Stack Canaries
Last updated
Last updated
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
StackGuard voeg 'n spesiale waarde bekend as 'n canary voor die EIP (Extended Instruction Pointer) in, spesifiek 0x000aff0d
(wat null, newline, EOF, carriage return verteenwoordig) om teen buffer oorgange te beskerm. Tog bly funksies soos recv()
, memcpy()
, read()
, en bcopy()
kwesbaar, en dit beskerm nie die EBP (Base Pointer) nie.
StackShield neem 'n meer gesofistikeerde benadering as StackGuard deur 'n Global Return Stack te handhaaf, wat alle terugkeer adresse (EIPs) stoor. Hierdie opstelling verseker dat enige oorgang nie skade aanrig nie, aangesien dit 'n vergelyking tussen gestoor en werklike terugkeer adresse toelaat om oorgang voorvalle te ontdek. Boonop kan StackShield die terugkeer adres teen 'n grenswaarde nagaan om te bepaal of die EIP buite die verwagte dataruimte wys. Tog kan hierdie beskerming omseil word deur tegnieke soos Return-to-libc, ROP (Return-Oriented Programming), of ret2ret, wat aandui dat StackShield ook nie plaaslike veranderlikes beskerm nie.
-fstack-protector
:Hierdie meganisme plaas 'n canary voor die EBP, en reorganiseer plaaslike veranderlikes om buffers op hoër geheue adresse te posisioneer, wat voorkom dat hulle ander veranderlikes oorskry. Dit kopieer ook veilig argumente wat op die stapel bo plaaslike veranderlikes oorgedra word en gebruik hierdie kopieë as argumente. Tog beskerm dit nie arrays met minder as 8 elemente of buffers binne 'n gebruiker se struktuur nie.
Die canary is 'n ewekansige getal wat afgelei is van /dev/urandom
of 'n standaardwaarde van 0xff0a0000
. Dit word in TLS (Thread Local Storage) gestoor, wat dit moontlik maak dat gedeelde geheue ruimtes oor threads thread-spesifieke globale of statiese veranderlikes het. Hierdie veranderlikes word aanvanklik van die ouer proses gekopieer, en kind proses kan hul data verander sonder om die ouer of broers en susters te beïnvloed. Nietemin, as 'n fork()
gebruik word sonder om 'n nuwe canary te skep, deel alle prosesse (ouer en kinders) dieselfde canary, wat dit kwesbaar maak. Op die i386 argitektuur, word die canary by gs:0x14
gestoor, en op x86_64, by fs:0x28
.
Hierdie plaaslike beskerming identifiseer funksies met buffers wat kwesbaar is vir aanvalle en spuit kode aan die begin van hierdie funksies om die canary te plaas, en aan die einde om sy integriteit te verifieer.
Wanneer 'n webbediener fork()
gebruik, stel dit 'n brute-force aanval in staat om die canary byte vir byte te raai. Tog, die gebruik van execve()
na fork()
oorskry die geheue ruimte, wat die aanval ontken. vfork()
laat die kind proses toe om uit te voer sonder duplisering totdat dit probeer om te skryf, op watter punt 'n duplikaat geskep word, wat 'n ander benadering tot proses skepping en geheue hantering bied.
In x64
binaries, is die canary koekie 'n 0x8
byte qword. Die eerste sewe bytes is ewekansig en die laaste byte is 'n null byte.
In x86
binaries, is die canary koekie 'n 0x4
byte dword. Die eerste drie bytes is ewekansig en die laaste byte is 'n null byte.
Die minste betekenisvolle byte van beide canaries is 'n null byte omdat dit die eerste in die stapel sal wees wat van laer adresse kom en daarom funksies wat strings lees sal stop voordat dit dit lees.
Lek die canary en oorskry dit dan (bv. buffer overflow) met sy eie waarde.
As die canary in kind prosesse gefork is kan dit moontlik wees om dit brute-force een byte op 'n slag:
As daar 'n interessante lek of arbitrêre lees kwesbaarheid in die binêre is, kan dit moontlik wees om dit te lek:
Oorskry stack gestoor pointers
Die stapel wat kwesbaar is vir 'n stapel oorgang mag adresse na strings of funksies bevat wat oorgeskryf kan word om die kwesbaarheid te benut sonder om die stack canary te bereik. Kyk:
Pointer RedirectingWysig beide meester en thread canary
'n Buffer overflow in 'n threaded funksie wat met canary beskerm word, kan gebruik word om die meester canary van die thread te wysig. As gevolg hiervan is die mitigering nutteloos omdat die kontrole gebruik word met twee canaries wat dieselfde is (alhoewel gewysig).
Boonop kan 'n buffer overflow in 'n threaded funksie wat met canary beskerm word, gebruik word om die meester canary wat in die TLS gestoor is te wysig. Dit is omdat dit moontlik mag wees om die geheue posisie te bereik waar die TLS gestoor is (en dus, die canary) via 'n bof in die stapel van 'n thread. As gevolg hiervan is die mitigering nutteloos omdat die kontrole gebruik word met twee canaries wat dieselfde is (alhoewel gewysig). Hierdie aanval word in die skrywe uitgevoer: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Kyk ook na die aanbieding van https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 wat noem dat gewoonlik die TLS gestoor word deur mmap
en wanneer 'n stapel van thread geskep word, dit ook deur mmap
gegenereer word volgens dit, wat die oorgang mag toelaat soos in die vorige skrywe gewys.
Wysig die GOT inskrywing van __stack_chk_fail
As die binêre Partial RELRO het, kan jy 'n arbitrêre skrywe gebruik om die GOT inskrywing van __stack_chk_fail
te wysig na 'n dummy funksie wat nie die program blokkeer as die canary gewysig word nie.
Hierdie aanval word in die skrywe uitgevoer: https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)