在一次授权渗透测试中,得知测试目标是拿到权限或者关键用户数据。客户一开始只提供了一个安卓apk,在这种情况下,我们要怎么顺利完成测试呢?
一开始只提供了安卓apk包,也就只能从这个App入手。安装完成,打开之后就是一个登录页面:
配置好,收集代理,准备进行测试。过程中发现抓包无法抓到,报错信息如下:
由于App测试经验不多,一开始没理解。搜索一番之后发现,原因是由于安卓7.0开始只信任系统级别的证书,不再信任用户导入的证书。
那么只要把我们抓包工具的证书安装为安卓系统级别的根证书就可以。
第一步先导出burp证书,其他抓包工具同理:然后将证书文件转换一下格式,这一步可以在kali下执行:
opensslx509 -in cacert.der -inform DER -out cacert.pem -outformPEM
之后再提取Hash:
opensslx509 -inform PEM -subject_hash -incacert.pem
得到Hash值后,将证书文件修改名称为Hash值.0,之后用adb工具push到测试设备,或者文件管理器等其他方式上传到设备的/system/etc/security/cacerts/目录下,最后再给证书文件添加644权限即可:
chmod644 hash.0
证书安装完成后回到App就可以正常抓到包了,继续进行测试:之后注册了一个账号,进入主页面之后,发现程序功能并不多。把每个功能都测试一遍,也没发现什么漏洞。拿着App的域名进行了一波信息收集工作,也发现没什么其他有价值的资产。
重新捋了一下思路后,发现还没有对apk包做过测试,所以就想着反编译看一下有没有什么东西。直接把包放到jadx中,没有加壳,随便搜索一下关键字,可以发现代码里面有不少域名,那么就把这些域名收集一下:
把所有从代码里面找出来的域名挨个访问了一遍,终于看到了一个像样的网站,通过和对比发现是程序对应的Web端:那么之后的测试就转移到Web端。测试了一下,admin路径可以访问到后台,但是没有弱口令,把手里的字典都跑了一遍也没结果,无法突破。
在前台对各个功能点测试完也依旧没发现什么比较有用的漏洞,再次自闭。最后的思路只有在后台页面html里看到的第三方技术支持公司。
之后又把测试目标转移到了第三方技术支持公司,从信息收集开始,先扫描了一波子域名和目录。经过一番测试发现其中一个子域是用的thinkphp,随便访问一个不存在路径后会返回错误页面,可以看到thinkphp的版本信息,是有rce漏洞的版本:当时内心一阵狂喜,皇天不负有心人,终于找到一个利用点了。拿起exp就是一通乱怼,这个子域下也没有部署waf,很顺利的利用了漏洞:
?s=index/\think\Request/input&filter[]=system&data=whoami
本来执行成功之后是一开始想着写个马,但是考虑到这个不是主要目标,所以还是选择先反弹了一个shell,在服务器上翻找了一下各种文件。运气很好,找到了原目标的源码的备份文件,通过scp下载了一份,然后开始审计。
各种敏感函数先搜索一下,发现了一个很简单的任意文件读取漏洞:file_get_contents函数的参数可以控制,并且没有任何过滤,但是因为目的是要拿下权限,所以用处不大,暂且忽略。
继续搜索到exec时发现有一处命令执行漏洞,代码如下:整体代码逻辑是先判断请求参数action,action值为onetoone_info就走入这个代码段,然后查询用户id和房间号。这里需要自己登录一个账号,还需要通过遍历找到一个符合条件的房间号,否则无法往下走,之后绕过两个if,走到else的代码段,可以看到有个exec函数,函数的参数$cmd里有个$content是可控的:用dnslog平台测试一下执行效果,确认可以成功执行命令:确认可以执行命令之后写了个马到目标,完成测试。
虽然客户一开始只提供了一个安卓apk,但通过对apk反编译,找到了目标Web端,又通过Web端后台,发现了第三方技术支持公司。对第三方技术支持公司进行渗透测试,获得到了原目标Web端源码,最后审计源码发现一处命令执行漏洞,拿下权限,圆满完成测试。