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

Basic Information

Code

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:

  1. 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.
  2. 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 kuita malloc_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:

  1. Weka top chunk: Tengeneza chunk na badilisha saizi ya top chunk.
  2. Lazimisha top chunk kuingia kwenye unsorted bin: Tengeneza chunk kubwa zaidi.
  3. Vuja anwani za libc: Tumia udhaifu kusoma kutoka kwenye unsorted bin.
  4. Fanya shambulio la unsorted bin: Andika kwenye _IO_list_all kwa kutumia overflow.
  5. Punguza top chunk ya zamani: Badilisha saizi yake ili ifae katika bin ndogo.
  6. Weka muundo wa uongo wa _IO_FILE: Unda muundo wa faili wa uongo ili kuiba mtiririko wa udhibiti.
  7. 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

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