道德警告: 仅限研究、教育与授权测试用途。请勿在未经许可的系统上使用。
BeyondTrust Remote Support (RS) 与 Privileged Remote Access (PRA) 是用于代理进入组织内部系统的特权远程会话的设备,因此它们经常暴露于互联网,并在网络中占据受信任的位置。
能够访问设备 WebSocket 端点的未认证攻击者,可通过串联两个漏洞以 site 用户身份执行操作系统命令:设备 thin-scc-wrapper 脚本中的参数注入(CVE-2024-12356),以及一个将无效 UTF-8 字节转变为提前中断 SQL 字面量的 PostgreSQL 字符串转义绕过(CVE-2025-1094)。该漏洞路径在任何认证之前即可触达。
本仓库中的 bt_rs_rce_check.py 是针对该漏洞链的非破坏性检测器。它驱动真实漏洞利用所使用的完全相同的未认证代码路径,但止步于可达性证明:它唯一要求目标执行的是良性的 sleep(基于时间的差分)或向您控制的带外收集器发起良性的主机名/HTTP 查询。它从不打开 shell、写入文件、读取数据、持久化或横向移动。
psql 无效 UTF-8 SQL 注入缺陷,串联以完成 RCEBT24-10-ONPREM1 / BT24-10-ONPREM2;云端实例已由 BeyondTrust 修补)。CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H该漏洞链可在 site 用户身份下实现未认证远程代码执行,而该设备的全部用途就是代理进入内部系统的特权访问,因此单个匿名请求即可将暴露的 RS 或 PRA 主机转化为立足点,并以此为跳板攻击该设备所中介的每一个下游系统。
它不需要任何凭据、用户交互或先前访问权限:攻击者来自外部且匿名,唯一前提是能够通过网络访问设备的 WebSocket 端点。
该漏洞在发现已被野外利用后才被披露,于 2024 年 12 月 19 日被加入 CISA 已知被利用漏洞目录,并已被公开关联到 2024 年 12 月美国财政部遭国家支持行为体攻击的事件。
易受攻击的逻辑位于设备的 thin-scc-wrapper shell 脚本中,该脚本从未认证的 WebSocket 帧中读取攻击者控制的会话密钥(gskey),并将其传递给数据库。完整的 RCE 是三个不同问题的串联。
1. thin-scc-wrapper 中的参数注入(CVE-2024-12356)。 该包装脚本将不受信任的 gskey 不带引号地传递给辅助程序,因此 shell 会在 echo 运行前将其按单词拆分为参数:
quoted=$(export PHPRC="$BG_app_root/config/php-cli.ini"; echo $gskey | $ingrediRoot/app/dbquote)
以 -e 开头的密钥会将 echo 变为 echo -e,后者会解释反斜杠转义,使攻击者能够向下一阶段的数据流中注入任意原始字节——最重要的是 \xC0。攻击者控制的是现有命令的一个标志,而非注入新命令,这就是为什么这是参数注入(CWE-88)而非经典命令注入。
2. 经由无效 UTF-8 的 PostgreSQL 转义绕过(CVE-2025-1094)。 dbquote 使用 PHP 的 pg_escape_string() 对该值进行转义,后者调用 libpq 的 PQescapeStringInternal()。对于多字节字符,它信任 pg_encoding_mblen() 报告的长度,并逐字复制该字符的字节,而不进行验证:
len = pg_encoding_mblen(encoding, source);
for (i = 0; i < len; i++) /* copy the character */
*target++ = *source++;
像 0xC0 这样的字节声明了一个 2 字节字符,因此转义器会将下一个字节吞入作为其“续字节”——即使该字节是单引号(0x27)。因此,序列 0xC0 0x27 会带着一个未转义的单引号字节通过“已转义”的字符串。
3. psql 跳出字面量并运行 \!(CVE-2025-1094)。 “已转义”的字符串被管道传递给 psql,后者不会将 0xC0 0x27 视为一个字符,因此 0x27 会提前闭合 SQL 字符串字面量,其后的所有内容都会被解析为新输入。攻击者利用这一点触达 psql 的 \! 元命令,该命令以 site 用户身份运行 shell 命令:
<0xC0>'; \! <cmd> #
Rapid7 发现,实际中的 RCE 总是依赖 CVE-2025-1094,且该漏洞单独即可成立:在二进制 WebSocket 帧中传递原始 0xC0 字节(而非文本帧——文本帧中的 UTF-8 验证会将其剥离)即可使 gskey 原样到达并触发 SQL 跳出,完全无需 echo -e 步骤。本检测器即采用这种二进制帧方法。
整个漏洞链可在认证前通过单个 WebSocket 触达:
/nw 的未认证 WebSocket(设备上的 Tornado 处理器)。Sec-WebSocket-Protocol: ingredi support desk customer thin 标头选择易受攻击的“thin”应用,以 URL 编码形式发送为 ingredi%20support%20desk%20customer%20thin。Host 标头(映射到已安装的公司)解析,或作为后备方案使用 X-Ns-Company 标头。如果两者均未映射到已安装的公司,设备会在处理 gskey 之前关闭套接字。1、一个 thinMint UUID、authType 0(gskey 认证),然后是恶意的 gskey(版本 1 意味着没有 locale_code 行):1
<thinMint UUID>
0
<0xC0>'; \! <cmd> #
BT24-10 增加了一个输入验证门,在 gskey 到达 dbquote/psql 之前拒绝任何非字母数字的 gskey:
elif [[ ! "$gskey" =~ ^[a-zA-Z0-9]{32}$ ]]; then
blog "bad session key given"
...
exit 1
任何包含 0xC0、引号或 shell 元字符的密钥都会被拒绝,脚本随即退出,因此已修补的设备不会产生 1 failure 回复,也不会执行任何命令。检测器将该行为差异转化为一种不依赖出口流量的基于时间的差分,无需目标具备出站连接能力:
A × 32)。在已修补和未修补的构建上,这都会到达数据库查询并快速返回 ['2\n', '1 failure\n']。<0xC0>'; \! sleep <delay> #。在易受攻击的主机上,psql 会运行注入的 sleep,因此 1 failure 回复会延迟约 <delay> 秒。在已修补的主机上,gskey 正则表达式会拒绝该密钥,脚本退出,套接字快速关闭且无回复。由于判定依据是设备自身回复的时序,因此即使目标阻止出站 DNS/HTTP 也能成立——在这种情况下,仅靠 OAST 回调会产生误报。可选的回调模式仅作为佐证,适用于确实允许出站流量的主机。
安装唯一依赖:
pip install -r requirements.txt
差分模式(推荐,不依赖出口流量):
python3 bt_rs_rce_check.py --target rs.example.com --mode differential
带 OAST 佐证的差分模式:
python3 bt_rs_rce_check.py --target rs.example.com \
--oast <your-collector>.oast.pro --mode both
当 Host 标头无法解析到租户时, 提供显式 slug,或提供一个候选 slug 文件(每行一个),通过 X-Ns-Company 标头依次尝试:
python3 bt_rs_rce_check.py --target rs.example.com --company acme
python3 bt_rs_rce_check.py --target rs.example.com --company-list slugs.txt
主要选项:
解读结果:
VULNERABLE — 注入的 1 failure 回复相对于对照延迟了约 --delay 秒。sleep 已执行;该主机上的未认证 RCE 漏洞链可利用。PATCHED — 对照快速返回 1 failure,但注入被拒绝且无回复。BT24-10 的 gskey 正则已生效,注入从未到达 psql 汇点。UNRESOLVED(“company did not resolve”) — 两个探测均未产生 1 failure,因此对照也从未到达 gskey 处理器。这不是已修补的结果;设备因 Host/公司未映射到已安装的公司而关闭了套接字。请使用正确的虚拟主机(--target)或有效的 slug(--company / --company-list)重试。应用 BT24-10(BT24-10-ONPREM1 / BT24-10-ONPREM2)或升级至 24.3.1 以上版本。由于该漏洞链还依赖 PostgreSQL psql 缺陷(CVE-2025-1094),请同时保持 PostgreSQL 客户端工具已修补,并在可行的情况下限制设备 WebSocket 端点的网络暴露。
psql 无效 UTF-8 / SQL 注入缺陷,串联以完成 RCE。rapid7/metasploit-framework PR #19877,针对 BeyondTrust RS/PRA 的未认证 RCE。本软件仅供授权安全测试与防御性研究使用。请仅针对您拥有或获得书面明确授权测试的系统运行。它是一个非破坏性检测器,刻意避免武器化的命令执行、数据访问与持久化。您有责任遵守所有适用法律并获得适当授权;作者对滥用行为不承担任何责任。
| 选项 | 含义 |
|---|
--target <host> | 设备虚拟主机 / FQDN(必填)。 |
--company <slug> | 显式租户 slug,作为 X-Ns-Company 发送。 |
--company-list <file> | 候选 slug 文件,依次尝试直至解析成功。 |
--oast <domain> | 用于回调佐证的带外收集器域名。 |
--mode {differential,callback,both} | 检测策略(默认 differential)。 |
--delay <seconds> | 基于时间测试的 sleep 时长(默认 9)。 |
--timeout <seconds> | 每次探测的套接字超时(默认 25)。 |
--header 'H: v' | 额外的原始请求标头;可重复。 |