Rootkit linux 5.6+
Fonctionnalités
- Hook les appels systèmes
write,openat,getdents64 - Canal de communication dans
/dev/null - Élévation des privilèges (devenir root)
- Cacher le LKM (Linux Kernel Module)
- Révéler le LKM
- Cacher plusieurs PID
- Script de persistance du LKM
Explication de fonctionnement
-
Hook des appels systèmes
Les appels systèmes sont hook à l'aide de
ftraceoù on attache une fonction callback dans une partie de kernel, notamment dans les registres des appels systèmes qu'on veut hook. -
Canal de communication
Dans le hook de l'appel système
openaton vérifie quel fichier à été ouvert. Si le fichier est/dev/nullon retient lefile descriptoret lepiddu procès appelant. Puis, dans le hook de l'appel systèmewriteon vérifie si lepidet lefile descriptorcorrespond à celui que on a retenu, afin de ne pas faire des vérification inutiles. Si c'est le cas, on compare ce qui est écrit dans le fichier. Les commandes acceptées sontroot,hideme,revealethide$avec un préfixesecret. Le moyen de communication se fait par l'outil standardecho. -
Élévation de privilèges
Pour devenir root, d'abord je récupère la structure
piddu processus qui écrit dans/dev/null. Puis, on récupère la tâche qui correspond à cepid. À la suite, on change les accréditations de la tâche pour celle du root (0).$ echo "secretroot" > /dev/null` -
Cacher LKM
Pour cacher le LKM, on récupère la liste des modules chargées et on supprime le rootkit.
$ echo "secrethideme" > /dev/null -
Révélation de LKM
Pour révéler le LKM, on ajoute mon module dans la liste des modules chargées.
$ echo "secretreveal" > /dev/null -
Cacher PID
Les pid sont stocké dans la structure
_hidden_pidsqui peut contenir au plus 200pid, et qui contient le nombre depidcachés. Puis, dans le hook de l'appel systèmewrite, lepidavec la phrasesecrethide$PID$,où PID est lepiddonné, est retenu. Après, dans l'appel systèmegetdents64on vérifie si le dossier dont une tache essaye d'accéder correspond auxpids retenus. Si c'est le cas, on l'ignore dans listing.$ echo "secrethide\$42\$" > /dev/null -
Persistance
Pour avoir mon LKM chargé au démarrage on remplace l'image de
initramfsqui contient le filesystem initiale qui est chargé en mémoire et quimountle vrai filesystem et qui contient des LKM avec des drivers. Donc, on crée uninitramfsfauté avec mon LKM, et on ajoute la ligne de chargement du rootkit dans le scriptinit.$ sudo ./persistance.sh
Bibliographie
- Learn linux rootkit
- WRITING SIMPLE ROOTKIT
- Hooking syscalls with ftrace
- Linux hook system call
- Persistent rootkit
- Hide processes