一、前言:
项目测试间隙调研了下移动APP安全测试,发现不少文档都提到了Drozer这款安全测试工具,遂拿来学习并投入项目中实践下。
二、Drozer介绍:
Drozer是一款针对Android的安全测试框架,分为安装在PC端的控制台、安装在终端上的代理APP两部分。可以利用APP的IPC通信,动态的发现被测试APP的安全风险。
三、安装
1、官方下载地址
https://labs.mwrinfosecurity.com/tools/drozer/
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等)传递参数导致的安全漏洞,反馈给开发后进行排查,现已经全部修复。