Experimenter LD_PRELOAD

 · 1 min read
 · Jean Schurger
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.