
macnoise v0.5.0
Расширяемый генератор системной телеметрии MacOS.
MacNoise
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 с обширными изменениями, скорее всего, будут закрыты.