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)
Jeśli masz do czynienia z binarnym plikiem chronionym przez canary i PIE (Position Independent Executable), prawdopodobnie musisz znaleźć sposób na ich obejście.
Zauważ, że checksec
może nie wykryć, że binarny plik jest chroniony przez canary, jeśli został skompilowany statycznie i nie jest w stanie zidentyfikować funkcji.
Jednak możesz to zauważyć ręcznie, jeśli stwierdzisz, że wartość jest zapisywana na stosie na początku wywołania funkcji i ta wartość jest sprawdzana przed zakończeniem.
Najlepszym sposobem na obejście prostego canary jest, jeśli binarny plik to program forkujący procesy potomne za każdym razem, gdy nawiązujesz z nim nowe połączenie (usługa sieciowa), ponieważ za każdym razem, gdy się z nim łączysz, używany będzie ten sam canary.
Wtedy najlepszym sposobem na obejście canary jest po prostu brute-force'owanie go znak po znaku, a możesz ustalić, czy zgadnięty bajt canary był poprawny, sprawdzając, czy program się zawiesił, czy kontynuuje swój regularny przepływ. W tym przykładzie funkcja brute-force'uje 8-bajtowy canary (x64) i rozróżnia między poprawnie zgadniętym bajtem a złym bajtem, po prostu sprawdzając, czy odpowiedź jest wysyłana z serwera (innym sposobem w innej sytuacji mogłoby być użycie try/except):
Ten przykład jest zaimplementowany dla 64 bitów, ale mógłby być łatwo zaimplementowany dla 32 bitów.
To jest zaimplementowane dla 32 bitów, ale można to łatwo zmienić na 64 bity. Zauważ również, że w tym przykładzie program oczekiwał najpierw bajtu wskazującego rozmiar wejścia oraz ładunku.
Wątki tego samego procesu również dzielą ten sam token canary, dlatego możliwe będzie brute-force'owanie canary, jeśli binarny program tworzy nowy wątek za każdym razem, gdy występuje atak.
Ponadto, przepełnienie bufora w funkcji wątkowej chronionej canary może być użyte do zmodyfikowania głównego canary przechowywanego w TLS. Dzieje się tak, ponieważ może być możliwe dotarcie do pozycji pamięci, w której przechowywany jest TLS (a tym samym canary) za pomocą bof w stosie wątku. W rezultacie, łagodzenie jest bezużyteczne, ponieważ sprawdzenie jest używane z dwoma canary, które są takie same (choć zmodyfikowane). Ten atak został opisany w artykule: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Sprawdź również prezentację https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015, która wspomina, że zazwyczaj TLS jest przechowywany przez mmap
, a gdy stos wątku jest tworzony, jest również generowany przez mmap
, co może umożliwić przepełnienie, jak pokazano w poprzednim artykule.
64 bity, brak PIE, nx, BF canary, zapisz w pamięci ROP, aby wywołać execve
i przeskoczyć tam.