Grundlegende Methodik der binären Ausnutzung
Reading time: 8 minutes
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
ELF Grundinformationen
Bevor Sie mit der Ausnutzung von irgendetwas beginnen, ist es interessant, einen Teil der Struktur einer ELF-Binärdatei zu verstehen:
Ausnutzungswerkzeuge
Stack Overflow Methodik
Bei so vielen Techniken ist es gut, ein Schema zu haben, wann jede Technik nützlich sein wird. Beachten Sie, dass die gleichen Schutzmaßnahmen unterschiedliche Techniken beeinflussen werden. Sie können Möglichkeiten finden, die Schutzmaßnahmen in jedem Schutzabschnitt zu umgehen, jedoch nicht in dieser Methodik.
Steuerung des Flusses
Es gibt verschiedene Möglichkeiten, wie Sie den Fluss eines Programms steuern können:
- Stack Overflows, indem der Rückgabepointer vom Stack oder der EBP -> ESP -> EIP überschrieben wird.
- Möglicherweise müssen Sie einen Integer Overflow ausnutzen, um den Overflow zu verursachen.
- Oder über Arbitrary Writes + Write What Where to Execution.
- Format-Strings: Missbrauch von
printf
, um beliebige Inhalte an beliebige Adressen zu schreiben. - Array-Indexierung: Missbrauch einer schlecht gestalteten Indizierung, um einige Arrays zu steuern und einen beliebigen Schreibzugriff zu erhalten.
- Möglicherweise müssen Sie einen Integer Overflow ausnutzen, um den Overflow zu verursachen.
- bof zu WWW über ROP: Missbrauch eines Buffer Overflows, um ein ROP zu konstruieren und in der Lage zu sein, ein WWW zu erhalten.
Sie finden die Write What Where to Execution Techniken in:
Ewige Schleifen
Etwas, das zu berücksichtigen ist, ist, dass normalerweise nur eine Ausnutzung einer Schwachstelle möglicherweise nicht ausreicht, um einen erfolgreichen Exploit auszuführen, insbesondere müssen einige Schutzmaßnahmen umgangen werden. Daher ist es interessant, einige Optionen zu diskutieren, um eine einzelne Schwachstelle mehrmals in derselben Ausführung der Binärdatei ausnutzbar zu machen:
- Schreiben Sie in eine ROP-Kette die Adresse der
main
-Funktion oder die Adresse, an der die Schwachstelle auftritt. - Durch die Kontrolle einer ordnungsgemäßen ROP-Kette könnten Sie in der Lage sein, alle Aktionen in dieser Kette auszuführen.
- Schreiben Sie die
exit
-Adresse in GOT (oder eine andere Funktion, die von der Binärdatei vor dem Ende verwendet wird) die Adresse, um zurück zur Schwachstelle zu gehen. - Wie in .fini_array, speichern Sie hier 2 Funktionen, eine um die Schwachstelle erneut aufzurufen und eine andere um
__libc_csu_fini
aufzurufen, die die Funktion aus.fini_array
erneut aufruft.
Ausnutzungsziele
Ziel: Eine vorhandene Funktion aufrufen
- ret2win: Es gibt eine Funktion im Code, die Sie aufrufen müssen (vielleicht mit einigen spezifischen Parametern), um das Flag zu erhalten.
- In einem regulären bof ohne PIE und canary müssen Sie nur die Adresse in die Rückgabeadresse, die im Stack gespeichert ist, schreiben.
- In einem bof mit PIE müssen Sie es umgehen.
- In einem bof mit canary müssen Sie es umgehen.
- Wenn Sie mehrere Parameter setzen müssen, um die ret2win-Funktion korrekt aufzurufen, können Sie verwenden:
- Eine ROP Kette, wenn genügend Gadgets vorhanden sind, um alle Parameter vorzubereiten.
- SROP (falls Sie diesen Syscall aufrufen können), um viele Register zu steuern.
- Gadgets von ret2csu und ret2vdso, um mehrere Register zu steuern.
- Über ein Write What Where könnten Sie andere Schwachstellen (nicht bof) ausnutzen, um die
win
-Funktion aufzurufen. - Pointer-Redirecting: Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
- ASLR oder PIE könnten die Adressen beeinflussen.
- Uninitialisierte Variablen: Man weiß nie.
Ziel: RCE
Über Shellcode, wenn nx deaktiviert oder Shellcode mit ROP gemischt:
- (Stack) Shellcode: Dies ist nützlich, um einen Shellcode im Stack zu speichern, bevor oder nachdem der Rückgabepointer überschrieben wurde, und dann dorthin zu springen, um ihn auszuführen:
- In jedem Fall, wenn es einen canary, müssen Sie in einem regulären bof (leaken) umgehen.
- Ohne ASLR und nx ist es möglich, zur Adresse des Stacks zu springen, da sie sich niemals ändern wird.
- Mit ASLR müssen Sie Techniken wie ret2esp/ret2reg verwenden, um dorthin zu springen.
- Mit nx müssen Sie einige ROP verwenden, um
memprotect
aufzurufen und eine Seiterwx
zu machen, um dann den Shellcode dort zu speichern (zum Beispiel durch Aufruf von read) und dann dorthin zu springen. - Dies wird Shellcode mit einer ROP-Kette mischen.
Über Syscalls
- Ret2syscall: Nützlich, um
execve
aufzurufen, um beliebige Befehle auszuführen. Sie müssen in der Lage sein, die Gadgets zu finden, um den spezifischen Syscall mit den Parametern aufzurufen. - Wenn ASLR oder PIE aktiviert sind, müssen Sie sie besiegen, um ROP-Gadgets aus der Binärdatei oder Bibliotheken zu verwenden.
- SROP kann nützlich sein, um die ret2execve vorzubereiten.
- Gadgets von ret2csu und ret2vdso, um mehrere Register zu steuern.
Über libc
- Ret2lib: Nützlich, um eine Funktion aus einer Bibliothek (normalerweise aus
libc
) wiesystem
mit einigen vorbereiteten Argumenten (z.B.'/bin/sh'
) aufzurufen. Sie müssen die Binärdatei die Bibliothek laden, mit der Funktion, die Sie aufrufen möchten (libc normalerweise). - Wenn statisch kompiliert und kein PIE, ändern sich die Adressen von
system
und/bin/sh
nicht, sodass es möglich ist, sie statisch zu verwenden. - Ohne ASLR und Kenntnis der geladenen libc-Version ändern sich die Adressen von
system
und/bin/sh
nicht, sodass es möglich ist, sie statisch zu verwenden. - Mit ASLR aber ohne PIE, wenn die libc bekannt ist und die Binärdatei die
system
-Funktion verwendet, ist es möglich,ret
zur Adresse von system in der GOT mit der Adresse von'/bin/sh'
im Parameter zu verwenden (das müssen Sie herausfinden). - Mit ASLR aber ohne PIE, wenn die libc bekannt ist und ohne dass die Binärdatei die
system
verwendet: - Verwenden Sie
ret2dlresolve
, um die Adresse vonsystem
aufzulösen und sie aufzurufen. - Umgehen ASLR und berechnen Sie die Adresse von
system
und'/bin/sh'
im Speicher. - Mit ASLR und PIE und ohne Kenntnis der libc: Sie müssen:
- PIE umgehen.
- Die
libc
-Version herausfinden (ein paar Funktionsadressen leaken). - Die vorherigen Szenarien mit ASLR überprüfen, um fortzufahren.
Über EBP/RBP
- Stack Pivoting / EBP2Ret / EBP Chaining: Steuern Sie den ESP, um RET über den gespeicherten EBP im Stack zu steuern.
- Nützlich für off-by-one Stack Overflows.
- Nützlich als alternative Möglichkeit, EIP zu steuern, während EIP missbraucht wird, um die Nutzlast im Speicher zu konstruieren und dann über EBP dorthin zu springen.
Sonstiges
- Pointer-Redirecting: Falls der Stack Zeiger auf eine Funktion enthält, die aufgerufen werden soll, oder auf einen String, der von einer interessanten Funktion (system oder printf) verwendet werden soll, ist es möglich, diese Adresse zu überschreiben.
- ASLR oder PIE könnten die Adressen beeinflussen.
- Uninitialisierte Variablen: Man weiß nie.
tip
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Unterstützen Sie HackTricks
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.