Написание Эксплоита

Улучшение разработки нашего эксплоита

 

Ранее мы рассмотрели Fuxxing IMAP-сервера в разделе Simple IMAP Fuzzer. В конце наших усилий мы обнаружили что мы могли бы переписать EIP, сделав ESP только точкой регистра, указывающей на ячейку памяти под нашим управлением ( 4 байта после нашего возврата адреса). Мы продолжим и восстановим наш буфер (fuzzed = “A”*1004 + “B”*4 + “C”*4), для подтверждения, того что поток выполнил перенаправление через удаленный адрес JMP ESP.

Производим запуск fuzz_imap
Dante

 

Отладчик для поиска эксплоита
Dante

 

Управление выполнением потока

 

Теперь нам необходимо определить правильное смещение, чтобы получить исполняемый код. К счастью Metasploit приходят на помощь две очень полезные утилиты: pattern_create.rb и pattern_offset.rb. Оба эти сценария находятся в директории Metasploittools‘. При запуске pattern_create.rb, сценарий сгенерирует строку состоящую из уникальных моделей, которые мы можем использовать, чтобы заменить нашу последовательность ‘A‘.

Пример эксплоит кода:

Пример кода эксплоит
Dante

 

После того как мы успешно перезаписали EIP или SEH, нам необходимо принять значение содержащееся в регистре и скормить это значение pattern_offset.rb в какой-то момент случайной строки появившегося значения.

 

Вместо вызова командной строки pattern_create.rb, мы вызовем основной API прямо из нашего fuzzer используя Rex::Text.pattern_create(). Если мы посмотрим на источник, мы можем видеть как вызывается эта функция.

Вызов API из fuzzer
Dante

 

Итак, мы видим, что мы вызываем функцию pattern_create, которая состоит из более чем двух параметров, размера буфера мы видим создается и опциональный второй параметр, давая нам некоторый контроль над содержимым буфера. Таким образом нам необходимо, мы вызовем функцию и заменим нашу fuzzed переменную при помощи fuzzed = Rex::Text.pattern_create(11000).

 

Это вызывает наш SEH чтобы перезаписать 0x684E3368 и основываясь на значении возвращаемом pattern_offset.rb, мы можем определить что байты которые удалил наш обработчик исключений являются следующими четырьмя байтами 10361, 10362, 10363, 10364.

Производим перезапись 0x684E3368
Dante

 

Отладка эксплоит кода
Dante

 

Как это часто бывает атаки переполнения SEH, нам теперь необходимо найти POP POP RET (иные последовательности так же хороши) адрес для того чтобы перенаправить поток исполнения на наш буфер. Тем не менее, в поисках подходящего обратного адреса в surgemail.exe, приводит нас к ранее возникшей проблемой, во всех адресах присутствует нулевой байт.

Поиск обратного адреса в surgemail
Dante

 

К счастью, у нас еще есть доступ атаки, чтобы попробовать в форме частичной перезаписи, переполнение SEH только с 3 низко значимыми байтами возврата адреса. Разница в том, что на этот раз мы можем поставить наш shell код в первую часть буфера после схемы как в:

Перемещаем shell код в первую часть буфера
Dante

 

POP POP RET перенаправит нам 4 байта, перед тем как RET где мы разместим краткое JMP принимает 5 байт обратно. Затем мы получим назад JMP, который получит в середине NOPSLED.

 

Это было невозможно сделать с частично перезаписанным EIP и ESP, а из-за расположения стека ESP было четыре байта после нашего RET. Если мы сделали частичную перезапись EIP, ESP тогда будет неконтролируемой областью.

 

Затем запись эксплоита и получение shell с тем что мы узнали о наших улучшениях кода.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *