MacNoise 生成真实的 macOS 遥测数据:网络连接、文件写入、进程派生、plist 变更、TCC 探测等等。将其指向一台运行着你的 EDR、SIEM 或防火墙堆栈的机器,看看实际会触发什么——而不是厂商数据表声称会触发的内容。
有关动机与设计背景,请参阅发布博客文章。
# Build (add build-amd64 / build-arm64 to cross-compile for Darwin, or release for both)
make build
# List available modules
./macnoise list
# Run a single module
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# Preview without executing
./macnoise run svc_launch_agent --dry-run
# Run all network modules
./macnoise run --category network
# Run a scenario
./macnoise scenario configs/scenarios/edr_validation.yaml
# Emit structured JSONL output
./macnoise run --category file --format jsonl --output /tmp/events.jsonl
macnoise run <module> [--param key=val ...] Run a specific module
macnoise run --category <cat> Run all modules in a category
macnoise run --all Run all modules
macnoise list [--category <cat>] List modules
macnoise info <module> Show module details, params, MITRE
macnoise scenario <file.yaml> Run a YAML scenario
macnoise categories List categories with counts
macnoise version Print version
默认情况下,每个模块在运行结束后都会撤销自身的操作。这通常正是你想要的,但也意味着检测系统只能看到安装事件。要验证你的安全堆栈能否检测到持久化本身——比如驻留在 ~/Library/LaunchAgents 中的 LaunchAgent、一条 cron 条目、一个被修改的 shell 配置文件——当扫描运行时,产物必须仍然存在:
./macnoise run svc_launch_agent --no-cleanup
每个跳过清理的模块都会打印一行说明自身名称,审计日志会记录 cleanup_result: skipped 而非 ok,因此留下持久化产物的运行绝不会被误认为是已妥善清理的运行。使用 macnoise info <module> 可查看某个模块会创建什么。
你需要自行负责移除这些产物。 在不带该标志的情况下重新运行同一模块,只会清理本次运行所创建的内容,而不会清理之前 --no-cleanup 运行遗留的内容。
MacNoise 写入两个独立的流。遥测事件——即你的 EDR/SIEM 实际看到的内容——输出到 stdout 或 --output。第二个可选流记录 MacNoise 自身的行为:运行了哪些模块、前置检查/清理结果以及 MITRE 映射,格式为 OCSF 1.7.0 JSONL。
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
每条遥测事件都带有 success(schema 1.1)以及与之并列的 outcome。success 表示 MacNoise 是否正常工作;outcome 表示它尝试执行的操作最终如何:
一次被拒绝的 TCC 探测,或一次指向已失效 C2 的信标,正是这个工具存在的意义——生成这类遥测数据,因此它们保持 success: true,并通过 outcome 来区分。只有 error 会将 success 设为 false。在审计日志中,相同的值出现在 unmapped.outcome 字段中,因为 OCSF 的 status 会以相同方式记录被拒绝的操作和出故障的工具。
审计日志以追加模式打开,因此多次运行产生的记录会累积在同一个文件中,便于批量分析。如果你正在添加模块,并想了解新事件类型如何归入 OCSF,请参阅 CONTRIBUTING.md。
每个分类旁边都附有对应的模块文档:
场景将模块串联成有序序列——用一个 YAML 文件即可针对你的检测能力重放多阶段的入侵模式。
这两个 APT 场景逐技术地遵循真实且已记录的入侵序列——每个 YAML 文件都引用了其构建所依据的实际威胁情报,并为每一步标注了其演练所对应的 MITRE 技术,因此完整的分解请直接查看这些文件,而不是这里的转述。
先进行试运行:
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
与你的 SIEM/EDR 交叉核对: 每一步的注释都指明了它应当触发的技术。真实运行后没有匹配的告警,就说明你的覆盖存在缺口。
编写你自己的场景:
name: My Custom Scenario
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: "443"
- category: file
params:
base_dir: "/tmp/test"
关于新增模块、代码风格以及完整的 PR 流程,请参阅 CONTRIBUTING.md。
发布过程已自动化——release-please 会根据你的 Conventional Commit PR 标题直接发布新版本,因此 feat: add net_tls module 或 fix: correct beacon jitter 既是你的 PR 标题,也是你的更新日志条目。
MacNoise 仅用于对你拥有或已获得明确书面许可的测试系统进行经授权的安全测试、EDR 验证与检测工程。作者对滥用行为不承担任何责任。
欢迎以 AI 代码形式贡献,但请牢记,代码审查目前仍以人工为主导,这意味着我们能审查的代码量有限。请将 PR 限定为具体的修复或新的遥测模块。改动范围过大的 PR 很可能会被关闭。
| 类别 | 描述 | 模块 |
|---|
network | 出站连接、DNS、信标、监听器、反向 Shell、数据外泄 | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_exfil |
process | 进程派生、信号传递、dylib 注入、发现、Gatekeeper 绕过、osascript | proc_spawn, proc_signal, proc_inject, proc_discovery, proc_gatekeeper, proc_osascript |
file | 文件创建、修改、凭据文件与钥匙串读取、归档、隐藏 | file_create, file_modify, file_browser_creds, file_cred_files, file_keychain_copy, file_archive, file_hide |
tcc | TCC 权限探测(FDA、通讯录、钥匙串、辅助功能、屏幕录制) | tcc_fda, tcc_contacts, tcc_keychain, tcc_accessibility, tcc_screen_recording |
endpoint_security | ES 框架事件触发,包括 .dmg 挂载与载荷执行 | es_file, es_process, es_mount |
service | LaunchAgent/Daemon 持久化、cron、shell 配置文件、登录项 | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Plist 创建与修改 | plist_create, plist_modify |
xpc | XPC 服务枚举 | xpc_enumerate |
| 标志 | 默认值 | 描述 |
|---|
--format | human | 输出格式:human 或 jsonl |
--output | (无) | 将输出写入文件(同时输出到 stdout) |
--verbose | false | 详细输出,包括清理错误 |
--dry-run | false | 预览操作而不实际执行 |
--no-cleanup | false | 保留模块产物(见下文) |
--timeout | 30 | 每个模块的超时时间(秒) |
--audit-log | (无) | 将 OCSF 1.7.0 审计记录写入 JSONL 文件 |
--config | (无) | 从 YAML 配置文件加载默认值 |
outcome | 含义 | 输出标记 |
|---|
executed | 操作已执行,并达成了模块所声称的效果 | [+] |
denied | 操作已执行,但被环境拒绝 | [-] |
indeterminate | 操作已执行,但无法得出任何结论 | [?] |
error | MacNoise 自身未能完成该操作 | [!] |
| 类别 | README |
|---|
network | modules/network/README.md |
process | modules/process/README.md |
file | modules/file/README.md |
tcc | modules/tcc/README.md |
endpoint_security | modules/endpoint_security/README.md |
service | modules/service/README.md |
plist | modules/plist/README.md |
xpc | modules/xpc/README.md |
| 文件 | 描述 |
|---|
network_only.yaml | 所有网络模块 |
edr_validation.yaml | 全面的 EDR 检测覆盖 |
full_sweep.yaml | 所有类别 |
lazarus_group.yaml | Lazarus 集团:dylib 注入、服务发现、反向 Shell、plist 持久化 |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer:MaaS 信息窃取器、Gatekeeper 绕过、钥匙串转储、ZIP 外泄、后门持久化 |