这是 CVE-2026-11374 利用前置条件的检测脚本。该漏洞是 ManageEngine AD360 套件中一个可预测的 SSO 票据缺陷,可导致未认证账户接管。四个范围内产品共享 ManageEngineADSFramework:
| 产品 | 受影响版本 | 修复版本 |
|---|---|---|
| ADSelfService Plus | ≤ 6528 | 6529 |
| RecoveryManager Plus | ≤ 6320 | 6321 |
| M365 Manager Plus | ≤ 4816 | 4817 |
| ADAudit Plus | ≤ 8702 | 8703 |
在受影响版本中,SSO 票据只是在受害者登录时采样的 System.currentTimeMillis()(一个可预测的时间戳),因此可以通过 CUSTOM_SSO_TICKET cookie 重放该票据以劫持该会话。修复方案用 UUID.randomUUID()(一个足够随机的标识符)替换了票据。仅当产品已集成 AD360 时,重放路径才可达:ADSFilter 通过 isProductIntegrated() 对其进行门控。该门控正是此工具所检查的前置条件。
注意: 此检测器确认的是前置条件,而非漏洞本身。
POTENTIALLY_AFFECTED结果并非确认存在漏洞的判定——更多信息请参见下文。
可以。它是为生产环境和评估用途而构建的。
1700000000000,一个足够久远的毫秒值,永远不可能存在于缓存中),因此绝不会恢复任何会话。服务器只是指示我们清除所发送的 cookie。GET,受影响的唯一 cookie 是工具发送的一次性 cookie。CVE-2026-11374 的补丁仅更改了票据的生成方式(从毫秒改为 UUID);并未改变此探测所触及的 cookie 重放路径。因此,对于任何未认证请求,已修补安装与易受攻击安装的响应逐字节完全相同。
该工具在未认证且非破坏性的条件下可以做到:
它无法做到:
POTENTIALLY_AFFECTED 结果意味着前置条件已满足,您应去核实补丁级别,而非主机已被确认存在漏洞。conf/product.conf,或主动解析实时票据(真正的利用行为,此处有意未实现)。?build= 有时是真实版本,有时是一个读数低于修复版本的冻结占位符,因此低于修复版本的值含义不明确,工具会将其标记为无法确定。等于或高于修复版本的值仍然是可靠的已修补信号,因为占位符总是太低而无法达到该值。requests 库。使用 pip install requests 安装。# single host (prefer a URL or host:port; ports differ per product)
./cve_2026_11374_check.py https://adssp.example.com:8888
# multiple hosts (scheme optional: https is tried first, then http)
./cve_2026_11374_check.py host-a:8081 host-b:8365
# scan a list, one target per line ('#' comments allowed), compact output
./cve_2026_11374_check.py -f targets.txt --brief
# machine-readable output for pipelines
./cve_2026_11374_check.py -f targets.txt --json > results.json
各产品的默认端口不同(ADSelfService Plus 为 8888,ADAudit Plus 为 8081,M365 Manager Plus 为 8365,RecoveryManager Plus 为 8090),因此请传入 URL 或 host:port。裸主机默认使用 8888。
一个已集成 AD360 的控制台(详细输出,默认模式)。第二行明确指出这是前置条件而非存在漏洞的判定;第三行是尽力而为的版本提示:
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[!] https://adssp.example.com:8888: POTENTIALLY_AFFECTED
ADSelfService Plus: AD360-integrated, CustomSSO replay path active - precondition met. Not confirmed vulnerable; verify patch level (fixed build 6529).
build: 6519 (below fixed 6529 - inconclusive: ?build= may be a stale placeholder or a hotfix)
同一产品的独立安装,重放路径未激活:
$ ./cve_2026_11374_check.py https://adssp.example.com:8888
[+] https://adssp.example.com:8888: UNAFFECTED
ADSelfService Plus: standalone / not AD360-integrated (no cleanup), so the replay path isn't reachable here. Verify build >= 6529 regardless.
使用 --brief 扫描列表,每个主机输出单行对齐结果。若任一主机为 POTENTIALLY_AFFECTED,退出状态为 1,否则为 0,这在脚本中非常方便。行尾注记显示识别出的产品,以及在阳性结果时的版本号:
$ ./cve_2026_11374_check.py -f targets.txt --brief; echo "exit: $?"
POTENTIALLY_AFFECTED https://host-a:8888 ADSelfService Plus 6519
POTENTIALLY_AFFECTED http://host-b:8081 ADAudit Plus 8530
UNAFFECTED http://host-c:8365 M365 Manager Plus
UNAFFECTED https://host-d:443
INCONCLUSIVE http://host-e:8888 ADSelfService Plus
ERROR host-f:8888 timeout
exit: 1
机器可读输出(--json)。每条结果包含 verdict、其背后的 state 和 detail、识别出的 product,以及(对于阳性结果)一个 build 对象:build 是发现的版本号,fixed_build 是该产品的修复阈值,patch_hint 是方向性判断(等于或高于修复版本为 likely_patched,否则为 inconclusive),note 是简短说明:
$ ./cve_2026_11374_check.py https://host-b:8081 --json
[
{
"target": "https://host-b:8081",
"state": "potentially_affected",
"detail": "ADAudit Plus: AD360-integrated, CustomSSO replay path active - precondition met ...",
"product": "ADAudit Plus",
"build": { "build": "8530", "fixed_build": "8703", "patch_hint": "inconclusive", "note": "below fixed 8703 - inconclusive: may be a hotfix" },
"verdict": "POTENTIALLY_AFFECTED"
}
]
| 代码 | 含义 |
|---|---|
0 | 没有目标返回 POTENTIALLY_AFFECTED |
1 | 至少一个目标为 POTENTIALLY_AFFECTED |
2 | 用法错误(参数错误 / 目标文件不可读) |
向任意 CustomSSO URL(*.do)发送一个无效票据和一个应用标记:
GET /AppsHome.do
Cookie: CUSTOM_SSO_TICKET=1700000000000; CUSTOM_SSO_APP_TAG_NAME=AD360
在已集成 AD360 的安装上,链路 ADSFilter → CustomSSOFilter → CookieSSOImpl 会执行其解析分支(标记指向不同的产品,因此 appName != prodName),解析虚假票据失败,并发出清理 cookie 的响应头:
Set-Cookie: CUSTOM_SSO_TICKET=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_NAME=removed; Max-Age=0; ...
Set-Cookie: CUSTOM_SSO_APP_TAG_NAME=removed; Max-Age=0; ...
独立安装永远不会运行该路径,也不会发出清理。产品的识别依据是其固定的、各产品独有的 Tomcat 会话 cookie(ADSelfService Plus 为 JSESSIONIDADSSP,以此类推),该 cookie 在每次响应中都会设置。该检查以响应头而非状态码作为判断依据,因为已集成的 ADSSP 对同一探测返回 302,而 ADAudit、M365 和 RMP 返回 200。
POTENTIALLY_AFFECTED 并非“已确认存在漏洞”。它是利用前置条件。由于补丁没有触及此代码路径,已修补版本会做出完全相同的响应,因此您必须通过其他途径确认补丁级别(参见后续步骤)。这是未认证观察者所能获知的上限。HTTP 400 可能是限速锁定而非真实答案。Zoho IAM 实施了 URL 滚动限速,将来源 IP 限制为每 60 秒约 40 个请求,随后将该路径锁定约 60 秒。锁定期间,请求返回 HTTP 400,集成信号被掩盖。工具将此类情况报告为 INCONCLUSIVE;请约一分钟后从该 IP 重试。UNAFFECTED。如果您预期那里是 ManageEngine 产品,请直接确认。?v=)和 M365(?bN=)始终暴露真实版本;ADSSP 的 ?build= 有时是真实的,有时是一个读数低于修复版本的冻结占位符,因此低于修复版本的 ADSSP 值含义不明确;RMP 不暴露任何版本。在所有情况下,等于或高于修复版本的版本号都强烈表明已修补,低于则无法确定。如果目标返回 POTENTIALLY_AFFECTED,请将其视为已暴露并值得确认,然后:
直接确认补丁级别(工具无法做到)。在主机上读取 conf/product.conf(build_number),并与该产品的修复版本对比(ADSelfService Plus 6529、RecoveryManager Plus 6321、M365 Manager Plus 4817、ADAudit Plus 8703)。按方向性解读:等于或高于修复版本的版本号是主机已修补的有力指标,因为 UUID 修复就在该版本分支中。低于修复版本的版本号属于无法确定,而非存在漏洞的证明,因为带外热修复和后向移植可以在不提升版本号的情况下应用 UUID 修复;在这种情况下,请改用下方的票据格式检查。
如果可以登录,请检查已签发票据的格式。CUSTOM_SSO_TICKET cookie 不是 HttpOnly,因此认证后您可以读取其值:13 位数字表示存在漏洞,UUID 表示已修补。这是最明确的肯定性检查。
对所有存在漏洞或无法确认已修补的主机,更新到修复版本(或更高版本)。该修复用随机 UUID 替换了可预测的票据。
搜寻利用尝试。在主机上,serverOut_<date>.txt 将限速记录为如下突发序列:
IAMSecurityException ErrorCode: URL_ROLLING_THROTTLES_LIMIT_EXCEEDED,
RequestURI: "/showLogin.cc", RemoteAddr: <source IP>
来自单个来源 IP 的 SSO/登录分发路径上出现 URL_ROLLING_THROTTLES_LIMIT_EXCEEDED 激增,是票据暴力破解的有力指标。同时请审查近期成功登录和会话活动,寻找被接管的迹象。
同时降低暴露面。限制对 AD360 套件的网络访问(不应面向互联网),如果不需要重放路径,禁用 CustomSSO 集成即可完全消除该前置条件。
将受影响产品更新到至少修复版本(ADSelfService Plus 6529、RecoveryManager Plus 6321、M365 Manager Plus 4817、ADAudit Plus 8703)或更高版本。该修复用 UUID.randomUUID() 替换了可预测的 System.currentTimeMillis() SSO 票据。
此代码根据 MIT 许可证 分发。
未经事先双方同意而使用本工具攻击目标属违法行为。遵守所有适用的地方、州和联邦法律是最终用户的责任。开发人员不承担任何责任,也不对本程序造成的任何滥用或损害负责。
| 选项 | 说明 |
|---|
targets | 一个或多个 host、host:port 或 https://host:port |
-f, --targets-file FILE | 从文件读取目标(每行一个;支持 # 注释) |
--brief | 每个目标输出单行对齐结果,适合扫描大量主机 |
--json | 输出结构化的 JSON 结果 |
--timeout SECS | 单请求超时时间(默认:15) |
--no-build | 在阳性结果时跳过额外的版本号请求 |
--no-color | 禁用彩色输出(同时遵循 NO_COLOR 和非 TTY 环境) |
| 判定 | 含义 |
|---|
POTENTIALLY_AFFECTED | 范围内产品且已集成 AD360;CustomSSO cookie 重放路径已激活,因此满足 CVE-2026-11374 的利用前置条件。这不是确认存在漏洞的判定;请核实补丁级别(参见后续步骤)。 |
UNAFFECTED | 重放路径不可达。可能属于以下任一情况:独立安装的范围内产品(未集成 AD360——不过如果日后集成,该路径将变得可达,因此无论如何请核实版本);不属于四个范围内产品的 ManageEngine ADS 框架产品;或者响应中根本没有范围内产品(不是 CVE-2026-11374 涉及的四个产品之一,或是剥离了会话 cookie 的代理)。 |
INCONCLUSIVE | 返回 HTTP 400——很可能是 IAM 限速锁定掩盖了信号;约 60 秒后重试。 |
ERROR | 连接/超时/TLS 失败。 |
| 探测响应 | 判定 |
|---|
| 清理响应头 + 已知范围内产品 cookie | POTENTIALLY_AFFECTED |
| 有产品 cookie、无清理,状态 ≠ 400 | UNAFFECTED(独立安装 / 未集成) |
| 无范围内产品 cookie,状态 ≠ 400 | UNAFFECTED(不是四个产品之一) |
| 有清理响应头但产品 cookie 无法识别 | UNAFFECTED(ManageEngine,但不在范围内) |
HTTP 400 | INCONCLUSIVE(很可能是 IAM 限速锁定;参见局限性) |