GNU obstack function-pointer hijack

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 ์ง€์›ํ•˜๊ธฐ

๊ฐœ์š”

GNU obstacks๋Š” ํ• ๋‹น์ž ์ƒํƒœ๋ฅผ ๋‘ ๊ฐœ์˜ ๊ฐ„์ ‘ ํ˜ธ์ถœ ๋Œ€์ƒ๊ณผ ํ•จ๊ป˜ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค:

  • chunkfun (offset +0x38) with signature void *(*chunkfun)(void *, size_t)
  • freefun (offset +0x40) with signature void (*freefun)(void *, void *)
  • extra_arg์™€ use_extra_arg ํ”Œ๋ž˜๊ทธ๋Š” _obstack_newchunk๊ฐ€ chunkfun(new_size) ๋˜๋Š” chunkfun(extra_arg, new_size) ์ค‘ ์–ด๋–ค ํ˜•ํƒœ๋กœ ํ˜ธ์ถœ๋ ์ง€ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค

๊ณต๊ฒฉ์ž๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์œ ์˜ struct obstack * ๋˜๋Š” ๊ทธ ํ•„๋“œ๋ฅผ ์†์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด, obstack์ด ๋‹ค์Œ ๋ฒˆ ํ™•์žฅ๋  ๋•Œ(next_free == chunk_limit), chunkfun์„ ํ†ตํ•œ ๊ฐ„์ ‘ ํ˜ธ์ถœ์ด ๋ฐœ์ƒํ•˜์—ฌ ์ฝ”๋“œ ์‹คํ–‰ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

Primitive: size_t ๋ถˆ์ผ์น˜ โ†’ 0-๋ฐ”์ดํŠธ ํ• ๋‹น โ†’ ํฌ์ธํ„ฐ OOB ์“ฐ๊ธฐ

์ผ๋ฐ˜์ ์ธ ๋ฒ„๊ทธ ํŒจํ„ด์€ 32-bit register๋ฅผ ์‚ฌ์šฉํ•ด sizeof(ptr) * count๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐ˜๋ฉด ๋…ผ๋ฆฌ์  ๊ธธ์ด๋Š” 64-bit size_t์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Example: elements = obstack_alloc(obs, sizeof(void *) * size); is compiled as SHL EAX,0x3 for size << 3.
  • size = 0x20000000 ๋ฐ sizeof(void *) = 8 ์ผ ๋•Œ, 32-bit์—์„œ ๊ณฑ์…ˆ์ด 0x0์œผ๋กœ ๋ž˜ํ•‘๋˜์–ด ํฌ์ธํ„ฐ ๋ฐฐ์—ด์ด 0 ๋ฐ”์ดํŠธ๊ฐ€ ๋˜์ง€๋งŒ, ๊ธฐ๋ก๋œ size๋Š” ์—ฌ์ „ํžˆ 0x20000000์ž…๋‹ˆ๋‹ค.
  • ์ดํ›„ elements[curr++] = ptr; ์“ฐ๊ธฐ๋Š” ์ธ์ ‘ํ•œ ํž™ ๊ฐ์ฒด๋“ค์— 8-๋ฐ”์ดํŠธ OOB ํฌ์ธํ„ฐ ์ €์žฅ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ œ์–ด ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ๊ฐ„ ๋ฎ์–ด์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Leaking libc via obstack.chunkfun

  1. ๋‘ ํž™ ๊ฐ์ฒด๋ฅผ ์ธ์ ‘ํ•˜๊ฒŒ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: ๋ณ„๊ฐœ์˜ obstacks๋กœ ๊ตฌ์„ฑ๋œ ๋‘ ์Šคํƒ).
  2. ๊ฐ์ฒด A์˜ ํฌ์ธํ„ฐ ๋ฐฐ์—ด OOB ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ์ฒด B์˜ elements ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์–ด์จ์„œ, B์—์„œ์˜ pop/read๊ฐ€ ๊ฐ์ฒด A์˜ obstack ๋‚ด๋ถ€ ์ฃผ์†Œ๋ฅผ ์—ญ์ฐธ์กฐํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  3. ์˜คํ”„์…‹ 0x38์—์„œ chunkfun(malloc์ด ๊ธฐ๋ณธ๊ฐ’)์„ ์ฝ์–ด libc ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋…ธ์ถœ์‹œํ‚ค๊ณ , ๊ทธ ๋‹ค์Œ libc_base = leak - malloc_offset์„ ๊ณ„์‚ฐํ•˜์—ฌ ๋‹ค๋ฅธ ์‹ฌ๋ณผ(์˜ˆ: system, "/bin/sh")์„ ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.

Hijacking chunkfun with a fake obstack

ํ”ผํ•ด์ž์˜ ์ €์žฅ๋œ struct obstack *์„ ๋ฎ์–ด์จ์„œ obstack ํ—ค๋”๋ฅผ ํ‰๋‚ด๋‚ธ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ๋ฐ์ดํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ํ•„์š”ํ•œ ํ•„๋“œ:

  • next_free == chunk_limit โ€” ๋‹ค์Œ push์—์„œ _obstack_newchunk๋ฅผ ๊ฐ•์ œํ•˜๊ธฐ ์œ„ํ•ด
  • chunkfun = system_addr
  • extra_arg = binsh_addr, use_extra_arg = 1 โ€” ๋‘-์ธ์ž ํ˜ธ์ถœ ํ˜•ํƒœ ์„ ํƒ

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ”ผํ•ด์ž obstack์—์„œ ํ• ๋‹น์„ ํŠธ๋ฆฌ๊ฑฐํ•˜์—ฌ ๊ฐ„์ ‘ ํ˜ธ์ถœ์„ ํ†ตํ•ด system("/bin/sh")์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Example fake obstack layout (glibc 2.42 offsets):

fake  = b""
fake += p64(0x1000)          # chunk_size
fake += p64(heap_leak)       # chunk
fake += p64(heap_leak)       # object_base
fake += p64(heap_leak)       # next_free == chunk_limit
fake += p64(heap_leak)       # chunk_limit
fake += p64(0xF)             # alignment_mask
fake += p64(0)               # temp
fake += p64(system_addr)     # chunkfun
fake += p64(0)               # freefun
fake += p64(binsh_addr)      # extra_arg
fake += p64(1)               # use_extra_arg flag set

๊ณต๊ฒฉ ์ ˆ์ฐจ

  1. Trigger size wrap๋กœ ๊ฑฐ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ๊ธธ์ด๋ฅผ ๊ฐ€์ง„ 0-byte pointer array๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. Groom adjacencyํ•˜์—ฌ OOB pointer store๊ฐ€ obstack pointer๋ฅผ ํฌํ•จํ•˜๋Š” ์ธ์ ‘ ๊ฐ์ฒด์— ๋„๋‹ฌํ•˜๋„๋ก ์กฐ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  3. Leak libc โ€” victim pointer๋ฅผ neighbor obstack์˜ chunkfun์œผ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ณ  function pointer๋ฅผ ์ฝ์Šต๋‹ˆ๋‹ค.
  4. Forge obstack ๋ฐ์ดํ„ฐ์— ์ œ์–ด๋œ chunkfun/extra_arg๋ฅผ ๋„ฃ๊ณ  _obstack_newchunk๊ฐ€ ์œ„์กฐ๋œ ํ—ค๋”์— ์˜ค๋„๋ก ๊ฐ•์ œํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์„ ํƒํ•œ function-pointer ํ˜ธ์ถœ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

References

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 ์ง€์›ํ•˜๊ธฐ