ivan-sincek/malware-apk
GitHub: ivan-sincek/malware-apk
一款用于Android应用安全测试的PoC工具集,帮助安全人员验证Intent注入、Deep Link、任务劫持等移动端漏洞,无需Root权限即可在真机上运行。
Stars: 135 | Forks: 36
# 恶意软件 APK
作为漏洞赏金猎人,你的漏洞赏金报告是否因为未使用“恶意”的概念验证 应用程序来利用漏洞而被拒绝?
作为安全工程师,你是否在验证漏洞赏金报告、执行回归测试和进行渗透测试方面感到困难?
我已经为你准备好了——所有这些都可以在你自己的设备上舒适地完成!
**注意:这是一个测试/利用工具,而不是漏洞扫描器。识别安全漏洞需要手动对 APK 进行逆向工程并审查代码。**
**注意:无需 Root 你的设备。**
使用 Android Studio v2025.2.3 (64-bit) (JDK 17) 构建,并在多个虚拟设备以及搭载 Android OS v13.0 (Tiramisu) 的三星 Galaxy Note S20 Ultra 物理设备上进行了测试。
[YouTube: Malware APK v5.0 - 代理 Intent 注入 PoC](https://youtube.com/shorts/hMcJ4JhPhnQ)
欲了解更多提示和技巧,请查看我的 [Android 渗透测试速查表](https://github.com/ivan-sincek/android-penetration-testing-cheat-sheet)。
为教育目的而制作。希望能对你有所帮助!
未来计划:
* 添加绑定到服务 的选项,
* 添加在测试 Intent Filter 时嵌套无限数量 Intent 的选项,
* 添加指定 Intent Category 的选项,
* 添加在 Intent Extras 中指定 `HashMap` 类型的选项,
* 添加在 Intent Extras 中指定 `null` 值的选项,
* 添加广播监控器以缓存和重放被拦截 Intent 的选项,
* 添加内容编码和解码部分,
* 添加带有搜索、复制和下载操作选项的日志工具栏,
* 添加项目模板以便轻松编译原生 `.so` 库用于任意代码执行 (RCE),
* 添加更多 UI 自定义选项。
## 目录
* [关于应用](#about-the-app)
* [使用说明](#usage)
* [文件系统](#file-system)
* [进程](#process)
* [枚举](#enumeration)
* [Intent](#intent)
* [广播监控器](#broadcast-monitor)
* [Web](#web)
* [任务劫持](#task-hijacking)
* [点击劫持](#tap-hijacking)
* [无障碍监控器](#accessibility-monitor)
* [通知监控器](#notification-monitor)
* [剪贴板](#clipboard)
* [状态管理器](#state-manager)
* [设置](#settings)
## 关于应用
版本:`5.5`
APK 名称:`Malware APK`
包名:`com.kira.malware`
最低 SDK:`29` (Android 10)
目标 SDK:`36` (Android 16)
导出的 Activity:
* `com.kira.malware.activities.MainActivity`
* `com.kira.malware.activities.HiddenActivity`
所需权限:
* `android.permission.READ_EXTERNAL_STORAGE`
* `android.permission.WRITE_EXTERNAL_STORAGE`
* `android.permission.QUERY_ALL_PACKAGES`
* `android.permission.INTERNET`
* `android.permission.SYSTEM_ALERT_WINDOW`
* `android.permission.BIND_ACCESSIBILITY_SERVICE`
* `android.permission.BIND_NOTIFICATION_LISTENER_SERVICE`
* `android.permission.POST_NOTIFICATIONS`
内部质量保证用的 URI:
* `kira://hidden`
* `content://com.kira.malware.TestFileProvider/files/test.txt`
* `content://com.kira.malware.TestSQLiteProvider`
* `javascript:alert(JavaScriptBridge.test())`
## 使用说明
### 文件系统
**#1:** 读取和修改另一个应用的文件。
**#2:** 读取另一个应用的全局可读共享首选项 - 由于应用 (UID) 沙箱机制,这不太可能成功。
**#3:** 要访问另一个应用的文件,请修改此应用 [AndroidManifest.xml](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/AndroidManifest.xml#L4) 中的 [sharedUserId](https://developer.android.com/guide/topics/manifest/manifest-element#uid),然后重新构建 APK - 这仅在另一个应用定义了共享用户 ID,并且两者都使用相同的代码签名证书签名时才有效。
```
**#4:** 列出系统或用户安装的包。

图 1 - 文件系统
### 进程 **#1:** 并非所有设备或 Root 工具都将 `su` (switch user) 二进制文件存储在同一位置。 **#2:** 运行 CLI 工具(如 `/system/bin/logcat`)或以用户 `/bin/sh` 或 Root `/bin/su` 权限启动反向 Shell。 **#3:** 应用 (UID) 沙箱机制可能会阻止你执行某些操作或访问另一个应用的目录。
图 2 - 运行 CLI 工具
### 枚举 **#1:** 读取另一个应用的 Manifest 文件。 **#2:** 列出另一个应用的受保护或导出组件。 **#3:** 通过在此应用的 `AndroidManifest.xml` 中声明,来请求另一个应用定义的自定义权限,然后重新构建 APK - 这仅在权限的保护级别不是 `signature` 时才有效。 ```
图 3 - 枚举 (1)

图 4 - 枚举 (2)
### Intent **#1:** 测试另一个应用的 Intent Filter。 **#2:** 向另一个应用发送 Intent 以直接绕过其生物识别/安全验证。 **#3:** 向另一个应用发送 Intent 以间接触发其推送通知管理器,从而绕过生物识别/安全验证,然后手动打开收到的推送通知。 **#4:** 向另一个应用发送 Intent 以污染其 Widget。 **#5:** 多次向另一个应用发送 [Pending] Intent 以导致拒绝服务。 **#6:** 向另一个应用发送可变的 Pending Intent 以提取随后添加的 Intent Extras。 **#7:** 通过利用应用的导出(代理)组件,访问受保护的组件,例如另一个应用的文件或 SQLite Content Provider。 **#8:** 测试另一个应用的 Deep Link。 **#9:** 通过在 Intent 的 URI 中添加 `` 占位符,对另一个应用的 Deep Link 或 Content Provider URI 发起强制攻击。 **#10:** 你可以将 Intent 发送到 `HiddenActivity` 进行检查,然后再将其发送到另一个应用。 **#11:** 通过 `../` 测试文件 Content Provider 的路径遍历,以及任意文件读取/写入。 **#12:** 通过 Projection 和 Selection 测试 SQLite Content Provider 的 SQL 注入。 Projection SQLi 示例: ``` * from sqlite_master-- ``` Selection SQLi 示例: ``` 1=1) OR 2=2-- ``` 以下内容仅适用于 `Proxy Intent` Extras: * 如果值是等于 `` 的字符串: * 整个值将被替换为 `target intent` 的 `PendingIntent` 对象, * 并将使用 `Intent.putParcelable()`。 * 如果值是等于 `` 的字符串: * 整个值将被替换为 `target intent` 的 `Intent` 对象, * 并将使用 `Intent.putParcelable()`。 * 如果值是包含 `` 的字符串: * 所有匹配的部分将被替换为 `target intent` 的 `Intent.toUri(Intent.URI_INTENT_SCHEME)`。 * 如果值是包含 `` 的字符串: * 所有匹配的部分将被替换为 `target intent` 的 `Intent.toUri(Intent.URI_ALLOW_UNSAFE)`。 * 如果值是等于 `` 的字符串: * 整个值将被替换为 `target intent extras` 的 `Bundle` 对象, * 并将使用 `Intent.putBundle()`。 以下内容适用于 `Proxy Intent` 和 `Target Intent` Extras,但仅当它们启动 [com.kira.malware.activities.HiddenActivity](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/java/com/kira/malware/activities/HiddenActivity.java) 时: * 要使用文件 Content Provider 读取回调: * 添加类型为 `string` 的 Intent Extra, * 键为 `HiddenActivity`, * 值为 ``。 * 要使用文件 Content Provider 写入回调: * 添加类型为 `array list` 的 Intent Extra, * 键为 `HiddenActivity`, * 值为 ``, * 以及必需的源文件。 * 要使用 SQLite Content Provider 查询回调: * 添加类型为 `string` 的 Intent Extra, * 键为 `HiddenActivity`, * 值为 ``。 * 要使用带有过滤功能的 SQLite Content Provider 查询回调: * 添加类型为 `array list` 的 Intent Extra, * 键为 `HiddenActivity`, * 值为 ``, * 以及可选的 Projection 和 Selection。 * 要在出错时自动关闭回调 Activity: * 添加类型为 `string` 的 Intent Extra, * 键为 `HiddenActivityClose`, * 值为 ``。 * 要在成功时自动关闭回调 Activity: * 添加类型为 `string` 的 Intent Extra, * 键为 `HiddenActivityClose`, * 值为 ``。 在测试代理 Intent 注入以访问私有数据时,你通常需要将 [com.kira.malware.activities.HiddenActivity](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/java/com/kira/malware/activities/HiddenActivity.java) 指定为 `target intent` 类名,并将文件或 SQLite Content Provider 的 Intent Extra 范围限定在同一个 `target intent` 中,如下图所示。
图 5 - Deep Link 模糊测试

图 6 - Pending Intent 注入 P1

图 7 - Pending Intent 注入 P2

图 8 - Intent 注入 P1

图 9 - Intent 注入 P2
### 广播监控器 **#1:** 监听来自另一个应用的广播 Intent 并从 Intent Extras 中提取敏感信息。
图 10 - 广播监控器
### Web **#1:** 验证配置错误的 Asset Link 是否允许 [App Link](https://developer.android.com/training/app-links/verify-applinks) 劫持 - 这仅适用于带有 `autoVerify` 属性的 Intent Filter。 **#2:** 通过在此应用的 `AndroidManifest.xml` 中的 [HiddenActivity](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/AndroidManifest.xml#L66) 下指定另一个应用的 Deep Link 来劫持该链接,然后重新构建 APK。 ``` ``` **#3:** 从网站发起 Deep Link 回调以劫持另一个应用的流程。 **#4:** 利用现有的 Web 浏览器会话劫持另一个应用的已验证流程。 **#5:** 劫持 `OAuth` 流程并通过自动化剩余步骤来完成它。 **#6:** 从 Deep Link 或响应正文中提取的所有值都经过 URL 解码,并且仅在插入到另一个请求的 URL 查询字符串(`?` 之后)时才进行 URL 编码。 **每次启动应用时,请确保打开 `Web` 部分以激活 Deep Link 回调流程。**
图 11 - Web

图 12 - Deep Link 回调
### 任务劫持 **#1:** 无法在运行时更改任务亲和性。 **#2:** 要劫持另一个应用的任务,请修改此应用的 `AndroidManifest.xml` 中 [MainActivity](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/AndroidManifest.xml#L48) 下的任务亲和性,然后重新构建 APK。 在[这里](https://developer.android.com/privacy-and-security/risks/strandhogg)阅读更多关于任务劫持 的内容。
图 13 - 任务劫持
### 点击劫持 **#1:** 测试另一个应用是否可以检测到覆盖层。 **#2:** 通过检查 [MotionEvent.FLAG_WINDOW_IS_OBSCURED 和 MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED](https://github.com/ivan-sincek/malware-apk/blob/main/src/Malware/app/src/main/java/com/kira/malware/fragments/TapHijackingFragment.java#L35) 标志来检测覆盖层 - 此解决方案仅适用于较旧的 Android 版本。 在[这里](https://developer.android.com/privacy-and-security/risks/tapjacking)阅读更多关于点击劫持 的内容。
图 14 - 点击劫持
### 无障碍监控器 **#1:** 通过滥用无障碍服务从另一个应用的 UI 中提取敏感信息。 在[这里](https://developer.android.com/reference/android/view/View#attr_android:importantForAccessibility)阅读更多关于该解决方案的内容。
图 15 - 无障碍监控器
### 通知监控器 **#1:** 通过滥用通知服务从另一个应用的推送通知中提取敏感信息。
图 16 - 通知监控器
### 剪贴板 **#1:** 设置剪贴板。 **#2:** 转储剪贴板并查找敏感信息。
图 17 - 剪贴板
### 状态管理器 **#1:** 随时保存和加载 UI 状态。 **#2:** 下载 UI 状态文件并与他人共享,并随时上传他人共享的 UI 状态文件。
图 18 - 管理器
### 设置 **#1:** 额外的系统控制和 UI 自定义。 **#2:** 生物识别解锁提示仅在启动时出现一次。清除所有任务以完全退出应用并重新启用它。
图 19 - 设置
标签:Android 13, Android安全, APK测试, Bug Bounty, DAST, Intent注入, JS文件枚举, RCE验证, Security Engineer, XML 请求, 云资产清单, 任务劫持, 内容提供者, 协议分析, 可自定义解析器, 域名枚举, 安全决策支持, 安全开发, 广播监控, 恶意软件分析, 权限提升, 目录枚举, 移动安全, 逆向工程