Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
SC3010-Computer-Security — Использование Struts2 и PowerShell для воссоздания уязвимости OGNL Injection CVE-2017-5638. | Kitploit
Инструменты/GitHubGitHub/aipeacs/sc3010-computer-security
Статический анализАнализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеРазработка Полезной НагрузкиЛаборатории и ПрактикаArchived
GitHubaipeacs/sc3010-computer-security

SC3010-Computer-Security

3 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Использование Struts2 и PowerShell для воссоздания уязвимости OGNL Injection CVE-2017-5638.

Репозиторий

SC3010-Компьютерная безопасность — Воспроизведение атаки CVE-2017-5638

Этот репозиторий является частью проекта курса SC3010 "Компьютерная безопасность".
В нём воспроизводится CVE-2017-5638, критическая уязвимость удалённого выполнения кода в Apache Struts 2 (версии 2.3.5–2.3.31 и 2.5–2.5.10), которая была использована в утечке данных Equifax 2017 года, позволившей злоумышленникам получить личные данные примерно 147 миллионов человек.

Уязвимость возникает из-за единственного дефекта проектирования: когда Apache Struts не может разобрать запрос на загрузку multipart/form-data, он формирует сообщение об ошибке, вставляя необработанный заголовок Content-Type (без санитизации) в строку, которая затем передаётся интерпретатору выражений OGNL. Злоумышленник, поместив OGNL-выражение в заголовок Content-Type, добивается его выполнения на стороне сервера с правами пользователя процесса Tomcat.

В репозитории содержатся:

  • Рабочий уязвимый сервер на Java/Maven (Struts2 2.3.28) с конечной точкой загрузки файлов.
  • Эксплойт-скрипт на PowerShell, демонстрирующий полную цепочку внедрения → RCE.
  • Аннотированные исходные файлы из Apache Struts 2.3.28, показывающие каждый шаг цепочки вызовов.

Предварительные знания

  • Как работает внедрение OGNL?

Структура репозитория

root@kitploit:~
SC3010-Computer-Security/
├── simulation/
│   ├── backend/          # Уязвимый сервер Apache Struts2 2.3.28 (Java/Maven)
│   └── attack-script/    # Эксплойт-скрипт для CVE-2017-5638
│       └── exploit_cve_2017_5638.ps1   # PowerShell (кроссплатформенный)
├── struts-src-code/          # Исходные коды Apache Struts2 + правовые уведомления
│   ├── licenses/             # LICENSE, NOTICE и лицензии компонентов
│   └── src/
│       ├── struts2-core/     # Классы конвейера запросов + уязвимый JakartaMultiPartRequest
│       ├── xwork2/           # ActionContext.java, OgnlUtil.java
│       └── ognl/             # OgnlContext.java
├── diagrams/                 # Диаграммы конечного автомата и последовательности, аннотированная OGNL-нагрузка
└── _notes/                   # Дополнительная информация

Имитация атаки

  • См. simulation/README.md для инструкций по настройке и использованию.

Диаграмма конечного автомата атаки

На диаграмме ниже показаны все точки принятия решений в конвейере запросов Struts2. Красный путь — тот, что вынуждает злоумышленник; серые → ... — безопасные пути, не применяемые при эксплуатации.

