
Apache Struts 2.0 RCE уязвимость - Позволяет злоумышленнику внедрять команды ОС в веб-приложение через content-type header
Уязвимость удаленного выполнения кода (RCE) в Apache Struts 2.0
Это скрипт для эксплуатации CVE-2017-5638. Он позволяет злоумышленнику внедрять команды операционной системы в веб-приложение через заголовок Content-Type.
Apache Struts 2 — это веб-фреймворк с открытым исходным кодом для разработки Java EE веб-приложений. Он использует и расширяет Java Servlet API, чтобы побудить разработчиков применять архитектуру «модель-представление-контроллер» (MVC).
В последнюю неделю марта 2017 года хакер, работающий с Apache Struts и известный как «Nike Zheng», опубликовал публичный proof-of-concept эксплойт, демонстрирующий, насколько легко можно удаленно выполнять команды операционной системы на уязвимом сервере Apache Struts 2.
Уязвимость CVE-2017-5638 — https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-5638 — позволяет неаутентифицированное удаленное выполнение кода (RCE) через специально сформированное значение Content-Type в HTTP-запросе. Злоумышленник может создать некорректное значение для Content-Type, что приведет к возникновению исключения в уязвимом программном обеспечении. При подготовке сообщения об ошибке для отображения дефект в анализаторе Apache Struts Jakarta Multipart приводит к выполнению вредоносного значения Content-Type вместо его отображения.
После публикации этого эксплойта было зафиксировано большое количество сканирований, нацеленных на поиск уязвимых серверов Apache. Поскольку эксплойт очень прост в выполнении, любой может с легкостью удаленно эксплуатировать уязвимые машины. В связи с этим были зарегистрированы частые атаки, последовавшие за массовыми сканированиями.
Один из наших клиентов попросил нас проверить все их IP-адреса, поскольку они широко использовали уязвимый фреймворк Apache Struts 2 и не имели точных записей о том, какие IP (веб-серверы) работали под управлением уязвимой версии Apache. Требовалось проверить около тысячи IP-адресов. Клиент потребовал предоставить все уязвимые домены вместе с информацией о том, является ли сервер Linux или Windows. Чтобы избежать утомительной задачи сканирования каждого IP вручную, я написал небольшой скрипт.
Скрипт объединяет следующие функции/задачи:
Чтение имен уязвимых доменов одно за другим из файла, содержащего список доменов.
Использование официального эксплойта для проверки уязвимых серверов.
Запуск эксплойта и определение, является ли сервер Windows или Linux.