移动终端安全:实验3-Drozer关键模块的使用
实验过程
安装Drozer,并确认链接成功
1. 枚举已安装包
列出设备上安装的应用包(基本核查用):
dz> run app.package.list
用途:确认目标包名(package name),后续模块都以包名为参数。
2. 检查包攻击面(导出组件)
列出某个包下所有 导出(exported) 的 activity(通过 PackageManager API):
dz> run app.package.attacksurface <包名>
意义:快速定位那些对外可被外部 Intent 调用的组件(潜在入口)。
3. 枚举 Activity(全设备或指定包)
列出设备上安装并导出的 activity:
dz> run app.activity.info
或只列出某包:
dz> run app.activity.info --package <包名>
从输出可看到每个 Activity 的 exported
与所需权限等信息。
4. 枚举 Content Provider
列出 Content Provider 信息(URI、权限、导出状态等):
dz> run app.provider.info
后续测试思路:若发现 provider 暴露且未做权限控制,可尝试通过 content URI query/insert/update/delete
来判断是否可以读写。
这里太多不好判断,我们依旧列出玩转程序的Content Provider 信息
5. 枚举 Service
列出系统中 service:
dz> run app.service.info
可用于发现可被外部 start/bind 的 service(无权限的 service 可能被滥用)。
6. 枚举 Broadcast Receiver
列出注册并导出的广播接收器:
dz> run app.broadcast.info
若 broadcast receiver 未限制权限或使用 exported="true"
,可向其发送 crafted intent 触发行为。
7. 使用Drozer运行一个无权限组件
(1)使用 app.activity.info
找到目标包的某个 exported
Activity:
dz> run app.activity.info --package [package name]
(2)构造 Intent 并启动该 Activity(最简单):
dz> run app. activity. start --component [package name] [component name]
发现该程序的FirstActivity
启动成功。
知识补充
一、什么是 drozer(核心概念)
- drozer 是一个面向 Android 平台的开源安全评估框架,设计目的是让渗透测试人员能“以应用的身份”与目标设备、应用的 IPC(Intent、Content Provider、Service、BroadcastReceiver 等)以及底层运行时(Dalvik/ART)交互,自动化发现组件暴露、权限缺陷和其他漏洞。labs.withsecure.com+1
- 它最初由 MWR Labs(Mercury/后来并入其它团队)开发,后续社区和相关组织(如 WithSecure/ReversecLabs)维护并发布代码、模块与文档。drozer 在行业内长期被引用为 Android 渗透测试的“标准工具”之一。linuxjournal.com+1
二、drozer 的架构 / 组件
-
drozer Console(客户端 / 控制台)
在测试机/宿主机上运行的命令行工具(
dz
),用来加载模块、发起请求、显示结果并交互式执行命令。GitHub -
drozer Agent(运行在 Android 设备上的 APK)
以应用身份运行在目标设备/模拟器上的代理(agent),接收控制台命令并执行相应操作(列举组件、发送 Intent、访问 Content Provider、执行 exploit 等)。Agent 可通过正常安装、社工或利用其他漏洞部署(注意合法性)。GitHub
-
模块(Modules)
drozer 的功能拆分为大量模块(例如
app.package.list
、app.activity.info
、scanner.provider.traversal
等),用户通过run <module>
调用。模块可通过社区/官方仓库扩展,支持分享与复用。GitHub+1 -
外部仓库 / 扩展
新版本支持外部模块仓库(WithSecure/社区仓库),便于分发更新的模块与 exploit。GitHub
三、主要能力与典型模块(功能分类)
-
信息收集 / 枚举
-
app.package.list
— 列出已安装包。 -
app.activity.info
、app.service.info
、app.provider.info
、app.broadcast.info
— 枚举并显示导出组件、权限与 intent filters。(你在实验里贴出的命令都属这一类。)GitHub
-
-
组件测试 / 利用
- 使用
app.activity.start
向导出 Activity 发送 Intent、用app.provider.query
/insert
等与 Content Provider 交互,测试未授权读写或注入。Gist+1
- 使用
-
扫描器与自动化
- 一些
scanner.*
模块可以对应用进行更系统的检查(比如 provider traversal、intent injection 等),用于批量或自动化测试。GitHub
- 一些
-
远程/利用相关
- drozer 能生成/运用一些已知 exploit 或 payload(例如通过 weasel 或 agent 注入、或构建恶意 APK、网页进行社会工程式部署),用于验证远程利用场景(请注意法律与授权)。GitHub+1
四、如何与 Android IPC/组件交互(技术细节)
drozer 的核心能力来自对 Android IPC/组件模型的“程序化使用”:
-
PackageManager / PackageInfo 查询(枚举组件)
-
agent 使用
PackageManager
获取目标应用的PackageInfo
、ActivityInfo
、ServiceInfo
、ProviderInfo
、ReceiverInfo
,从中读取exported
、permission
、intent-filters
等字段,从而判断哪些组件对外暴露、是否需要权限。
-
-
Intent 构造与发送(调用 Activity/Service/Receiver)
-
构建
Intent
(包含 action、data、extras、componentName 等),调用startActivity()
、startService()
、bindService()
或sendBroadcast()
来触发目标组件,观察行为或利用逻辑缺陷。
-
-
ContentResolver 访问 Provider
-
使用
ContentResolver.query/insert/update/delete
对 ContentProvider 发起操作,通过各种 URI、selection、projection 等参数测试是否存在未授权访问或注入问题。
-
-
Binder/Service 调用
-
对于导出的 Binder 接口(AIDL 服务或自定义 Binder),drozer 可尝试以
bindService
后通过反射或标准接口调用(如果接口已知)或尝试模糊化调用(更高级模块)。
-
-
调用系统/应用 API(敏感操作模拟)
-
agent 作为一个 app,可直接调用 Android API(如读取联系人、发送 SMS、访问文件等)——前提是它拥有相应运行时权限或目标 app 的组件允许执行这些操作。
-
技战术上,drozer 把“人工用 Android Studio / adb 做的事情”自动化并脚本化,且把构造 Intent / ContentProvider 调用这种容易出错但很有价值的测试变为模块化流程。
五、防护建议(把理解转为防御)
理解 drozer 的原理后,你可以把防护措施总结为:
-
明确
exported
的值,尽量不导出不必要的组件;对必须导出的组件要求android:permission
且使用signature
限制敏感功能。 -
Provider 对敏感数据使用
android:grantUriPermissions
与权限检查;对插入/更新/删除做严格校验。 -
在组件入口处验证 Intent 的来源(检查 calling UID、action、data、extra 内容是否合法)。
-
最小化授予权限,避免过度暴露。做静态/动态测试(如使用 drozer、Frida、MobSF)来发现漏失。