at0m-b0mb/MacRecon
GitHub: at0m-b0mb/MacRecon
MacRecon 是一款 macOS 只读信息收集与安全审计工具,通过 PyQt6 界面采集系统全貌并生成带评分和默认脱敏的可分享报告。
Stars: 2 | Forks: 0
MacRecon — macOS 信息收集工具
一款现代化的 PyQt6 桌面应用,能够收集关于 Mac 几乎所有值得了解的信息
—— 系统、硬件、用户、网络、软件、持久化机制,以及内置的
安全审计 —— 并将其导出为清晰明了的 HTML、JSON 或文本
报告。
专为道德黑客、红队和蓝队设计,默认开启脱敏功能,确保报告可以安全分享。
## ✨ 概述
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`)被刻意**不进行**掩藏;它们
不标识任何人,掩藏它们只会破坏原有含义。
- **映射关系是稳定的。** 同一个用户在每一页上都是 ``,因此
“这三个进程属于同一个账户”的关联在脱敏后依然成立。
关闭该功能需要确认,窗口会重新渲染为琥珀色,并且导出的文件会被打上未脱敏的警告标记。
## 🚀 快速开始
```
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 身份运行安全工具,包括听从我的建议。
## 📸 截图
| 安全审计 | 进程与持久化 |
|---|---|
|  |  |
| 系统 | 硬件 |
|---|---|
|  |  |
| 用户 | 网络 |
|---|---|
|  |  |
| 软件 | |
|---|---|
|  | |
## 🔍 收集的信息
### 🖥 系统
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, 后渗透, 多模态安全, 数据脱敏, 无线安全, 桌面应用, 逆向工具