zixuantemp/MacVM-MCP
GitHub: zixuantemp/MacVM-MCP
一个基于 MCP 的 macOS 远程取证分析平台,通过 SSH 自动化执行多阶段安全评估。
Stars: 0 | Forks: 0
# MacVM-MCP — macOS 分析 MCP 服务器
一个用于 macOS 安全研究与恶意软件分析的模型上下文协议(MCP)服务器。
通过 SSH 连接到 macOS 机器,并提供 40+ 工具、4 个复合剧本、5 个提示词和 5 个资源,实现端到端的 macOS 威胁分级分析。
## 快速安装
**一键安装(交互式):**
```
git clone https://github.com/zixuantemp/MacVM-MCP && cd MacVM-MCP && bash install.sh
```
**pip:**
```
pip install -e .
cp config.json.example config.json && $EDITOR config.json
macvm-mcp # console script (project.scripts)
```
**Docker:**
```
docker build -t macvm-mcp .
docker run -i --rm -v $PWD/config.json:/app/config.json:ro macvm-mcp
```
`install.sh` 脚本会创建虚拟环境,提示输入 SSH 主机/用户/密钥,生成 `config.json`,测试连接,并输出可直接粘贴的 MCP 客户端代码片段。
## 复合剧本(自动化分析)
四个一次性工具,可运行完整工作流并返回结构化的 Markdown 报告:
| 工具 | 功能 |
|------|------|
| `triage_full` | 哈希 + Mach-O + 安全字符串 + 签名 + 权限 + 隔离 + Gatekeeper |
| `behavioral_full` | 持久化基线 → tcpdump + fs_usage → 执行 → 持久化差异 → IOCs |
| `app_bundle_full_audit` | Info.plist、签名、权限、辅助程序、动态库、每个捆绑二进制文件的哈希 |
| `incident_response_scan` | 持久化 + 内核扩展 + TCC + SIP + 实时网络 + 可疑进程 + 过滤器 |
## MCP 能力
**提示词(5 个)**:`triage_macos_sample`、`analyze_app_bundle`、`mac_persistence_check`、`mac_incident_response`、`pkg_installer_audit`。
**资源(5 个)**:
- `mac://system/info` — 目标实时快照
- `mac://persistence/locations` — 所有 macOS 持久化路径
- `mac://docs/cheatsheet` — 常见 macOS 分析命令
- `mac://docs/frida-snippets` — 可直接使用的 NSURLSession/CommonCrypto/NSTask 等 JS 钩子
- `mac://status/connection` — 当前 SSH 状态
**技能(3 个)**:可添加到 Claude Code 配置的 `skills/` 下 — `triage-macos-malware`、`audit-app-bundle`、`macos-incident-response`。
## 安全改进(1.0)
本版本修复了三个关键问题 — 详见 [`SECURITY.md`](SECURITY.md)。
1. **约 30 个位置的 Shell 注入**(每个使用用户可控路径/过滤/模式进行字符串插值的 f-string)— 通过基于 `shlex.quote` 的 `_sh()` 辅助函数修复。
2. **Sudo 密码泄露** — `echo '' | sudo -S` 会在 `ps` 中暴露密码。改用通过 stdin 传递的 `sudo -S -p ''`。
3. **TOFU 主机密钥信任** — 将 `paramiko.AutoAddPolicy` 替换为 `RejectPolicy`;遵循 `~/.ssh/known_hosts`。如需首次设置,请设置 `MAC_SSH_AUTO_ADD_HOSTKEY=1`。
**建议:** 使用 SSH 密钥认证。在 `config.json` 中将 `password` 设为 `null` 并配置 `key_file`。如必须使用密码,优先使用 `MAC_SSH_PASSWORD` 环境变量,而非将其提交到磁盘。
## 架构
```
Kali Linux (Claude Code)
│
│ SSH (paramiko)
▼
macOS 14/15/26 target
├── Static analysis (otool, codesign, strings)
├── Behavioral analysis (fs_usage, dtrace)
├── Network monitoring (tcpdump, lsof)
├── Persistence (launchctl, plist)
├── Security (SIP, TCC, Gatekeeper)
└── Dynamic (Frida, LLDB)
```
## 设置
### 1. 配置 SSH 访问
复制并编辑配置:
```
cp config.json.example config.json
```
编辑 `config.json`:
```
{
"ssh": {
"host": "192.168.1.100",
"port": 22,
"username": "analyst",
"password": "yourpassword",
"key_file": "~/.ssh/id_rsa"
},
"remote_work_dir": "/tmp/macmcp",
"local_work_dir": "/home/kali/Desktop/analysis"
}
```
或使用环境变量:
```
export MAC_SSH_HOST=192.168.1.100
export MAC_SSH_USER=analyst
export MAC_SSH_PASSWORD=yourpassword
export MAC_SSH_KEY=~/.ssh/id_rsa
```
### 2. macOS 目标要求
- 已启用 SSH:`系统设置 → 通用 → 共享 → 远程登录`
- 完整功能所需(部分工具需要 sudo):
# 在 macOS 目标上,允许分析用户免密 sudo:
echo "analyst ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/analyst
- 可选:安装 Frida 以进行动态分析:
pip3 install frida-tools
### 3. 注册到 Claude Code
添加到 `~/.claude/claude_desktop_config.json`(或当前活动的 MCP 配置):
```
{
"mcpServers": {
"macmcp": {
"command": "/home/kali/Desktop/venv/bin/python3",
"args": ["/home/kali/Desktop/MacMCP/server.py"],
"env": {
"MACMCP_CONFIG": "/home/kali/Desktop/MacMCP/config.json"
}
}
}
}
```
## 工具参考
### 连接与文件传输
| 工具 | 描述 |
|------|------|
| `check_connection` | 验证 SSH 并显示操作系统版本。**请始终首先调用。** |
| `upload_file` | 从 Kali 复制文件到 macOS |
| `download_file` | 从 macOS 复制文件到 Kali |
### 基础系统
| 工具 | 描述 |
|------|------|
| `execute_bash` | 运行任意 bash 命令(可选 sudo) |
| `read_file` | 读取远程文件内容 |
| `get_file_hash` | MD5 + SHA1 + SHA256 |
| `list_processes` | 带可选过滤器的 `ps aux` |
| `get_system_info` | 软件版本、硬件、SIP、启动参数 |
### 静态分析
| 工具 | 描述 |
|------|------|
| `analyze_macho` | Mach-O 头、加载命令、符号 |
| `extract_strings` | 字符串提取(支持可选正则过滤) |
| `analyze_code_signing` | 证书、团队 ID、公证信息 |
| `get_entitlements` | 权限 plist |
| `analyze_dylibs` | 关联的动态库(`otool -L`) |
| `get_quarantine_info` | com.apple.quarantine 扩展属性 |
| `check_gatekeeper` | `spctl` 评估 |
| `disassemble_function` | `otool -tV` 反汇编 |
### 行为分析
| 工具 | 描述 |
|------|------|
| `execute_with_monitoring` | **一体化**:运行二进制文件 + 文件系统监控 + 网络捕获 |
| `fs_usage_monitor` | 通过 `fs_usage` 进行文件系统活动监控 |
| `dtrace_trace` | DTrace 单行命令或脚本 |
### 网络分析
| 工具 | 描述 |
|------|------|
| `monitor_network_realtime` | 通过 `lsof -i` 实时监控连接 |
| `tcpdump_start` | 启动数据包捕获(后台) |
| `tcpdump_stop` | 停止捕获并汇总(可选下载) |
### 持久化
| 工具 | 描述 |
|------|------|
| `check_persistence` | **全面**:所有持久化位置 |
| `list_launch_agents` | LaunchAgents 与 LaunchDaemons |
| `analyze_plist` | 以可读形式解析任意 plist |
| `list_login_items` | 通过 osascript 获取登录项 |
### macOS 安全功能
| 工具 | 描述 |
|------|------|
| `check_sip_status` | SIP 与认证根状态 |
| `check_tcc_permissions` | TCC 数据库:应用权限授权 |
| `list_kernel_extensions` | 内核扩展与系统扩展 |
| `check_network_filters` | 网络扩展提供者 |
### 动态分析
| 工具 | 描述 |
|------|------|
| `frida_list_processes` | 可注入 Frida 的进程列表 |
| `frida_run_script` | 使用 JS 注入运行中的进程 |
| `frida_spawn_and_attach` | 启动并附加进行注入 |
| `inspect_process` | 进程的 lsof + vmmap + ps |
| `dump_process_memory` | `gcore` 内存转储 |
| `lldb_run_commands` | 在二进制文件/进程上执行 LLDB 命令 |
### 应用分析
| 工具 | 描述 |
|------|------|
| `analyze_app_bundle` | 完整的 .app 包分析 |
| `analyze_pkg_installer` | .pkg 内容与脚本及签名 |
| `take_screenshot` | 截图并下载到 Kali |
## 工作流示例
### 快速分级
```
1. check_connection
2. upload_file (sample)
3. get_file_hash (sample)
4. analyze_macho (sample)
5. extract_strings (sample, filter_pattern="http|flag|key|password")
6. analyze_code_signing (sample)
```
### 行为分析
```
1. upload_file (sample)
2. check_persistence ← baseline
3. execute_with_monitoring (sample, duration=30)
4. check_persistence ← diff for new entries
```
### .app 包
```
1. upload_file (MyApp.app → /tmp/macmcp/MyApp.app)
2. analyze_app_bundle (/tmp/macmcp/MyApp.app)
3. extract_strings (main binary)
4. check_gatekeeper (/tmp/macmcp/MyApp.app)
```
### 网络 IOC 提取
```
1. tcpdump_start (interface=en0)
2. execute_bash (run the sample)
3. sleep 30
4. tcpdump_stop (download_to=/home/kali/Desktop/analysis/capture.pcap)
```
### Frida API 挂钩
```
// Hook NSURLSession to capture network requests
Interceptor.attach(
ObjC.classes.NSURLSession['- dataTaskWithRequest:completionHandler:'].implementation, {
onEnter(args) {
const request = new ObjC.Object(args[2]);
console.log('[NSURLSession]', request.URL().absoluteString());
}
});
```
## macOS 与 FlareVM 对比
| FlareVM 工具 | MacMCP 等效工具 |
|---|---|
| `check_connection` (WinRM) | `check_connection` (SSH) |
| `execute_powershell` | `execute_bash` |
| `get_file_hash` | `get_file_hash` |
| `die_analyze` | `analyze_macho` + `extract_strings` |
| `capa_analyze` | `analyze_code_signing` + `analyze_macho` |
| `floss_extract_strings` | `extract_strings` |
| `procmon_start/stop` | `fs_usage_monitor` + `dtrace_trace` |
| `fakenet_start/stop` | `tcpdump_start/stop` |
| `regshot_snapshot` | `check_persistence` (前后对比) |
| `autoruns_analyze` | `list_launch_agents` + `check_persistence` |
| `execute_with_monitoring` | `execute_with_monitoring` |
| `frida_run_script` | `frida_run_script` |
| `x64dbg_load` | `lldb_run_commands` |
| `process_hacker_info` | `inspect_process` |
| `take_screenshot` | `take_screenshot` |
## 许可证
MIT — 详见 [LICENSE](LICENSE)。
**最后更新**:2026-04-17
**版本**:1.0.0
标签:AMSI绕过, Claude, CSV导出, CVE检测, DAST, Docker, HTTP工具, IOC, IP 地址批量处理, macOS分析工具, macOS取证, macOS安全工具, macOS恶意软件, macOS持久性, macOS行为监控, MCP, Model Context Protocol, Python, SSH, 云资产清单, 内存分配, 取证, 后渗透, 威胁检测, 安全防御评估, 恶意软件分析, 持久性检测, 无后门, 无线安全, 终端安全, 网络安全审计, 网络流量捕获, 自动化分析, 自动化编排, 请求拦截, 跨站脚本, 远程执行, 逆向工具, 逆向工程