Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xDani en 17 Febrero 2013, 16:16 pm



Título: [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)
Publicado por: 0xDani en 17 Febrero 2013, 16:16 pm
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 (http://es.wikipedia.org/wiki/Bash))
 
1. LD_PRELOAD

LD_PRELOAD es una variable de entorno usada por el ld (http://linux.die.net/man/8/ld-linux). ¿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 (http://pubs.opengroup.org/onlinepubs/009695299/functions/getuid.html) y geteuid (http://pubs.opengroup.org/onlinepubs/009695299/functions/geteuid.html), 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
  1. /* hook.c */
  2.  
  3. #include <sys/types.h>
  4.  
  5. uid_t getuid()
  6. {
  7. return 0;
  8. }
  9.  
  10. uid_t geteuid()
  11. {
  12. return 0;
  13. }

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.


Título: Re: [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)
Publicado por: Stakewinner00 en 17 Febrero 2013, 21:36 pm
Muy interesante, cuando este en linux lo pruebo.


Título: Re: [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)
Publicado por: 0xDani en 17 Febrero 2013, 22:02 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


Título: Re: [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)
Publicado por: 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 ;)


Título: Re: [Aporte][Mini-Tutorial] Conseguir una shell root en Linux (truco LD_PRELOAD)
Publicado por: 0xDani en 19 Febrero 2013, 16:09 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:

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

Pues nada, a seguir probando...  :-(