0X00 简介
Drozer是一款针对Android的安全测试框架,分为安装在PC端的控制台、安装在终端上的代理APP两部分。可以利用APP的IPC通信,动态的发现被测试APP的安全风险。
0X01 安装
工具下载
https://labs.mwrinfosecurity.com/tools/drozer/
官网下载
安卓手机客户端apk(drozer-agent)
服务端(.msi)
测试apk(sieve)
adb工具下载
http://adbshell.com/downloads
环境
java Jdk1.6+
python2.7
环境
夜神模拟器分别安装客户端apk,测试apk(sevie)
Tips
drozer的安装路径需要安装在Python的安装路径下
报错
安装drozer启动时会有python模块的报错,需要对缺失的库进行安装。
一键安装
1 | pip install protobuf pyOpenSSL twisted service_identity |
如果安装失败,可以对各自的库进行安装
报错1、ImportError: No module named google.protobuf
1 | 解决方法:pip install protobuf |
报错2、ImportError: No module named OpenSSL
1 | 解决方法:pip install pyOpenSSL |
报错3、drozer Server requires Twisted to run.
Run ‘pip install twisted’ to fetch this dependency.
1 | 解决方法:pip install twisted |
警告:UserWarning: You do not have a working installation of the service_identity module: ‘No module named service_identity’. Please install it from https://pypi.python.org/pypi/service_identity and make sure all of its dependencies are satisfied.
1 | 解决方法:pip install service_identity |
0X02 adb与夜神模拟器联动启动drozer
在模拟器的环境下,在模拟器的安装目录的bin目录下执行(建议将其添加环境变量)
1 | nox_adb.exe connect 127.0.0.1:62001 |
即可连接到模拟器,使用adb进行查看
1 | adb devices |
接下来在模拟器中打开drozer的客户端drozer agent
进行端口转发,在真机的情况下,貌似是不需要进行端口转发的。
1 | adb forward tcp:31415 tcp:31415 |
命令行打开drozer,若未加环境变量需要在python的Script目录下执行
1 | drozer.bat console connect |
输入list查看是否正常。如输入list无显示,关闭窗口重新连接即可(玄学)
可以使用help查看模块的使用方法。
如
1 | help app.activity.start |
至此Drozer的安装与连接完成。
0X03 Drozer的基础使用
Drozer的基本命令
列出模拟器设备中所有已经安装的App包列表
1 | run app.package.list |
这里有个点就是会出现中文乱码的情况。
需要进行如下修改C:\Python27\Lib\site-packages\drozer\modules\app
目录下修改package.py在355行左右如图红线上添加u
并在第一行添加如下代码。将默认编码修改为utf-8。
1 | Import sys |
列举APP的详细信息
利用关键词“sieve”进行搜索得出包名:
1 | run app.package.list -f sieve |
查看包的详细信息:
1 | run app.package.info -a com.mwr.example.sieve |
包含的内容有:版本号,数据存放在手机上的路径,安装时关于应用程序允许的权限的详细信息
Drozer安全测试
查看sieve的可攻击点
1 | run app.package.attacksurface com.mwr.example.sieve |
在此,我们将只考虑通过Android的内置机制的进程间通信(IPC)暴露漏洞。这些漏洞通常导致敏感数据泄漏到安装在同一设备上的其他应用程序。
上面结果说明我们有很多潜在的问题,这个app上的 ‘exports’ 有的几个让其他应用程序可以访问的activities(应用程序使用的屏幕)、内容提供者(数据库对象)、服务(后台工作者)。同时有一点,该服务是可调试的,这意味着我们可以使用ADB逐步通过代码将调试器附加到进程
可导出的Activity
通过 app.activity.info 我们可以知道sieve哪些activity是可以导出的
1 | run app.activity.info -a com.mwr.example.sieve |
从信息中可以看出第一个是选择文件的activity,第二个是启动登录的activity,第三个是密码列表的activity
依次启动这些activity
1 | run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.FileSelectActivity |
选择文件界面弹出
1 | run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.MainLoginActivity |
登录界面弹出
1 | run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList |
在登录界面进行调起密码列表的界面会跳过登录(越权),直接进入app
Tips:
若正常应用未正确配置,那么就会存在界面劫持的风险。可在一般app界面上尝试调用以上activity。调起后若app未进行任何提示或操作那么就可以判断该app存在界面劫持风险。(界面劫持测试app(Hijack))
从provider读取信息
1 | run app.provider.info -a com.mwr.example.sieve |
可以收集有关应用程序可导出的内容provider的更多信息。
Database-backed Content Providers (数据泄露)
drozer提供了一个扫描模块,它汇集了各种猜测路径,并列出了一个可访问的列表,可扫描出哪些。
1 | run scanner.provider.finduris com.mwr.example.sieve |
现在我们可以使用其他的drozer模块从这些内容URI中检索信息,甚至修改数据库中的数据。
(先在app中添加数据)
查询数据库中的信息:
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical |
Database-backed Content Providers (sql注入)
android平台促进使用SQLite数据库来存储用户数据。由于这些数据库使用SQL,对于SQL注入来说,它们很容易受到攻击,。通过操作传递到的投影和选择字段来测试SQL注入。
这里尝试传入一个单引号进行测试。
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'" |
Android返回一个非常冗长的错误消息,显示它试图执行的整个查询。我们可以充分利用这个漏洞来列出数据库中的所有表:
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --project "* FROM SQLITE_MASTER WHERE type='table';--" |
或查询其他受保护的表(查询key表的字段)
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM key;--" |
检查Content Provider的脆弱性
内容provider对SQL注入和目录遍历都是脆弱的。drozer offers 模块自动测试这些漏洞的简单情况:
1 | run scanner.provider.injection -a com.mwr.example.sieve |
0X04 小结
这是在做app业务渗透测试文档中使用的一款工具,当时使用较为吃力,所以花了两天的时间进行一个学习。这个工具的很多强大之处还暂时没有涉猎到,后面会慢慢的进行一个学习。