at0m-b0mb/MacRecon

GitHub: at0m-b0mb/MacRecon

MacRecon 是一款 macOS 只读信息收集与安全审计工具,通过 PyQt6 界面采集系统全貌并生成带评分和默认脱敏的可分享报告。

Stars: 2 | Forks: 0

MacRecon — macOS Information Gatherer

MacRecon — macOS 信息收集工具

一款现代化的 PyQt6 桌面应用,能够收集关于 Mac 几乎所有值得了解的信息 —— 系统、硬件、用户、网络、软件、持久化机制,以及内置的 安全审计 —— 并将其导出为清晰明了的 HTML、JSON 或文本 报告。
专为道德黑客、红队和蓝队设计,默认开启脱敏功能,确保报告可以安全分享。

Python PyQt6 macOS Cross Read-only License

## ✨ 概述 MacRecon 将关于你面前这台 Mac 的侦察级情报收集到一个精致的深色界面中, 标记出真正重要的配置错误,并一键生成可分享的报告。 **它执行的所有操作都是只读的。** 它永远不会更改设置、安装 任何内容,或向其他主机发送数据包。它只读取防御者 —— 或者已经攻陷该主机的攻击者 —— 会优先查看的状态。 ## 🛡 默认脱敏 —— 让报告能够安全分享的关键 从本质上讲,一份侦察报告就是一份标识机器身份的所有信息的列表。 这正是你想要记录在自己笔记里的内容,但也正是你**不**希望出现在 截图、幻灯片或客户附录中的内容。 MacRecon 会在所有地方掩藏这些具有标识性的值 —— 无论是在屏幕上还是在所有导出文件中 —— 除非你明确将其关闭: | 值 | 脱敏为 | 为什么采用这种形式 | |---|---|---| | 序列号 | `X7K•••••••` | 确认存在序列号但不泄露具体内容 | | 硬件 UUID / UDID | `••••••` | 不透明;精确锁定该设备 | | MAC 地址 | `a4:83:e7:xx:xx:xx` | 保留 **OUI**(告诉你这是 *Apple*,而不是 *哪一台 Mac*) | | 内网 IP | `192.168.x.x` | 保留 **子网布局**,隐藏具体主机 | | 公网 IP | `` | 没有保留的价值 | | 用户名 | `` | 在整个报告中保持一致,因此你仍然可以进行关联 | | Wi-Fi SSID | `` | 同上 —— “3个不同的网络”这种上下文得以保留 | | 电子邮件 | `••••••@corp.com` | 域名提供背景;而本地部分代表具体的人 | 此项设计基于以下两个原则: - **脱敏去除身份信息,但不破坏证据。** 一个被标记为 *“全局可写路径”* 的启动项仍然会向你展示 `/Users/Shared/.hidden/updater` —— 如果用一串点来代替,这个发现就毫无价值了。众所周知的名称(`root`、 `_windowserver`、`/Users/Shared`)被刻意**不进行**掩藏;它们 不标识任何人,掩藏它们只会破坏原有含义。 - **映射关系是稳定的。** 同一个用户在每一页上都是 ``,因此 “这三个进程属于同一个账户”的关联在脱敏后依然成立。 关闭该功能需要确认,窗口会重新渲染为琥珀色,并且导出的文件会被打上未脱敏的警告标记。

MacRecon dashboard

