
Расширяемый генератор системной телеметрии MacOS.
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
По умолчанию каждый модуль отменяет свои действия по завершении. Обычно это то, что нужно, но это означает, что детектирование видит только событие установки. Чтобы проверить, что ваш стек обнаруживает само постоянство — LaunchAgent в ~/Library/LaunchAgents, запись в cron, изменённый профиль оболочки — артефакт должен оставаться на месте к моменту сканирования:
./macnoise run svc_launch_agent --no-cleanup
Каждый модуль, пропускающий очистку, выводит строку со своим именем, а в журнале аудита фиксируется cleanup_result: skipped вместо ok, поэтому запуск, оставивший постоянство, никогда не спутают с запуском, который всё убрал. Используйте macnoise info <module>, чтобы узнать, что создаёт конкретный модуль.
Вы сами отвечаете за их удаление. Повторный запуск того же модуля без этого флага уберёт только то, что создал этот запуск, а не то, что осталось после предыдущего запуска с --no-cleanup.
MacNoise ведёт два отдельных потока. События телеметрии — то, что реально видит ваш EDR/SIEM, — попадают в stdout или в --output. Второй, опциональный поток записывает, что делал сам MacNoise: какие модули запускались, результаты предусловий и очистки, а также привязки к MITRE, в формате JSONL по спецификации OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Каждое событие телеметрии содержит outcome наряду с success (schema 1.1). success сообщает, сработал ли MacNoise; outcome — что произошло с предпринятым действием:
Отклонённый TCC-зонд или beacon на мёртвый C2 — это как раз та телеметрия, ради которой существует этот инструмент, поэтому они остаются success: true и различаются по outcome. Только error делает success: false. В журнале аудита то же значение появляется в unmapped.outcome, поскольку OCSF status одинаково фиксирует и отклонённое действие, и сбойный инструмент.
Журнал аудита открывается в режиме добавления, поэтому записи из нескольких запусков накапливаются в одном файле для пакетного анализа. Если вы добавляете модуль и хотите узнать, как новый тип события классифицируется в OCSF, см. CONTRIBUTING.md.
Документация по модулям находится рядом с каждой категорией:
Сценарии объединяют модули в упорядоченные последовательности — один YAML-файл, который воспроизводит многоэтапный шаблон вторжения против ваших детектирующих правил.
Два APT-сценария воспроизводят реальные задокументированные последовательности вторжений, приём за приёмом: каждый YAML-файл ссылается на реальные данные threat intel, на основе которых он построен, и аннотирует каждый шаг техникой MITRE, которую задействует, — так что за полным разбором обращайтесь к ним, а не к пересказу здесь.
Сначала dry-run:
./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 выпускает новую версию прямо из заголовка вашего PR в формате Conventional Commit, так что feat: add net_tls module или fix: correct beacon jitter — это одновременно и заголовок PR, и запись в журнале изменений.
MacNoise предназначен для авторизованного тестирования безопасности, валидации EDR и разработки детектирующих правил на системах, которыми вы владеете или на тестирование которых у вас есть явное письменное разрешение. Авторы не несут ответственности за неправомерное использование.
Контрибуции кода, созданного ИИ, допустимы, но учтите, что в настоящее время ревью кода — это процесс, в котором ведущая роль принадлежит человеку, а значит, объём кода, который мы можем проверить, ограничен. Пожалуйста, ограничивайте PR конкретным исправлением или новым модулем телеметрии. PR с масштабными изменениями, скорее всего, будут закрыты.
| Категория | Описание | Модули |
|---|
network | Исходящие подключения, DNS, биконинг, прослушивающие порты, reverse shell, эксфильтрация | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_exfil |
process | Порождение процессов, доставка сигналов, внедрение dylib, обнаружение (discovery), обход Gatekeeper, osascript | proc_spawn, proc_signal, proc_inject, proc_discovery, proc_gatekeeper, proc_osascript |
file | Создание и изменение файлов, чтение файлов с учётными данными и keychain, архивирование, сокрытие | 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, профиль оболочки, элементы входа (Login Items) | 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 | (none) | Записывать вывод в файл (в дополнение к stdout) |
--verbose | false | Подробный вывод, включая ошибки очистки |
--dry-run | false | Предпросмотр действий без выполнения |
--no-cleanup | false | Оставлять артефакты модулей на месте (см. ниже) |
--timeout | 30 | Тайм-аут выполнения модуля в секундах |
--audit-log | (none) | Записывать аудиторские записи OCSF 1.7.0 в JSONL-файл |
--config | (none) | Загружать значения по умолчанию из 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 Group: внедрение dylib, обнаружение служб, reverse shell, постоянство через plist |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: инфостилер MaaS, обход Gatekeeper, дамп keychain, эксфильтрация через ZIP, постоянство через бэкдор |