
macnoise v0.3.0
Generador extensible de telemetría del sistema macOS.
MacNoise
MacNoise genera telemetría real de macOS: conexiones de red, escrituras de archivos, creación de procesos, mutaciones de plist, sondeos de TCC y más. Apúntalo a una máquina que ejecute tu stack de EDR, SIEM o firewall y observa qué se dispara realmente, no lo que la hoja de datos del proveedor afirma que se disparará.
Para conocer los antecedentes sobre la motivación y el diseño, consulta la publicación del blog de lanzamiento.
Inicio rápido
# 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
Categorías de telemetría
| Categoría | Descripción |
|---|---|
network | Conexiones TCP, HTTP, listeners, reverse shells, DNS y TLS |
process | Ejecución exacta, entrega de señales, inyección de dylib, bypass de Gatekeeper y osascript |
file | Descubrimiento acotado, lecturas/copias literales, creación, modificación, archivado, ocultación y cifrado de señuelos |
tcc | Sondeos de permisos TCC con requisitos exactos de Full Disk Access, Contacts, Accessibility o Screen Recording |
credential | Acceso nativo al almacén de credenciales |
volume | Creación de imágenes de disco y ciclo de vida de volúmenes montados |
service | Enumeración de Launchd, persistencia de LaunchAgent/Daemon, cron, perfil de shell y Login Items |
plist | Creación y modificación de plist |
evasion | Limpieza de logs, timestomping, eliminación de historial y enmascaramiento |
Consulta el catálogo de módulos generado para ver cada módulo, parámetro, salida, tipo de evento, privilegio y mapeo ATT&CK.
Comandos
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
Flags globales
| Flag | Predeterminado | Descripción |
|---|---|---|
--format | human | Formato de salida: human o jsonl |
--output | (ninguno) | Escribir la salida en un archivo (además de stdout) |
--verbose | false | Salida detallada, incluidos errores de limpieza |
--dry-run | false | Previsualizar acciones sin ejecutarlas |
--no-cleanup | false | Dejar los artefactos del módulo en su lugar (ver más abajo) |
--timeout | 30 | Tiempo de espera por módulo en segundos |
--audit-log | (ninguno) | Escribir registros de auditoría OCSF 1.7.0 en un archivo JSONL |
--config | (ninguno) | Cargar valores predeterminados desde un archivo de configuración YAML |
--run-id | generado | Establecer el identificador de correlación para esta ejecución |
Flujo de datos de escenarios
Los archivos de escenario usan version: 1. Las entradas y salidas de los módulos están tipadas, y un paso posterior las referencia con mapeos explícitos en lugar de interpolación de cadenas:
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
Solo se pueden referenciar las salidas declaradas por un módulo. Los escenarios locales se pueden reutilizar con un paso include; las inclusiones son relativas, no pueden atravesar por encima del directorio raíz del escenario, se comprueban ciclos y están limitadas a ocho niveles. MacNoise valida el grafo completo antes de la ejecución, asigna a la ejecución un espacio de trabajo privado y limpia los módulos invocados en orden inverso. Usa --input content=value para proporcionar entradas y --report report.json para el informe de ejecución versionado.
Dejar artefactos en su lugar
De forma predeterminada, cada módulo se revierte a sí mismo cuando termina. Normalmente eso es lo que quieres, pero significa que una detección solo ve el evento de instalación. Para validar que tu stack detecta la persistencia en sí misma —un LaunchAgent que reside en ~/Library/LaunchAgents, una entrada de cron, un perfil de shell modificado— el artefacto tiene que seguir ahí cuando se ejecute el escaneo:
./macnoise run svc_launch_agent --no-cleanup
Cada módulo que omite la limpieza imprime una línea nombrándose a sí mismo, y el registro de auditoría registra cleanup_result: skipped en lugar de ok, de modo que una ejecución que dejó persistencia atrás nunca se confunde con una que limpió. Usa macnoise info <module> para ver qué crea un módulo determinado.
Eres responsable de eliminarlos tú mismo. Volver a ejecutar el mismo módulo sin el flag limpiará solo lo que esa ejecución creó, no lo que dejó atrás una ejecución anterior con --no-cleanup.
Registro de auditoría
MacNoise escribe dos flujos separados. Los eventos de telemetría —lo que tu EDR/SIEM ve realmente— van a stdout o a --output. Un segundo flujo opcional registra lo que hizo MacNoise en sí: qué módulos se ejecutaron, los resultados de prerequisitos/limpieza y los mapeos MITRE, en JSONL de OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Cada evento de telemetría lleva un outcome autoritativo y un subject tipado (esquema 2.0). El outcome indica qué le ocurrió a la acción que MacNoise intentó, mientras que el subject identifica el archivo, proceso, endpoint de red, servicio o recurso implicado:
outcome | Significado | Marcador humano |
|---|---|---|
executed | La acción se ejecutó e hizo lo que el módulo afirma | [+] |
denied | La acción se ejecutó y el entorno la rechazó | [-] |
indeterminate | La acción se ejecutó, pero no se puede concluir nada | [?] |
error | MacNoise en sí falló al llevar a cabo la acción | [!] |
Un sondeo TCC denegado o un beacon hacia un C2 muerto es la telemetría que esta herramienta existe para generar, por lo que es distinto de error, que significa que MacNoise en sí falló. El registro de auditoría registra el mismo valor en unmapped.outcome. Los parámetros declarados como sensibles se reemplazan con [REDACTED] en los registros de auditoría gestionados y en la identidad de la línea de comandos.