
Générateur extensible de télémétrie système MacOS.
MacNoise génère une télémétrie macOS réelle : connexions réseau, écritures de fichiers, lancements de processus, mutations de plist, sondes TCC, et plus encore. Pointez-le vers une machine exécutant votre pile EDR, SIEM ou pare-feu et voyez ce qui se déclenche réellement - pas ce que la fiche technique du fournisseur prétend déclencher.
Pour plus de contexte sur la motivation et la conception, voir le billet de blog de la version.
# 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 run --category file --format jsonl --output /tmp/events.jsonl
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> Run a YAML scenario
macnoise categories List categories with counts
macnoise version Print version
Par défaut, chaque module s'auto-réverse à la fin de son exécution. C'est généralement ce que vous voulez, mais cela signifie qu'une détection ne voit jamais que l'événement install. Pour valider que votre pile détecte la persistance elle-même - un LaunchAgent présent dans ~/Library/LaunchAgents, une entrée cron, un profil shell modifié - l'artefact doit toujours être là lorsque l'analyse s'exécute :
./macnoise run svc_launch_agent --no-cleanup
Chaque module qui saute le nettoyage affiche une ligne le nommant, et le journal d'audit enregistre cleanup_result: skipped plutôt que ok, afin qu'une exécution ayant laissé une persistance derrière elle ne soit jamais confondue avec une exécution qui a fait le ménage. Utilisez macnoise info <module> pour voir ce que crée un module donné.
Vous êtes responsable de les retirer vous-même. Relancer le même module sans l'option ne nettoiera que ce que cette exécution a créé, pas ce qu'une exécution précédente avec --no-cleanup a laissé derrière.
MacNoise écrit deux flux distincts. Les événements de télémétrie - ce que votre EDR/SIEM voit réellement - vont vers stdout ou --output. Un second flux, optionnel, enregistre ce que MacNoise lui-même a fait : quels modules ont été exécutés, les résultats des prérequis/nettoyage, et les correspondances MITRE, en JSONL OCSF 1.7.0.
./macnoise scenario configs/scenarios/amos_atomic_stealer.yaml --audit-log /tmp/audit.jsonl
Chaque événement de télémétrie porte un outcome en plus de success (schéma 1.1). success indique si MacNoise a fonctionné ; outcome indique ce qui est advenu de l'action qu'il a tentée :
Une sonde TCC refusée ou un beacon vers un C2 mort est précisément la télémétrie que cet outil existe pour générer, donc ces cas restent success: true et sont différenciés par outcome. Seul error met success: false. Dans le journal d'audit, la même valeur apparaît dans unmapped.outcome, car status OCSF enregistre de manière identique une action refusée et un outil défaillant.
Le journal d'audit s'ouvre en mode ajout, de sorte que les enregistrements de plusieurs exécutions s'accumulent dans un seul fichier pour une analyse par lot. Si vous ajoutez un module et souhaitez savoir comment un nouveau type d'événement est classé dans OCSF, consultez CONTRIBUTING.md.
La documentation des modules se trouve aux côtés de chaque catégorie :
Les scénarios enchaînent les modules en séquences ordonnées - un seul fichier YAML qui rejoue un schéma d'intrusion multi-étapes contre vos détections.
Les deux scénarios APT suivent de véritables séquences d'intrusion documentées, technique par technique - chaque fichier YAML cite le renseignement sur les menaces réel sur lequel il est construit et annote chaque étape avec la technique MITRE qu'il met en œuvre. Commencez donc par là pour le déroulement complet plutôt qu'un récit ici.
Faites d'abord un dry-run :
./macnoise scenario configs/scenarios/<scenario>.yaml --dry-run
Recoupez avec votre SIEM/EDR : le commentaire de chaque étape nomme la technique qu'elle devrait déclencher. L'absence d'alerte correspondante après une exécution réelle est une lacune dans votre couverture.
Écrire le vôtre :
name: My Custom Scenario
steps:
- module: net_connect
params:
target: "192.168.1.1"
port: "443"
- category: file
params:
base_dir: "/tmp/test"
Consultez CONTRIBUTING.md pour l'ajout de nouveaux modules, le style de code et l'ensemble du processus de PR.
Les versions sont automatisées - release-please crée une nouvelle version directement à partir du titre de votre PR Conventional Commit, donc feat: add net_tls module ou fix: correct beacon jitter est à la fois votre titre de PR et votre entrée de changelog.
MacNoise est destiné aux tests de sécurité autorisés, à la validation EDR et à l'ingénierie de détection sur des systèmes que vous possédez ou pour lesquels vous disposez d'une autorisation écrite explicite de tester. Les auteurs déclinent toute responsabilité en cas d'utilisation abusive.
Les contributions de code IA sont les bienvenues, mais veuillez garder à l'esprit que la revue de code est actuellement un processus dirigé par des humains, ce qui signifie que nous ne pouvons examiner qu'une quantité limitée de code. Veuillez limiter les PR à un correctif spécifique ou à un nouveau module de télémétrie. Les PR comportant des modifications importantes seront probablement fermées.
| Catégorie | Description | Modules |
|---|
network | Connexions sortantes, DNS, beaconing, listeners, shells inversés, exfiltration | net_connect, net_listen, net_beacon, net_revshell, net_dns, net_exfil |
process | Lancement de processus, envoi de signaux, injection dylib, découverte, contournement de Gatekeeper, osascript | proc_spawn, proc_signal, proc_inject, proc_discovery, proc_gatekeeper, proc_osascript |
file | Création de fichiers, modification, lecture de fichiers d'identifiants et de trousseaux, archivage, masquage | file_create, file_modify, file_browser_creds, file_cred_files, file_keychain_copy, file_archive, file_hide |
tcc | Sondes de permission TCC (FDA, Contacts, Trousseau, Accessibilité, Enregistrement d'écran) | tcc_fda, tcc_contacts, tcc_keychain, tcc_accessibility, tcc_screen_recording |
endpoint_security | Déclencheurs d'événements du framework ES, y compris montage .dmg et exécution de charge utile | es_file, es_process, es_mount |
service | Persistance LaunchAgent/Daemon, cron, profil shell, éléments de connexion | svc_launch_agent, svc_launch_daemon, svc_cron, svc_shell_profile, svc_login_item |
plist | Création et modification de plist | plist_create, plist_modify |
xpc | Énumération des services XPC | xpc_enumerate |
| Option | Défaut | Description |
|---|
--format | human | Format de sortie : human ou jsonl |
--output | (aucun) | Écrire la sortie dans un fichier (en plus de stdout) |
--verbose | false | Sortie verbeuse incluant les erreurs de nettoyage |
--dry-run | false | Aperçu des actions sans exécution |
--no-cleanup | false | Laisser les artefacts des modules en place (voir ci-dessous) |
--timeout | 30 | Délai d'expiration par module en secondes |
--audit-log | (aucun) | Écrire les enregistrements d'audit OCSF 1.7.0 dans un fichier JSONL |
--config | (aucun) | Charger les valeurs par défaut depuis un fichier de configuration YAML |
outcome | Signification | Marqueur humain |
|---|
executed | L'action s'est exécutée et a fait ce que le module prétend | [+] |
denied | L'action s'est exécutée et l'environnement l'a refusée | [-] |
indeterminate | L'action s'est exécutée, mais aucune conclusion ne peut être tirée | [?] |
error | MacNoise lui-même a échoué à réaliser l'action | [!] |
| Catégorie | 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 |
| Fichier | Description |
|---|
network_only.yaml | Tous les modules réseau |
edr_validation.yaml | Couverture complète de détection EDR |
full_sweep.yaml | Toutes les catégories |
lazarus_group.yaml | Groupe Lazarus : injection dylib, découverte de services, shell inversé, persistance plist |
amos_atomic_stealer.yaml | AMOS / Atomic Stealer : infostealer MaaS, contournement de Gatekeeper, dump du trousseau, exfiltration ZIP, persistance backdoor |