本项目提供了一个用于验证 Apache Tomcat AJP 协议本地文件包含漏洞(俗称 Ghostcat 幽灵猫,CVE-2020-1938 / CNVD-2020-10487)的 Python 验证脚本。
此脚本基于最初流传的 Python 2 版本进行了全面重构与修复,完全兼容 Python 3 环境,修复了 StringIO、base64 编码以及二进制数据与字符串拼接时的兼容性问题,增强了在现代操作系统上的稳定性。
Apache Tomcat 在处理 AJP(Apache JServ Protocol)协议时,默认开启 8009 端口,且未对传入的请求属性进行严格的安全校验。
攻击者可以通过构造恶意的 AJP 请求,注入 javax.servlet.include.request_uri、javax.servlet.include.path_info 和 javax.servlet.include.servlet_path 等属性:
DefaultServlet,读取 Web 应用目录下的任意文件(如 WEB-INF/web.xml、配置文件等)。JspServlet 将该文件作为 JSP 解析编译,从而实现远程命令执行。注:该漏洞仅支持本地文件包含(LFI),不支持直接的远程文件包含(RFI)。
命令行语法:
python CNVD-2020-10487-Tomcat-Ajp-lfi.py <目标IP> [-p 目标端口] [-f 目标文件路径]
target (必填): 目标主机的 IP 地址或域名。-p, --port (可选): AJP 端口,默认为 8009。-f, --file (可选): 想要读取的目标文件相对路径,默认为 WEB-INF/web.xml。基础检测(读取默认的 web.xml):
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 127.0.0.1
指定端口和文件(读取自定义配置文件):
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.100 -p 8009 -f WEB-INF/classes/application.properties
如果您的系统受到此漏洞影响,建议立即采取以下防护措施:
conf/server.xml 中注释或删除 <Connector port="8009" protocol="AJP/1.3" ... /> 配置。requiredSecret(Tomcat 8.5.51/9.0.31 及以后版本为 secret)属性以强制进行认证。本脚本仅供网络安全研究、教育和企业内部合规的安全审计使用。 请勿使用该脚本对未授权的目标进行非法探测或攻击。使用者在使用该脚本时必须遵守当地法律法规,因使用不当或非法使用造成的任何后果,由使用者自行承担。