Experimenter LD_PRELOAD
Table of contents
Introduction
Hier, je suis allé assister pour la première fois à un atelier MontréHack. En tentant de résoudre le défi proposé, j'ai eu l'idée d'expérimenter LDPRELOAD. (Ce n'était pas la bonne méthode, mais l'expérimentation était intéressante).
Principe
Le but de cette expérience est de remplacer un appel système par du code personnel. La programme choisi est whoami, on va lui faire croire à une fausse identité (à l'instar du programme bien connu fakeroot).
Exploration
Un rapide 'strace whoami' nous révèle rapidement l'utilisation de l'appel système geteuid (on a quand même une petite idée de ce qu'on cherche).
jeansch@blackpage:~/tmp (0) % strace whoami
execve("/usr/bin/whoami", ["whoami"], [/* 44 vars */]) = 0
...
geteuid() = 1000
...
write(1, "jeansch\n", 8jeansch
...
Remplacement
La documentation de geteuid (page de manuel) nous indique le fonctionnement et le prototypage de la fonction. Il s'agit donc de remplacer cette fonction par une renvoyant systématiquement le UID 0 (root).
/* Compitation: cc -fPIC -shared -o geteuid.so geteuid.c
Utilisation: LD_PRELOAD=geteuid.so */
#include <unistd.h>
#include <sys/types.h>
uid_t geteuid(void) {
return 0;
}
Essai
jeansch@blackpage:~/tmp (0) % whoami
jeansch
jeansch@blackpage:~/tmp (0) % LD_PRELOAD=./geteuid.so whoami
root
C'est gagné :)
Bien entendu, c'est un mensonge. Seul whoami croit que l'usager est root, mais c'est faux. Un programme tentant une opération privilégiée échouera de toute façon, même s'il croit avoir été exécuté par root.