
macnoise v0.5.0
Расширяемый генератор системной телеметрии MacOS.
MacNoise
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 scenario configs/scenarios/file_flow.yaml --format jsonl --output /tmp/events.jsonl
Категории телеметрии
| Категория | Описание |
|---|---|
network | TCP-соединения, HTTP, слушатели, reverse shell, DNS и TLS |
process | Точное выполнение, доставка сигналов, инъекция dylib, обход Gatekeeper и osascript |
file | Ограниченное обнаружение, буквальное чтение/копирование, создание, изменение, архивирование, сокрытие и шифрование приманок |
tcc | Проверки разрешений TCC с точными требованиями Full Disk Access, Contacts, Accessibility или Screen Recording |
credential | Доступ к нативному хранилищу учётных данных |
volume | Создание образов дисков и жизненный цикл смонтированных томов |
service | Перечисление Launchd, персистентность LaunchAgent/Daemon, cron, профиль оболочки и элементы входа |
plist | Создание и изменение plist |
evasion | Очистка журналов, изменение временных меток, удаление истории и маскировка |
Смотрите сгенерированный каталог модулей для каждого модуля, параметра, вывода, типа события, привилегии и сопоставления с ATT&CK.
Команды
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> [--input key=val] [--report report.json]
Run a YAML scenario
macnoise categories List categories with counts
macnoise version Print 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 |
--run-id | генерируется | Задать идентификатор корреляции для этого запуска |
Поток данных сценария
Файлы сценариев используют version: 1. Входы и выходы модулей типизированы, и
последующий шаг ссылается на них через явные сопоставления, а не через строковую
интерполяцию:
version: 1
name: Archive one generated artifact
on_error: stop
inputs:
content:
type: string
required: true
steps:
# Custom modules declare these outputs through OutputSpecs.
- id: create
module: custom_create
params:
content:
input: content
- id: archive
module: custom_archive
params:
source:
output: create.path
outputs:
archive:
output: archive.path
Ссылаться можно только на выходы, объявленные модулем. Локальные сценарии можно
переиспользовать с помощью шага include; включения относительны, не могут
выходить за пределы корневого каталога сценариев, проверяются на циклы и
ограничены восемью уровнями.
MacNoise проверяет полный граф перед выполнением, предоставляет запуску одно
приватное рабочее пространство и очищает вызванные модули в обратном порядке. Используйте
--input content=value для передачи входов и --report report.json для
версионированного отчёта о выполнении.
Оставление артефактов на месте
По умолчанию каждый модуль отменяет свои действия по завершении. Обычно это то, что нужно, но это означает, что обнаружение видит только событие установки. Чтобы проверить, что ваш стек обнаруживает саму персистентность — 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 и один типизированный subject (схема 2.0). Outcome говорит, что произошло с действием, которое попытался выполнить MacNoise, а subject идентифицирует файл, процесс, сетевую конечную точку, службу или ресурс, вовлечённые в действие:
outcome | Значение | Человеческий маркер |
|---|---|---|
executed | Действие выполнилось и сделало то, что заявляет модуль | [+] |
denied | Действие выполнилось, но среда его отклонила | [-] |
indeterminate | Действие выполнилось, но ничего нельзя заключить | [?] |
error | Сам MacNoise не смог выполнить действие | [!] |
Отклонённая проверка TCC или маяк к мёртвому C2 — это телеметрия, для генерации которой существует этот инструмент, поэтому она отличается от error, который означает, что сам MacNoise дал сбой. Журнал аудита записывает то же значение в unmapped.outcome. Параметры, объявленные чувствительными, заменяются на [REDACTED] в управляемых записях аудита и идентичности командной строки.
Журнал аудита открывается в режиме добавления, поэтому записи из нескольких запусков накапливаются в одном файле для пакетного анализа. Если вы добавляете модуль и хотите узнать, как новый тип события классифицируется в OCSF, смотрите CONTRIBUTING.md.
Справочник модулей
Сгенерированный каталог модулей — авторитетный справочник по именам, параметрам, выходам, типам событий, привилегиям и сопоставлениям ATT&CK. Заметки по категориям объясняют поведение платформы и операционные границы:
| Категория | README |
|---|---|
network | modules/network/README.md |
process | modules/process/README.md |
file | modules/file/README.md |
tcc | modules/tcc/README.md |
credential | modules/credential/README.md |
volume | modules/volume/README.md |
service | modules/service/README.md |
plist | modules/plist/README.md |
evasion | modules/evasion/README.md |
Сценарии
Сценарии объединяют модули в упорядоченные последовательности — один YAML-файл, который воспроизводит многоэтапный шаблон вторжения против ваших средств обнаружения.
| Файл | Описание |
|---|---|
network_only.yaml | Составные операции TCP, слушателя, DNS, HTTP-маяка и HTTP-эксфильтрации |
edr_validation.yaml | Комплексное покрытие обнаружения EDR |
full_sweep.yaml | Все категории |
lazarus_group.yaml | Lazarus Group: инъекция dylib, обнаружение служб, reverse shell, персистентность LaunchAgent |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: MaaS-инфостилер, обход Gatekeeper, дамп keychain, ZIP-эксфильтрация, персистентность бэкдора |
clickfix.yaml | ClickFix: обфусцированный однострочник, вставленный в Terminal, декодирование base64, загрузка второй стадии, персистентность LaunchAgent |
ransomware.yaml | Воздействие программы-вымогателя: разместить текстовые приманки, зашифровать их, затем оставить записку о выкупе |
discovery.yaml | Составные рецепты обнаружения системы, учётных записей, сети и защитного ПО на основе argv |
process_chain.yaml | Цепочка из трёх процессов оболочки, построенная из явного вектора аргументов |
file_flow.yaml | Связанный поток создания, изменения, ограниченного обнаружения, чтения, копирования и архивирования |
mounted_execution.yaml | Создание и выполнение полезной нагрузки из наблюдаемой точки монтирования образа диска |
Два сценария APT следуют реальным задокументированным последовательностям вторжения, техника за техникой — каждый YAML-файл цитирует фактическую threat intel, на которой он построен, и аннотирует каждый шаг техникой MITRE, которую он отрабатывает, так что начинайте оттуда для полной разбивки, а не с пересказа здесь.
Сначала dry-run:
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
Сопоставьте с вашим SIEM/EDR: каждый комментарий шага называет технику, которую он должен вызвать. Отсутствие соответствующего оповещения после реального запуска — это пробел в вашем покрытии.
Написание собственных:
version: 1
name: My Custom Scenario
on_error: stop
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: 443
- module: file_create
params:
base_dir: "/tmp/test"
Параметры проверяются на соответствие объявленному для каждого модуля типу string,
integer, boolean, path или list перед предпросмотром или выполнением. Неизвестные имена и недопустимые значения
отклоняются. on_error по умолчанию имеет значение stop. Установите его в continue только когда
охватывающий прогон должен попытаться выполнить последующие вызовы модулей после сбоя.
Начните с шаблона сценария для типизированных входов, выходов и связанного потока данных.
Совместимость версии 1
Версия 1.0 определяет поддерживаемые команды и флаги CLI, имена и контракты модулей, схему сценария 1, схему телеметрии 2.0 и схему отчёта сценария 1.0. Будущие несовместимые изменения этих интерфейсов требуют нового мажорного релиза.
Существующим пользователям следует прочитать Миграция с v0.6.0 на v1.0.0. Она сопоставляет каждый удалённый модуль и описывает изменения сценариев, JSONL и Go API.
Участие в разработке
Смотрите CONTRIBUTING.md для путей примитивов, сценариев и изменений ядра.
Релизы автоматизированы — release-please выпускает новую версию прямо из заголовка вашего PR в стиле Conventional Commit, так что feat: add net_tls module или fix: correct beacon jitter — это одновременно и заголовок вашего PR, и запись в changelog.
Отказ от ответственности
MacNoise предназначен для авторизованного тестирования безопасности, валидации EDR и инженерии обнаружения на системах, которыми вы владеете или на которые у вас есть явное письменное разрешение на тестирование. Авторы не несут ответственности за неправомерное использование.
Политика в отношении ИИ-кода
Вклад в виде ИИ-кода допустим, но имейте в виду, что ревью кода в настоящее время будет процессом, ведомым человеком, а значит, объём кода, который мы можем проверить, ограничен. Пожалуйста, ограничивайте PR конкретным исправлением или новым модулем телеметрии. PR с обширными изменениями, скорее всего, будут закрыты.