House of Orange
Reading time: 6 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Basic Information
Code
- Tafuta mfano katika https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
- Mbinu ya unyakuzi ilirekebishwa katika patch hivyo hii sasa haifanyi kazi (inafanya kazi kabla ya 2.26)
- Mfano sawa na maelezo zaidi katika https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Goal
- Tumia kazi ya
malloc_printerr
Requirements
- Badilisha saizi ya juu ya chunk
- Libc na leaks za heap
Background
Baadhi ya taarifa muhimu kutoka kwa maoni ya hiki mfano:
Kitu ni kwamba, katika toleo za zamani za libc, wakati kazi ya malloc_printerr
ilipokuwa inaitwa, ilifanya kuzunguka kwenye orodha ya miundo ya _IO_FILE
iliyohifadhiwa katika _IO_list_all
, na kwa kweli kutekeleza kiashiria cha maagizo katika muundo huo.
Shambulio hili litaunda muundo wa _IO_FILE
wa uongo ambao tutauandika kwenye _IO_list_all
, na kusababisha malloc_printerr
ikimbie.
Kisha itatekeleza anwani yoyote tuliyoihifadhi katika _IO_FILE
jump table, na tutapata utekelezaji wa msimbo.
Attack
Shambulio linaanza kwa kufanikiwa kupata top chunk ndani ya unsorted bin. Hii inapatikana kwa kuita malloc
na saizi kubwa kuliko saizi ya sasa ya top chunk lakini ndogo kuliko mmp_.mmap_threshold
(kawaida ni 128K), ambayo vinginevyo ingesababisha mmap
allocation. Kila wakati saizi ya top chunk inabadilishwa, ni muhimu kuhakikisha kuwa top chunk + saizi yake imepangwa kwa ukurasa na kwamba prev_inuse bit ya top chunk imewekwa kila wakati.
Ili kupata top chunk ndani ya unsorted bin, tengeneza chunk ili kuunda top chunk, badilisha saizi ya top chunk (kwa overflow katika chunk iliyotolewa) ili top chunk + saizi iwe imepangwa kwa ukurasa na prev_inuse bit imewekwa. Kisha tengeneza chunk kubwa zaidi kuliko saizi mpya ya top chunk. Kumbuka kwamba free
haitaitwa kamwe ili kupata top chunk ndani ya unsorted bin.
Top chunk ya zamani sasa iko katika unsorted bin. Ikiwa tunaweza kusoma data ndani yake (labda kutokana na udhaifu ambao pia ulisababisha overflow), inawezekana kuvuja anwani za libc kutoka kwake na kupata anwani ya _IO_list_all.
Shambulio la unsorted bin linafanywa kwa kutumia overflow kuandika topChunk->bk->fwd = _IO_list_all - 0x10
. Wakati chunk mpya inatolewa, top chunk ya zamani itagawanywa, na kiashiria cha unsorted bin kitaandikwa kwenye _IO_list_all
.
Hatua inayofuata inahusisha kupunguza saizi ya top chunk ya zamani ili ifae katika bin ndogo, hasa kuweka saizi yake kuwa 0x61. Hii inatumika kwa madhumuni mawili:
- Kuingiza katika Bin Ndogo 4: Wakati
malloc
inachambua unsorted bin na kuona chunk hii, itajaribu kuingiza katika bin ndogo 4 kutokana na saizi yake ndogo. Hii inafanya chunk kuishia kwenye kichwa cha orodha ya bin ndogo 4 ambayo ni eneo la kiashiria cha FD cha chunk ya_IO_list_all
kwani tuliandika anwani ya karibu katika_IO_list_all
kupitia shambulio la unsorted bin. - Kusababisha Ukaguzi wa Malloc: Manipulation hii ya saizi ya chunk itasababisha
malloc
kufanya ukaguzi wa ndani. Wakati inakagua saizi ya chunk ya uongo ya mbele, ambayo itakuwa sifuri, inasababisha kosa na kuitamalloc_printerr
.
Manipulation ya bin ndogo itakuruhusu kudhibiti kiashiria cha mbele cha chunk. Mchanganyiko na _IO_list_all unatumika kuunda muundo wa uongo wa _IO_FILE. Muundo huu umeundwa kwa uangalifu ili kujumuisha maeneo muhimu kama _IO_write_base
na _IO_write_ptr
yaliyowekwa kwa thamani zinazopita ukaguzi wa ndani katika libc. Zaidi ya hayo, jump table inaundwa ndani ya muundo wa uongo, ambapo kiashiria cha maagizo kimewekwa kwenye anwani ambapo msimbo wa kiholela (kwa mfano, kazi ya system
) unaweza kutekelezwa.
Ili kufupisha sehemu iliyobaki ya mbinu:
- Punguza Top Chunk ya Zamani: Badilisha saizi ya top chunk ya zamani kuwa 0x61 ili ifae katika bin ndogo.
- Weka Muundo wa Uongo wa
_IO_FILE
: Punguza top chunk ya zamani na muundo wa uongo wa _IO_FILE na weka maeneo ipasavyo ili kuiba mtiririko wa utekelezaji.
Hatua inayofuata inahusisha kuunda muundo wa uongo wa _IO_FILE ambao unachanganya na top chunk ya zamani ambayo kwa sasa iko katika unsorted bin. Bytes za kwanza za muundo huu zimeundwa kwa uangalifu ili kujumuisha kiashiria cha amri (kwa mfano, "/bin/sh") ambacho kitatekelezwa.
Maeneo muhimu katika muundo wa uongo wa _IO_FILE, kama _IO_write_base
na _IO_write_ptr
, yamewekwa kwa thamani zinazopita ukaguzi wa ndani katika libc. Zaidi ya hayo, jump table inaundwa ndani ya muundo wa uongo, ambapo kiashiria cha maagizo kimewekwa kwenye anwani ambapo msimbo wa kiholela unaweza kutekelezwa. Kawaida, hii itakuwa anwani ya kazi ya system
au kazi nyingine inayoweza kutekeleza amri za shell.
Shambulio linafikia kilele wakati wito wa malloc
unasababisha utekelezaji wa msimbo kupitia muundo wa _IO_FILE uliofanywa. Hii inaruhusu utekelezaji wa msimbo wa kiholela, kwa kawaida ikisababisha shell kuanzishwa au payload nyingine mbaya kutekelezwa.
Muhtasari wa Shambulio:
- Weka top chunk: Tengeneza chunk na badilisha saizi ya top chunk.
- Lazimisha top chunk kuingia kwenye unsorted bin: Tengeneza chunk kubwa zaidi.
- Vuja anwani za libc: Tumia udhaifu kusoma kutoka kwenye unsorted bin.
- Fanya shambulio la unsorted bin: Andika kwenye _IO_list_all kwa kutumia overflow.
- Punguza top chunk ya zamani: Badilisha saizi yake ili ifae katika bin ndogo.
- Weka muundo wa uongo wa _IO_FILE: Unda muundo wa faili wa uongo ili kuiba mtiririko wa udhibiti.
- Lazimisha utekelezaji wa msimbo: Tengeneza chunk ili kutekeleza shambulio na kuendesha msimbo wa kiholela.
Mbinu hii inatumia mitambo ya usimamizi wa heap, uvujaji wa taarifa za libc, na overflows za heap ili kufikia utekelezaji wa msimbo bila kuitisha moja kwa moja free
. Kwa kuunda kwa uangalifu muundo wa uongo wa _IO_FILE na kuuweka katika eneo sahihi, shambulio linaweza kuiba mtiririko wa udhibiti wakati wa operesheni za kawaida za allocation ya kumbukumbu. Hii inaruhusu utekelezaji wa msimbo wa kiholela, ambayo inaweza kusababisha shell au shughuli nyingine mbaya.
References
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_orange/
- https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za udukuzi kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.