BF Forked & Threaded Stack Canaries
Last updated
Last updated
Lernen Sie & üben Sie AWS-Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen Sie & üben Sie GCP-Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn Sie es mit einem durch einen Canary und PIE (Position Independent Executable) geschützten Binärprogramm zu tun haben, müssen Sie wahrscheinlich einen Weg finden, um sie zu umgehen.
Beachten Sie, dass checksec
möglicherweise nicht feststellt, dass ein Binärprogramm durch einen Canary geschützt ist, wenn es statisch kompiliert wurde und nicht in der Lage ist, die Funktion zu identifizieren.
Sie können jedoch manuell feststellen, dass ein Wert am Anfang eines Funktionsaufrufs im Stapel gespeichert wird und dieser Wert vor dem Verlassen überprüft wird.
Der beste Weg, einen einfachen Canary zu umgehen, besteht darin, wenn das Binärprogramm bei jeder neuen Verbindung (Netzwerkdienst) Kindprozesse erstellt, da bei jeder Verbindung zu ihm dieselbe Canary verwendet wird.
Dann ist der beste Weg, die Canary zu umgehen, einfach, sie Zeichen für Zeichen zu brutzeln, und Sie können herausfinden, ob das geratene Canary-Byte korrekt war, indem Sie überprüfen, ob das Programm abgestürzt ist oder seinen regulären Ablauf fortsetzt. In diesem Beispiel bruteforct die Funktion eine 8-Byte-Canary (x64) und unterscheidet zwischen einem korrekt geratenen Byte und einem falschen Byte, indem sie einfach überprüft, ob ein Antwort vom Server zurückgesendet wird (in anderen Situationen könnte eine try/except verwendet werden):
Dieses Beispiel ist für 64-Bit implementiert, könnte aber leicht für 32-Bit implementiert werden.
Dies ist für 32-Bit implementiert, könnte aber leicht auf 64-Bit geändert werden. Beachten Sie auch, dass für dieses Beispiel das Programm zunächst ein Byte erwartet, um die Größe der Eingabe und des Payloads anzugeben.
Threads des gleichen Prozesses teilen sich auch das gleiche Canary-Token, daher ist es möglich, einen Canary durch Brute-Force zu ermitteln, wenn das Binär jedes Mal einen neuen Thread erstellt, wenn ein Angriff stattfindet.
Darüber hinaus könnte ein Pufferüberlauf in einer Thread-Funktion, die mit Canary geschützt ist, verwendet werden, um den Master-Canary im TLS zu modifizieren. Dies liegt daran, dass es möglicherweise möglich ist, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und daher der Canary) über einen Pufferüberlauf im Stack eines Threads. Als Ergebnis ist die Schutzmaßnahme nutzlos, da die Überprüfung mit zwei identischen Canaries erfolgt (obwohl modifiziert). Dieser Angriff wird im Writeup durchgeführt: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads
Überprüfen Sie auch die Präsentation von https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015, die erwähnt, dass normalerweise das TLS durch mmap
gespeichert wird und wenn ein Stack eines Threads erstellt wird, wird er auch durch mmap
generiert, was den Überlauf ermöglichen könnte, wie im vorherigen Writeup gezeigt.
64 Bit, kein PIE, nx, BF-Canary, schreiben Sie in einen Speicher einen ROP, um execve
aufzurufen und dorthin zu springen.