BF Forked & Threaded Stack Canaries
Last updated
Last updated
Naucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Naucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Jeśli masz do czynienia z binarnym plikiem chronionym przez canary i PIE (Position Independent Executable), prawdopodobnie będziesz musiał znaleźć sposób na ich obejście.
Zauważ, że checksec
może nie wykryć, że binarny plik jest chroniony przez canary, jeśli został on skompilowany statycznie i nie jest w stanie zidentyfikować funkcji.
Możesz jednak zauważyć to ręcznie, jeśli zauważysz, że wartość jest zapisywana na stosie na początku wywołania funkcji, a ta wartość jest sprawdzana przed wyjściem.
Najlepszym sposobem na obejście prostego canary jest, gdy binarny plik to program tworzą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 połączysz, użyty zostanie ten sam canary.
Następnie najlepszym sposobem na obejście canary jest po prostu brutalne narzucanie go znak po znaku, a możesz dowiedzieć się, czy zgadnięty bajt canary był poprawny, sprawdzając, czy program się zawiesił, czy kontynuuje swoje regularne działanie. W tym przykładzie funkcja brutalnie narzuca 8-bajtowy canary (x64) i rozróżnia między poprawnie zgadniętym bajtem a złym bajtem, po prostu sprawdzając, czy serwer wysyła odpowiedź z powrotem (innym sposobem w innych sytuacjach mogłoby być użycie try/except):
Ten przykład jest zaimplementowany dla 64 bitów, ale można go łatwo zaimplementować 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 danych wejściowych oraz samego ładunku.
Wątki tego samego procesu będą również dzielić ten sam token kanarka, dlatego będzie możliwe przeprowadzenie ataku brutalnej siły na kanarka, jeśli binarny plik tworzy nowy wątek za każdym razem, gdy następuje atak.
Co więcej, przepełnienie bufora w funkcji wątkowej zabezpieczonej kanarkiem może być wykorzystane do modyfikacji głównego kanarka przechowywanego w TLS. Dzieje się tak, ponieważ możliwe może być dotarcie do pozycji pamięci, w której przechowywane jest TLS (a zatem kanarek) za pomocą przepełnienia bufora na stosie wątku. W rezultacie zastosowanie zabezpieczenia jest bezużyteczne, ponieważ sprawdzanie jest wykonywane z użyciem dwóch kanarków, które są identyczne (choć zmodyfikowane). Ten atak jest 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 przechowywane przez mmap
i gdy tworzony jest stos wątku, również jest generowany przez mmap
, co może umożliwić przepełnienie, jak pokazano w poprzednim opisie.
64 bity, brak PIE, nx, kanarek BF, zapisz w pewnej pamięci ROP, aby wywołać execve
i przeskoczyć tam.