House of Roman
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Basic Information
์ด ๊ธฐ์ ์ ๊ฐ์ง fastbins, unsorted_bin ๊ณต๊ฒฉ ๋ฐ ์๋์ ์ค๋ฒ๋ผ์ดํธ๋ฅผ ํตํด ๋์ ์์ด RCE๋ฅผ ํ์ฉํ๋ ๋งค์ฐ ํฅ๋ฏธ๋ก์ด ๊ธฐ์ ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ ํจ์น๋์์ต๋๋ค.
Code
- ์์ ๋ https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c์์ ์ฐพ์ ์ ์์ต๋๋ค.
Goal
- ์๋ ํฌ์ธํฐ๋ฅผ ์ ์ฉํ์ฌ RCE
Requirements
- fastbin ๋ฐ unsorted bin ํฌ์ธํฐ ํธ์ง
- 12๋นํธ์ ๋ฌด์์์ฑ์ด ๊ฐ์ ๋ก ํด๊ฒฐ๋์ด์ผ ํจ (์๋ ํ๋ฅ 0.02%)
Attack Steps
Part 1: Fastbin Chunk points to __malloc_hook
์ฌ๋ฌ ๊ฐ์ ์ฒญํฌ๋ฅผ ์์ฑํฉ๋๋ค:
fastbin_victim(0x60, offset 0): ๋์ค์ ํ ํฌ์ธํฐ๋ฅผ LibC ๊ฐ์ผ๋ก ๊ฐ๋ฆฌํค๋๋ก ํธ์งํ UAF ์ฒญํฌ.chunk2(0x80, offset 0x70): ์ข์ ์ ๋ ฌ์ ์ํดmain_arena_use(0x80, offset 0x100)relative_offset_heap(0x60, offset 0x190): โmain_arena_useโ ์ฒญํฌ์ ์๋์ ์คํ์
๊ทธ๋ฐ ๋ค์ free(main_arena_use)๋ฅผ ํธ์ถํ๋ฉด ์ด ์ฒญํฌ๊ฐ ์ ๋ ฌ๋์ง ์์ ๋ชฉ๋ก์ ๋ฐฐ์น๋๊ณ fd ๋ฐ bk ํฌ์ธํฐ ๋ชจ๋์์ main_arena + 0x68์ ๋ํ ํฌ์ธํฐ๋ฅผ ์ป๊ฒ ๋ฉ๋๋ค.
์ด์ fake_libc_chunk(0x60)๋ผ๋ ์๋ก์ด ์ฒญํฌ๊ฐ ํ ๋น๋๋ฉฐ, ์ด๋ fd ๋ฐ bk์์ main_arena + 0x68์ ๋ํ ํฌ์ธํฐ๋ฅผ ํฌํจํ๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ relative_offset_heap๊ณผ fastbin_victim์ด ํด์ ๋ฉ๋๋ค.
/*
Current heap layout:
0x0: fastbin_victim - size 0x70
0x70: alignment_filler - size 0x90
0x100: fake_libc_chunk - size 0x70 (contains a fd ptr to main_arena + 0x68)
0x170: leftover_main - size 0x20
0x190: relative_offset_heap - size 0x70
bin layout:
fastbin: fastbin_victim -> relative_offset_heap
unsorted: leftover_main
*/
fastbin_victim์relative_offset_heap์ ๊ฐ๋ฆฌํค๋fd๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.relative_offset_heap์fake_libc_chunk๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ ์คํ์ ์ผ๋ก, ์ฌ๊ธฐ์๋main_arena + 0x68์ ๋ํ ํฌ์ธํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.fastbin_victim.fd์ ๋ง์ง๋ง ๋ฐ์ดํธ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก๋fastbin_victim์ดmain_arena + 0x68์ ๊ฐ๋ฆฌํค๋๋ก ๋ง๋ค ์ ์์ต๋๋ค.
์ด์ ์์
์ ์ํด ๊ณต๊ฒฉ์๋ fastbin_victim์ fd ํฌ์ธํฐ๋ฅผ ์์ ํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์, main_arena + 0x68์ ๊ทธ๋ฆฌ ํฅ๋ฏธ๋กญ์ง ์์ผ๋ฏ๋ก ํฌ์ธํฐ๋ฅผ **__malloc_hook**์ ๊ฐ๋ฆฌํค๋๋ก ์์ ํฉ์๋ค.
__memalign_hook์ ์ผ๋ฐ์ ์ผ๋ก 0x7f๋ก ์์ํ๊ณ ๊ทธ ์์ 0์ด ์์ผ๋ฏ๋ก, ์ด๋ฅผ 0x70 ํจ์คํธ ๋น์ ๊ฐ์ผ๋ก ์์กฐํ ์ ์์ต๋๋ค. ์ฃผ์์ ๋ง์ง๋ง 4๋นํธ๋ ๋ฌด์์์ด๋ฏ๋ก, ์ฐ๋ฆฌ๊ฐ ๊ด์ฌ ์๋ ๊ณณ์ ๊ฐ๋ฆฌํค๋๋ก ํ ์ ์๋ ๊ฐ์ ๊ฐ๋ฅ์ฑ์ 2^4=16์
๋๋ค. ๋ฐ๋ผ์ ์ฌ๊ธฐ์ BF ๊ณต๊ฒฉ์ด ์ํ๋์ด ์ฒญํฌ๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋๋ฉ๋๋ค: 0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23).
(๋๋จธ์ง ๋ฐ์ดํธ์ ๋ํ ์์ธํ ์ ๋ณด๋ how2heap ์์ ์์ ํ์ธํ์ธ์). BF๊ฐ ์๋ํ์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ๋ฏ๋ก, ์๋ํ ๋๊น์ง ๋ค์ ์์ํ์ธ์.
๊ทธ๋ฐ ๋ค์, 2๊ฐ์ malloc์ด ์ํ๋์ด 2๊ฐ์ ์ด๊ธฐ ํจ์คํธ ๋น ์ฒญํฌ๊ฐ ์ ๊ฑฐ๋๊ณ , ์ธ ๋ฒ์งธ malloc์ด ํ ๋น๋์ด **__malloc_hook:**์์ ์ฒญํฌ๋ฅผ ์ป์ต๋๋ค.
malloc(0x60);
malloc(0x60);
uint8_t* malloc_hook_chunk = malloc(0x60);
Part 2: Unsorted_bin ๊ณต๊ฒฉ
์์ธํ ๋ด์ฉ์ ๋ค์์ ํ์ธํ ์ ์์ต๋๋ค:
๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ chunk->bk์ ์ง์ ๋ ์์น์ main_arena + 0x68์ ์ธ ์ ์๊ฒ ํด์ค๋๋ค. ๊ณต๊ฒฉ์ ์ํด ์ฐ๋ฆฌ๋ __malloc_hook์ ์ ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, ์ด๋ฅผ ๋ฎ์ด์ด ํ ์๋์ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ one_gadget์ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์ฒญํฌ๋ฅผ ๊ฐ์ ธ์ unsorted bin์ ๋ฃ๊ธฐ ์์ํฉ๋๋ค:
uint8_t* unsorted_bin_ptr = malloc(0x80);
malloc(0x30); // Don't want to consolidate
puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
์ด ์ฒญํฌ์์ UAF๋ฅผ ์ฌ์ฉํ์ฌ unsorted_bin_ptr->bk๋ฅผ __malloc_hook์ ์ฃผ์๋ก ํฌ์ธํ
ํฉ๋๋ค(์ฐ๋ฆฌ๋ ์ด์ ์ ์ด๋ฅผ ๋ฌด์์๋ก ์๋ํ์ต๋๋ค).
Caution
์ด ๊ณต๊ฒฉ์ ์ ๋ ฌ๋์ง ์์ ๋น์ ์์์ํต๋๋ค(๋ฐ๋ผ์ ์์ ๊ฒ๊ณผ ํฐ ๊ฒ๋). ๋ฐ๋ผ์ ์ด์ ๋น ๋ฅธ ๋น์์ ํ ๋น๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค(๋ ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ๋ค๋ฅธ ํ ๋น์ ์ํํ๊ณ ์ถฉ๋ํ ์ ์์ต๋๋ค), ์ด๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด์๋ ๊ฐ์ ํฌ๊ธฐ๋ก ํ ๋นํด์ผ ํ๋ฉฐ, ๊ทธ๋ ์ง ์์ผ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํฉ๋๋ค.
๋ฐ๋ผ์ __malloc_hook์ main_arena + 0x68์ ์ฐ๊ธฐ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด unsorted_bin_ptr->bk์ __malloc_hook์ ์ค์ ํ ํ, ์ฐ๋ฆฌ๋ ๋จ์ํ **malloc(0x80)**์ ์ํํด์ผ ํฉ๋๋ค.
3๋จ๊ณ: __malloc_hook์ system์ผ๋ก ์ค์
1๋จ๊ณ์์ ์ฐ๋ฆฌ๋ __malloc_hook์ ํฌํจํ๋ ์ฒญํฌ๋ฅผ ์ ์ดํ๊ฒ ๋์๊ณ (๋ณ์ malloc_hook_chunk์์) 2๋จ๊ณ์์๋ ์ฌ๊ธฐ์์ main_arena + 0x68์ ์ธ ์ ์์์ต๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ malloc_hook_chunk์์ ๋ถ๋ถ ๋ฎ์ด์ฐ๊ธฐ๋ฅผ ์
์ฉํ์ฌ ์ฐ๋ฆฌ๊ฐ ์ด libc ์ฃผ์(main_arena + 0x68)๋ฅผ one_gadget ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฌ์ฉํฉ๋๋ค.
์ฌ๊ธฐ์ 12๋นํธ์ ๋ฌด์์์ฑ์ ๋ฌด์์๋ก ์๋ํด์ผ ํฉ๋๋ค(์์ธํ ์ ๋ณด๋ how2heap ์์ ์์ ํ์ธํ ์ ์์ต๋๋ค).
๋ง์ง๋ง์ผ๋ก, ์ฌ๋ฐ๋ฅธ ์ฃผ์๊ฐ ๋ฎ์ด์ฐ์ฌ์ง๋ฉด, malloc์ ํธ์ถํ๊ณ one_gadget์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
References
- https://github.com/shellphish/how2heap
- https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_roman/
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


