ASLR
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Adres Ruimte Uitleg Randomisering (ASLR) is 'n sekuriteitstegniek wat in bedryfstelsels gebruik word om die geheue adresse wat deur stelsels en toepassingsprosesse gebruik word, te randomiseer. Deur dit te doen, maak dit dit aansienlik moeiliker vir 'n aanvaller om die ligging van spesifieke prosesse en data, soos die stapel, hoop en biblioteke, te voorspel, wat sekere tipes eksplosies, veral buffer oorgange, verminder.
Om die ASLR-status op 'n Linux-stelsel te kontroleer, kan jy die waarde uit die /proc/sys/kernel/randomize_va_space
lêer lees. Die waarde wat in hierdie lêer gestoor is, bepaal die tipe ASLR wat toegepas word:
0: Geen randomisering. Alles is staties.
1: Konserwatiewe randomisering. Gedeelde biblioteke, stapel, mmap(), VDSO-bladsy is gerandomiseer.
2: Volledige randomisering. Benewens elemente wat deur konserwatiewe randomisering gerandomiseer is, is geheue wat deur brk()
bestuur word, gerandomiseer.
Jy kan die ASLR-status met die volgende opdrag kontroleer:
Om ASLR te deaktiveer, stel jy die waarde van /proc/sys/kernel/randomize_va_space
op 0. Dit is oor die algemeen nie aanbeveel om ASLR te deaktiveer buite toets- of foutopsporing scenario's nie. Hier is hoe jy dit kan deaktiveer:
U kan ASLR ook vir 'n uitvoering deaktiveer met:
Om ASLR te aktiver, kan jy 'n waarde van 2 na die /proc/sys/kernel/randomize_va_space
lêer skryf. Dit vereis gewoonlik wortelregte. Volledige randomisering kan gedoen word met die volgende opdrag:
Veranderinge gemaak met die echo
opdragte is tydelik en sal teruggestel word by herlaai. Om die verandering volhardend te maak, moet jy die /etc/sysctl.conf
lêer wysig en die volgende lyn byvoeg of aanpas:
Na die redigering van /etc/sysctl.conf
, pas die veranderinge toe met:
This will ensure that your ASLR settings remain across reboots.
PaX verdeel die prosesadresruimte in 3 groepe:
Kode en data (geïnisialiseerde en nie-geïnisialiseerde): .text
, .data
, en .bss
—> 16 bits entropie in die delta_exec
veranderlike. Hierdie veranderlike word ewekansig geïnitialiseer met elke proses en bygevoeg tot die aanvanklike adresse.
Geheue toegeken deur mmap()
en gedeelde biblioteke —> 16 bits, genoem delta_mmap
.
Die stapel —> 24 bits, verwys na as delta_stack
. Dit gebruik egter effektief 11 bits (van die 10de tot die 20ste byte insluitend), uitgeline op 16 bytes —> Dit lei tot 524,288 moontlike werklike stapeladresse.
Die vorige data is vir 32-bis stelsels en die verminderde finale entropie maak dit moontlik om ASLR te omseil deur die uitvoering herhaaldelik te probeer totdat die uitbuiting suksesvol voltooi word.
As jy 'n groot genoeg oorgang het om 'n groot NOP-slee voor die shellcode te huisves, kan jy eenvoudig adresse in die stapel brute-force totdat die vloei oor 'n deel van die NOP-slee spring.
'n Ander opsie hiervoor, in die geval die oorgang nie so groot is nie en die uitbuiting plaaslik uitgevoer kan word, is om die NOP-slee en shellcode in 'n omgewingsveranderlike toe te voeg.
As die uitbuiting plaaslik is, kan jy probeer om die basisadres van libc te brute-force (nuttig vir 32-bis stelsels):
As jy 'n afstandsbediening bedien, 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.
In 64-bis stelsels is die entropie baie hoër en dit behoort nie moontlik te wees nie.
Dit is moontlik om 'n groot deel van die stap met omgewingsveranderlikes te beset en dan te probeer om die binêre honderde/duisende kere plaaslik te misbruik. Die volgende kode toon hoe dit moontlik is om net 'n adres in die stap te kies en elke paar honderd uitvoerings sal daardie adres die NOP instruksie bevat:
/proc/[pid]/stat
)Die lêer /proc/[pid]/stat
van 'n proses is altyd leesbaar deur almal en dit bevat interessante inligting soos:
startcode & endcode: Adresse bo en onder met die TEKS van die binêre
startstack: Die adres van die begin van die stapel
start_data & end_data: Adresse bo en onder waar die BSS is
kstkesp & kstkeip: Huidige ESP en EIP adresse
arg_start & arg_end: Adresse bo en onder waar cli argumente is.
env_start &env_end: Adresse bo en onder waar omgewing veranderlikes is.
Daarom, as die aanvaller op dieselfde rekenaar is as die binêre wat uitgebuit word en hierdie binêre nie die oorgang van ru-argumente verwag nie, maar van 'n ander invoer wat geskep kan word na die lees van hierdie lêer. Dit is moontlik vir 'n aanvaller om 'n paar adresse uit hierdie lêer te kry en offsets daaruit vir die uitbuiting te konstrueer.
Vir meer inligting oor hierdie lêer, kyk https://man7.org/linux/man-pages/man5/proc.5.html en soek vir /proc/pid/stat
Die uitdaging is om 'n lek te gee
As jy 'n lek gegee word (maklike CTF-uitdagings), kan jy offsets daaruit bereken (veronderstel byvoorbeeld dat jy die presiese libc weergawe weet wat in die stelsel wat jy uitbuit, gebruik word). Hierdie voorbeeld uitbuiting is ontleen van die voorbeeld hier (kyk daardie bladsy vir meer besonderhede):
ret2plt
Deur 'n buffer overflow te misbruik, sal dit moontlik wees om 'n ret2plt te exploiteer om 'n adres van 'n funksie uit die libc te exfiltreer. Kyk:
Ret2pltFormat Strings Arbitrary Read
Net soos in ret2plt, as jy 'n arbitrêre lees via 'n formaat string kwesbaarheid het, is dit moontlik om die adres van 'n libc funksie uit die GOT te exfiltreer. Die volgende voorbeeld is van hier:
You can find more info about Format Strings arbitrary read in:
Format StringsProbeer om ASLR te omseil deur adresse binne die stapel te misbruik:
Ret2ret & Reo2popDie vsyscall
meganisme dien om prestasie te verbeter deur sekere stelsels oproepe in gebruikersruimte uit te voer, alhoewel hulle fundamenteel deel van die kern is. Die kritieke voordeel van vsyscalls lê in hul vaste adresse, wat nie onderhewig is aan ASLR (Address Space Layout Randomization). Hierdie vaste aard beteken dat aanvallers nie 'n inligting lek kwesbaarheid benodig om hul adresse te bepaal en dit in 'n uitbuiting te gebruik nie.
Egter, geen super interessante gadgets sal hier gevind word nie (alhoewel dit byvoorbeeld moontlik is om 'n ret;
ekwivalent te kry)
(Dit volgende voorbeeld en kode is from this writeup)
Byvoorbeeld, 'n aanvaller mag die adres 0xffffffffff600800
binne 'n uitbuiting gebruik. Terwyl die poging om direk na 'n ret
instruksie te spring mag lei tot onstabiliteit of crashes na die uitvoering van 'n paar gadgets, kan dit suksesvol wees om na die begin van 'n syscall
wat deur die vsyscall afdeling verskaf word, te spring. Deur 'n ROP gadget versigtig te plaas wat uitvoering na hierdie vsyscall adres lei, kan 'n aanvaller kode-uitvoering bereik sonder om ASLR vir hierdie deel van die uitbuiting te omseil.
Let dus op hoe dit moontlik mag wees om ASLR te omseil deur die vdso te misbruik as die kernel saamgestel is met CONFIG_COMPAT_VDSO, aangesien die vdso-adres nie gerandomiseer sal word nie. Vir meer inligting, kyk:
Ret2vDSOLeer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)