Stap Canaries
Reading time: 6 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.
StackGuard en StackShield
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 detecteer. 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.
Stack Smash Protector (ProPolice) -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 stap 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 gestoor in TLS (Thread Local Storage), wat deelbare geheue ruimtes oor threads toelaat om thread-spesifieke globale of statiese veranderlikes te hê. 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 gestoor by gs:0x14
, 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.
Lengtes
In x64
binêre, is die canary koekie 'n 0x8
byte qword. Die eerste sewe bytes is ewekansig en die laaste byte is 'n null byte.
In x86
binêre, is die canary koekie 'n 0x4
byte dword. Die eerste drie bytes is ewekansig en die laaste byte is 'n null byte.
caution
Die minste betekenisvolle byte van beide canaries is 'n null byte omdat dit die eerste in die stap sal wees wat van laer adresse kom en daarom funksies wat strings lees sal stop voordat dit dit lees.
Omseilings
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:
BF Forked & Threaded Stack Canaries
- 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 stap wat kwesbaar is vir 'n stap oorgang kan adresse na strings of funksies bevat wat oorgeskryf kan word om die kwesbaarheid te benut sonder om die stack canary te bereik. Kontroleer:
- Wysig beide meester en thread canary
'n Buffer oorgang in 'n gedrade funksie wat met canary beskerm word, kan gebruik word om die meester canary van die thread te wysig. As gevolg hiervan is die versagting nutteloos omdat die kontrole met twee canaries wat dieselfde is (alhoewel gewysig) gebruik word.
Boonop kan 'n buffer oorgang in 'n gedrade 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 geheueposisie te bereik waar die TLS gestoor is (en dus, die canary) via 'n bof in die stap van 'n thread.
As gevolg hiervan is die versagting nutteloos omdat die kontrole met twee canaries wat dieselfde is (alhoewel gewysig) gebruik word.
Hierdie aanval word in die skrywe uitgevoer: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Kontroleer ook 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 stap van thread geskep word, dit ook deur mmap
gegenereer word volgens dit, wat die oorgang kan 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/
Verwysings
- https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html
- http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
- https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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.