一、什么是Actuator
Spring Boot Actuators 模块端点信息官方文档:
Spring Boot Actuator Web API Documentation
Spring 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模块带来的信息泄露。
Actuator 其提供的端点分为两类:
1.原生端点
请求方法
端点
描述
GET
/actuator
查看有哪些 Actuator端点是开放的。
GET
/actuator/auditevent
auditevents端点提供有关应用程序审计事件的信息。
GET
/actuator/beans
beans端点提供有关应用程序 bean 的信息。
GET
/actuator/conditions
conditions端点提供有关配置和自动配置类条件评估的信息。
GET
/actuator/configprops
configprops端点提供有关应用程序@ConfigurationPropertiesbean的信息。
GET
/actuator/env
查看全部环境属性,可以看到 SpringBoot 载入哪些 properties,以及 properties 的值(会自动用*替换 key、password、secret 等关键字的 properties 的值)。
GET
/actuator/flyway
flyway端点提供有关 Flyway 执行的数据库迁移的信息。
GET
/actuator/health
端点提供有关应用程序运行状况的health详细信息。
GET
/actuator/heapdump
heapdump端点提供来自应用程序 JVM 的堆转储。(通过分析查看/env端点被*号替换到数据的具体值。)
GET
/actuator/httptrace
httptrace端点提供有关 HTTP 请求-响应交换的信息。(包括用户HTTP请求的Cookie数据,会造成Cookie泄露等)。
GET
/actuator/info
info端点提供有关应用程序的一般信息。
GET
/actuator/integrationgraph
integrationgraph端点公开了一个包含所有 Spring Integration 组件的图。
GET
/actuator/liquibase
liquibase端点提供有关 Liquibase 应用的数据库更改集的信息。
GET
/actuator/logfile
logfile端点提供对应用程序日志文件内容的访问。
GET
/actuator/loggers
loggers端点提供对应用程序记录器及其级别配置的访问。
GET
/actuator/mappings
mappings端点提供有关应用程序请求映射的信息。
GET
/actuator/metrics
metrics端点提供对应用程序指标的访问。
GET
/actuator/prometheus
端点以prometheusPrometheus 服务器抓取所需的格式提供 Spring Boot 应用程序的指标。
GET
/actuator/quartz
quartz端点提供有关由 Quartz 调度程序管理的作业和触发器的信息。
GET
/actuator/scheduledtasks
scheduledtasks端点提供有关应用程序计划任务的信息。
GET
/actuator/sessions
sessions端点提供有关由 Spring Session 管理的应用程序 HTTP 会话的信息。
GET
/actuator/startup
startup端点提供有关应用程序启动顺序的信息。
POST
/actuator/shutdown
shutdown端点用于关闭应用程序。
2.用户自定义扩展端点
二、漏洞利用
默认情况下所有Web端点都在/actuator目录下。
查看/actuator:
查看/actuator/env
env包含被脱敏的数据库用户名与密码与redis数据库密码等信息。
访问/actuator/heapdump下载堆转储文件:
一般比较大。
使用安装JDK自带的JVisualVM工具,对Heap Dump进行分析,JVisualVM位于/jdk/bin目录下
装入heapdump文件
涉及系统的一些配置信息:
env中信息存储在heapdump中的java.util.LinkedHashMap$Entry类中(Spring boot 2.X版本)。
根据/actuator/env页面展示的信息去heapdump文件中分析信息。(建议在/actuator/env检索“******”6个星号,去寻找password,key或者secret等信息)
比如:我要找到数据库的密码。
env中数据库登录用户名已经暴露,我们需要去找spring.datasource.password的值。
在OQL控制台执行OQL语句:这个语句是查出key值中包含password字符的数据。
select s from java.util.LinkedHashMap$Entry s where /password/.test(s.key.toString())
逐个查看查询出的结果:找到key值为spring.datasource.password的value就是数据库的登录密码。
下一步就是寻找在哪可以登录数据库了,看看外网有没有开放数据库的管理端口等,不展示了。
查redis数据库密码等信息同样步骤!
除了查找password再查一个其他信息。
这边在/actuator/env看到阿里云oss的信息。
使用OQL语句:
select s from java.util.LinkedHashMap$Entry s where /Secret/.test(s.key.toString())
查找key中包含Secret字符的:
这样就找到了oss的登录信息了。
使用OSS Browser尝试登录。(OSS Browser用法请自行搜索),这样就登录上阿里云OSS了,可以删除下载文件了(不要去做!)。
三、修复方法:
在 Spring Boot 2.x 中为了安全起见,Actuator 只开放了两个端点 /actuator/health 和 /actuator/info。可以在配置文件中设置打开或关闭。
1、Actuator 默认所有的监控点路径都在/actuator/*,当然如果有需要这个路径也支持定制,通过修改配置文件改变端点名避免被扫描发现。
2、关闭不需要使用的端点并引入security依赖,打开安全限制并进行身份验证。同时设置单独的Actuator管理端口并配置不对外网开放。
四、总结
1、Spring boot引起的信息泄露暴露的密码不只我展示的这么多,其他组件碰到后应该多去探索发现。
2、拿到密码后能做的也很多。
版权归原作者 艾木凡 所有, 如有侵权,请联系我们删除。