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, 云资产清单, 内存分配, 取证, 后渗透, 威胁检测, 安全防御评估, 恶意软件分析, 持久性检测, 无后门, 无线安全, 终端安全, 网络安全审计, 网络流量捕获, 自动化分析, 自动化编排, 请求拦截, 跨站脚本, 远程执行, 逆向工具, 逆向工程