使用drozer对Android应用进行安全评估的测试例子
看着drozer的用户说明文档,试了几个Android App,测试发现这几个App都基本没什么问题,只好又用drozer提供的sieve来进行练习了。进行安装评估的步骤一般也就是下面的标题步骤了。
1 在Android设备上安装使用sieve
sieve是一个密码管理器App,用来展示Android应用的一些共同缺陷,可以用来练习使用drozer。https://www.mwrinfosecurity.com/system/assets/380/original/sieve.apk下载sieve.apk。 打开模拟器,安装sieve: adb intsall sieve apk
然后设置sieve,第一次使用需要设置打开sieve软件的密码和PIN码。 给sieve增加内容,添加一些要管理的帐号密码信息
在seting里面还有其他的功能:
2 获取App Package信息
drozer每个模块的作用:
获取App包信息的模块是**app.package.* **:
2.1获取获取Android设备上的所有的安装的App的包名
命令是:
run app.package.info -a com.mwr.example.sieve
run app.package.list
这条命令会把所有的App都列出来,如果想具体查找某个App可加上-f [App关键字]的参数,如查找sieve在Android设备中的包名:
run app.package.list -f sieve
注意:在输入命令时可以使用Tab键自动补齐 需要记住com.mwr.example.sieve的包名,以后的命令要针对这个操作
2.2获取sieve的一些基本信息
命令是:
run app.package.info -a com.mwr.example.sieve
可以看到Sieve的版本信息,数据存储的目录,用户ID,组ID,是否有共享库,还有权限信息等。
2.3Itentify the Attack Surface(确定攻击面?)
这个测试教程主要关注的是Android 固有的IPC通信机制的脆弱性,这些特点导致了App泄漏敏感信息给同一台设备上的其它App。 查找可以进行Attack Surface的组件的命令:
run app.package.attacksurface com.mwr.example.sieve
结果显示了潜在可以利用的组件个数: “exported”表示组件可以被其他App使用。 services is debuggable表示我们可以用adb绑定一个调试器到进程。
2.4进一步获取Attack Surface的信息
如进一步获取ativity组建的attack surface信息的命令是:
run app.activity.info -a com.mwr.example.sieve
其中上图的MainLoginActivity是程序启动时主界面,必须是exported,其他两个activity是理论上说是不能exported的。
2.5启动Activities
上图的PWList和FileSelectActivity是exported并且不需要任何权限,我们可以用drozer启动他们,比如感觉PWList这个含金量应该大一点,所以就启动它了,命令是:
run app.activity.start –component com.mwr.example.sieve com.mwr.example.sieve.PWList
启动后的效果:
app.activity.start的使用方法:
help app.activity.start usage: run app.activity.start [-h] [–action ACTION] [–category CATEGORY [CATEGORY …]] [–component PACKAGE COMPONENT] [–data-uri DATA_URI] [–extra TYPE KEY VALUE] [–flags FLAGS [FLAGS …]] [–mimetype MIMETYPE]
Starts an Activity using the formulated intent.
2.6从Content Provider中获取信息
接上2.3节,进一步获取content provider的attact surface的信息的命令是:
run app.provider.info -a com.mwr.example.sieve
从上图可以看到2.3节中两个exported的content provider的具体信息,包括名字,权限,访问路径等。
2.6.1查找可以访问content provider的URI(数据泄漏)
从上节图中我们猜测DBContentProvider会有某种格式的数据库,但是我们不知道其中的数据是如何组织的。Content URI必须是 “content:///” 的形式,因此我们可以构造部分的content URIs来访问DBcontent Provider。 上图存在一个需要READ_KEYS和WRITE_KEYS权限才能读和写的“/Keys”的路径。
drozer的scanner模块提供了一些方法去猜测可能存在的content URIs:
run scanner.provider.finduris -a com.mwr.example.sieve
上图中检测出了可以访问content的URI,接下来我们可以用drozer的其他模块和URI从content中获取,甚至更改信息。 如:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ –vertical
如上图我们获取了用户名,邮箱帐号,和Base64编码的密码字符串。
2.6.2进行SQL注入
Android操作系统建议使用SQLite数据库存储用户数据。SQLite数据库使用SQL语句,所以可以进行SQL注入。 使用projection参数和seleciton参数可以传递一些简单的SQL注入语句到Content provider。如:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ –projection “‘”
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ –selection “‘”
上面两条命令执行后Android设备返回了非常详细的错误信息。
使用Sql注入列出数据库中的所有数据表:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ –projection “* FROM SQLITE_MASTER WHERE type=’table';–“
使用SQL注入列出数据表的内容:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ –projection “* FROM Key;–“
2.6.3从File System-backed Content Providers获取信息
File System-backed Content Provider提供了访问底层文件系统的方法,Android沙盒会阻止App共享文件允许,而File System-backed Content Provider允许App共享文件。 对于sieve来说,我们可以推测出的FileBackupProvider就是一个file system-backed content provider。 我们可以使用drozer的app.provider.read模块查看某个文件:
run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts
可以使用app.provider.download下载文件
run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db /home/user/database.db
2.6.4检查Content Provider的脆弱性
检查是否有SQL注入:
run scanner.provider.injection -a com.mwr.example.sieve
检查是否存在遍历文件的漏洞
run scanner.provider.traversal -a com.mwr.example.sieve
总结体会:我觉得在刚开始获取了软件包的基本信息后,就先用模块scanner里面的工具扫一扫,找到一些漏洞或者利用点后再进行下一步。
2.7和Services交互
获取是exported状态的services的命令:
run app.service.info -a com.mwr.example.sieve
关于Services的模块:
如向某个服务发送信息:
run app.service.send com.mwr.example.sieve com.mwr.example.sieve.CryptoService –msg 1 5 3
返回的结果:
没搞明白为什么返回这个,段数还不够。
2.8 其他常用模块
- shell.start 在Android设备上开启一个交互式Linux Shell
- tools.file.upload / tools.file.download
- tools.setup.busybox / tools.setup.minimalsu 安装busybox或者minimalsu到Android设备上
Ubuntu14.04 Drozer工具的安装和使用
Ubuntu14.04 Drozer工具的安装和使用
1.Drozer工具简介
略
2.工具的安装
2.1安装前提
确保PC机的操作系统里面安装了:
- JRE或者JDK
- Android SDK
64位的Ubuntu14.04需要安装IA32-libs。 确保adb和java已经在系统环境变量PATH中。
2.2Ubuntu安装Drozer
可以在官网https://www.mwrinfosecurity.com/products/drozer/community-edition/下载.deb的安装包直接安装;也可以下载.egg的python包安装,此时需要自己手动下载安装protobuf和twisted包。我是直接下载的.deb包安装的。
2.3手机或者模拟器安装代理agent.apk
下载agent.apk,使用命令安装:
adb install agent.apk
3 Drozer的使用
3.1建立Drozer Console和Dorzer Agent的连接,开启一个会话
Step1建立端口转发,Drozer默认使用31415端口。 如下命令:将Ubuntu的TCP端口31415的所有数据转发到手机上31415端口:
adb forward tcp:31415 tcp:31415
Step2在Android设备上开启Agent server。 选择”Enbeded Server“那一项,然后选择”Enadble“开启Agent server。
Step3使用drozer Console连接Agent server。 在Ubuntu的终端中输入命令:
drozer console connect
打开效果如下:
3.2Drozer Console的命令
Drozer Console是一个命令行环境,和bash shell相似。 Drozer Console提供了一系列的评估Android设备安全性的模块,每个模块有很明确的功能。 下图是自己根据官方文档翻译出的命令描述,可能不准确:
命令 | 描述 | 备注 |
---|---|---|
run MODULE | 运行一个drozer模块 | |
list或者ls | 显示在当前会话中可被执行的所有drozer模块 | 隐藏你没有权限执行的模块 |
shell | 在设备上的Agent进程上下文中开启一个交互式的Linux shell | |
cd | 跳转命令,挂载到指定的模块空间 | 可以避免重复输入模块的全名 |
clean | 清除drozer保存在Android设备上的临时文件 | |
contributors | 列出为drozer框架做出贡献的人名 | |
echo | 在console中显示文本 | |
exit | 结束drozer会话 | |
help ABOUT | 显示某一个命令或者模块(ABOUT)的帮助 | |
load | 加载并且顺序运行一个包含一系列drozer命令的文件 | |
module | 从互联网上寻找和安装drozer的扩展模块 | |
permissions | 显示drozer Agent获得的权限 | |
set | 赋值运算,将一个数值存到一个变量中,这个变量可以做环境变量 | 如:set HOST=193.168.1.1 |
unset | 取消赋值 | …… |
以下图片先用list显示了所有模块,再用cd命令进入scanner模块,然后使用了set、echo、unset命令
下图是官方文档的命令说明: