Telnet 实战与排错 — 明文抓包、端口探测与安全禁用
Wireshark 还原 Telnet 明文口令、telnet/nc 端口探测、手工调试文本协议与彻底禁用 Telnet / 应用层 / TCP 23
Table of Contents
这篇你能学到
- 如何用 Wireshark / tshark 把 Telnet 的明文口令和会话一键还原出来(安全教学实验)。
- 如何用
telnet/nc/Test-NetConnection做端口连通性探测,并正确解读"连上 / refused / timeout"。 - 如何从零禁用 Telnet(Linux / Windows / 网络设备),以及老设备只能 Telnet 时的过渡方案与常见故障排错。
1. 抓包观察
1.1 Wireshark 显示过滤式
这组过滤式能干什么:快速从海量包里只挑出 Telnet 流量、只看协商命令、或只抓"字符模式的单字节按键包 / Ctrl+C 的紧急包",定位登录阶段与登录口令位置。
| |
1.2 一键还原明文口令(安全教学实验)
这组命令能干什么:在隔离实验环境里抓一份 Telnet 会话的包,再用 Wireshark 或 tshark 把明文口令和命令还原,直观感受"明文"有多危险。
在你自己拥有的隔离实验环境中做一次,直观感受风险:
Wireshark 中:右键任一 Telnet 包 → Follow → TCP Stream,可看到类似:
命令行等价:
1.3 典型字段说明
| 观察点 | 现象 | 判读 |
|---|---|---|
| 连接开始 | 连续多个 IAC DO/WILL 三字节包 | 选项协商阶段;看 telnet.option 判断进入哪种模式 |
IAC WILL ECHO(FF FB 01) | 服务端要求远端回显 | 进入字符模式,后续每键一包 |
IAC WON'T ECHO(FF FC 01) | 服务端临时关回显 | 马上就是口令输入,抓包重点位置 |
IAC SB 18 00 ... IAC SE | 终端类型子协商 | 可看到 xterm/vt100 字符串 |
IAC SB 1F ... | NAWS | 4 字节即列数与行数 |
大量 tcp.len == 1 | 字符模式 | 效率低但交互好;行模式则为整行 |
tcp.flags.urg == 1 + FF F2 | Synch | 用户按了 Ctrl+C |
| 明文可读的 ASCII | 所有内容 | 这就是必须淘汰 Telnet 的全部理由 |
2. 常用命令 / 配置
2.1 端口连通性探测(今天 Telnet 的主要用途)
这组命令能干什么:用 telnet 本身或更好的替代工具(nc、bash /dev/tcp、nmap、Test-NetConnection)探测"某 IP 的某 TCP 端口是否开放"。
| |
| |
2.2 用 Telnet 手工调试文本协议
这段能干什么:Telnet 是"裸 TCP + 文本",正好用来手工发 HTTP/SMTP/POP3/Redis 请求,验证服务端是否按协议返回。
HTTP/1.1:
SMTP:
POP3:
Redis:
调 TLS 端口(443/465/993)时 telnet 无能为力,改用:
openssl s_client -connect example.com:443 -servername example.com
2.3 Telnet 客户端内部命令
这张表能干什么:连接后按 Ctrl + ] 进入命令模式,可做断开、看状态、调试协商、切回显、发中断等——排错时常用 toggle options 看协商过程。
连接后按 Ctrl + ] 进入命令模式:
| 命令 | 作用 |
|---|---|
quit / q | 断开并退出 |
close | 关闭当前连接但保留 telnet 提示符 |
status | 显示连接状态与协商结果 |
toggle options | 打印选项协商过程(排错神器) |
set echo | 切换本地回显 |
send ip | 发送 IAC IP(中断) |
send ayt | 发送 Are You There 探活 |
mode line / mode character | 切换行/字符模式 |
open host port | 建立新连接 |
? | 帮助 |
调试协商过程:
2.4 服务端:检查与彻底禁用(Linux)
这段配置能干什么:查 telnetd 是否在监听,然后用 systemd / xinetd 停掉并屏蔽它,卸载软件包,再用防火墙兜底,最后验证端口已关闭。
| |
2.5 Windows 禁用 Telnet 服务端
这段 PowerShell 能干什么:停止并禁用 Windows 的 Telnet 服务,并建议把客户端也一并移除,减少攻击者可用的横向移动工具。
2.6 网络设备:从 Telnet 切到 SSH
这段配置能干什么:在 Cisco / 华为设备上关掉 Telnet、只开 SSH,从带外管理层面消除明文风险。
| |
2.7 合规扫描:找出网内还开着 Telnet 的设备
这组命令能干什么:用 nmap / masscan 扫全网的 23 端口,产出"还在跑 Telnet 的资产清单"作为合规基线。
3. 常见故障与排错
3.1 telnet: command not found
先记住结论:这不是 Telnet 服务的问题,而是本地客户端没装——现代系统默认不再带 telnet 客户端,装一个或用 nc/Test-NetConnection 替代即可。
| 系统 | 安装 |
|---|---|
| Ubuntu/Debian | sudo apt install telnet |
| RHEL/CentOS/Rocky | sudo yum install telnet |
| Alpine | apk add busybox-extras(busybox-extras telnet) |
| macOS | brew install telnet(系统自 High Sierra 起移除) |
| Windows | dism /online /Enable-Feature /FeatureName:TelnetClient |
更好的选择:直接用
nc、Test-NetConnection或</dev/tcp/host/port,无需安装。
3.2 探测结果如何解读
先记住结论:三种结果对应三种网络语义——Connected = 端口开;refused = 主机在但端口没人听(RST);timeout = 包被吃掉、根本没回应。前者说明防火墙放行了只是服务没起,后者说明包在路上被丢了。
| 输出 | 含义 | 后续动作 |
|---|---|---|
Connected to host. + 光标闪烁 | 端口开放且 TCP 可达 | 正常 |
Connection refused | 主机可达但端口无监听(收到 RST) | 检查服务是否启动、监听地址是否 127.0.0.1 |
长时间挂起后 Connection timed out | 报文被丢弃(防火墙 DROP / 路由不通 / 主机不存在) | 查安全组、iptables、路由 |
No route to host | 本地路由或 ARP 层不通 | ip route、ping 网关 |
Unable to connect to remote host | 通用连接失败 | 结合 tcpdump 看有无 SYN 发出 |
关键区分:refused = 有人拒接(RST);timeout = 电话打不通(无响应)。前者说明防火墙放行了但服务没开,后者说明包在路上被吃了。
3.3 连上后无响应 / 乱码
先记住结论:连上却一片空白或乱码,多半是对端根本不是文本协议(MySQL/SSH/TLS),或被 NVT 当 ASCII 解释了二进制——换对工具或协商 BINARY 即可,不要怀疑网络。
| 现象 | 原因 | 处理 |
|---|---|---|
| 连上后一片空白 | 对端是二进制协议(如 MySQL、SSH、TLS),不是文本协议 | 换 nc、openssl s_client 或专用客户端 |
| 满屏乱码 | 二进制数据被 NVT 当 ASCII 解释 | 同上;或 telnet -8/协商 BINARY |
| 输入无回显 | 服务端未发 WILL ECHO | Ctrl+] → set echo 打开本地回显 |
| 每个字符显示两遍 | 本地回显 + 远端回显同时开 | Ctrl+] → set echo 关掉本地 |
退格键变成 ^H 或 ^? | 终端 erase 字符与远端不匹配 | stty erase ^H 或登录后 export TERM=vt100 |
| 中文乱码 | NVT 是 7 位,未协商 BINARY | 用 telnet -8,或改用 SSH |
3.4 无法退出 Telnet
先记住结论:telnet 没有普通的 Ctrl+C 退出通道,必须用转义序列 Ctrl + ] 进入 telnet> 提示符再 quit;被占用就用 -e 换一个转义键。
转义序列:Ctrl + ](Windows/Linux 默认),进入 telnet> 提示符后输入 quit。
若 Ctrl+] 无效(被终端占用):
3.5 手工发 HTTP 请求得不到响应
先记住结论:手工发 HTTP 收不到响应,九成是"格式不对"——漏了结束空行、缺 Host 头、换行不是 CRLF,或对端其实是 HTTPS(TLS)而非明文 HTTP。
| 原因 | 说明 |
|---|---|
| 忘了空行 | HTTP 头部结束必须是空行(多敲一次回车) |
| 缺 Host 头 | HTTP/1.1 强制要求 Host: |
| 换行不对 | 严格来说需 CRLF;telnet 已按 NVT 发 CRLF,一般没问题;nc 需 printf 'GET / HTTP/1.1\r\nHost: x\r\n\r\n' |
| 目标是 HTTPS | 443 是 TLS,telnet 无法握手 → 用 openssl s_client |
| 输入太慢被超时 | 服务端 keep-alive 超时;改用脚本一次性发送 |
3.6 老设备只能 Telnet 怎么办(过渡方案)
先记住结论:能升级就升级到 SSH;实在不能升级,就把设备圈进隔离管理网 + 跳板机 SSH 隧道,把"明文 Telnet"压缩到内网最后一跳,再配 ACL 白名单与审计。
优先级从高到低:
- 升级固件启用 SSH(多数设备近十年固件都支持)。
- 若不可升级:把设备置于独立管理 VLAN,禁止跨网段访问 23 端口。
- 通过跳板机 + SSH 隧道访问:
- ACL 限制源 IP 白名单 + 强制日志审计。
- 排入设备淘汰计划。
4. 与其他协议对比
| 维度 | Telnet | SSH | netcat (nc) | rlogin | 串口 Console |
|---|---|---|---|---|---|
| 端口 | TCP 23 | TCP 22 | 任意 | TCP 513 | 无(物理口) |
| 规范 | RFC 854/855 | RFC 4251~4254 | 无标准 | RFC 1282 | RS-232 |
| 加密 | 无 | 有(内建) | 无(ncat --ssl 可加) | 无 | 物理隔离 |
| 服务端认证 | 无 | 主机密钥 TOFU/CA | 无 | 无(.rhosts 更危险) | 物理接触 |
| 客户端认证 | 明文口令 | 公钥/口令/2FA/证书 | 无 | 主机信任,可免口令 | 设备本地 |
| 终端协商 | 有(NVT + IAC 选项) | 有(pty-req) | 无(裸管道) | 有(自动传 TERM) | 有 |
| 文件传输 | 无 | scp/sftp | 支持(管道) | rcp | X/Y/ZMODEM |
| 端口转发 | 无 | -L/-R/-D | 有限(-l 中继) | 无 | 无 |
| 二进制安全 | 需协商 BINARY | 原生支持 | 原生支持 | 一般 | 支持 |
| 今日地位 | 淘汰(仅探测/调试) | 事实标准 | 网络瑞士军刀 | 淘汰 | 带外救援手段 |
探测场景选型:脚本化/二进制场景用 nc;交互调试文本协议用 telnet(NVT 处理换行更省心);全面扫描用 nmap;Windows 环境用 Test-NetConnection。
5. 速查表 / 常见面试题
5.1 IAC 命令速查
| 值 | 命令 | 值 | 命令 |
|---|---|---|---|
| 255 | IAC | 247 | EC 擦除字符 |
| 254 | DON’T | 246 | AYT 探活 |
| 253 | DO | 245 | AO 中止输出 |
| 252 | WON’T | 244 | IP 中断进程 |
| 251 | WILL | 243 | BRK |
| 250 | SB 子协商开始 | 242 | DM 数据标记 |
| 249 | GA | 241 | NOP |
| 248 | EL 擦除行 | 240 | SE 子协商结束 |
5.2 选项码速查
| 码 | 选项 | 码 | 选项 |
|---|---|---|---|
| 0 | BINARY | 31 | NAWS 窗口大小 |
| 1 | ECHO | 32 | TERMINAL-SPEED |
| 3 | SUPPRESS-GO-AHEAD | 34 | LINEMODE |
| 5 | STATUS | 36/39 | ENVIRON / NEW-ENVIRON |
| 24 | TERMINAL-TYPE | 37/38 | AUTHENTICATION / ENCRYPTION |
5.3 操作速查
| 目标 | 命令 |
|---|---|
| 探测端口 | telnet host port / nc -zv host port / Test-NetConnection host -Port n |
| 退出 telnet | Ctrl + ] → quit |
| 自定义转义键 | telnet -e ^X host port |
| 查看协商过程 | telnet -d host 或 Ctrl+] → toggle options |
| 8 位模式 | telnet -8 host |
| 抓明文 | tshark -r x.pcap -qz follow,tcp,ascii,0 |
| 关闭服务端 | systemctl disable --now telnet.socket + apt purge telnetd |
| 设备切 SSH | Cisco transport input ssh / 华为 undo telnet server enable |
5.4 高频面试题
Q1:Telnet 为什么不安全?列举至少三点。
A:① 用户名与口令明文传输,抓包即得;② 会话内容(命令与输出)全明文;③ 无服务端身份认证,无法防中间人;④ 无消息完整性保护,可被注入/劫持;⑤ 历史 telnetd 存在多个预认证远程漏洞;⑥ NEW-ENVIRON 等选项曾被用于认证绕过。
Q2:telnet host 80 能连上说明什么?连不上又说明什么?
A:能连上说明 TCP 三次握手成功,即网络可达 + 目标端口有进程监听 + 中间无阻断;Connection refused 说明主机可达但端口无监听(收到 RST);timed out 说明报文被防火墙 DROP 或路由不可达。注意:连上只证明 TCP 层通,不证明应用层服务健康。
Q3:什么是 NVT?为什么需要它? A:Network Virtual Terminal,网络虚拟终端。它定义了一套"最小公共分母"终端规范(7 位 ASCII、CR LF 换行、固定控制码集),使异构终端设备能互通——每端只需实现"本地终端 ↔ NVT"的转换,而不必两两适配。
Q4:IAC 是什么?如何在数据中传输字节 0xFF?
A:IAC = Interpret As Command,值 255(0xFF),是 Telnet 的带内命令引导符。要在数据中传输一个字面量 0xFF,必须转义为 IAC IAC(FF FF)。
Q5:解释 WILL / WON’T / DO / DON’T 的语义差异。
A:WILL/WON'T 描述发送方自身是否启用某选项(“我要/我不要做”);DO/DON'T 描述对对方的要求(“你要/你别做”)。配对关系:WILL↔DO/DON'T,DO↔WILL/WON'T。RFC 854 规定只在状态改变时发起请求、收到请求必须应答、应答不再触发新请求,以此避免无限循环。
Q6:Telnet 的字符模式是怎么形成的?有什么代价?
A:服务端发 WILL ECHO + 双方 SUPPRESS-GO-AHEAD 后进入字符模式:客户端关闭本地回显,逐字符发送,由服务端回显。好处是支持 vi、Tab 补全等实时交互;代价是每个按键一个 TCP 包(40+ 字节头承载 1 字节数据),高延迟链路上体验差、包量大。
Q7:Telnet 和 SSH 的关系?SSH 继承了什么?
A:SSH 是 Telnet 的安全替代品,保留了"远程终端"语义并结构化:终端类型、窗口大小、终端模式在 SSH 中变成 pty-req 通道请求(模式编号甚至沿用 Telnet 思路);同时新增了加密传输层、主机密钥认证、公钥认证、多通道复用与端口转发。
Q8:输入口令时屏幕不显示,是不是说明口令被加密了?
A:不是。那只是服务端发送 IAC WON'T ECHO 让客户端停止回显,纯粹是显示层面的处理。口令字节在网络上依然是明文,抓包可直接读出。这是 Telnet 最容易被误解的一点。
Q9:生产环境如何彻底消除 Telnet 风险?
A:① 服务端 systemctl disable --now telnet.socket 并卸载 telnetd 包;② 防火墙 DROP 23 端口;③ 网络设备改 transport input ssh / undo telnet server enable;④ 用 nmap 定期扫描全网 23 端口作为合规基线;⑤ 无法改造的老设备置于隔离管理 VLAN + 跳板机 SSH 隧道访问 + 源 IP 白名单;⑥ 客户端侧也建议移除,减少攻击者横向移动可用工具。
Q10:为什么调试 HTTPS 不能用 telnet?
A:443 端口上跑的是 TLS,连接后服务端等待 ClientHello 二进制握手报文,telnet 发的是 NVT 明文,握手必然失败。应使用 openssl s_client -connect host:443 -servername host 或 curl -v。