danieloz147/ios-profile-builder
GitHub: danieloz147/ios-profile-builder
一款基于浏览器的 Apple .mobileconfig 配置描述文件可视化构建与分析工具,专为安全攻防研究和 MDM 实验场景设计。
Stars: 1 | Forks: 0
# ios-profile-builder
一个基于浏览器的工具,用于组装 Apple **`.mobileconfig`** 配置描述文件 —— 无需手动编写 XML。
专为安全攻防研究、MDM 实验室测试和描述文件原型设计而构建。完全离线运行。零遥测,零外部连接。
## 功能说明
Apple 配置描述文件是 XML property list(属性列表),用于将设置、证书、Web Clip 和 MDM 注册推送到 iOS / iPadOS / macOS 设备。手动编写它们意味着要费力处理 UUID、plist schema 和 CMS 签名。此工具用一个浏览器表单取代了所有这些工作,能够一次性生成结构正确的 `.mobileconfig`。
### 支持的 payload 类型
| Payload | 类型标识符 |
|---|---|
| Web Clip(主屏幕快捷方式) | `com.apple.webClip.managed` |
| Wi-Fi | `com.apple.wifi.managed` |
| VPN | `com.apple.vpn.managed` |
| 受信任的根 CA(PEM 或 DER) | `com.apple.security.root` |
| MDM 注册 | `com.apple.mdm` |
| 自定义(原始 plist 片段) | any |
每个描述文件中每种类型最多可包含 10 个实例。空部分会被自动跳过。
### 附加功能
- **描述文件元数据** —— DisplayName、Identifier、Organization、Description、ConsentText。
- **自动生成的 UUID** —— 每次构建时,每个 payload 和描述文件根节点都会获取新的 UUID4。
- **可选的 CMS 签名** —— 附加 `.p12` / `.pfx` 和密码;该工具使用 `openssl smime` 进行签名。签名状态会在 `X-Profile-Signing-Status` 响应头中返回。不签名也可以使用 —— 在大多数实验室/研究环境中,未签名的描述文件可以正常安装。
- **Payload 参考抽屉** —— 提供针对每种常见 payload 类型的 UI 内参考,包括风险、仅限受监管设备的限制以及攻击场景。
- **预定义模板** —— 仅包含 Web Clip、根 CA、完整 MDM 注册。
- **导入与分析** —— 上传任何现有的 `.mobileconfig` 以检查其内容:描述文件元数据、带有风险评级的每个 payload 的详细分解,以及自动检测危险的 payload 组合(完全中间人攻击、设备接管、钓鱼应用等)。
## 环境要求
- Python 3.8+
- `pip install -r requirements.txt`(Flask + Werkzeug)
- PATH 中包含 `openssl` 用于签名(可选)
## 安装与运行
### Linux / macOS
```
git clone https://github.com/YOUR_USERNAME/ios-profile-builder
cd ios-profile-builder
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python3 app.py
```
在浏览器中打开 **http://127.0.0.1:5000**。
### Windows
```
git clone https://github.com/YOUR_USERNAME/ios-profile-builder
cd ios-profile-builder
python -m venv venv && venv\Scripts\activate
pip install -r requirements.txt
python app.py
```
Windows 版的 `openssl` 随 Git for Windows 一起提供,位于 `C:\Program Files\Git\usr\bin\openssl.exe`。
## 命令行参数
```
python3 app.py [--host HOST] [--port PORT] [--debug]
```
| 参数 | 默认值 | 描述 |
|---|---|---|
| `--host` | `127.0.0.1` | 绑定地址。供本地使用时请保持在 loopback。 |
| `--port` | `5000` | TCP 端口。 |
| `--debug` | off | Flask 调试模式(仅限开发环境)。 |
## 使用方法
1. 启动服务器并打开 `http://127.0.0.1:5000`。
2. 可选择从顶部栏中挑选一个模板。
3. 填写描述文件元数据以及您需要的任意 payload 部分。
4. 如果需要经过 CMS 签名的输出,请附加 `.p12` 文件及密码。
5. 点击 **Build & download** —— 浏览器将接收到 `.mobileconfig` 文件。
6. 在浏览器的“网络”选项卡中检查 `X-Profile-Signing-Status`,以确认状态是 `signed` 还是 `unsigned`。
### 导入并分析现有描述文件
在模板栏中点击 **📂 Import**,并选择任意 `.mobileconfig` 文件。侧边抽屉将随以下内容打开:
- 描述文件元数据(DisplayName、Identifier、Organization、Description)
- 每个 payload 的详细分解:风险标签(CRITICAL / HIGH / MEDIUM / INFO)、类型标识符以及关键字段值
- **攻击组合检测** —— 自动标记危险的组合,例如完全中间人攻击(Root CA + Wi-Fi + VPN)、设备接管(MDM + Root CA + VPN)、钓鱼应用(WebClip + Root CA)等
关闭抽屉后,点击 **📊 Last Import**(首次导入后会出现在模板栏中)即可重新打开上次的分析结果,无需重新上传。
### 通过 HTTPS 暴露(Cloudflare Quick Tunnel)
iOS 要求通过 HTTPS 才能安装从远程主机提供的描述文件。供实验室使用:
```
# 安装一次 cloudflared:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/
python3 app.py --host 0.0.0.0 &
cloudflared tunnel --url http://localhost:5000
```
隧道会打印一个临时的 HTTPS URL,您可以将其分享给测试设备。
## 安全设计
| 领域 | 实现方式 |
|---|---|
| 输入处理 | 所有表单字段均被视为不受信任的数据。值仅通过 `plistlib` 进行处理 —— 绝不执行或解释。 |
| 自定义 plist | 在合并前进行解析和验证;格式错误的输入 → 返回 400 错误,而不会导致崩溃。 |
| 文件上传上限 | 通过 Flask `MAX_CONTENT_LENGTH` 设置 8 MB 的硬性限制。 |
| 签名错误 | `openssl` 的 stderr 仅在服务器端记录;响应头返回通用的状态字符串(无路径泄漏)。 |
| 临时文件 | 在全新的 `tempfile.mkdtemp` 目录中创建,并在响应后立即通过 `shutil.rmtree` 删除。 |
| 文件名清理 | 输出文件名在用于 `Content-Disposition` 之前,会通过 `os.path.basename` + 字母数字白名单进行剥离。 |
| 安全标头 | 每个响应都带有 `X-Content-Type-Options`、`X-Frame-Options: DENY`、`Referrer-Policy` 和 `Content-Security-Policy`。 |
## 本工具不做的事情
- **在目标设备上没有任何持久化**行为,仅限于描述文件本身。它构建的是一个 `.mobileconfig`;安装它是标准的 Apple 用户同意流程。
- **没有 C2,没有回调,没有 beaconing。** 生成的描述文件仅包含您配置的 payload。
- **不生成证书。** 它只是封装您提供的根 CA;它不会自行签发。
- **不进行漏洞利用。** 它不会绕过 MDM 信任提示、用户同意屏幕或设备安全控制。
- **无身份验证,不支持多用户。** 绑定到 loopback。这是一个本地构建工具,而不是经过严格安全加固的 Web 服务。
## 测试
```
pip install pytest
pytest -q
```
包含 17 个测试,离线运行,无需网络访问。
## 项目结构
```
ios-profile-builder/
├── app.py # Flask app + payload builders + signing
├── requirements.txt
├── README.md
├── templates/
│ └── index.html # single-page UI (vanilla JS, no bundler)
├── static/ # logo / branding (not tracked in git)
└── tests/
└── test_app.py # pytest suite
```
## 许可证
MIT
标签:CVE, MDM, 后端开发, 安全测试工具, 安全研究工具, 数字签名, 苹果配置文件, 足迹探测, 逆向工具, 配置生成器