漏洞链的过程需要一组程序,允许黑客利用应用程序内的多个漏洞/缺陷的优势来实现最大化影响,一个简单的例子就是用XSS配合Opendirect重定向,然后用XSS链接实现账户劫持,然后再从SSRF到RCE。
今天我们来看看国外白帽子 Ahmad Halabi 利用漏洞链组合进行挖洞的案例。
从一个移动应用程序(apk文件)开始,第一步反编译apk文件,可以使用`jadx`或`apktool`来帮助你将Dex和APK文件反编译为可读的Java和Smali代码。
在查看反编译后的源代码后,注意到配置文件使用了JSC扩展名加密。
JSC代表开发人员用来加密包含敏感信息(如:服务器IP、凭据、密钥等)的文件的JavaScript编译脚本。
接着解密JSC文件,JSC是使用了Cocos2d-x(一种开源的跨平台开发框架)开发,因此在反编译的应用程序文件中搜索Cocos2d-x文件。
然后对`libcocos2d-x.so`文件进行逆向,搜索`main.js`函数,直接拿出IDA,尝试找到`Cocos2d-x`用来加密文件的解密密钥`XXTEA`:
然后就可以使用`XXTEA`密钥对JSC文件进行解密了。
在JSC文件被解密后,就能够轻松阅读JS源代码了。代码审计过程中,在一个解密的配置文件中发现了一个有趣的IP地址。
于是果断进行端口扫描,但目标做了一些保护措施,因为在扫描过程中收到了巨大的数据包延迟。
因此考虑使用了另一种方法来检测开放端口,尝试使用Shodan/Censys,发现了一个运行GitLab的开放端口8100
。
查看页面,存在一个`Register`按钮,尝试注册账户,顺利进入目标公司的GitLab。
注册登录后,发现没有公共项目可供普通用户权限的账户使用。然后在使用过程中发现一处API端点api/v4/users
,在这里成功找到了管理员的用户名。
记下用户名,然后从当前用户注销,添加管理员用户名root
,尝试使用密码字典进行密码爆破。
PS:密码字典并不是随机的,通过查看了社交媒体、开源(GitHub等)、网站和任何其他来源上的目标公司简介,这些信息收集最终获得了管理员账户可能使用密码的正确情报。
然后网站使用了WAF来防止暴力破解,最终通过利用X-Forwarded-For:127.0.0.$1$
实现绕过WAF防护。
最终使用管理员账户登录GitLab,并顺利获取私有存储库访问权限。
通过源代码查看,找到访问目标公司基础设施的凭据。
云数据库
SQL数据库
Redis数据库
服务器用户名
服务器密码
密码进行了hash,但很容易破解。最终拿到访问所有后端管理系统的权限。
通过Redis升级到RCE,并访问到另一台服务器。然后从一台服务器渗透到另一台服务器,最终访问到所有服务器。
该项目漏洞挖掘共花费25小时(每天5小时)。
1、端口扫描IP地址[发现打开的SSH但不存在漏洞+爆破密码不起作用]
2、通过IP反向查找域名
3、执行子域枚举[找到一个解析子域名`vip.Target.com`]
4、端口扫描[发现Nginx、Xampp、Java正在运行]
5、检查常见漏洞和已知漏洞[没有易受CVE攻击的漏洞]
6、目录爆破[找到登录页]
7、尝试使用普通用户名和密码进行爆破[失败]
8、查看页面源代码+阅读JS文件[找到隐藏的注册页]
9、注册账户需要白名单电话号码范围
10、经过几次尝试,找到了电话号码范围模式
11、验证码会发送到电话号码上,注册时需要验证码[问题是无法访问到添加的电话号码,也无法添加不同模式]
12、通过抓取请求和响应包,发现验证码在响应包中泄露,注册成功
13、导航至登录页面[登录需要用户名和密码]
14、无法登录[响应消息为:用户名无效,因为在注册时使用了相同的用户名]
15、添加注册的电话号码,而不是用户名[登录成功]
16、服务器正在运行Xampp,搜索文件上传端点[所有图片上传均经过验证和保护]
17、在浏览了仪表板的各项功能后,发现其中一个端点缺少对Upload图标扩展名的验证
18、上传了php shell,并访问shell路径[shell没能执行,页面中也没有显示任何PHP信息]
19、检查请求并在请求 URL 中发现 (.do) [虽然应用程序运行的是 Xampp,但后端确使用了Java]
20、写个简单的jsp反弹shell,然后上传
21、成功获得shell,并以管理员身份访问到服务器
该项目漏洞挖掘共花费4小时。