九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

admin 2023年6月5日20:28:06评论22 views字数 4135阅读13分47秒阅读模式

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

〇、前置知识


devtools是spring-boot的一个热部署工具,无需手动重启Spring Boot应用就能实现自动加载项目。在开发过程中,如果我们修改了某些java文件,我们可能需要重启下项目来观看修改后的结果,如果使用spring-boot-devtools,当classpath中有文件变动时候,devtools会自动帮你重启服务器(百度的介绍,这个可以根据自己的情况自定义路径)。


其实在devtools中还有一个远程模块,如果要启用Remote DevTools,那就要配置remote属性。


首先按照devtools的文档看devtools的配置信息:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

当配置是以下这种情况时即表示项目启用了远程devtools,这时候会存在安全风险。


pom:

<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId><!--            <scope>runtime</scope>-->            <optional>true</optional>        </dependency>

*左右滑动查看更多


application.yml:

devtools:    restart:      enabled: true  #设置开启热部署      additional-paths: src/main/java #重启目录      exclude: WEB-INF/**    remote:      secret: mysecret

*左右滑动查看更多


下面我们就来简要分析一下为什么会产生风险,以及产生什么样的风险。


一、分析过程


因为SpringBoot所有的自动配置都是由xxxAutoConfiguration来进行的,已知:

orgspringframeworkbootspring-boot-devtools2.6.4spring-boot-devtools-2.6.4.jar!orgspringframeworkbootdevtoolsautoconfigureRemoteDevToolsAutoConfiguration.class

*左右滑动查看更多


是devtools的自动配置类。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


上半部分是有关spring.devtools.remote.secret配置的实现。


查看流程,首先是将SecretHeaderName、Secret的值传入到HttpHeaderAccessManager类进行处理。


跟进HttpHeaderAccessManager类:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


在该类中会获取请求头中的一个参数headerName做比对,如果headerName的值与expectedSecret不一致就会报403。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


回到RemoteDevToolsAutoConfiguration,跟进对应的DevToolsProperties类查看SecretHeaderName、Secret:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

orgspringframeworkbootspring-boot-devtools2.6.4spring-boot-devtools-2.6.4.jar!orgspringframeworkbootdevtoolsautoconfigureDevToolsProperties.class

*左右滑动查看更多


九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


跟进RemoteDevToolsProperties,在getSecretHeaderName方法中返回的是X-AUTH-TOKEN,即http的头部有一个X-AUTH-TOKEN头。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


而getSecret则是从配置文件中获取:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


回到remoteDevToolsAccessManager方法,那么HttpHeaderAccessManager对象返回的就是对X-AUTH-TOKEN: Secret校验结果。


往下看下半部分。

这部分属于RemoteRestartConfiguration静态类,该类是devtools开关配置实现类:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


查看remoteRestartHandlerMapper方法流程。

首先查看该方法里的properties.getRemote(),跟进对应的DevToolsProperties类:

orgspringframeworkbootspring-boot-devtools2.6.4spring-boot-devtools-2.6.4.jar!orgspringframeworkbootdevtoolsautoconfigureDevToolsProperties.class

*左右滑动查看更多


九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


getRemote方法返回的是RemoteDevToolsProperties对象:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


跟进RemoteDevToolsProperties对象。

该类返回各种对应的属性值:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


其中getContextPath方法返回的是remoteRestartHandlerMapper方法中的url。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


拼接得出远程访问的url为/.~~spring-boot!~/restart。


然后往下走进入到HttpRestartServerHandler:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


跟进HttpRestartServer类:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


在该类的handle方法中,获取请求封装为objectInputStream对象,随后使用ObjectInputStream的readObject方法对request进行反序列化,因为request是可控的,所以导致漏洞产生。


二、漏洞场景


实际想要利用这个漏洞,条件其实有点苛刻(所以只能算风险项),要满足以下几个条件:

1、需要一个密码;

2、生产环境需要启用devtools Remote。


首先看第一点:


结合对headerName的比对想象一下,即使我们不知道密码,但是可以通过状态来爆破密码,即:

1、403的时候肯定是密码不对,因为密码不对访问就403;

2、密码对了,但是请求内容为空或反序列化内容不对就会报错,这时候状态就是500。


所以,可以利用403跟500来爆破密码,密码问题就不用太担心了。


其次看“生产环境需要启用devtools Remote”。


条件苛刻的原因就在这里,开头讲到的配置其实是大多数情况下针对测试环境的配置,其中因为:

<plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration><!--                    <fork>true</fork>-->                    <excludeDevtools>true</excludeDevtools>                </configuration>            </plugin>

*左右滑动查看更多


在打包成jar后,devtools就不会启用,也就是说如果要利用成功,spring-boot-maven-plugin的属性就要是false,这样才能打包带上devtools。


我们可以测试一下:


引用依赖:

  <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId><!--            <scope>runtime</scope>-->            <optional>true</optional>        </dependency>

*左右滑动查看更多


Idea自己导入的版本为2.6.4。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


正常配置启用远程热部署,即开头的配置(如果是idea直接运行,Boolean无论是什么都会启用Remote DevTools),如果远程热部署启用成功,项目启动后会有提示:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


下面在默认配置下打包成jar试试:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


可以看到devtools没了,将spring-boot-maven-plugin的属性改成false再打包试一下:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


将属性改成false后打包的生产环境会包含Remote DevTools。


最后,尝试把序列化后的恶意数据发送触发:

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


三、防御建议


1、在使用Springboot-devtools工具时,建议按照官方的文档说明谨慎启用远程模块。如不需要在生产环境启用远程模块,在打包项目时检查 <excludeDevtools>标签的属性是否设置成true:

<plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <excludeDevtools>true</excludeDevtools>                </configuration>            </plugin>

*左右滑动查看更多


2、如果要启用远程模块,建议在配置文件中将secret改为随机大小写字母+数字+特殊字符组合的密码。


具体操作参考及推荐阅读可参见:

https://medium.com/@sherif_ninja/springboot-devtools-insecure-deserialization-analysis-exploit-2c4ac77c285ahttps://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools.remote-applicationshttps://docs.spring.io/spring-boot/docs/current/reference/html/using.html#using.devtools

*左右滑动查看更多





往期回顾

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧


原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月5日20:28:06
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-绿队(改进)| 王者打不上去了?一起来看个spring-boot devtools反序列化吧https://cn-sec.com/archives/1783779.html

发表评论

匿名网友 填写信息