[Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)

Iniciado por 0xDani, 17 Febrero 2013, 16:16 PM

0 Miembros y 1 Visitante están viendo este tema.

0xDani

Bien, pues estaba aburrido y me se me ocurrio que podia probar este viejo truco para ascender privilegios. Me funciono y he decidido hacer un pequeño tutorial como aporte.

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:


/* hook.c */

#include <sys/types.h>

uid_t getuid()
{
return 0;
}

uid_t geteuid()
{
return 0;
}


Compilamos:

$ gcc -c -fPIC hook.c -o libhook.o
$ gcc -shared -fPIC libhook.o -o libhook.so


Y ejecutamos el bash con LD_PRELOAD seteada:

$ LD_PRELOAD=ruta/a/libreria/libhook.so bash

Salida:

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Stakewinner00


0xDani

Cita de: Stakewinner00 en 17 Febrero 2013, 21:36 PM
Muy interesante, cuando este en linux lo pruebo.

Ya digo que en muchos sistemas puede no funcionar, de hecho en la man page del ld se indica que para binarios setuid la variable LD_PRELOAD es ignorada, pero el caso es que a mi me ha funcionado en Ubuntu 12.04, que es una distro bastante popular.

Y en cualquier caso por probar no pierdes nada xD
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Miky Gonzalez

Muy interesante, funciona el obtener uid=root. Pero que no se confunda la gente porfavor, esto no da privilegios, solo engaña al shell ;)
Mi blog personal, con información acerca de programación, seguridad, desarrollo y electrónica:

EN CONSTRUCCIÓN

0xDani

Cita de: Miky Gonzalez en 18 Febrero 2013, 20:16 PM
Muy interesante, funciona el obtener uid=root. Pero que no se confunda la gente porfavor, esto no da privilegios, solo engaña al shell ;)

Pues es verdad, fallo mio.

Por lo visto el bash que estoy usando no tiene privilegios:

$ strace bash
...
setuid32(0)                             = -1 EPERM (Operation not permitted)
getgid32()                              = 1000
setuid32(0)                             = -1 EPERM (Operation not permitted)
...


Pues nada, a seguir probando...  :-(
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM