Le petit blog crasseux de Jean Schurger - Jean Schurger's little grimy website.

Experimenter LD_PRELOAD

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 LD_PRELOAD. (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.

Modifié: 2015-06-01 lun 17:57

Emacs 24.4.1 (Org mode 8.3beta)