## 🚀 快速开始 ``` git clone https://github.com/at0m-b0mb/MacRecon.git cd MacRecon pip install -r requirements.txt python3 macrecon.py # GUI, redaction on ``` ### 其他运行方式 ``` python3 macrecon.py --demo # synthetic data — works on any OS python3 macrecon.py --no-redact # show real identifiers (asks first) python3 macrecon.py --cli # report straight to the terminal python3 macrecon.py --cli -o report.html python3 macrecon.py --cli -o report.json ``` MacRecon **默认以非特权模式运行**,并在其自身的审计中予以说明。少数 检查项(sudoers 内容、固件密码)需要 root 权限,在权限不足时将报告 *Unknown*,而不会进行猜测。如果你需要这些信息,请运行 `sudo python3 macrecon.py --cli` —— 但请先阅读源代码。永远不要仅仅听信他人的话就使用 root 身份运行安全工具,包括听从我的建议。 ## 📸 截图 | 安全审计 | 进程与持久化 | |---|---| | ![Audit](https://static.pigsec.cn/wp-content/uploads/repos/cas/02/02f18231f594e100f25e49c0d3fedce6ad516abc5982d9c3e4598ac9f3af762f.png) | ![Processes](https://static.pigsec.cn/wp-content/uploads/repos/cas/68/68bfd5275c3b6d3923a8a1c60eb9e36d121280dd63a597098711be335da16937.png) | | 系统 | 硬件 | |---|---| | ![System](https://static.pigsec.cn/wp-content/uploads/repos/cas/3e/3edc1237d7ad04a66fc61dc6e73ee653d85116d3f8d5b22943da8d7b8bda6495.png) | ![Hardware](https://static.pigsec.cn/wp-content/uploads/repos/cas/34/3462fa52d4140cdb2b82b18bbdb19adc444089b936f9618c3a4b446ed9880479.png) | | 用户 | 网络 | |---|---| | ![Users](https://static.pigsec.cn/wp-content/uploads/repos/cas/5a/5af8cfdccedcdb72ad810321eb3dff3c6b70458d7e30aa0493daa29cf200d615.png) | ![Network](https://static.pigsec.cn/wp-content/uploads/repos/cas/90/9054f9488ae45a9098b9ddd3d110584d0c5cc413a7a6f812f45b81ff1f206016.png) | | 软件 | | |---|---| | ![Software](https://static.pigsec.cn/wp-content/uploads/repos/cas/9f/9f1eb48ec548485730ebaa2090f0a7f3b2c6833396f255426809437a1651cd97.png) | | ## 🔍 收集的信息 ### 🖥 系统 macOS 版本、构建版本和营销代号 · kernel · 架构以及 Apple Silicon 与 Intel 的对比 · 电脑名称 / 本地主机名 / 主机名 · 启动时间和运行时间 · 自定义 `boot-args` · Rosetta 2 · 转译进程状态 · 时区和语言环境 · 完整的安全态势快照。 ### ⚙ 硬件 型号名称、标识符和编号 · 芯片、性能/能效核心分配 · 内存及实时的 `vm_stat` 明细 · 交换空间 · **序列号**、**硬件 UUID**、**配置 UDID** · Activation Lock · 启动 ROM · 每个卷的存储状态 · GPU 和连接的显示器 · 电池电量、循环次数、状态和健康度。 ### 👤 用户 包含 UID、真实姓名、shell 和主目录的每个账户 · **谁拥有管理员权限** · 服务主体 · 特权组成员身份(`admin`、`wheel`、 `com.apple.access_ssh`) · 活动会话 · 来自 `wtmp` 的登录历史 · **SSH 私钥,以及每个密钥是否设置了密码短语** · `authorized_keys` 信任计数。 ### 🌐 网络 包含 MAC、IPv4 和链路状态的每个硬件端口 · **Wi-Fi**:当前 SSID、 信道、安全模式、PHY、信号/噪声 · **附近的网络**并标明开放/WEP 网络 · DNS 解析器和搜索域 · 默认网关 · 代理 · VPN 配置 · ARP 邻居 · **带有暴露判定结果的监听端口**(环回与所有接口的对比)。 ### 📦 软件 包含版本、bundle ID 和**代码签名机构**的应用程序 · **未签名和被隔离的** bundle · Homebrew formulae · 安装程序记录 (在应用程序被删除后依然保留) · **系统扩展** · **第三方 kernel extensions**。 ### ⚡ 进程与持久化 按 CPU 排序的消耗前列进程 · 按用户统计的进程数 · **每一个 launchd domain** (`~/Library/LaunchAgents`、`/Library/LaunchAgents`、`/Library/LaunchDaemons`), Apple 自带的作业会被单独列出 · 每个作业都会被解析为**它实际执行的 程序** · 已加载的 launchd 作业 · cron 和非自带的周期性脚本。 启动项会经过启发式规则分类,标记出值得人工检查的内容: | 标记 | 含义 | |---|---| | ⚠ 全局可写路径 | 从 `/tmp`、`/Users/Shared`、`/Volumes`… 运行 | | ⚠ 下载或执行代码 | `curl … \| sh`、`base64 -d`、`osascript -e` | | ⚠ 内联 shell | `/bin/sh -c …` | ### 🛡 安全审计 每一项检查都会被评分、用通俗易懂的语言进行解释、给出具体的修复建议,并且 **附带生成该结果的命令**,这样你就可以去验证结论,而不是盲目相信。 | 检查项 | 未通过时的严重程度 | |---|---| | System Integrity Protection 已禁用 | **Critical** | | 可疑的启动项 | **High** | | FileVault 已关闭 | **High** | | Gatekeeper 已禁用 | **High** | | 已启用自动登录 | **High** | | 无密码 sudo(`NOPASSWD`) | **High** | | 不受支持的 macOS 版本 | **High** | | 应用程序防火墙已关闭 | Medium | | Remote Login / Screen Sharing / ARD 已启用 | Medium | | 访客账户已启用 | Medium | | 自动更新已禁用 | Medium | | 没有密码短语的 SSH 密钥 | Medium | | 在所有接口上监听的服务 | Medium / Low | | 过多的管理员账户 · 隐身模式已关闭 | Low | 严重程度回答的是*“这在多大程度上扩大了这台 Mac 的攻击面”* —— 而不是*“这个词听起来有多可怕”*。SIP 是唯一的 Critical 项,因为如果 SIP 被关闭,页面上的其他所有检查项都仅供参考:本地攻击者可以重写 报告这些问题的安全工具。 ## 📤 报告 一键导出当前扫描结果 —— 并遵循当前的脱敏状态 —— 支持以下格式: - **HTML** —— 独立的深色主题报告,按严重程度着色,适合打印 - **JSON** —— 结构化数据,适用于 pipeline 和对比两次扫描结果 - **TXT** —— 纯文本,适用于做笔记和终端环境 ## 🏗 架构 ``` macrecon.py entry point / CLI macrecon/ model.py Category · Section · Finding · Severity redact.py the masking engine (identity out, evidence in) demo_data.py synthetic Mac — what the screenshots come from report.py HTML / JSON / TXT exporters collectors/ base.py read-only command runner, demo mode, plist helpers posture.py shared security probes (SIP, FileVault, firewall…) system.py hardware.py users.py network.py software.py processes.py security_audit.py probes -> graded findings gui/ theme.py palette + semantic colouring rules widgets.py cards, tables, findings, tiles, painted risk gauge dashboard.py overview page main_window.py sidebar, threaded scan, search, export tools/ make_banner.py generates assets/banner.png capture.py screenshots, with a hard no-real-data guard ``` 如果你打算对其进行扩展,这里有几个值得了解的设计决策: - **一个模型,三个渲染器。** GUI 和所有导出器都基于同一个 `Category` 树构建,因此脱敏只需在一个地方应用,任何格式都 无法绕过它。 - **收集器不做评判。** 收集器只报告 Gatekeeper 处于 `Disabled` 状态; 由 `theme.semantic_color` 决定这是否属于警报。因此,同一个值可以在 一列中被视为正常,而在另一列中被视为异常。 - **`run()` 拒绝执行更改状态的操作。** 命令运行器会拒绝一系列被列入黑名单的 会更改系统状态的二进制文件,因此“只读”是强制执行的,而不仅仅是承诺。 - **扫描是多线程的。** 在真实的 Mac 上大约需要 15 秒(光是 Wi-Fi 扫描就占用了 大部分时间);如果放在 GUI 线程中,看起来就会像卡死了一样。 - **没有使用 `osascript`。** 通过 System Events 枚举登录项是常见的 做法,但这会触发 TCC 同意提示,并由于模态对话框而阻碍后台扫描。 launchd agents 通过读取文件就能涵盖相同的信息。 ## 🧪 在当前 macOS 版本上开发时的注意事项 在你可能找到的大多数指南中存在一些错误,而 MacRecon 对此进行了处理: - **`airport` 已经被移除了。** 旧的 `/System/Library/PrivateFrameworks/Apple80211.framework/.../airport -I` 在当前 macOS 上会以 127 状态码退出。Wi-Fi 状态现在通过 `system_profiler SPAirPortDataType` 获取。 - **`defaults read com.apple.alf globalstate` 已经失效。** 该键 已被移除;防火墙状态现在通过 `socketfilterfw --getglobalstate` 获取。 - **`system_profiler -detailLevel mini` 会隐藏标识信息。** 序列号、 硬件 UUID 和 Wi-Fi 网络信息完全不会出现在输出中 —— 必须使用 `full` 级别,这是系统故意为收集这些信息设置的障碍。 ## 📋 环境要求 - 需要 **macOS** 才能进行实时扫描(在 macOS 26 Tahoe, Apple Silicon 上开发并验证)。Windows/Linux 只能运行演示模式。 - **Python 3.9+** - **PyQt6** — `pip install -r requirements.txt` `--cli` 报告除了标准库之外,不需要任何 GUI 依赖。 ## ⚖️ 法律与道德使用声明 MacRecon 仅用于**经过授权的**安全工作:你自己的机器、 你组织的设备群、实验室,或者你拥有书面许可的测试项目。 它是只读的,仅收集本地状态 —— 但一份完整的未脱敏报告 属于敏感信息:它可以标识一台特定的机器及其用户。请像 对待任何其他测试产出物一样对待未脱敏的导出文件:对其进行 加密存储,仅与资产所有者分享,并在测试 结束后将其删除。 如果你在没有所有权或没有评估许可的机器上运行此工具,可能是 违法的。后果由你自行承担。 ## 📄 许可证 MIT — 查看 [LICENSE](LICENSE)。

at0m-b0mb 构建
如果 MacRecon 在你的评估工作中为你节省了时间,欢迎给个 ⭐ 以表支持。

标签:Homebrew安装, PyQt6, 后渗透, 多模态安全, 数据脱敏, 无线安全, 桌面应用, 逆向工具