Apache Tomcat CVE-2020-1938 漏洞简单复现
文章目录
- Apache Tomcat CVE-2020-1938 漏洞简单复现
-
- 实验准备
- 实验步骤
-
- 搭建环境
- nmap扫描漏洞端口
- POC代码验证
- 漏洞修复建议
- 参考链接
实验准备
-
所选漏洞:Apache Tomcat远程代码执行漏洞
-
漏洞编号:CVE-2020-1938
-
漏洞选择理由:Tomcat是Apache软件基金会Jakarta 项目中的一个核心项目,作为目前比较流行的Web应用服务器,深受Java爱好者的喜爱,并得到了部分软件开发商的认可。Tomcat服务器是一个免费的开放源代码的Web应用服务器,被普遍使用在轻量级Web应用服务的构架中。 Tomcat提供了可以在其中运行Java代码的“纯Java” HTTP Web服务器环境。
在2020年1月6日,国家信息安全漏洞共享平台(CNVD)收录了由北京长亭科技有限公司首次发现并报送的Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2020-1938),该漏洞使攻击者可以读取任何webapps文件(例如webapp配置文件,源代码等)或包括一个文件来远程执行代码。由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。漏洞被曝光后,由于其十分简单即可利用还能造成巨大破坏的高危特性,许多使用tomcat的小型开发者被迫禁用AJP服务.Apache Tomcat官方于2月14日紧急发布了安全补丁。
因为该漏洞允许攻击者读取Tomcat上所有webapp目录下的任意文件,而通常用java开发的应用程序的war包也是放在webapp目录下的,所以也能够被攻击者读取到。这也意味着,如果你把数据库用户名密码、连接其他后端服务的账号、JWT签名secret、OAuth AppSecret等密钥信息放在properties文件里的话,那么,攻击者可能现在也拿到了这些信息,并且正在试着入侵你的服务器。解压后不仅能拿到properties文件,还能获得class文件,因此攻击者还能逆向获取到应用程序源码,进而从源代码中挖掘出更多其他漏洞加以利用。 -
威胁类型
文件包含、远程代码执行
-
威胁等级
该漏洞通过远程网络进行攻击,在攻击复杂度极低的情况下可以通过文件包含操作提取重要目录下的所有文件,NVD网站通过CVSS v3.1计算器得出分数9.8分,属于极危漏洞。
-
CVE-2020-1938受影响系统及应用版本
apache tomcat 6
apache tomcat 7 < 7.0.100
apache tomcat 8 < 8.5.51
apache tomcat 9 < 9.0.31tomcat下载链接:Index of /dist/tomcat
- 本次实验选择的对象是Apache tomcat 9.0.13 apache-tomcat-9.0.13-windows-x64.zip
- 主机:win 10
- 虚拟环境:win 7
实验步骤
搭建环境
-
在win7系统上安装jdk与jre(笔者使用的是jdk_1.8.0_333,jre为同版本),下载时可以全部使用默认设置,在c盘的program files文件夹中找到Java即为文件安装位置.
jdk下载链接Java Downloads | Oracle 注:下载jdk需要登录Oracle账户
jre下载链接jre downloads
接下来我们配置环境变量,右键计算机-属性-高级系统设置-环境变量
在系统变量中新建JAVA_HOME变量,变量值是你Jdk的安装路径
再新建CLASSPATH变量,变量值是
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
修改系统变量中的Path变量,在变量值最后输入
%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
环境变量就添加完成了,命令行检查一下是否配置成功
java -version
-
在下载并解压笔者选择的tomcat版本后,进入bin目录下执行startup.bat启动tomcat,看到框中内容说明正常启动了tomcat,在浏览器中输入 http://localhost:8080 即可打开.
-
修改配置文件
首先修改
apache-tomcat-9.0.13\conf\ web.xml
,将框内包含的注释取消并添加下列代码于红框中<init-param> <param-name>enableCmdLineArguments</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>executadle</param-name> <param-value></param-value> </init-param>
接着修改 apache-tomcat-9.0.13\conf\ context.xml
文件,添加 privileged="true"
语句
搞定!至此,环境搭建完成.
nmap扫描漏洞端口
-
先看看我们运行tomcat服务的虚拟机的ip:
10.0.3.15
-
然后就可以用nmap扫描端口了,如果确实存在漏洞,那我们应该能看到至少8009端口和8080端口被占用,其中的8009端口应该是AJP服务。
可以看到,这两个端口确实是被占用了的,8080很好理解,毕竟我们打开的浏览器上就占用了这个端口,而8009这个端口才是这次实验的重点:因为Tomcat默认开启的AJP服务就占用了这个端口,导致攻击者可以构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上 webapp 目录下的配置文件或源代码,配合文件包含的利用还可以达到远程代码执行的危害。
POC代码验证
代码来自:suricata/cve 2020-1938.py
这套代码运行环境为2.7版本的python,所以在执行前请确认你有相应的环境 (python 2.7的下载地址) ,笔者在虚拟机上做好了python 2.7.10的安装,并完成了POC实现,见下图
可以成功访问文件,漏洞复现成功!
漏洞修复建议
-
临时禁用AJP协议端口,在
conf/server.xml
配置文件中注释掉:<Connector port=“8009” protocol="AJP/1.3"redirectPort=“8443” />
-
特别配置ajp配置中的secretRequired跟secret属性来限制认证
-
下载更新版本,只要不在本文开头提到的波及版本中即可。
参考链接
NVD - CVE-2020-1938
(CVE-2020-1938)Apache Tomcat远程代码执行漏洞复现_whh6tl的博客-CSDN博客
Apache Tomcat CVE-2020-1938,细思极恐 - 云+社区 - 腾讯云
Apache Tomcat 文件包含漏洞(CVE-2020-1938)_山山而川'的博客-CSDN博客_cve-2020-1938