Weblogic t3协议分析

本文介绍了WebLogic中的反序列化漏洞利用,包括基于T3协议的CVE-2020-2883,通过Docker搭建测试环境,详细解释了T3协议组成及利用流程,并展示了利用链和回显利用方法,以及如何在受限环境下通过RMI实现代码执行。

漏洞介绍

weblogic反序列化漏洞大致有两种,一种是基于t3协议的,一种是基于xml的

基于T3协议漏洞大致有: CVE-2015-4582、CVE-2016-0638、CVE-2016-3510、CVE-2018-2628、CVE-2020-2555、CVE-2020-2883

其中CVE-2020-2883是CVE-2020-2555补丁的绕过,实则差不多

调试环境搭建

本篇测试CVE-2020-2883漏洞使用docker搭建环境

使用vulfocus/weblogic-cve_2020_2883镜像(weblogic:12.1.3)、idea远程调试

docker-compose.yml配置如下

version: '2' 
services: 
 weblogic: 
   image: vulfocus/weblogic-cve_2020_2883:latest 
   ports: 
    - "7001:7001" 
    - "8453:8453"

然后docker-compose up -d启动镜像,

再docker exec -it <镜像ID> /bin/bash,进入容器shell vi /u01/oracle/weblogic/user_projects/domains/base_domain/bin/setDomainEnv.sh

搜索debugFlag

在if上添加

debugFlag="true" 
export debugFlag

如图

然后:wq保存,exit退出容器`docker restart <容器id>`重启容器,服务端调试环境就搭建好了

还有个问题就是,本地调试需要远程运行项目的jar包或源码,可以直接dokcer cp从镜像里把jar包都拿出来,但是下载速度太慢了,我选择本机在官网下载weblogic12.1.3的安装包,然后解压,把.jar后缀的放到一个文件夹下,当做依赖

在本地打开idea,创建空项目,然后将上面整理好的文件夹,设置为依赖,如图

再设置远程调试,如图

这样调试环境就搭建好了

漏洞测试exp用的是GitHub - Y4er/CVE-2020-2883: Weblogic coherence.jar RCE,运行前修改地址和端口

服务端启动docker后,本地idea开启调试,就可以连接到服务端

然后在wlthint3client.jar!/weblogic/rjvm/InboundMsgAbbrev.class#read处加断点,如图

在此处就可以看见反序列化流程了

t3协议组成分析

首先在发出t3协议数据包之前,要先发一个header,例:t3 10.3.1\nAS:255\nHL:19\n\n

10.3.1是本地客户端请求,AS是abbrevs的大小,HL是header长度

发送完header后再发送t3协议

判断WebLogic系统使用T3协议还是IIOP协议可以从以下几个方面入手: ### 配置文件查看 WebLogic的配置文件中通常会明确指定使用的协议。可以查看 `config.xml` 文件或者相关的域配置文件。在配置文件中搜索关于协议的配置项,如果存在类似 `t3://` 的配置,说明使用的是T3协议;如果存在 `iiop://` 的配置,则使用的是IIOP协议。例如,在配置文件中可能会有如下配置: ```xml <server> <name>myServer</name> <listen-address>localhost</listen-address> <listen-port>7001</listen-port> <listen-protocol>t3</listen-protocol> <!-- 这里表明使用T3协议 --> </server> ``` 或者 ```xml <server> <name>myServer</name> <listen-address>localhost</listen-address> <listen-port>7002</listen-port> <listen-protocol>iiop</listen-protocol> <!-- 这里表明使用IIOP协议 --> </server> ``` ### 客户端连接URL 在客户端代码中,如果连接WebLogic服务器的URL以 `t3://` 开头,那么使用的是T3协议;如果以 `iiop://` 开头,则使用的是IIOP协议。例如,Java代码中使用T3协议连接WebLogic服务器: ```java import javax.naming.Context; import javax.naming.InitialContext; import java.util.Hashtable; public class T3ConnectionExample { public static void main(String[] args) { try { Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL, "t3://localhost:7001"); // 使用T3协议 InitialContext ctx = new InitialContext(env); // 后续操作 } catch (Exception e) { e.printStackTrace(); } } } ``` 如果使用IIOP协议连接: ```java import javax.naming.Context; import javax.naming.InitialContext; import java.util.Hashtable; public class IIOPConnectionExample { public static void main(String[] args) { try { Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.cosnaming.CNCtxFactory"); env.put(Context.PROVIDER_URL, "iiop://localhost:7002"); // 使用IIOP协议 InitialContext ctx = new InitialContext(env); // 后续操作 } catch (Exception e) { e.printStackTrace(); } } } ``` ### 端口监听情况 T3协议和IIOP协议通常使用不同的端口。默认情况下,WebLogic的T3协议使用7001端口,而IIOP协议使用7004端口。可以通过查看服务器的端口监听情况来判断使用的协议。在Linux系统中,可以使用 `netstat` 命令: ```bash netstat -tlnp | grep java ``` 在Windows系统中,可以使用 `netstat` 命令: ```batch netstat -ano | findstr :7001 # 查找T3协议默认端口 netstat -ano | findstr :7004 # 查找IIOP协议默认端口 ``` 如果在输出中看到Java进程监听了7001端口,可能使用的是T3协议;如果监听了7004端口,可能使用的是IIOP协议。 ### 服务发现和日志分析WebLogic的管理控制台中,可以查看服务器的服务发现信息,了解服务器使用的协议。此外,还可以查看WebLogic的日志文件,日志中可能会记录服务器使用的协议信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值