Ret2lib
Leer & oefen AWS-hacking:HackTricks Opleiding AWS Red Team Expert (ARTE)
Leer & oefen GCP-hacking:
HackTricks Opleiding GCP Red Team Expert (GRTE)
Basiese Inligting
Die essensie van Ret2Libc is om die uitvoervloei van 'n kwesbare program om te lei na 'n funksie binne 'n gedeelde biblioteek (bv. system, execve, strcpy) in plaas van die uitvoering van aanvaller-voorsiene shellcode 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
Vind die adresse
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:
As jy wil nagaan of die ASLR die adres van libc verander, kan jy dit doen:
As jy die libc wat gebruik word ken, is dit ook moontlik om die skuif na die
system
-funksie te vind met:
As jy die libc wat gebruik word ken, is dit ook moontlik om die skuif na die string
/bin/sh
funksie te vind met:
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:
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 rootregte benodig).
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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F843477771-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FC6PyZhjUxJWWaN3uLo1y%252Fuploads%252Fgit-blob-bdf76a39d8fddd45a0ddc9ac9e31b7c694be00cc%252Fimage%2520%28853%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=4dac68c0&sv=1)
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 laai (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:
Leaking libc address with ROPEn jy kan 'n pwntools-sjabloon hiervoor vind in:
Leaking libc - templateKen 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 vind.
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):
Indien jy 'n afgeleë bediener aanval, kan jy probeer om die adres van die
libc
-funksieusleep
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:
One Gadgetx86 Ret2lib Kodevoorbeeld
In hierdie voorbeeld is ASLR brute-force geïntegreer in die kode en die kwesbare binêre lê op 'n afgeleë bediener:
x64 Ret2lib Kodevoorbeeld
Kyk na die voorbeeld van:
ROP - Return Oriented ProgramingARM64 Ret2lib Voorbeeld
In die geval van ARM64, spring die ret instruksie na waar die x30-register na wys en nie waar die stapelregister 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:
Ret2lib + Printf leak - arm64Ret-in-printf (of puts)
Dit maak dit moontlik om inligting uit die proses te lek deur printf
/puts
te roep met sekere spesifieke data as 'n argument geplaas. 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 in 'n printf
formaat string kwesbaarheid te omskep deur die ret2lib
te gebruik om printf te roep met die waardes om dit te benut (klink nutteloos maar moontlik):
Ander Voorbeelde & verwysings
Ret2lib, gegewe 'n lek na die adres van 'n funksie in libc, deur een gadget te gebruik
64-bis, ASLR geaktiveer maar geen PIE, die eerste stap is om 'n oorvloei te vul tot by die byte 0x00 van die kanarie om dan puts te roep en dit te lek. Met die kanarie word 'n ROP-gadget geskep om puts te roep om die adres van puts van die GOT te lek en dan 'n ROP-gadget om
system('/bin/sh')
te roep64-bis, ASLR geaktiveer, geen kanarie, stapel oorvloei in hoof van 'n kindfunksie. ROP-gadget om puts te roep om die adres van puts van die GOT te lek en dan 'n een-gadget te roep.
64-bis, geen pie, geen kanarie, geen relro, nx. Gebruik skryffunksie om die adres van skryf (libc) te lek en roep een gadget.
Gebruik 'n formaatstring om die kanarie van die stapel te lek en 'n buffer oorvloei om in te roep na stelsel (dit is in die GOT) met die adres van
/bin/sh
.32-bis, geen relro, geen kanarie, nx, pie. Misbruik 'n slegte indeksering om adresse van libc en heap van die stapel te lek. Misbruik die buffer oorvloei om 'n ret2lib te doen wat
system('/bin/sh')
roep (die heap-adres is nodig om 'n kontrole te omseil).
Last updated