You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.1 KiB
108 lines
4.1 KiB
СКАНЕР УЯЗВИМОСТИ APACHE TOMCAT/CGI-BIN (CVE-2019-0232)
|
|
ТЕХНИЧЕСКОЕ ЗАДАНИЕ
|
|
|
|
|
|
ЦЕЛЬ
|
|
|
|
Необходимо разработать сканер доменов с уязвимостью CVE-2019-0232.
|
|
|
|
|
|
EXPLOIT
|
|
|
|
Суть эксплойта - в некорректном экранировании командной строки скрипта cgi-bin сервера Apache Tomcat.
|
|
Из-за этого возможно удаленное исполнение кода.
|
|
Если дать запрос вида
|
|
|
|
http://localhost/cgi-bin/hello.bat?&whoami
|
|
|
|
то в результате выполнится cmd.exe /c "whoami"
|
|
|
|
Подробности описаны по ссылкам:
|
|
https://blog.trendmicro.com/trendlabs-security-intelligence/uncovering-cve-2019-0232-a-remote-code-execution-vulnerability-in-apache-tomcat/
|
|
https://wwws.nightwatchcybersecurity.com/2019/04/30/remote-code-execution-rce-in-cgi-servlet-apache-tomcat-on-windows-cve-2019-0232/
|
|
|
|
|
|
РЕАЛИЗАЦИЯ
|
|
|
|
В качестве источника сканирования будем использовать сервис https://www.shodan.io/search?query=apache+tomcat
|
|
Для доступа к shodan.io нужна учетка. Но по идее это безопасно даже при реализации как модуль к боту.
|
|
Можно предварительно выкачивать нужные данные в формате .csv и загружать их отдельно в боты через конфиги.
|
|
|
|
Результатом сканирования является список записей с полями:
|
|
- URL исходного запроса (http://domain.com/cgi-bin/script.bat?&dir например)
|
|
- полный HTTP-ответ на запрос, включая все HTTP-заголовки и тело ответа
|
|
- URL whoami-запроса (http://domain.com/cgi-bin/script.bat?&whoami)
|
|
- полный HTTP-ответ на запрос whoami (см.ниже), включая все HTTP-заголовки и тело ответа
|
|
|
|
Алгоритм сканирования следующий:
|
|
1. парсим ответ shodan.io на данный запрос, учитывая пейджинг. Получаем из ответа имена сайтов.
|
|
ЛИБО работаем по .csv или .json-файлу, экспортированному с сервиса (это платная услуга на сервисе).
|
|
2. берем следующий домен с выхода сканера.
|
|
3. если в заголовках есть версия серверного ПО, убеждаемся что она меньше 7.0.94, 8.5.40 и 9.0.19 соответствено.
|
|
Если версия больше или равна, пропускаем домен, переходим к следующему.
|
|
Если версия меньше или отсутствует, продолжаем.
|
|
4. делаем запросы
|
|
|
|
http://domain.com/cgi-bin/hello.bat?&dir
|
|
http://domain.com/cgi-bin/hello.bat?&dir
|
|
http://domain.com/cgi-bin/test.bat?&dir
|
|
http://domain.com/cgi-bin/info.bat?&dir
|
|
http://domain.com/cgi-bin/0.bat?&dir
|
|
http://domain.com/cgi-bin/1.bat?&dir
|
|
|
|
Перебор продолжаем, либо пока не переберем все варианты скриптов, либо пока не получим нужный нам ответ.
|
|
Как можно видеть, названия файлов варьируются - эти имена лучше забить в массив в программе, и работать перебором.
|
|
|
|
Названия скриптов для пробы:
|
|
|
|
hello.bat
|
|
helloworld.bat
|
|
test.bat
|
|
index.bat
|
|
info.bat
|
|
sysinfo.bat
|
|
run.bat
|
|
tomcat.bat
|
|
0.bat
|
|
1.bat
|
|
2.bat
|
|
...
|
|
10.bat
|
|
|
|
Кроме того, для каждого имени скрипта нужно добавлять цифры от 0 до 9 к его имени.
|
|
То есть, для имени hello.bat мы попробуем следующие варианты:
|
|
hello.bat
|
|
hello0.bat
|
|
hello1.bat
|
|
..
|
|
hello9.bat
|
|
|
|
ВАЖНО: посмотреть почему метасплойт работает без подбора имени скрипта!
|
|
https://www.exploit-db.com/exploits/47073
|
|
ОТВЕТ: потому что там имя скрипта задается извне, т.е. мы скрипт на самом деле не знаем.
|
|
|
|
4. Если был получен код 200 в ответ, следует проанализировать ответ на предмет уязвимости:
|
|
- для команды dir в ответе всегда есть устойчивые паттерны
|
|
mm.dd.YYYY HH:mm <DIR> .
|
|
mm.dd.YYYY HH:mm <DIR> ..
|
|
|
|
Если этот паттерн присутствует в ответе:
|
|
- делаем запрос http://domain.com/cgi-bin/<script>.bat?&whoami
|
|
(здесь script - имя того скрипта, для которого удалось получить ответ 200 с искомым паттерном)
|
|
- добавляем в результирующий список запросы и ответы.
|
|
|
|
|
|
Сканер должен быть оформлен следующим образом:
|
|
* это может быть скрипт на распространенном скриптовом языке (например, python или PowerShell)
|
|
* скрипт должен вести лог в текущем каталоге, с именем $(script).log, где $(script) - это имя собственно скрипта
|
|
* лог должен иметь отметки даты-времени на каждое событие
|
|
* логирование может быть базовым и расширенным - переключается опцией командной строки
|
|
* в лог нужно добавлять следующие события:
|
|
- старт программы, с ее версией
|
|
- обнаружение домена с уязвимостью:
|
|
- домен
|
|
- версия софта
|
|
- полные HTTP-запросы и ответы
|
|
каждые Н минут (как вариант - итераций поиска) выводить статистику:
|
|
- % доменов просканировано, % уязвимых доменов найдено
|
|
- при расширенном логировании нужно логировать каждый HTTP-запрос и ответ (даже если по ним нет успеха).
|