BF Forked & Threaded Stack Canaries
Last updated
Last updated
Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Wenn du es mit einer binären Datei zu tun hast, die durch einen Canary und PIE (Position Independent Executable) geschützt ist, musst du wahrscheinlich einen Weg finden, diese zu umgehen.
Beachte, dass checksec
möglicherweise nicht erkennt, dass eine binäre Datei durch einen Canary geschützt ist, wenn diese statisch kompiliert wurde und nicht in der Lage ist, die Funktion zu identifizieren.
Du kannst dies jedoch manuell feststellen, wenn du bemerkst, dass ein Wert zu Beginn eines Funktionsaufrufs im Stack gespeichert wird und dieser Wert vor dem Verlassen überprüft wird.
Der beste Weg, einen einfachen Canary zu umgehen, ist, wenn die binäre Datei ein Programm ist, das bei jeder neuen Verbindung mit ihm (Netzwerkdienst) Kindprozesse forked, denn jedes Mal, wenn du dich mit ihm verbindest, wird der gleiche Canary verwendet.
Der beste Weg, den Canary zu umgehen, besteht dann darin, ihn einfach Zeichen für Zeichen zu brute-forcen, und du kannst herausfinden, ob das erratene Canary-Byte korrekt war, indem du überprüfst, ob das Programm abgestürzt ist oder seinen regulären Ablauf fortsetzt. In diesem Beispiel brute-forced die Funktion einen 8-Byte-Canary (x64) und unterscheidet zwischen einem korrekt erratenen Byte und einem schlechten Byte, indem sie einfach überprüft, ob eine Antwort vom Server zurückgesendet wird (eine andere Möglichkeit in anderen Situationen könnte die Verwendung von try/except sein):
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, kann jedoch leicht auf 64 Bit geändert werden. Beachten Sie auch, dass das Programm zuerst ein Byte erwartet, um die Größe der Eingabe und die Nutzlast anzuzeigen.
Threads desselben Prozesses werden auch das gleiche Canary-Token teilen, daher wird es möglich sein, ein Canary zu brute-forcen, wenn die Binärdatei bei jedem Angriff einen neuen Thread erzeugt.
Darüber hinaus könnte ein Buffer Overflow in einer threaded Funktion, die mit einem Canary geschützt ist, verwendet werden, um das Master-Canary, das im TLS gespeichert ist, zu modifizieren. Das liegt daran, dass es möglich sein könnte, die Speicherposition zu erreichen, an der das TLS gespeichert ist (und damit das Canary) über einen bof im Stack eines Threads. Infolgedessen ist die Minderung nutzlos, da die Überprüfung mit zwei Canaries verwendet wird, die gleich sind (obwohl modifiziert). Dieser Angriff wird in dem 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, es ebenfalls durch mmap
generiert wird, was den Overflow ermöglichen könnte, wie im vorherigen Writeup gezeigt.
64 bits, no PIE, nx, BF canary, write in some memory a ROP to call execve
and jump there.