przemytn/CVE-2026-24061

GitHub: przemytn/CVE-2026-24061

CVE-2026-24061 概念验证工具,利用 GNU InetUtils telnetd 的参数注入漏洞实现无凭据获取 root shell。

Stars: 0 | Forks: 0

# CVE-2026-24061 - telnetd auth 绕过 ## 概述 GNU InetUtils 中 `telnetd` 的参数注入漏洞。受影响版本为 1.9.3 到 2.7。CVSS 评分 9.8。自 2026 年 1 月 26 日起被列入 CISA KEV 目录,这意味着该漏洞正在野外被积极利用。 核心技巧在于 telnetd 通过 NEW-ENVIRON (RFC 1572) 接收来自客户端的环境变量 `USER` 的值,并在没有任何验证的情况下直接将其拼接到 `login(1)` 的调用命令中。如果客户端发送 `USER="-f root"`,telnetd 将执行: ``` /usr/bin/login -p -h -f root ``` `login` 中的 `-f` 标志意味着“跳过密码验证直接登录该用户”。结果是获得 root shell,无需任何身份验证。 ## 机制 在 `telnetd/telnetd.c` 中存在一个 login 调用模板: ``` char *login_invocation = PATH_LOGIN " -p -h %h %?u{-f %u}{%U}"; ``` `%u` 代表来自 telnet 身份验证的用户(受信任)。`%U` 代表来自客户端的原始环境变量 `USER`(不受信任)。当未启用身份验证时,使用的是 `%U`。 变量展开逻辑位于 `telnetd/utility.c` 的 `_var_short_name` 函数中: ``` case 'U': return getenv("USER") ? xstrdup(getenv("USER")) : xstrdup(""); ``` 零过滤。客户端在 USER 中发送的任何内容都会直接传递给 login 的命令行。不仅 `-f root` 有效,理论上可以注入 `login` 接受的任何参数。 该漏洞是在 2015-03-19 的上游安全防护提交 (`fa3245ac`) 中引入的。讽刺的是,该提交本意是为了改进 USER 变量的处理。Debian 曾在 2019 年为此发布过补丁 (`0028-telnetd-Scrub-USER-from-environment.patch`),但在 Debian 10 修复 CVE-2020-10188 时,该补丁丢失,导致漏洞回归。因此 Debian 10+、Ubuntu 及其衍生版本也受影响。 ## POC 原理 `main.py` 是一个最小化的 telnet 客户端,其工作流程如下: 1. 连接到 23 端口 2. 在协商阶段接受 NEW-ENVIRON,其他选项均回复 WONT 3. 收到 SEND 请求后,回复 `IAC SB NEW_ENVIRON IS VAR "USER" VALUE "-f root" IAC SE` 4. telnetd 执行 `login -f root`,你获得 shell 5. 随后作为交互式会话运行,从输出中过滤 IAC 和 ANSI 转义序列 ``` klient serwer |--- tcp connect ------------------->| |<-- IAC DO NEW_ENVIRON -------------| |--- IAC WILL NEW_ENVIRON ---------->| |<-- IAC SB NEW_ENVIRON SEND --------| |--- SB NEW_ENVIRON IS | | VAR "USER" VALUE "-f root" | | IAC SE ------------------------>| | [telnetd: login -p -h x -f root]| |<-- root@host:~# ------------------| ``` ## 用法 ``` python3 main.py python3 main.py -p ``` Ctrl+C 结束会话。 ## 注意事项 不要在没有安装 `inetutils-telnetd` 的系统上尝试此操作。来自 netkit 的 `telnetd` 软件包是不同的代码,不受此特定漏洞影响。如果你连接后得到的是正常的登录提示符而不是 shell,说明服务器已经打了补丁,或者它不是 inetutils 的 telnetd。 不要将 payload 改为 `-f <其他用户>` 并期望它在所有系统上都有效。某些发行版的 `login(1)` 对 `-f` 有额外的限制。在标准的 Debian/Ubuntu 上,`-f root` 可以正常工作。 ## 受影响版本 | 软件 | 版本 | |---|---| | GNU InetUtils | 1.9.3 - 2.7 | | Debian 10+ | inetutils-telnetd (补丁前) | | Debian 11 | 在 2:2.0-1+deb11u3 中修复 | | Ubuntu | inetutils-telnetd (补丁前) | ## 补丁 官方修复添加了一个 `sanitize()` 函数,用于拒绝以 `-` 开头或包含 shell 元字符的值。该函数应用于展开过程中的所有变量,而不仅仅是 USER。 ``` static char * sanitize (const char *u) { if (u && *u != '-' && !u[strcspn(u, "\t\n !\"#$&'()*;<=>?[\\^`{|}~")]) return u; else return ""; } ``` - `fd702c0` - USER 补丁 - `ccba9f7` - 所有变量的清理
标签:CISA KEV, CISA项目, CVE-2026-24061, Exploit, GNU InetUtils, login, PoC, RCE, telnet, telnetd, Zero-Day, 协议分析, 参数注入, 暴力破解, 权限提升, 环境变量注入, 编程工具, 网络安全, 认证绕过, 远程代码执行, 逆向工具, 隐私保护, 高危漏洞