
Расширяемый генератор системной телеметрии MacOS.
MacNoise генерирует реальную телеметрию macOS: сетевые подключения, запись файлов, запуск процессов, изменения plist, проверки TCC и многое другое. Направьте его на машину, работающую под вашим EDR, SIEM или межсетевым экраном, и посмотрите, что на самом деле срабатывает — а не то, что, по заявлениям вендора, должно срабатывать.
О мотивации и дизайне см. пост в блоге о релизе.
# Сборка (добавьте build-amd64 / build-arm64 для кросс-компиляции под Darwin, или release для обоих)
make build
# Список доступных модулей
./macnoise list
# Запуск одного модуля
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# Предпросмотр без выполнения
./macnoise run svc_launch_agent --dry-run
# Запуск всех сетевых модулей
./macnoise run --category network
# Запуск сценария
./macnoise scenario configs/scenarios/edr_validation.yaml
# Вывод структурированного JSONL
./macnoise run --category file --format jsonl --output /tmp/events.jsonl
| Категория | Описание | Модули |
|---|---|---|
network | Исходящие подключения, DNS, биконинг, прослушивание, обратные шеллы, TLS, эксфильтрация | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_dns_exfil, net_tls, 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, профиль оболочки, элементы входа | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Создание и изменение plist | plist_create, plist_modify |
xpc | Перечисление служб XPC | xpc_enumerate |
evasion | Обход защиты: очистка журналов, изменение временных меток, удаление истории | evade_log_clear |
macnoise run <module> [--param key=val ...] Запуск конкретного модуля
macnoise run --category <cat> Запуск всех модулей в категории
macnoise run --all Запуск всех модулей
macnoise list [--category <cat>] Список модулей
macnoise info <module> Показать детали модуля, параметры, MITRE
macnoise scenario <file.yaml> Запуск YAML-сценария
macnoise categories Список категорий с количеством
macnoise version Вывод версии
| Флаг | По умолчанию | Описание |
|---|---|---|
--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-файла конфигурации |
По умолчанию каждый модуль отменяет свои действия по завершении. Обычно это то, что нужно, но это означает, что детектирование видит только событие установки. Чтобы проверить, что ваш стек обнаруживает само постоянство — 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, в формате OCSF 1.7.0 JSONL.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Каждое событие телеметрии несёт outcome наряду с success (схема 1.1). success указывает, сработал ли MacNoise; outcome указывает, что произошло с действием, которое он пытался выполнить:
outcome | Значение | Маркер в человекочитаемом виде |
|---|---|---|
executed | Действие выполнено и сделало то, что заявляет модуль | [+] |
denied | Действие выполнено, но среда отказала ему | [-] |
indeterminate | Действие выполнено, но выводов сделать нельзя | [?] |
error | Сам MacNoise не смог выполнить действие | [!] |
Отклонённая проверка TCC или биконинг на мёртвый C2 — это та телеметрия, ради которой существует этот инструмент, поэтому они остаются success: true и различаются по outcome. Только error устанавливает success: false. В журнале аудита то же значение появляется в unmapped.outcome, поскольку статус OCSF одинаково записывает и отклонённое действие, и сломанный инструмент.
Журнал аудита открывается в режиме добавления, поэтому записи из нескольких запусков накапливаются в одном файле для пакетного анализа. Если вы добавляете модуль и хотите узнать, как новый тип события классифицируется в OCSF, см. CONTRIBUTING.md.
Документация модулей находится рядом с каждой категорией:
| Категория | 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 |
evasion | modules/evasion/README.md |
Сценарии объединяют модули в упорядоченные последовательности — один YAML-файл, который воспроизводит многоэтапный паттерн вторжения против ваших детектирований.
| Файл | Описание |
|---|---|
network_only.yaml | Все сетевые модули |
edr_validation.yaml | Комплексное покрытие детектирования EDR |
full_sweep.yaml | Все категории |
lazarus_group.yaml | Lazarus Group: внедрение dylib, обнаружение служб, обратный шелл, постоянство через plist |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: MaaS-инфостилер, обход Gatekeeper, дамп связки ключей, эксфильтрация ZIP, постоянство бэкдора |
clickfix.yaml | ClickFix: обфусцированный однострочник, вставленный в Terminal, декодирование base64, загрузка второй стадии, постоянство LaunchAgent |
Два 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"
См. CONTRIBUTING.md о добавлении новых модулей, стиле кода и полном процессе PR.
Релизы автоматизированы — release-please выпускает новую версию прямо из заголовка вашего Conventional Commit PR, так что feat: add net_tls module или fix: correct beacon jitter — это одновременно и заголовок вашего PR, и запись в журнале изменений.
MacNoise предназначен для авторизованного тестирования безопасности, валидации EDR и инженерии детектирования на системах, которыми вы владеете или на тестирование которых имеете явное письменное разрешение. Авторы не несут ответственности за неправомерное использование.
Вклад кода от ИИ приветствуется, но имейте в виду, что ревью кода в настоящее время будет процессом под руководством человека, а значит, мы можем просмотреть лишь ограниченный объём кода. Пожалуйста, ограничивайте PR конкретным исправлением или новым модулем телеметрии. PR с обширными изменениями, скорее всего, будут закрыты.