通过 GNU InetUtils telnetd 的 LINEMODE SLC(设置本地字符)处理程序中的缓冲区溢出,实现未认证远程代码执行。
CVSS 3.1: 9.8(严重) | CWE: CWE-120, CWE-787
telnetd/slc.c 中的 add_slc() 函数将每个 SLC 三元组的 3 个字节追加到一个固定的 108 字节缓冲区(slcbuf)中,且未进行边界检查。未认证的攻击者可以在选项协商期间(任何登录提示之前)发送一个精心构造的 SLC 子选项,其中包含 40 个以上三元组(功能码 > 18/NSLC),从而溢出缓冲区,破坏 BSS 中的 slcptr 指针,并在 end_slc() 使用被破坏的指针时实现任意写入。
# 构建易受攻击的实验室环境
docker compose up -d
# 检测(非破坏性)
python3 detect.py 127.0.0.1 2323
# 利用(使 telnetd 崩溃 - 确认漏洞)
python3 exploit.py 127.0.0.1 2323
# 清理
docker compose down
Docker 设置运行一个 Debian 容器,其中包含在 xinetd 下运行的 inetutils-telnetd 2.4,暴露于端口 2323。完全隔离 - 不会影响您的主机。
WILL LINEMODE 以触发 LINEMODE 协商DO LINEMODE 并进入 SLC 子选项处理add_slc() 为每个三元组将一个"不支持"回复(3 字节)排队到一个 104 字节的缓冲区中slcptr 和相邻的 BSS 数据end_slc() 通过被破坏的 slcptr 写入子选项结束标记(任意写入)要超越 DoS,您需要:
slcbuf → slcptr 偏移量)end_slc() 通过被破坏的 slcptr 写入的值本工具仅供授权的安全测试和教育目的使用。请勿将其用于您不拥有或未经明确许可测试的系统。作者对滥用行为不承担任何责任。
MIT
| 文件 | 描述 |
|---|
exploit.py | PoC 崩溃/DoS 利用脚本 |
Dockerfile | 易受攻击的 telnetd 实验室 |
docker-compose.yml | 一键实验室搭建 |
xinetd-telnet.conf | xinetd 服务配置 |
detect.py | 非破坏性版本检测脚本 |