VirtualBox Slirp NAT ํจํท ํ ์ต์คํ๋ก์
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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
์์ฝ
- VirtualBox๋ ํจํท ๋ฒํผ(mbufs)๊ฐ ์ธ๋ผ์ธ ๋ฉํ๋ฐ์ดํฐ์ ํจ์ ํฌ์ธํฐ ์ฝ๋ฐฑ(
pfFini,pfDtor)์ ๊ฐ์ง ์ปค์คํ zone allocator์ ์กด์ฌํ๋, ํฌ๊ฒ ์์ ๋ Slirp ํฌํฌ๋ฅผ ํฌํจํ๋ค. - ๊ฒ์คํธ๋ ์ ๋ขฐ๋
m->m_len์ ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋ IP ํค๋ ๊ธธ์ด๋ก ๋ฎ์ด์ธ ์ ์์ผ๋ฉฐ, ์ด๋ ์ดํ์ ๋ชจ๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๋ค์ ๋ฌด๋ ฅํํ๊ณ infoleak ๋ฐ overwrite primitives๋ฅผ ์ ๋ฐํ๋ค. - checksum์ด
0์ด๊ณip_len์ด ๊ณผ๋ํ UDP ํจํท์ ์ ์ฉํ๋ฉด, ๊ฒ์คํธ๋ mbuf ๊ผฌ๋ฆฌ์ ์ธ์ ์ฒญํฌ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ exfiltrateํ์ฌ ํ ๋ฐ zone ์ฃผ์๋ฅผ ์์๋ผ ์ ์๋ค. - ์กฐ์๋ IP ์ต์
์ ์ ๊ณตํ๋ฉด
ip_stripoptions()๊ฐ ์ ์๋ฆฌ์์memcpy()๋ก ๋๋ฌด ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋๋ก ๊ฐ์ ๋์ด, ๊ณต๊ฒฉ์๊ฐ ๋ค์ mbuf์struct itemํค๋๋ฅผ ๋ฎ์ด์ฐ๊ณ ๊ทธzoneํ๋๋ฅผ ์์ ํ ์ ์ด๋๋ ๋ฐ์ดํฐ๋ก ๊ฐ๋ฆฌํค๊ฒ ํ ์ ์๋ค. - ์์๋ mbuf๋ฅผ freeํ๋ฉด ๊ณต๊ฒฉ์๊ฐ ์ ๊ณตํ ์ธ์๋ฅผ ๊ฐ์ง
zone->pfFini()๊ฐ ํธ์ถ๋๋ค; ์ด๋ฅผmemcpy@plt๋ก ๊ฐ๋ฆฌํค๊ฒ ํ๋ฉด arbitrary copy/write primitive๊ฐ ๋์ด non-PIE VirtualBox ๋ฐ์ด๋๋ฆฌ ๋ด๋ถ์ GOT ์ํธ๋ฆฌ๋ ๋ค๋ฅธ ์ ์ด ๋ฐ์ดํฐ๋ก ํฅํ๋๋ก ์กฐ์ข ํ ์ ์๋ค.
Packet allocator anatomy
VirtualBox๋ ๊ฐ ์ธํฐํ์ด์ค๋ง๋ค zone_clust๋ผ๋ zone์์ ๋ค์ด์ค๋ ๋ชจ๋ Ethernet ํ๋ ์์ ํ ๋นํ๋ค. ๊ฐ 0x800-byte ๋ฐ์ดํฐ ์ฒญํฌ๋ ์ธ๋ผ์ธ ํค๋๊ฐ ์์ ๋ถ๋๋ค:
struct item {
uint32_t magic; // 0xdead0001
void *zone; // uma_zone_t pointer with callbacks
uint32_t ref_count;
LIST_ENTRY(item) list; // freelist / used list links
};
mbuf๊ฐ ํด์ ๋ ๋ ํธ์ถ ์คํ m_freem -> ... -> slirp_uma_free()๋ ์ธ๋ผ์ธ ํค๋๋ฅผ ์ ๋ขฐํฉ๋๋ค:
uma_zfree_arg()๋item = (struct item *)mem - 1์ ์ฌ๊ณ์ฐํ๊ณitem->zone์ ๊ฒ์ฆํด์ผ ํ์ง๋งAssert()๋ ๋ฆด๋ฆฌ์ค ๋น๋์์ ์ปดํ์ผ๋์ง ์์ต๋๋ค.slirp_uma_free()๋zone = item->zone์ ๋ก๋ํ๊ณ ์กฐ๊ฑด ์์ดzone->pfFini(zone->pData, data_ptr, zone->size)๋ฅผ ์คํํ ๋ค์zone->pfDtor(...)๋ฅผ ํธ์ถํฉ๋๋ค.
๋ฐ๋ผ์ mbuf ํค๋์ ๋ํ ๋ชจ๋ write-what-where๋ free() ์ค์ ์ ์ด ๊ฐ๋ฅํ ๊ฐ์ ํธ์ถ๋ก ์ด์ด์ง๋๋ค.
Infoleak via m->m_len override
VirtualBox๋ ip_input() ์๋จ์ ๋ค์์ ์ถ๊ฐํ์ต๋๋ค:
if (m->m_len != RT_N2H_U16(ip->ip_len))
m->m_len = RT_N2H_U16(ip->ip_len);
Because the assignment happens before verifying the IP header, a guest can advertise any length up to 0xffff. The rest of the stack (ICMP, UDP, fragmentation handlers, etc.) assumes m->m_len is trustworthy and uses it to decide how many bytes to copy off the mbuf.
์ฒดํฌ์ฌ์ด 0์ธ UDP ํจํท(์ฆ โno checksumโ)์ ์ฌ์ฉํ๋ผ. NAT fast-path๋ payload ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฌํ์ง ์๊ณ m->m_len ๋ฐ์ดํธ๋ฅผ ์ ๋ฌํ๋ฏ๋ก ip_len์ ๋ถํ๋ฆฌ๋ฉด Slirp๊ฐ ์ค์ ๋ฒํผ๋ฅผ ๋์ด ์ฝ๊ณ heap residues๋ฅผ ๊ฒ์คํธ๋ NAT ๋ฐ์ ํ๋ ฅํ๋ ์ธ๋ถ ํฌํผ๋ก ๋ฐํํ๊ฒ ๋๋ค. ์ฒญํฌ ํฌ๊ธฐ๊ฐ 2048 ๋ฐ์ดํธ์ด๋ฏ๋ก leak์ ๋ค์์ ํฌํจํ ์ ์๋ค:
- ๋ค์ mbuf์ inline
struct itemโ freelist ์์์ ์ค์ zoneํฌ์ธํฐ๋ฅผ ๋๋ฌ๋ธ๋ค. magicํ๋ ๊ฐ์ heap cookies โ ์ดํ corruptions๋ฅผ ์ํํ ๋ ์ ํจํด ๋ณด์ด๋ ํค๋๋ฅผ ๋ง๋ค๋๋ก ๋์.
IP options๋ก ์ธ์ ์ฒญํฌ ํค๋ ๋ฎ์ด์ฐ๊ธฐ
๊ฐ์ ์๋ชป๋ ๊ธธ์ด๋ ํจํท์ ip_stripoptions()๋ฅผ ํตํ๊ฒ ํ์ฌ overwrite ๊ธฐ๋ณธ ๋์์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค(์ด๋ IP header์ options๊ฐ ์๊ณ payload๊ฐ UDP/TCP์ผ ๋ ํธ๋ฆฌ๊ฑฐ๋๋ค). ํฌํผ๋ m->m_len์ผ๋ก๋ถํฐ ๋ณต์ฌ ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๊ณ memcpy()๋ฅผ ํธ์ถํด ์ ์ก ํค๋๋ฅผ ์ ๊ฑฐ๋ ์ต์
์๋ก ์ด๋์ํจ๋ค:
- ๊ธด
ip_len์ ์ ๊ณตํ์ฌ ๊ณ์ฐ๋ ์ด๋ ๊ธธ์ด๊ฐ ํ์ฌ mbuf๋ฅผ ๋์ด๊ฐ๋๋ก ํ๋ค. - IP options๋ฅผ ์ ์ ์ ํฌํจ์์ผ Slirp๊ฐ stripping ๊ฒฝ๋ก๋ก ์ง์ ํ๊ฒ ํ๋ค.
memcpy()๊ฐ ์คํ๋๋ฉด ๋ค์ mbuf์์ ์ฝ์ด ํ์ฌ mbuf์ payload์ inline header์ ๋ฎ์ด์จmagic,zone,ref_count๋ฑ์ ์์์ํจ๋ค.
ํ ๋น์๋ ๋์ผ ์ธํฐํ์ด์ค์ ํจํท์ freelist ์์์ ์ธ์ ํ๊ฒ ์ ์งํ๋ฏ๋ก, ์ด ์ค๋ฒํ๋ก์ฐ๋ ์ ์ ํ heap grooming ์ดํ์ ๋ค์ ์ฒญํฌ๋ฅผ ๊ฒฐ์ ๋ก ์ ์ผ๋ก ๋ฎ์น๋ค.
uma_zone_t ์์กฐ๋ก pfFini ํ์ทจํ๊ธฐ
์ธ์ ํ struct item์ ์์์ํฌ ์ ์๊ฒ ๋๋ฉด, ์ต์คํ๋ก์์ ๋ค์๊ณผ ๊ฐ์ด ์งํ๋๋ค:
- ์ ์ถ๋ heap ์ฃผ์๋ฅผ ์ฌ์ฉํด ๊ฒ์คํธ๊ฐ ์์ ํ ์ ์ดํ๋ mbuf ์์ ๊ฐ์ง
uma_zone๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํ๋ค. ๋ค์์ ์ฑ์ด๋ค:pfFini์memcpy()์ PLT ์ํธ๋ฆฌpData์ ์ํ๋ ๋ชฉ์ ์ง ํฌ์ธํฐ(์: GOT ์ํธ๋ฆฌ, vtable ์ฌ๋กฏ, ํจ์ ํฌ์ธํฐ ๋ฐฐ์ด)size์ ๋ณต์ฌํ ๋ฐ์ดํธ ์- ์ ํ:
pfDtor๋ฅผ 2๋จ๊ณ ํธ์ถ๋ก ์ค์ (์: ์๋ก ์ด ํจ์ ํฌ์ธํฐ๋ฅผ ํธ์ถํ๋๋ก)
- ๋์ mbuf์
zoneํ๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ก ๋ฎ์ด์ฐ๊ณ ,listํฌ์ธํฐ๋ฅผ ์กฐ์ ํด freelist ์ฅ๋ถ๊ฐ ์ถฉ๋์ ํผํ ์ ์์ ๋งํผ ์ผ๊ด๋๊ฒ ์ ์ง๋๊ฒ ํ๋ค. - mbuf๋ฅผ freeํ๋ค. ๊ทธ๋ฌ๋ฉด
slirp_uma_free()๋ mbuf์ ๊ฒ์คํธ ์ ์ด ๋ฐ์ดํฐ๊ฐ ๋จ์์๋ ๋์memcpy(dest=pData, src=item_data, n=size)๋ฅผ ์คํํด arbitrary write๋ฅผ ๋ฐ์์ํจ๋ค.
Linux VirtualBox ๋ฐ์ด๋๋ฆฌ๋ non-PIE์ด๋ฏ๋ก memcpy์ system์ PLT ์ฃผ์๊ฐ ๊ณ ์ ๋์ด ์์ด ์ง์ ์ฌ์ฉํ ์ ์๋ค. ๊ฒ์คํธ๋ ๋ ๊ฐ๋ก์ฑ์ง ํธ์ถ์ด ์คํ๋ ๋ ์ฐธ์กฐ๊ฐ ์ ์ง๋๋ ๋ค๋ฅธ mbuf ์์ /bin/sh ๊ฐ์ ๋ฌธ์์ด์ ์ ์ฅํ ์ ์๋ค.
Fragmentation์ ํตํ Heap grooming
Slirp์ ์ธํฐํ์ด์ค๋ณ zone์ ๊น์ด๊ฐ 3072 ์ฒญํฌ์ด๊ณ ์ฒ์์๋ ์ฐ์ ๋ฐฐ์ด๋ก ํ ๋น๋์ด freelist๊ฐ ๋์ ์ฃผ์์์ ๋ฎ์ ์ฃผ์๋ก ์ํ๋๋ค. ๊ฒฐ์ ๋ก ์ ์ธ์ ์ฑ์ ๋ค์์ผ๋ก ๋ฌ์ฑํ ์ ์๋ค:
- NAT์ ์ผ์ ํฌ๊ธฐ์
IP_MFfragment๋ฅผ ๋ค์ ํ๋ ค๋ณด๋ด์ด reassembly ์ฝ๋๊ฐ ์์ธก ๊ฐ๋ฅํ mbuf ์ํ์ค๋ฅผ ํ ๋นํ๊ฒ ํ๋ค. - ํ์์์๋๋ fragment๋ฅผ ๋ณด๋ด ํน์ ์ฒญํฌ๋ฅผ ์ฌํ์ฉํ์ฌ frees๊ฐ LIFO ์์๋ก freelist๋ก ๋์๊ฐ๊ฒ ํ๋ค.
- freelist walk์ ๋ํ ์ง์์ ์ฌ์ฉํด ๋ฏธ๋์ ํผํด์ mbuf๋ฅผ IP options overflow๋ฅผ ์ค์ mbuf ๋ฐ๋ก ๋ค์ ๋ฐฐ์นํ๋ค.
์ด๋ฌํ grooming์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ชฉํ struct item์ ์ ํํ ํ๊ฒฉํ๋๋ก ํ๊ณ ๊ฐ์ง uma_zone์ด leak primitive์ ๋ฒ์ ๋ด์ ๋จ์์๊ฒ ๋ณด์ฅํ๋ค.
From arbitrary write to host code execution
memcpy-on-free primitive๋ฅผ ์ด์ฉํ๋ฉด:
- ๊ณต๊ฒฉ์๊ฐ ์ ์ดํ๋
/bin/sh๋ฌธ์์ด๊ณผ ๋ช ๋ น ๋ฒํผ๋ฅผ ์์ ์ ์ธ mbuf๋ก ๋ณต์ฌํ๋ค. - primitive๋ฅผ ์ฌ์ฉํด GOT ์ํธ๋ฆฌ๋ ๊ฐ์ ํธ์ถ ์ง์ (์: NAT ์ฅ์น ์ํ ๋ด๋ถ์ ํจ์ ํฌ์ธํฐ)์
system()์ PLT ์ํธ๋ฆฌ๋ก ๋ฎ์ด์ด๋ค. - ๋ฎ์ด์ด ํธ์ถ์ ํธ๋ฆฌ๊ฑฐํ๋ค. VirtualBox๊ฐ NAT ์ฅ์น๋ฅผ ํธ์คํธ ํ๋ก์ธ์ค ๋ด๋ถ์์ ์คํํ๋ฏ๋ก ํ์ด๋ก๋๋ VirtualBox๋ฅผ ์คํํ๋ ์ฌ์ฉ์์ ๊ถํ์ผ๋ก ์คํ๋์ด guest-to-host escape๋ฅผ ํ์ฉํ๋ค.
๋์ฒด ํ์ด๋ก๋๋ก๋ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ํ ROP ์ฒด์ธ์ ์ฌ๊ณ ๊ทธ ์ฃผ์๋ฅผ ์์ฃผ ํธ์ถ๋๋ ์ฝ๋ฐฑ์ ๋ณต์ฌํ๊ฑฐ๋, pfFini/pfDtor ์์ฒด๋ฅผ ์ฐ์๋ gadgets๋ก ์ฌ์ง์ ํด ๋ฐ๋ณต์ ์ธ ์ฐ๊ธฐ๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


