【安全测试工具】Drozer介绍及使用

达芬奇密码2018-06-27 15:27
一、前言:
    项目测试间隙调研了下移动APP安全测试,发现不少文档都提到了Drozer这款安全测试工具,遂拿来学习并投入项目中实践下。

二、Drozer介绍:

    Drozer是一款针对Android的安全测试框架,分为安装在PC端的控制台、安装在终端上的代理APP两部分。可以利用APP的IPC通信,动态的发现被测试APP的安全风险。
    贴一张网上的图片,Drozer的功能点:


三、安装

1、官方下载地址
2、安装比较简单,不介绍了。
    中间有个java环境变量的小插曲说明下,如果运行drozer console connect后,报“ Could not find java. Please ensure that it is install ed and on your PATH. ”检查下自己本地的java环境变量是否有问题,如果设置正确,但是drozer还是找不到的话,Windows用户在“c:\users\用户名”文件夹下新建.drozer_config文件,文件内容为:
[executables]
java=C:\Program Files\Java\jdk1.7.0_79\bin\java.exe
javac=C:\Program Files\Java\jdk1.7.0_79\bin\javac.exe
(路径为自己的jdk目录)
    Windows文件名不能为空,导致不能新建.drozer_config文件的话,cmd下用命令rename 1.drozer_config .drozer_config改文件名为空。

四、界面介绍及连接设备

1、页面展示:

PC上的控制台,用的是免费社区版,所以控制台没有UI界面。

手机上的代理APP页面展示:

2、连接设备:

首先运行设备上的Drozer代理并启动守护服务,然后运行下面的命令做端口转发:

adb forward tcp:31415 tcp:31415

使用下面的命令建立链接:

drozer console connect

连接成功后,控制台显示dz>

五、常用命令介绍:

1、查找所有的攻击面:

dz> run app.package.attacksurface com.example
输出结果:
Attack Surface:
  6 activities exported  暴露的控件接口
  17 broadcast receivers exported     暴露的广播接收器
  0 content providers exported  数据提供接口,数据泄漏
  3 services exported  service服务接口
    is debuggable
解释:
  • 应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。Activity之间通过Intent进行通信。在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据
  • BroadcastReceive广播接收器:应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager 来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
  • content providers exported:android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式, 其他应用可以通过ContentResolver类(见ContentProviderAccessApp例子)从该内容提供者中获取或存入数据.(相当于在应用外包了一层壳), 只有需要在多个应用程序间共享数据是才需要内容提供者。例如,通讯录数据被多个应用程序使用,且必须存储在一个内容提供者中。它的好处:统一数据访问方式
  • service服务接口,一般常驻,连接上公开的service后,可通过service提供的接口调起其他activity等。

检测到攻击面,可进行的攻击:
  • activities exported  越权攻击,发送伪造消息等;
  • broadcast receivers exported 发送恶意广播,伪造广播消息,越权攻击等;
  • content providers exported 数据泄漏,SQL注入等;
  • services exported 越权攻击,服务拒绝,权限提升等;
2.1、intent介绍:
  • 可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。Intent可以启动一个Activity,也可以启动一个Service,还可以发起一个广播Broadcasts。
  • Intent有以下几个属性: 动作(Action),数据(Data),分类(Category),类型(Type),组件(Compent)以及扩展信(Extra)。其中最常用的是Action属性和Data属性。通过Drozer完整的发送intent消息命令格式为:


run app.activity.start [-h] [–action ACTION] [–category CATEGORY [CATEGORY …]] [–component PACKAGE COMPONENT] [–data-uri DATA_URI][–extra TYPE KEY VALUE] [–flags FLAGS [FLAGS …]] [–mimetype MIMETYPE]

2.2、对activity尝试进行攻击:

  • 来一把越权攻击:绕过登录页直接拉activity,看到有activity启动不需要权限,尝试用drozer直接拉起这些activity看看。
    run  app.activity.start  --component  com.example   com.example.activity.WelcomeActivity  
  • 发送伪造的残缺消息,刻意制造不完整的intent,发送给对应的activity。
run app.activity.start --action android.intent.action.SEND --component com.example com.example.activity.share.ShareToSessionActivity
intent中缺少extra部分

3、查看暴露的广播组件接口

run app.broadcast.info -a   com.example  -i  获取暴露的广播组件信息
尝试拒绝服务攻击,向广播组件发送不完整intent(空action或空extras)
run app.broadcast.send --component com.example com.example.sdk.communication.AppRegisterReceiver --extra string TEXT "hahahaha"
传递空的action

4、查看数据接口

如果有暴露的content组件接口,可能存在:
数据泄漏问题;
--直接访问URI获取敏感信息;--目录遍历;
构造特殊的URI进行SQL注入;
获取content provider的信息
dz> run app.provider.info -a  com.example  -i
使用drozer的scanner模块去猜测可能存在的URIs
dz> run scanner.provider.finduris -a  com.example
检测可注入的URI的注入点
dz> run scanner.provider.injection  -a  com.example
SQL注入的方式,如果上一步有拿到可注入的URI
获取某个表(如Key)中的数据:run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"

5、查找service服务接口

获取公开的service服务接口信息

dz> run app.service.info -a  com.example -i
直接启动服务看下
run app.service.start --action com.example.plugin.game.service.GameDownloadService --component  com.example com.example.plugin.game.service.GameDownloadService

6、文件操作

  • 安装minimal来可以获取暂时的root权限
run tools.setup.minimalsu
  • 进入shell模式,查看/data/data/com.example下是否有明文存储敏感信息
  • 在AndroidManifest.xml中android:allowBackup字段是否为true。当这个标志被设置为true或不设置该标志时应用程序数据可以备份和恢复,adb调试备份允许恶意攻击者复制应用程序数据。有名的栗子新浪微博android客户端越权泄密事件。

六、总结:

    使用Drozer在项目中实践后,有发现多处不校验导出组件(activity,broadcast,service等)传递参数导致的安全漏洞,反馈给开发后进行排查,现已经全部修复。

本文来自网易实践者社区,经作者yixin.shenhui授权发布。