fthook.h | ||
LICENSE | ||
Makefile | ||
persistance.sh | ||
README.md | ||
rootkit.c |
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
ftrace
où 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
openat
on vérifie quel fichier à été ouvert. Si le fichier est/dev/null
on retient lefile descriptor
et lepid
du procès appelant. Puis, dans le hook de l'appel systèmewrite
on vérifie si lepid
et lefile descriptor
correspond à 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
,reveal
ethide$
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
pid
du 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
). -
Cacher LKM
Pour cacher le LKM, on récupère la liste des modules chargées et on supprime le rootkit.
-
Révélation de LKM
Pour révéler le LKM, on ajoute mon module dans la liste des modules chargées.
-
Cacher PID
Les pid sont stocké dans la structure
_hidden_pids
qui peut contenir au plus 200pid
, et qui contient le nombre depid
cachés. Puis, dans le hook de l'appel systèmewrite
, lepid
avec la phrasesecrethide$PID$,
où PID est lepid
donné, est retenu. Après, dans l'appel systèmegetdents64
on vérifie si le dossier dont une tache essaye d'accéder correspond auxpid
s retenus. Si c'est le cas, on l'ignore dans listing. -
Persistance
Pour avoir mon LKM chargé au démarrage on remplace l'image de
initramfs
qui contient le filesystem initiale qui est chargé en mémoire et quimount
le vrai filesystem et qui contient des LKM avec des drivers. Donc, on crée uninitramfs
fauté avec mon LKM, et on ajoute la ligne de chargement du rootkit dans le scriptinit
.