Drozer测试四大组件
Drozer
介绍
Drozer是一款开源的Android安全测试和攻击工具,由MWR InfoSecurity开发。它提供了一个命令行接口,允许用户在安全测试或攻击Android应用程序时进行自动化测试,发现潜在的漏洞和安全风险。Drozer是目前应用最为广泛的Android安全测试工具之一,其功能和易用性受到了广泛的认可和好评。
Drozer的主要功能包括:
应用程序渗透测试:Drozer允许用户测试Android应用程序的安全性,包括动态和静态分析,以及漏洞扫描等。
应用程序漏洞挖掘:Drozer提供了一个插件系统,允许用户编写自己的插件来挖掘Android应用程序中的漏洞。
代码审计:Drozer允许用户快速浏览应用程序的源代码,并快速查找敏感信息和漏洞。
安全审计:Drozer提供了一些常见的安全审计功能,例如渗透测试、代码审计和漏洞扫描等。
总的来说,Drozer是一款非常强大的Android安全测试工具,可以帮助安全测试人员发现Android应用程序中的漏洞和安全风险,并提供相应的解决方案。
GitHub: https://github.com/WithSecureLabs/drozer
安装
环境准备
python 2.7【必须,不然可能会有玄学BUG】
PC控制端安装
## 安装依赖python2 -m pip install wheelpython2 -m pip install pyyamlpython2 -m pip install pyhamcrestpython2 -m pip install protobufpython2 -m pip install pyopensslpython2 -m pip install twistedpython2 -m pip install service_identity## 下载whl到本地wget https://github.com/WithSecureLabs/drozer/releases/download/2.4.4/drozer-2.4.4-py2-none-any.whlpython2 -m pip install drozer-2.4.4-py2-none-any.whl
设备端agent安装
wget https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apkadb install drozer-agent-2.3.4.apk
连接
## 端口转发adb forward tcp:31415 tcp:31415## 连接drozer console connect
出现如下内容,就说明OK了
Selecting da226956879c9325 (Xiaomi MI 6 Plus 6.0.1) .. ..:. ..o.. .r.. ..a.. . ....... . ..nd ro..idsnemesisand..pr .otectorandroidsneme. .,sisandprotectorandroids+. ..nemesisandprotectorandroidsn:. .emesisandprotectorandroidsnemes.. ..isandp,..,rotectorandro,..,idsnem. .isisandp..rotectorandroid..snemisis. ,andprotectorandroidsnemisisandprotec. .torandroidsnemesisandprotectorandroid. .snemisisandprotectorandroidsnemesisan: .dprotectorandroidsnemesisandprotector.drozer Console (v2.4.4)dz>
输入run app.package.list列举出所有的软件,可以列举就更加说明安装成功了。
相关命令
help: 列出所有可用命令,可通过`help
模块介绍翻译:
模块说明app.activity.forintent查找可以处理给定intent的activityapp.activity.info获取有关已导出activity的信息。app.activity.start启动activityapp.broadcast.info获取有关broadcast receiver的信息app.broadcast.send使用intent发送广播app.broadcast.sniff注册可以嗅探特定intent的broadcast receiverapp.package.attacksurface获取软件包的攻击面app.package.backup列出使用备份API的软件包(FLAG_ALLOW_BACKUP返回true)app.package.debuggable查找可调试的软件包app.package.info获取有关已安装软件包的信息app.package.launchintent获取软件包的启动intentapp.package.list列出软件包app.package.manifest获取软件包的AndroidManifest.xmlapp.package.native查找应用程序中嵌入的本地库。app.package.shareduid查找共享UID的软件包app.provider.columns列出内容提供者中的列app.provider.delete从内容提供者中删除app.provider.download从支持文件的内容提供者下载文件app.provider.finduri在软件包中查找引用的内容URIapp.provider.info获取有关导出内容提供程序的信息app.provider.insert插入到内容提供程序app.provider.query查询内容提供程序app.provider.read从支持文件的内容提供程序中读取app.provider.update更新内容提供者中的记录app.service.info获取有关已导出服务的信息app.service.send向服务发送消息,并显示回复app.service.start启动服务app.service.stop停止服务auxiliary.webcontentresolver启动内容提供者的Web服务接口。exploit.jdwp.check打开@jdwp-control,查看哪些应用连接exploit.pilfer.general.apnprovider读取APN内容提供者exploit.pilfer.general.settingsprovider读取设置内容提供者information.datetime打印日期/时间information.deviceinfo获取详细设备信息information.permissions获取设备上所有软件包使用的所有权限列表scanner.activity.browsable获取可以从Web浏览器调用的所有可浏览的 activityscanner.misc.native查找包中包含的本地组件scanner.misc.readablefiles在给定文件夹中查找可读取的全局文件scanner.misc.secretcodes搜索可从拨号器中使用的秘密代码scanner.misc.sflagbinaries在给定文件夹中查找suid / sgid二进制文件(默认为/system)。scanner.misc.writablefiles在给定文件夹中查找可写的全局文件scanner.provider.finduris搜索可以从我们的上下文查询的内容提供者。scanner.provider.injection测试内容提供程序的SQL注入漏洞。scanner.provider.sqltables查找可通过SQL注入漏洞访问的表。scanner.provider.traversal测试内容提供程序是否存在基本目录遍历漏洞。shell.exec执行单个Linux命令。shell.send将ASH shell发送到远程侦听器。shell.start进入交互式Linux shell。tools.file.download下载文件。tools.file.md5sum获取文件的md5校验和。tools.file.size获取文件大小。tools.file.upload上传文件。tools.setup.busybox安装Busybox。tools.setup.minimalsu准备在设备上安装'minimal-su'二进制文件。
四大组件
说明
组件名称描述用途Activity代表应用程序中的单个屏幕或用户界面处理用户与应用程序的交互和响应用户的操作Service代表应用程序中的后台任务在后台执行长时间运行的操作,例如音乐播放、下载和数据处理BroadcastReceiver用于接收系统广播和应用程序内部广播响应系统和应用程序中的广播消息,例如电池电量、网络连接状态、应用程序安装等ContentProvider用于应用程序之间共享数据允许应用程序访问其他应用程序存储在特定位置的数据,例如联系人、照片、音频文件等
测试
以sieve.apk为例,查看攻击面
## 找到APP包名dz> run app.package.list -f siecom.mwr.example.sieve (Sieve)## 找到模块dz> ls attackapp.package.attacksurface Get attack surface of package## 查看攻击面,可以通过 -h 参数查看帮助dz> run app.package.attacksurface com.mwr.example.sieveAttack Surface: 3 activities exported 0 broadcast receivers exported 2 content providers exported 2 services exported is debuggable
**可导出:**可以被其他应用程序或组件调用
一般有参数的情况下需要结合反编译去分析传入的参数,然后用参数--extra去构造发送。
Intent是一种用于在不同组件之间传递数据和执行操作的机制。Intent除了可以携带数据外,还可以传递Bundle对象或者使用putExtra方法传递键值对来传递数据。所以我们在分析参数的时候,着重注意Bundle对象
Bundle bundle = arg1.getExtras();sms.sendTextMessage(bundle.getString("phoneNumber"), null, bundle.getString("message"), null, null);// 参数 phoneNumber 和 message
Activity
风险点:
未授权访问(信息泄漏)
拒绝服务(发送空/畸形数据)
activity劫持
获取可导出activity
## run app.activity.info -a
调用对应的activity,切换到对应界面,查看是否存在未授权,以及程序是否会崩溃(拒绝服务)
## run app.activity.start --component
测试是否存在Activity劫持
## 环境准备wget https://github.com/yanghaoi/android_app/raw/master/uihijackv2.0_sign.apk## 安装点击劫持软件adb install uihijackv2.0_sign.apk
在打开原activity的基础上,调用此组件,如果uihijackv2.0_sign界面位于被测软件上,则存在漏洞,否则不存在漏洞。
run app.activity.start --component com.test.uihijack com.test.uihijack.MainActivity
Service
风险点:
根据具体的功能点分析
拒绝服务
获取可导出服务
## run app.service.info -a
启动服务
## run app.service.start --component
绑定到一个已导出的服务,并向其发送一条消息。如果服务发送了一个回复,则显示接收到的消息及其包含的任何数据【发送数据到服务,并dump数据】
## run app.service.send
如果返回的是对象类数据,一定要加上参数--bundle-as-obj,不然drozer会直接退出。
--msg和--extra参数来源:
另一个服务也一样
dz> run app.service.send com.mwr.example.sieve com.mwr.example.sieve.CryptoService --msg 3452 0 0 --extra string com.mwr.example.sieve.KEY 123 --extra string com.mwr.example.sieve.STRING 456 --bundle-as-objGot a reply from com.mwr.example.sieve/com.mwr.example.sieve.CryptoService: what: 9 arg1: 91 arg2: 0 Extras com.mwr.example.sieve.RESULT (byte[]) : [55, 41, -24, -79, 3, 110, -82, -59, 93, -94, -83, -45, -8, 9, 97, -70, -79, 101, -80] com.mwr.example.sieve.STRING (String) : 456 com.mwr.example.sieve.KEY (String) : 123
关闭服务
## run app.service.stop --component
ContentProvider
风险点:
信息泄漏
注入漏洞
Content Provider中的注入漏洞允许攻击者向Content Provider中注入恶意数据,从而可以获取敏感信息或者执行未经授权的操作。攻击者可以利用注入漏洞来执行SQL注入攻击,从而获取或修改Content Provider中的数据。如果Content Provider中存储了敏感数据,攻击者可能会利用注入漏洞来窃取该数据,导致严重的数据泄露问题。
目录遍历漏洞
使用ContentProvider.openFile()可以实现应用间共享数据,如果这个方法使用不当将会导致目录遍历漏洞。该漏洞允许攻击者访问Content Provider中未经授权的文件和目录。攻击者可以利用目录遍历漏洞来获取敏感信息,如密码、密钥、证书等。此外,攻击者还可以利用目录遍历漏洞来执行未经授权的操作,如删除或修改Content Provider中的文件,导致严重的安全问题。
获取提供者信息
## run app.provider.info -a
查询是否存在信息泄漏
## run scanner.provider.finduris -a
查询数据
## run app.provider.query
查询是否存在注入
## run scanner.provider.injection -a
利用注入
## 列出所有的表dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/ --projection "* FROM SQLITE_MASTER WHERE TYPE='table';--"| type | name | tbl_name | rootpage | sql || table | android_metadata | android_metadata | 3 | CREATE TABLE android_metadata (locale TEXT) || table | Passwords | Passwords | 4 | CREATE TABLE Passwords (_id INTEGER PRIMARY KEY,service TEXT,username TEXT,password BLOB,email ) || table | Key | Key | 5 | CREATE TABLE Key (Password TEXT PRIMARY KEY,pin TEXT ) |
查询是否存在目录遍历
## run scanner.provider.traversal -a
利用目录遍历读取文件
## run app.provider.read
BroadcastReceiver
风险点:
消息伪造
拒绝服务
上面的APK不存在广播接收者,所以这里更换为另一个APK
获取可导出广播接收者
## run app.broadcast.info -a
发送广播
发送电量屏幕的广播
run app.broadcast.send --action android.intent.action.SCREEN_ON
部分系统预定义广播及正常触发时机
action触发时机android.net.conn.CONNECTIVITY_CHANGE网络连接发生变化android.intent.action.SCREEN_ON屏幕点亮android.intent.action.SCREEN_OFF屏幕熄灭android.intent.action.BATTERY_LOW电量低,会弹出电量低提示框android.intent.action.BATTERY_OKAY电量恢复了android.intent.action.BOOT_COMPLETED设备启动完毕android.intent.action.DEVICE_STORAGE_LOW存储空间过低android.intent.action.DEVICE_STORAGE_OK存储空间恢复android.intent.action.PACKAGE_ADDED安装了新的应用android.net.wifi.STATE_CHANGEWiFi 连接状态发生变化android.net.wifi.WIFI_STATE_CHANGEDWiFi 状态变为启用/关闭/正在启动/正在关闭/未知android.intent.action.BATTERY_CHANGED电池电量发生变化android.intent.action.INPUT_METHOD_CHANGED系统输入法发生变化android.intent.action.ACTION_POWER_CONNECTED外部电源连接android.intent.action.ACTION_POWER_DISCONNECTED外部电源断开连接android.intent.action.DREAMING_STARTED系统开始休眠android.intent.action.DREAMING_STOPPED系统停止休眠android.intent.action.WALLPAPER_CHANGED壁纸发生变化android.intent.action.HEADSET_PLUG插入耳机android.intent.action.MEDIA_UNMOUNTED卸载外部介质android.intent.action.MEDIA_MOUNTED挂载外部介质android.os.action.POWER_SAVE_MODE_CHANGED省电模式开启
发送给指定的broadcast receiver
## run app.broadcast.send --component
extra参数来源: