用于检测 cPanel/WHM 身份验证绕过(CVE-2026-41940)的检测脚本,该漏洞影响 11.40 之后的所有 cPanel 版本。
这是对上游 cPanel 检测脚本的重写,修复了误报问题并增加了日志关联功能。
扫描 /var/cpanel/sessions/raw/ 目录,查找显示换行注入利用迹象的会话文件,然后将可疑 IP 和会话令牌与 cPanel 访问/登录/错误日志进行交叉比对。同时扫描 access_log 以发现会话文件已过期或被清除的历史利用痕迹。
pass 正则表达式,该正则会在生产环境中对每个已认证会话产生误报(该正则匹配任何 pass= 字段后跟另一行的情况,而每个会话文件都符合此模式)。method=badpass 来源 + 任意认证后属性 组合,而非要求狭窄的 token_denied + cp_security_token 组合。可捕获省略 token_denied 的 PoC 变体。POST /login/?login_only=1 -> 401)与随后来自同一 IP 的成功 cpsess 令牌使用,捕获会话文件已过期或被清除的利用行为。--extended 模式,可对更多日志源进行深度扫描。# Bash — 通用,无依赖
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh)
# Python — 在大型会话目录上更快,支持 --json
curl -fsSLo /tmp/ioc.py https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.py
python3 /tmp/ioc.py
# 扩展扫描(任一版本)
bash <(curl -fsSL https://raw.githubusercontent.com/AndreiG6/cpanel-cve-2026-41940-ioc/main/ioc.sh) --extended
python3 /tmp/ioc.py --extended
# 运行后检查退出码($? = 0 干净,1 发现 IOC,2 环境错误)
echo $?
curl 标志说明:
-f在 HTTP 错误时失败而非将错误页面管道传入 bash,-s静默(无进度条),-S在-s下仍显示错误,-L跟随重定向。
Python 版本支持 --json 以输出结构化结果,可管道传入 jq、导入 SIEM 或以编程方式处理。
# 完整 JSON 输出
python3 ioc.py --json
# 仅汇总计数
python3 ioc.py --json | jq '.counts'
# 列出所有 CRITICAL 发现
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL")]'
# 提取唯一攻击者 IP
python3 ioc.py --json | jq '.suspect_ips[]'
# 显示带来源 IP 的发现(用于防火墙封禁列表)
python3 ioc.py --json | jq '[.findings[] | {severity, source_ip, token: .cp_security_token}]'
# 获取所有成功使用令牌的 IP(用于立即封禁)
python3 ioc.py --json | jq '[.findings[] | select(.severity == "CRITICAL") | .source_ip] | unique'
# 获取特定 IP 的交叉引用数据
python3 ioc.py --json | jq '.cross_ref[.suspect_ips[0]]'
JSON 结构示例:
{
"findings": [
{
"severity": "CRITICAL",
"file": "/var/cpanel/sessions/raw/:Q3f8Ag2epeBuTaIZ",
"verdict": "Injected token used successfully (2xx/3xx in access_log)",
"origin": "address=203.0.113.50,app=whostmgrd,method=badpass",
"source_ip": "203.0.113.50",
"user": "root",
"hasroot": "1",
"tfa_verified": "0",
"cp_security_token": "/cpsess04396539398",
"token_denied": "1",
"successful_internal_auth_with_timestamp": "9999999999",
"token_hits": [
"203.0.113.50 - root [04/30/2026:12:12:01 -0000] \"GET /cpsess04396539398/json-api/version HTTP/1.1\" 200 0 ..."
]
},
{
"severity": "MEDIUM",
"file": "/var/cpanel/sessions/raw/:2TDiaHwh_r8qOH5y",
"verdict": "Injection landed; token was tried but BLOCKED (all 4xx/5xx)",
"source_ip": "198.51.100.23",
"cp_security_token": "/cpsess5637704041",
"token_hits": [
"198.51.100.23 - root [04/30/2026:04:08:09 -0000] \"GET /cpsess5637704041/json-api/version HTTP/1.1\" 403 0 ..."
]
},
{
"severity": "CRITICAL",
"file": null,
"verdict": "Injected cpsess token used with 2xx/3xx after failed login; session expired or purged",
"source_ip": "203.0.113.99",
"cp_security_token": "/cpsess8705792557",
"token_hits": ["..."]
}
],
"counts": {"critical": 2, "high": 15, "medium": 71, "warning": 0},
"suspect_ips": ["203.0.113.50", "198.51.100.23", "203.0.113.99"],
"suspect_ips_omitted": 0,
"cross_ref": {
"203.0.113.50": {
"cpanel_access_log": ["...last 5 lines..."],
"cpanel_login_log": ["..."]
}
},
"advisory": "https://support.cpanel.net/hc/en-us/articles/40073787579671"
}
git clone https://github.com/AndreiG6/cpanel-cve-2026-41940-ioc.git
cd cpanel-cve-2026-41940-ioc
# Bash 版本
bash ioc.sh # 默认(展开 CRITICAL/HIGH,MEDIUM/WARNING 仅计数)
bash ioc.sh -v # 详细(展开所有发现)
bash ioc.sh --extended # 详细 + 更深层日志 + 交叉引用中所有 IP
# Python 版本(相同检测逻辑,更快,结构化输出)
python3 ioc.py # 默认(与 bash 相同的折叠行为)
python3 ioc.py -v # 详细
python3 ioc.py --extended # 详细 + 更深层日志
python3 ioc.py --json # 结构化 JSON(始终包含所有发现)
必须在目标 cPanel 服务器上以 root 身份运行。Python 版本需要 Python 3.6+(CentOS 7 / CloudLinux 7+ 自带)。
| 代码 | 含义 |
|---|---|
| 0 | 未发现任何指标 |
| 1 | 检测到 IOC |
| 2 | 环境错误(非 cPanel 服务器) |
MIT