Este metodo ha sido probado en un Ubuntu 12.04, y puede ser que en otros sistemas el linker no cargue las librerias de LD_PRELOAD primero si se usa con ejecutables setuid.
Materiales:
- Un compilador de C (se usara gcc)
- Una shell Unix (probado con bash)
1. LD_PRELOAD
LD_PRELOAD es una variable de entorno usada por el ld. ¿Como funciona? Pues si esta variable contiene la ruta de una libreria dinamica, el ld la cargara antes que las otras librerias requeridas por el programa, incluida la libc.
Esto hace que se puedan "sobreescribir" funciones, cambiando el comportamiento de algunos programas. Y esto es lo que vamos a hacer.
2. Accion
Lo que vamos a hacer es "sobreescribir" las funciones getuid y geteuid, para que retornen siempre 0 (indicando que somos root ).
Lo primero que tenemos que hacer es crear una libreria dinamica que sobreescriba estas funciones:
Código
/* hook.c */ #include <sys/types.h> uid_t getuid() { return 0; } uid_t geteuid() { return 0; }
Compilamos:
Código:
$ gcc -c -fPIC hook.c -o libhook.o
$ gcc -shared -fPIC libhook.o -o libhook.so
Y ejecutamos el bash con LD_PRELOAD seteada:
Código:
$ LD_PRELOAD=ruta/a/libreria/libhook.so bash
Salida:
Código:
root@computer_name:~# whoami
root
Y voilà!
Bueno espero que les haya gustado, se esperan comentarios
EDIT: Quiza pegue mas en Hacking Linux/Unix o en algun otro subforo, ponganlo donde quieran.