
macnoise v0.2.0
Generador extensible de telemetría del sistema macOS.
MacNoise
MacNoise genera telemetría real de macOS: conexiones de red, escrituras de archivos, lanzamiento de procesos, mutaciones de plist, sondas TCC y más. Apúntalo a una máquina que ejecute tu EDR, SIEM o firewall y observa qué es lo que realmente se dispara, no lo que afirma la ficha técnica del proveedor.
Para conocer los antecedentes sobre la motivación y el diseño, consulta la publicación del blog de lanzamiento.
Inicio rápido
# Compilar (añade build-amd64 / build-arm64 para compilar de forma cruzada para Darwin, o release para ambos)
make build
# Listar los módulos disponibles
./macnoise list
# Ejecutar un solo módulo
./macnoise run net_connect --param target=127.0.0.1 --param port=8080
# Vista previa sin ejecutar
./macnoise run svc_launch_agent --dry-run
# Ejecutar todos los módulos de red
./macnoise run --category network
# Ejecutar un escenario
./macnoise scenario configs/scenarios/edr_validation.yaml
# Emitir salida JSONL estructurada
./macnoise run --category file --format jsonl --output /tmp/events.jsonl
Categorías de telemetría
| Categoría | Descripción | Módulos |
|---|---|---|
network | Conexiones salientes, DNS, balizamiento, listeners, shells inversos, exfiltración | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_exfil |
process | Lanzamiento de procesos, entrega de señales, inyección de dylib, descubrimiento, evasión de Gatekeeper, osascript | proc_spawn, proc_signal, proc_inject, proc_discovery, proc_gatekeeper, proc_osascript |
file | Creación de archivos, modificación, lecturas de archivos de credenciales y llaveros, archivado, ocultación | file_create, file_modify, file_browser_creds, file_cred_files, file_keychain_copy, file_archive, file_hide |
tcc | Sondas de permisos TCC (FDA, Contactos, Llavero, Accesibilidad, Grabación de pantalla) | tcc_fda, tcc_contacts, tcc_keychain, tcc_accessibility, tcc_screen_recording |
endpoint_security | Disparadores de eventos del framework ES, incluido el montaje de .dmg y la ejecución de payloads | es_file, es_process, es_mount |
service | Persistencia de LaunchAgent/Daemon, cron, perfil de shell, elementos de inicio de sesión | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Creación y modificación de plists | plist_create, plist_modify |
xpc | Enumeración de servicios XPC | xpc_enumerate |
Comandos
macnoise run <module> [--param key=val ...] Ejecutar un módulo específico
macnoise run --category <cat> Ejecutar todos los módulos de una categoría
macnoise run --all Ejecutar todos los módulos
macnoise list [--category <cat>] Listar módulos
macnoise info <module> Mostrar detalles del módulo, parámetros, MITRE
macnoise scenario <file.yaml> Ejecutar un escenario YAML
macnoise categories Listar categorías con recuentos
macnoise version Imprimir versión
Banderas globales
| Bandera | 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 los errores de limpieza |
--dry-run | false | Vista previa de las 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 |
Dejar artefactos en su lugar
De forma predeterminada, cada módulo se revierte a sí mismo cuando termina. Eso suele ser 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 en ~/Library/LaunchAgents, una entrada de cron, un perfil de shell modificado), el artefacto debe seguir presente cuando se ejecute el escaneo:
./macnoise run svc_launch_agent --no-cleanup
Cada módulo que omite la limpieza imprime una línea que lo identifica, y el registro de auditoría registra cleanup_result: skipped en lugar de ok, de modo que una ejecución que dejó persistencia nunca se confunde con una que ordenó todo. 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 la bandera solo limpiará lo que creó esa ejecución, no lo que dejó 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 realmente ve) van a stdout o a --output. Un segundo flujo opcional registra lo que MacNoise hizo en sí: qué módulos se ejecutaron, resultados de prerequisitos/limpieza y asignaciones MITRE, en JSONL 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 junto con success (esquema 1.1). success indica si MacNoise funcionó; outcome indica qué sucedió con la acción que intentó:
outcome | Significado | Marcador humano |
|---|---|---|
executed | La acción se ejecutó e hizo lo que afirma el módulo | [+] |
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í no pudo llevar a cabo la acción | [!] |
Una sonda TCC denegada o un balizamiento hacia un C2 muerto es la telemetría que esta herramienta existe para generar, por lo que esos casos permanecen como success: true y se distinguen por outcome. Solo error establece success: false. En el registro de auditoría, el mismo valor aparece en unmapped.outcome, ya que el status de OCSF registra una acción rechazada y una herramienta rota de forma idéntica.
El registro de auditoría se abre en modo de anexado, por lo que los registros de múltiples ejecuciones se acumulan en un solo archivo para análisis por lotes. Si estás añadiendo un módulo y quieres saber cómo se clasifica un nuevo tipo de evento en OCSF, consulta CONTRIBUTING.md.
Referencia de módulos
La documentación de los módulos vive junto a cada categoría:
| Categoría | 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 |
Escenarios
Los escenarios encadenan módulos en secuencias ordenadas: un solo archivo YAML que reproduce un patrón de intrusión de múltiples etapas contra tus detecciones.
| Archivo | Descripción |
|---|---|
network_only.yaml | Todos los módulos de red |
edr_validation.yaml | Cobertura integral de detección EDR |
full_sweep.yaml | Todas las categorías |
lazarus_group.yaml | Grupo Lazarus: inyección de dylib, descubrimiento de servicios, shell inverso, persistencia de plist |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer: infostealer MaaS, evasión de Gatekeeper, volcado de llavero, exfiltración ZIP, persistencia de backdoor |
Los dos escenarios APT siguen secuencias de intrusión reales documentadas, técnica por técnica: cada archivo YAML cita la inteligencia de amenazas real en la que se basa y anota cada paso con la técnica MITRE que ejercita, así que empieza ahí para el desglose completo en lugar de un resumen aquí.
Prueba primero en seco:
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
Compara con tu SIEM/EDR: cada comentario de paso nombra la técnica que debería disparar. Si no hay una alerta coincidente después de una ejecución real, es una brecha en tu cobertura.
Escribir el tuyo propio:
name: Mi escenario personalizado
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: "443"
- category: file
params:
base_dir: "/tmp/test"
Contribuciones
Consulta CONTRIBUTING.md para añadir nuevos módulos, estilo de código y el proceso completo de PR.
Los lanzamientos están automatizados: release-please genera una nueva versión directamente desde el título de tu PR con Conventional Commit, así que feat: add net_tls module o fix: correct beacon jitter es tanto el título de tu PR como tu entrada de changelog.
Aviso legal
MacNoise está diseñado para pruebas de seguridad autorizadas, validación de EDR e ingeniería de detección en sistemas que posees o para los que tienes permiso escrito explícito para probar. Los autores no asumen ninguna responsabilidad por el mal uso.
Política de código con IA
Las contribuciones de código con IA están bien, pero ten en cuenta que la revisión de código actualmente será un proceso liderado por humanos, lo que significa que solo hay una cantidad limitada de código que podemos revisar. Limita las PR a una corrección específica o a un nuevo módulo de telemetría. Es probable que las PR con cambios extensos se cierren.