House of Orange
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The exploitation technique was fixed in this patch so this is no longer working (working in earlier than 2.26)
Same example with more comments in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Abuse malloc_printerr
function
Overwrite the top chunk size
Libc and heap leaks
Some needed background from the comments from this example:
Jambo ni kwamba, katika toleo za zamani za libc, wakati malloc_printerr
inaitwa, ilifanya kuzunguka kwenye orodha ya _IO_FILE
structs zilizohifadhiwa katika _IO_list_all
, na kwa kweli kutekeleza kiashiria cha maagizo katika struct hiyo.
Shambulio hili litaunda struct ya _IO_FILE
bandia ambayo tutaiandika kwenye _IO_list_all
, na kusababisha malloc_printerr
ikimbie.
Kisha itatekeleza anwani yoyote tuliyoihifadhi katika _IO_FILE
structs jump table, na tutapata utekelezaji wa msimbo.
Shambulio linaanza kwa kufanikiwa kupata top chunk ndani ya unsorted bin. Hii inapatikana kwa kuita malloc
kwa saizi kubwa kuliko saizi ya sasa ya top chunk lakini ndogo kuliko mmp_.mmap_threshold
(ya 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 kila wakati imewekwa.
Ili kupata top chunk ndani ya unsorted bin, allocate 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 allocate chunk kubwa 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 kwa 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 inafanya kazi mbili:
Kuongeza kwenye Bin Ndogo 4: Wakati malloc
inakagua unsorted bin na kuona chunk hii, itajaribu kuiongeza kwenye 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 Mchakato wa Malloc: Manipulation hii ya saizi ya chunk itasababisha malloc
kufanya ukaguzi wa ndani. Wakati inakagua saizi ya chunk ya mbele ya uwongo, ambayo itakuwa sifuri, inasababisha kosa na kuita malloc_printerr
.
Manipulation ya bin ndogo itakuruhusu kudhibiti kiashiria cha mbele cha chunk. Overlap na _IO_list_all inatumika kuunda muundo wa _IO_FILE bandia. 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 bandia, ambapo kiashiria cha maagizo kimewekwa kwenye anwani ambapo msimbo wa kiholela (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 Bandia wa _IO_FILE
: Overlap top chunk ya zamani na muundo wa bandia wa _IO_FILE na weka maeneo ipasavyo ili kuiba mtiririko wa utekelezaji.
Hatua inayofuata inahusisha kuunda muundo wa bandia wa _IO_FILE ambao unashirikiana na top chunk ya zamani ambayo kwa sasa iko katika unsorted bin. Bytes za kwanza za muundo huu zimeundwa kwa uangalifu ili kujumuisha kiashiria kwa amri (mfano, "/bin/sh") ambayo itatekelezwa.
Maeneo muhimu katika muundo wa bandia 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 bandia, 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
unachochea utekelezaji wa msimbo kupitia muundo wa _IO_FILE ulioharibiwa. Hii inaruhusu utekelezaji wa msimbo wa kiholela, kwa kawaida ikisababisha shell kuanzishwa au payload nyingine mbaya kutekelezwa.
Muhtasari wa Shambulio:
Weka top chunk: Allocate chunk na badilisha saizi ya top chunk.
Lazimisha top chunk kuingia kwenye unsorted bin: Allocate chunk kubwa.
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 bandia wa _IO_FILE: Unda muundo wa faili bandia ili kuiba mtiririko wa udhibiti.
Chochea utekelezaji wa msimbo: Allocate 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 free
moja kwa moja. Kwa kuunda kwa uangalifu muundo wa bandia 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.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)