BF Forked & Threaded Stack Canaries
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ako se suočavate sa binarnim fajlom zaštićenim kanarom i PIE (Position Independent Executable), verovatno treba da pronađete način da ih zaobiđete.
Imajte na umu da checksec
možda neće otkriti da je binarni fajl zaštićen kanarom ako je statički kompajliran i nije sposoban da identifikuje funkciju.
Međutim, možete to ručno primetiti ako otkrijete da je vrednost sačuvana na steku na početku poziva funkcije i da se ova vrednost proverava pre izlaska.
Najbolji način da se zaobiđe jednostavna kanara je ako je binarni fajl program koji fork-uje dečije procese svaki put kada uspostavite novu vezu s njim (mrežna usluga), jer svaki put kada se povežete s njim biće korišćen isti kanar.
Dakle, najbolji način da se zaobiđe kanar je jednostavno brute-force-ovati ga karakter po karakter, i možete da utvrdite da li je pogodjena bajt kanara tačna proverom da li je program srušen ili nastavlja svoj redovni tok. U ovom primeru funkcija brute-force-uje kanar od 8 bajtova (x64) i razlikuje između tačno pogodjenog bajta i lošeg bajta samo proverom da li je odgovor poslat nazad od strane servera (drugi način u drugoj situaciji mogao bi biti korišćenje try/except):
Ovaj primer je implementiran za 64 bita, ali bi mogao lako biti implementiran i za 32 bita.
Ovo je implementirano za 32 bita, ali se to može lako promeniti na 64 bita. Takođe, imajte na umu da je za ovaj primer program očekivao prvi bajt koji označava veličinu ulaza i payload.
Threadovi istog procesa će takođe deliti isti canary token, stoga će biti moguće brute-forcati canary ako binarni fajl pokreće novu nit svaki put kada se dogodi napad.
Štaviše, buffer overflow u funkciji sa nitima zaštićenoj canary-jem mogao bi se koristiti za modifikaciju glavnog canary-ja koji je smešten u TLS. To je zato što bi moglo biti moguće doći do memorijske pozicije gde je TLS smešten (i stoga, canary) putem bof-a u steku niti. Kao rezultat, mitigacija je beskorisna jer se provera koristi sa dva canary-ja koja su ista (iako modifikovana). Ovaj napad je izveden u tekstu: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Pogledajte takođe prezentaciju https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015 koja pominje da se obično TLS čuva putem mmap
i kada se kreira stack niti takođe se generiše putem mmap
, što može omogućiti overflow kao što je prikazano u prethodnom tekstu.
64 bita, bez PIE, nx, BF canary, upisati u neku memoriju ROP da pozove execve
i skoči tamo.