Spring 代码执行 (CVE-2017-8046) 漏洞复现
描述
Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情 恶意攻击者使用精心构造的JSON数据包,向spring-data-rest服务器提交恶意PATCH请求,可以执行任意的Java代码。
- 影响范围:
环境搭建
使用Vulfocus项目提供的镜像进行测试。
搜索该漏洞的镜像,下载并启动容器。
复现
查找漏洞
进入容器提供的地址页面:http://10.9.21.12:21745/
看到页面返回的是一个json信息,并且存在 http://10.9.21.12:21745/persons 和 http://10.9.21.12:21745/profile 两个链接。
可以尝试打开这两个链接。
我们可以看到对于persons这个链接,存在一个空的数组 "persons" : []
。
而profile链接没有更多的有用信息了。
然后在这两个链接的返回信息中还会发现一个新的链接 http://10.9.21.12:21745/profile/persons 。
我们进入这个链接,会发现它描述了person对象的属性和方法。
我们可以根据这些信息来构造对象:
测试漏洞
REST语法支持的curd操作包括POST、DELETE、UPDATE/PATCH、GET。
对于PATCH方法,请求格式为JSON。根据RFC 6902,发送JSON文档结构需要注意以下几点:
1.请求头为Content-Type: _application/json-patch+json_;
2.需要参数op。其中op所支持的方法很多:
add,添加数据
remove,删除数据
replace,修改数据
move,移动数据
copy,拷贝数据
test,测试给定数据与指定位置数据是否相等
3.需要参数path。 值必须使用斜杠分割。
4.需要参数value。指定path变量修改后的值。
通过POST进行增加数据操作:
通过PATCH进行修改数据操作:
通过PATCH进行修改数据实现反弹shell:
在监听端启动监听:
构造用于反弹shell的payload:
该payload并不能直接使用,需要进行base64编码操作,然后获取ascii码,再通过java.lang.Runtime.getRuntime().exec(new java.lang.String())
方法来绕过java限制。用于编码的python脚本如下:
代码执行结果:
- 将代码输出的结果放到post请求参数的path中,重新发送请求:
如上图,该请求虽然会返回错误提示,但不影响payload执行,但是如果执行出错也是无法得知的。
- payload执行成功后,监听端会获得一个shell连接。
进入/tmp目录,即可获取flag。