Clock-Skew/Cyrus
GitHub: Clock-Skew/Cyrus
将 Metasploit 反弹 shell payload 自动注入第三方 Android APK 的模块化 Bash 工作流。
Stars: 10 | Forks: 2
# Cyrus

[](https://www.gnu.org/software/bash/)
[](https://www.linux.org/)
[](https://developer.android.com/)
[](https://apktool.org/)
[](https://www.metasploit.com/)
[](https://openjdk.org/)
**Cyrus** 是一个基于 Linux 的 Android APK 安全实验工作流,用于授权测试和研究。它将一系列常见的 Android 评估任务封装到一个菜单驱动的 Bash 界面中:反编译 APK,生成受控的 Android Meterpreter payload,将 payload 组件合并到反编译的 APK 中,重新构建未签名的工件,并启动匹配的 Metasploit handler。
该项目有意保持小巧且便于审查。每个主要操作都位于 `modules/` 下的独立 shell 模块中,因此工作流可以被审计、修改或分步运行,而不会隐藏底层工具的使用情况。
## 目录
- [Cyrus 的功能](#what-cyrus-does)
- [安全与授权](#safety-and-authorization)
- [仓库结构](#repository-layout)
- [工作流如何协同工作](#how-the-workflow-fits-together)
- [要求](#requirements)
- [设置](#setup)
- [用法](#usage)
- [输出](#outputs)
- [为重新构建的 APK 签名](#signing-the-rebuilt-apk)
- [网络与 Handler 说明](#network-and-handler-notes)
- [故障排除](#troubleshooting)
- [当前限制](#current-limitations)
- [致谢](#credits)
## Cyrus 的功能
Cyrus 自动化了授权的 Android APK payload 实验中重复的机械操作:
- 扫描 `APPS/` 中的 APK 文件,并使用 `apktool` 反编译选定的目标。
- 使用操作者提供的 `LHOST` 和 `LPORT` 值生成 Metasploit Android payload APK。
- 反编译生成的 payload,并将 `com/metasploit/stage` smali 包复制到目标 APK 树中。
- 当 payload manifest 中的权限不存在于目标 manifest 时,将其合并到目标 manifest 中。
- 将 payload 服务和启动接收器组件添加到目标 manifest 中。
- 尝试修补目标启动器 activity,以便在找到兼容的 smali 结构时,从 `onCreate()` 启动 payload 服务。
- 可选择将 payload 包从 `com/metasploit` 重命名为经过验证的 `com/` 命名空间。
- 将修改后的 APK 重新构建到 `output/unsigned.apk`。
- 从菜单中启动匹配的 Metasploit multi-handler。
- 提供清理操作以重置生成的输出。
Cyrus **不**会签名 APK、安装 Android 平台工具、安装 Metasploit、安装 `apktool`、生成 keystore,也不保证 payload 能在所有 Android 版本或应用结构上执行。
## 安全与授权
仅在您可以明确证明已获授权的环境中 Cyrus:
- 个人实验室设备
- 内部拥有的测试应用程序
- 培训靶场
- 经授权的渗透测试
- 漏洞赏金目标(确切的测试活动在范围内且被允许)
在使用 Cyrus 之前,请确认:
- APK 和设备归您所有或已明确批准用于测试
- Android 设备与 handler 之间的网络路径已获授权
- 生成的工件不会在测试环境之外分发
- 任何发现均通过适当的内部、客户或程序流程进行报告
本仓库仅用于教育和防御性安全研究。您有责任遵守当地法律、程序规则、客户协议和平台政策。
## 仓库结构
```
Cyrus/
├── APPS/ # User-created input directory for test APKs
├── output/ # Generated working directory, rebuilt artifacts, payload files
├── modules/
│ ├── decompile.sh # APK selection and apktool decompile step
│ ├── generate_payload.sh # msfvenom Android payload generation
│ ├── inject.sh # smali copy, manifest merge, launcher hook attempt
│ ├── encode.sh # package rename / smali namespace rewrite
│ ├── rebuild.sh # apktool rebuild to output/unsigned.apk
│ ├── metasploit.sh # Metasploit handler launch
│ ├── cleanup.sh # output directory reset
│ ├── antivirus_killer.sh # legacy/experimental module, not loaded by cyrus.sh
│ └── obfuscapk.sh # local Obfuscapk integration draft, not loaded by cyrus.sh
├── cyrus.sh # Main interactive menu
├── Con2.gif # Demo animation retained for the project README
├── preview.png # Static preview asset
└── Screenshot From 2025-10-09 12-27-13.png
```
在刚克隆的仓库中可能不存在 `APPS/` 和 `output/`。Cyrus 会自动创建 `output/`。当您准备好添加实验 APK 时,请创建 `APPS/`。
## 工作流如何协同工作
Cyrus 是对成熟外部工具的封装,而不是自定义的 Android 构建系统。
| 阶段 | 菜单操作 | 主模块 | 主要外部工具 | 结果 |
| --- | --- | --- | --- | --- |
| 1 | 反编译 APK | `modules/decompile.sh` | `apktool` | 目标 APK 解压至 `output/decompiled_apk/` |
| 2 | 生成 Payload | `modules/generate_payload.sh` | `msfvenom` | Payload APK 写入 `output/payload.apk` |
| 3 | 注入 Payload | `modules/inject.sh` | `apktool`, shell 工具 | Payload smali 和 manifest 条目合并至目标树 |
| 4 | 混淆 Payload | `modules/encode.sh` | shell 工具 | `com/metasploit` 引用重命名为 `com/` |
| 5 | 重新构建 APK | `modules/rebuild.sh` | `apktool`, Java 运行时 | 未签名的 APK 写入 `output/unsigned.apk` |
| 6 | 启动 Metasploit | `modules/metasploit.sh` | `msfconsole` | 启动使用选定的主机/端口的匹配 handler |
| 7 | 清理 | `modules/cleanup.sh` | shell 工具 | 删除并重新创建生成的输出 |
该工作流有意设计为顺序执行。除非您正在调试特定阶段,否则请按顺序运行这些步骤。
## 要求
Cyrus 专为 Linux 环境(例如 Kali、Debian、Ubuntu 或类似发行版)设计。
必需的命令行工具:
- `bash`
- `apktool`
- `java`
- `msfvenom`
- `msfconsole`
- `find`、`awk`、`sed`、`grep`、`cp`、`mv` 以及标准的 GNU/Linux shell 实用工具
推荐的运行时版本:
- OpenJDK 11 或 17
- Kali/Debian 当前打包的 Metasploit Framework
- Apktool 2.8.x 或更新版本
验证您的环境:
```
apktool -version
java -version
msfvenom --version
msfconsole --version
```
## 设置
克隆仓库:
```
git clone git@github.com:Clock-Skew/Cyrus.git
cd Cyrus
```
如果需要,使启动器可执行:
```
chmod +x cyrus.sh
```
为实验 APK 创建输入目录:
```
mkdir -p APPS
```
将授权的测试 APK 放入 `APPS/`。
启动 Cyrus:
```
./cyrus.sh
```
## 用法
从上到下使用菜单:
1. `反编译 APK`
2. `生成 Payload`
3. `注入 Payload`
4. `混淆 Payload (smali 重命名)`
5. `重新构建 APK (未签名)`
6. `启动 Metasploit`
7. `清理`
8. `退出`
推荐的操作者流程:
1. 将一个已授权的 APK 添加到 `APPS/`。
2. 运行 `./cyrus.sh`。
3. 反编译该 APK 并确认已创建 `output/decompiled_apk/`。
4. 使用设备可访问的 `LHOST` 和选定的 `LPORT` 生成 payload。
5. 将 payload 注入到反编译的 APK 中。
6. 可选择使用小写后缀(例如 `cyrus_lab`)重命名 payload 包。
7. 重新构建 APK。
8. 使用您自己的签名工作流对生成的 `output/unsigned.apk` 进行签名。
9. 启动 handler,仅在授权环境中进行测试。
## 输出
常见生成路径:
```
output/
├── decompiled_apk/ # Decompiled target APK tree
├── payload.apk # Generated Android payload APK
├── payload_smali/ # Decompiled payload APK tree
└── unsigned.apk # Rebuilt unsigned target APK
```
生成的输出是一次性的。使用清理菜单选项可以在全新运行之前重置工作区。
## 为重新构建的 APK 签名
Cyrus 在生成 `output/unsigned.apk` 后停止。Android 通常在安装前需要已签名的 APK。
使用适合您实验的签名工作流。如果工具和 keystore 已存在,示例命令如下:
```
apksigner sign --ks debug.keystore --ks-key-alias androiddebugkey \
--ks-pass pass:android --key-pass pass:android output/unsigned.apk
apksigner verify output/unsigned.apk
```
传统的 `jarsigner` 工作流可能在较旧的测试条件下有效,但 `apksigner` 是首选的 Android 签名工具。
## 网络与 Handler 说明
生成的 payload 和 handler 之间的 `LHOST` 和 `LPORT` 必须一致。
对于局域网内测试:
- 使用主机的局域网 IP 作为 payload 的 `LHOST`
- 在启动 Metasploit handler 时使用相同的 `LPORT`
- 确认 Android 测试设备能在该端口访问主机
对于路由或 VPN 实验测试:
- 使用 Android 测试设备从其网络位置可以访问的地址
- 考虑防火墙规则、NAT、VPN 路由和端口转发
- 如果 payload 回调地址发生更改,请重新生成 payload
保持 handler 的暴露范围尽可能小,测试结束后不要让监听器继续运行。
## 故障排除
### 没有列出 APK
创建 `APPS/` 并在其中至少放置一个 `.apk` 文件。
```
mkdir -p APPS
```
### 依赖检查失败
在继续之前安装或修复缺失的工具。Cyrus 会在启动期间报告缺失的 `apktool`、`msfvenom` 或 `java`,但不会为您安装软件包。
### 注入失败,因为 payload 文件缺失
按顺序运行步骤。`注入 Payload` 需要:
- `output/decompiled_apk/AndroidManifest.xml`
- `output/payload.apk`
### 因 manifest 错误导致重新构建失败
从干净的输出树开始并重新运行工作流。XML 合并问题通常是由不兼容的 manifest 状态或之前的部分运行引起的。
### 包重命名后因 smali 错误导致重新构建失败
使用安全的包后缀:
- 小写字母
- 数字
- 下划线
- 不能以数字开头
示例:`cyrus_lab`
### Handler 启动但没有出现会话
请检查:
- 从 Android 测试设备可以访问 payload 的 `LHOST`
- payload 的 `LPORT` 与 handler 端口匹配
- 主机防火墙允许所选端口上的入站流量
- 应用在安装后已启动
- 测试设备和主机处于预期的网络路径上
## 当前限制
- Cyrus 不会为重新构建的 APK 签名。
- Cyrus 不安装依赖项。
- Cyrus 不保证与每个 APK、Android 版本、资源表或启动器 activity 结构兼容。
- 启动器自动启动补丁有意跳过某些 smali 模式,而不是强行进行不安全的编辑。
- `antivirus_killer.sh` 是旧版/实验性的,且未被 `cyrus.sh` 加载。
- `obfuscapk.sh` 是一个带有机器特定路径的本地集成草稿,且未被 `cyrus.sh` 加载。
- 目前未包含正式的自动化测试套件。
## 开发说明
该项目是刻意保持简单的 Bash 脚本。在进行更改时:
- 保持模块小巧可读
- 保留清晰的前置条件检查
- 避免隐藏有助于故障排除的工具输出
- 将生成的文件保留在 `output/` 下
- 避免提交 APK、payload、keystore、私人客户端文件或生成的工件
提交前有用的检查:
```
bash -n cyrus.sh modules/*.sh
git status --short
```
## 致谢
- 灵感来源于 dana-at-cp 的 [`backdoor-apk`](https://github.com/dana-at-cp/backdoor-apk)。
- 建立在 iBotPeaches 及其贡献者的 [Apktool](https://apktool.org/) 之上。
- 使用了 Rapid7 和社区的 [Metasploit Framework](https://www.metasploit.com/) 工具。
- 感谢更广泛的 Android 逆向工程和安全研究生态系统。
## 许可证
目前未包含许可证文件。在添加许可证之前,默认保留所有权利。
标签:Android安全, Apktool, APK反编译, APK渗透, Cyrus, JS文件枚举, Linux工具, Meterpreter, Shell脚本, 云资产清单, 反取证, 后门生成, 嗅探欺骗, 安全评估, 应用安全, 数据展示, 权限维持, 目录枚举, 移动安全, 移动端后门, 端口探测, 红队, 网络控制, 逆向工程