root@kitploit:~
flowchart TD
    Start([Attacker sends HTTP POST /upload.action<br/>Content-Type: &#37;&#123;OGNL_PAYLOAD&#125;.multipart/form-data])
    Start --> PIPE

    PIPE["<b>Struts2 filter → wrap → parse pipeline</b><br/>doFilter() → PrepareOperations.wrapRequest()<br/>→ Dispatcher.wrapRequest() → new MultiPartRequestWrapper()"]
    PIPE --> D_CT{"Content-Type contains<br/>&quot;multipart/form-data&quot;?"}
    D_CT -- "No → normal request ..." --> OUT_NORM([non-upload path ...])
    D_CT -- "Yes (attacker appends<br/>.multipart/form-data to payload)" --> PARSE

    PARSE[/"<b>JakartaMultiPartRequest.parse()</b><br/>→ Commons FileUpload.parseRequest()"/]
    PARSE --> D_VALID{"FileUpload can parse<br/>Content-Type?"}
    D_VALID -- "Yes → normal file upload ..." --> OUT_OK([files extracted, action executes ...])
    D_VALID -- "No — malformed Content-Type<br/>throws InvalidContentTypeException<br/>(message = raw Content-Type string)" --> CATCH

    CATCH["parse() catch block<br/>calls buildErrorMessage(e, &#123;&#125;)"]
    CATCH --> FIND

    FIND[/"<b>buildErrorMessage()</b><br/>→ LocalizedTextUtil.findText(class, errorKey, locale, e.getMessage(), args)"/]
    FIND --> D_KEY{"Resource bundle has key<br/>struts.messages.upload.error.*?"}
    D_KEY -- "Yes → safe localised message ..." --> OUT_SAFE([error displayed safely ...])
    D_KEY -- "No — falls back to<br/>e.getMessage() as the default<br/>(attacker's raw Content-Type)" --> TRANSLATE

    TRANSLATE["TextParseUtil.translateVariables()<br/>scans string for &#37;&#123;...&#125; expressions"]
    TRANSLATE --> D_OGNL{"String contains<br/>&#37;&#123;...&#125; OGNL expression?"}
    D_OGNL -- "No → plain error string ..." --> OUT_PLAIN([safe error message ...])
    D_OGNL -- "Yes — evaluates OGNL<br/>inside attacker content" --> SANDBOX

    SANDBOX[/"<b>OGNL sandbox bypass</b><br/>#ognlUtil.getExcludedClasses().clear()<br/>#ognlUtil.getExcludedPackageNames().clear()"/]
    SANDBOX --> ACCESS

    ACCESS[/"<b>Unrestricted reflection</b><br/>#context.setMemberAccess(DEFAULT_MEMBER_ACCESS)"/]
    ACCESS --> RCE

    RCE[/"<b>RCE</b><br/>Runtime.getRuntime().exec(cmd)"/]
    RCE --> Done([Command executed as Tomcat process user])

    style Start fill:#d32f2f,color:#fff
    style Done fill:#d32f2f,color:#fff
    style OUT_NORM fill:#9e9e9e,color:#fff
    style OUT_OK fill:#9e9e9e,color:#fff
    style OUT_SAFE fill:#9e9e9e,color:#fff
    style OUT_PLAIN fill:#9e9e9e,color:#fff
    style SANDBOX fill:#b71c1c,color:#fff
    style ACCESS fill:#b71c1c,color:#fff
    style RCE fill:#b71c1c,color:#fff
    style CATCH fill:#e65100,color:#fff
    style TRANSLATE fill:#e65100,color:#fff

Полная версия конечного автомата с пояснениями ветвей приведена в diagrams/cve-2017-5638-state-machine.md.
Диаграмма последовательности и разбор аннотированной OGNL-нагрузки — в diagrams/cve-2017-5638-attack-chain.md.


Уведомления о стороннем программном обеспечении

Данный репозиторий воспроизводит части исходного кода Apache Struts 2.3.28 в академических целях исследования безопасности.

Apache Struts защищён авторским правом © 2000–2016 The Apache Software Foundation.
Распространяется по лицензии Apache, версия 2.0.
Копия лицензии доступна по адресу struts-src-code/licenses/LICENSE.txt.
Полное уведомление об авторстве, требуемое лицензией Apache, находится в struts-src-code/licenses/NOTICE.txt.

Apache Struts 2 включает дополнительные сторонние компоненты, каждый из которых регулируется собственной лицензией:

КомпонентФайл лицензии

Ссылки на источники:

  • apache/struts @ STRUTS_2_3_28 — ядро Struts2 и XWork
  • jkuhnert/ognl — OGNL 3.0.x
  • Gemini — Консультации по общим принципам языка OGNL.
Скачать инструмент
OGNL (библиотека навигации по объектному графу)
struts-src-code/licenses/OGNL-LICENSE.txt
XWorkstruts-src-code/licenses/XWORK-LICENSE.txt
FreeMarkerstruts-src-code/licenses/FREEMARKER-LICENSE.txt