
Script de détection de persistance, de chasse et de collecte d'artefacts Linux
# Détection de persistance Linux, chasse aux menaces et collecte d'artefacts - [Résumé](#summary) - [Utilisation](#usage) - [Exemples de détections](#example-detections) - [Tableau des techniques](#techniques) ## Résumé [`persisthunt.sh`](https://github.com/raj3shp/persisthunt/blob/main/persisthunt.sh) accélère les investigations en collectant des artefacts ciblés liés à la persistance et en signalant les modèles suspects couramment associés aux techniques de persistance Linux. Le script aide à la détection de persistance, à la chasse aux menaces et à la collecte d'artefacts à travers les mécanismes de persistance Linux bien connus. Les résultats sont classés en trois niveaux — `High`, `Low` et `Informational` — selon la confiance et la sévérité. Les exemples incluent des entrées d'exécution automatique suspectes référençant `/tmp/`, `/home/`, `/dev/tcp`, `curl`, ou la détection de shells bind/inverses actifs. Il est conçu comme une base flexible que les défenseurs peuvent personnaliser pour leurs environnements en ajoutant ou en supprimant de la logique de détection et des mots-clés. La sortie peut être volumineuse et nécessiter une analyse spécifique à l'environnement, mais elle convient également à la revue et à la synthèse à l'aide de LLM ou d'agents IA. ## Utilisation Exécutez en tant qu'utilisateur root et redirigez la sortie vers un fichier ``` sudo persisthunt.sh > output.log ``` Exécutez sur un hôte distant via SSH ``` ssh [email protected] 'bash -s' < persisthunt.sh > output.log 2>&1 ``` ## Exemples de détections ``` === [HIGH] Active reverse shell === bob 3889906 0.0 0.0 2800 1848 pts/2 S+ 06:38 0:00 sh -i === [HIGH] Active bind shell === LISTEN 0 1 0.0.0.0:4444 0.0.0.0:* users:(("python3",pid=3891687,fd=3)) bob 3891687 0.7 0.3 19540 12320 pts/3 S+ 06:41 0:00 python3 -c exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",4444));s1.listen(1);c,a=s1.accept(); while True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""") === [HIGH] eBPF programs with raw network sockets (possible BPFdoor persistence) === PID: 3903559, Executable: bpfdoorpoc, Stack trace: /proc/3903559/stack:[<0>] packet_recvmsg+0x6e/0x5c0 === [LOW] Recent ELF binary in tmp/home/hidden dirs === /var/tmp/.test ``` ## Techniques | Confiance | Technique | Description | |---|---|---| | Élevée | Persistance via les tâches at | Les tâches « at » légitimes sont rares ; des entrées inattendues dans /var/spool/at sont très suspectes. | | Élevée | Entrée cron référençant un mot-clé suspect | Fichiers cron qui référencent curl/wget/nc/ncat/socat ou des chemins comme /tmp, /var/tmp, /dev/shm, /home, ou des fichiers cachés. | | Élevée | Shell bind actif | Détecte les processus interpréteurs (bash/sh/zsh/dash/ksh/python*/perl/nc/ncat/socat) qui écoutent sur des sockets réseau (shells bind). | | Élevée | Shell inverse actif | Détecte les processus dont stdin et stdout sont redirigés vers des sockets, indiquant des shells inverses. | | Élevée | Persistance via socket réseau brute eBPF | Des rootkits tels que BPFdoor utilisent des programmes eBPF avec des sockets réseau brutes comme backdoor persistante. [En savoir plus](https://github.com/raj3shp/bpfdoorpoc/tree/main) | | Élevée | Service/minuteur systemd référençant un mot-clé suspect | Recherche les mots-clés suspects dans les fichiers .service et .timer sous les chemins systemd (y compris les unités utilisateur sous ~/.config/systemd/user/). | | Élevée | Script init/rc.local/profile référençant un mot-clé suspect | Scripts d'init et fichiers rc.local/profile qui référencent des mots-clés suspects ou des outils réseau dans les chemins de persistance. | | Élevée | Script MOTD référençant un mot-clé suspect | Scripts MOTD qui référencent des mots-clés suspects ou des outils de persistance. | | Élevée | Profil shell référençant un mot-clé suspect | Profils shell (/etc/profile, /etc/profile.d, ~/.bashrc, ~/.profile, etc.) contenant des commandes ou des chemins suspects. | | Élevée | Fichiers de service D-BUS référençant un mot-clé suspect | Fichiers de service D-BUS trouvés dans le chemin \*/dbus-1/\* référençant des mots-clés suspects | | Élevée | Scripts dispatcher NetworkManager référençant un mot-clé suspect | Scripts dispatcher NetworkManager trouvés dans le chemin \*/NetworkManager/dispatcher.d/\* référençant des mots-clés suspects | | Élevée | Fichiers exécutables ELF cachés dans les répertoires tmp/home/cachés | Fichiers cachés (noms commençant par un point) dans /tmp, /var/tmp, /home, /dev/shm qui sont des exécutables ELF. | | Élevée | Processus en cours | Processus en cours référençant un mot-clé suspect | | Élevée | Binaire ELF SUID/SGID/accessible en écriture par tous | Fichiers accessibles en écriture par tous avec les bits SUID ou SGID définis et qui sont des binaires ELF (élévation de privilèges/backdoor potentielle). | | Élevée | Processus caché détecté dans /proc (rootkit possible) | Énumère les PID de /proc et les compare à la sortie de ps pour trouver les processus cachés par des rootkits (par exemple Diamorphine) ; inclut des notes sur la façon dont les attaquants installent un backdoor dans ps pour masquer les PID. | | Élevée | Processus caché via un bind mount | Détecte les bind mounts recouvrant /proc/<pid> (par exemple mount -o bind mydir /proc/1234), ce qui peut masquer les entrées de processus à ps. | | Élevée | LD_PRELOAD configuré à l'échelle du système | Présence ou modification de /etc/ld.so.preload qui peut être exploitée par des rootkits pour la persistance. | | Faible | Fichiers avec capabilities | Fichiers du système avec des capabilities POSIX définies (via `getcap`) — indicateur de confiance plus faible mais à vérifier. | | Faible | Binaire ELF récent dans les répertoires tmp/home/cachés | Binaires ELF exécutables récemment modifiés ou créés (moins de 7 jours) dans /tmp, /var/tmp, /dev/shm, /home — indicateur de confiance plus faible. | | Faible | Fichier de config ou hooks Git | Fichiers de configuration ou hooks Git autres que les exemples fournis (par exemple .git/config ou .git/hooks/*) qui pourraient être détournés pour la persistance. | | Faible | Hooks APT | Les hooks APT pourraient être détournés pour la persistance. | | Faible | Plugins Yum/DNF | Plugins Yum/DNF référençant un mot-clé suspect | | Faible | Fichier .pth avec contenu suspect (persistance Python) | Fichiers .pth contenant des imports exécutés ou des appels comme import, os.system, exec() qui s'exécutent lors de l'import d'un module Python. | | Faible | Règles udev | Règles udev avec la clé RUN (persistance possible) | | Faible | Modules PAM | Modules PAM référençant pam_exec qui peuvent être détournés pour la persistance | | Faible | Détournement de binaires système | Fichiers binaires récemment modifiés dans /bin /sbin /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin/ | | Informationnelle | Toutes les entrées cron (revue manuelle) | Affiche tous les fichiers liés à cron ainsi que leur contenu (hors commentaires) pour une revue manuelle. | | Informationnelle | Tous les profils shell (revue manuelle) | Affiche le contenu de tous les fichiers de profil shell système et utilisateur pour inspection manuelle. | | Informationnelle | Tous les scripts init.d et rc.local (revue manuelle) | Affiche les scripts init.d et rc.local pour inspection manuelle. | | Informationnelle | Tous les fichiers MOTD (revue manuelle) | Affiche les scripts/fichiers MOTD et update-motd.d pour revue manuelle. | | Informationnelle | Binaires ELF récents (7 jours) (revue manuelle) | Liste les fichiers ELF exécutables récents (7 jours) pour revue manuelle. | | Informationnelle | Tous les fichiers cachés dans les répertoires home (revue manuelle) | Énumère les fichiers cachés (dotfiles) dans les répertoires home des utilisateurs pour revue manuelle. | | Informationnelle | Clés autorisées SSH dans les répertoires home (revue manuelle) | Affiche les fichiers authorized_keys non vides dans /root et /home pour inspection manuelle. | | Informationnelle | Utilisateurs et groupes locaux (revue manuelle) | Liste les utilisateurs et groupes locaux via getent pour revue manuelle. | | Informationnelle | Montages (revue manuelle) | Affiche les montages actuels pour inspection manuelle. | | Informationnelle | Connexions réseau actives (revue manuelle) | Affiche les connexions réseau actives (ss -tunap) pour revue manuelle. | | Informationnelle | Services systemd (revue manuelle) | Liste les services systemd en cours d'exécution (systemctl list-units --type=service --state=running). | | Informationnelle | Fichiers de service D-BUS (revue manuelle) | Recherche les fichiers de service D-BUS sous les répertoires dbus-1 pour revue. | | Informationnelle | Scripts dispatcher NetworkManager | NetworkManager-dispatcher exécute des scripts lors des changements réseau ; vérifiez les scripts exécutables de dispatcher.d sous NetworkManager pour une persistance potentielle. | | Informationnelle | Images de conteneurs et conteneurs en cours d'exécution | Liste toutes les images de conteneurs et les conteneurs en cours d'exécution avec Docker, Podman et Containerd | | Informationnelle | Paquets installés | Liste tous les paquets installés avec dpkg/rpm/dnf | | Informationnelle | Modules du noyau chargés | Liste tous les modules du noyau chargés |