怎么检查当前服务器 SSH 服务版本是否存在已知漏洞

文章导读
检查 SSH 服务版本是否存在已知漏洞,核心在于准确获取服务端版本号,再对照官方漏洞数据库确认,必要时升级修复。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

检查 SSH 服务版本是否存在已知漏洞,核心在于准确获取服务端版本号,再对照官方漏洞数据库确认,必要时升级修复。

先说结论:通过包管理器或 sshd 命令获取服务端版本,在 CVE/NVD 等公开漏洞库中检索对应风险,优先处理高危漏洞并升级版本。

  • 先判断:确认当前 SSH 服务端版本号(非客户端)
  • 优先做:对照漏洞数据库检查已知风险
  • 再验证:升级后测试连接并复查漏洞状态

命令速用版

以下命令可直接在服务器上执行,用于快速获取 SSH 服务端版本信息:

# CentOS/RHEL 系统
rpm -q openssh-server

# Ubuntu/Debian 系统
dpkg -l | grep openssh-server

# 通用方法(查看 sshd 二进制版本)
/usr/sbin/sshd -V

如果要从外部探测远程服务器的 SSH 版本:

nmap -sV -p 22 <目标 IP>

使用 Nmap 脚本引擎扫描 SSH 相关漏洞:

nmap `--script` sshv1 -p22 <目标 IP>
nmap -p22 <目标 IP> `--script` ssh2-enum-algos
nmap -p22 <目标 IP> `--script` ssh-hostkey `--script-args` ssh_hostkey=full

为什么会这样

SSH 服务在建立连接时会返回包含版本号的欢迎信息,例如"SSH-2.0-OpenSSH_7.4"。这个信息被称为服务标志(banner),是识别版本最直接的依据。漏洞扫描器判断"SSH 服务存在"的依据是网络层的协议响应,而不是服务器上进程是否运行。这意味着即使你在系统里停了服务,如果防火墙规则未生效或端口仍被监听,扫描器依然能检测到版本信息。

获取版本号后,需要在 CVE Details 或国家漏洞数据库(NVD)中查询该版本是否存在已知漏洞。有些旧版本存在用户枚举、弱加密算法等风险,及时升级能避免被利用。

分步处理

第一步:获取当前 SSH 服务端版本

怎么检查当前服务器 SSH 服务版本是否存在已知漏洞

在服务器本地执行包查询命令,记录完整的版本号,包括主版本和补丁版本。注意:ssh -V 仅显示客户端版本,不能代表服务端安全状态。

/usr/sbin/sshd -V

第二步:检查服务状态和监听端口

确认 SSH 服务是否正在运行:

systemctl status sshd
ss -tuln | grep :22

如果服务已关闭但扫描仍报漏洞,检查防火墙规则是否真正生效,以及是否有非标准端口的 SSH 实例在运行。

第三步:查询已知漏洞

访问 CVE Details 或 NVD 数据库,输入 SSH 软件名称和版本号进行检索。例如在搜索框输入"OpenSSH 7.4",关注高危漏洞的 CVE 编号、影响范围和修复建议。

第四步:下载并安装更新版本

怎么检查当前服务器 SSH 服务版本是否存在已知漏洞

根据漏洞公告中的修复方案,访问 OpenSSH 官网或使用系统包管理器下载最新版本。安装后根据操作系统指导手册进行必要配置。

# CentOS/RHEL
sudo yum update openssh-server

# Ubuntu/Debian
sudo apt update && sudo apt install `--only-upgrade` openssh-server

第五步:重启服务并测试

sudo systemctl restart sshd

使用另一个终端或远程主机尝试 SSH 连接,确认新版本服务正常运行。

怎么验证是否生效

升级完成后,再次执行版本检查命令确认版本号已更新:

/usr/sbin/sshd -V

从外部使用 nmap 重新扫描,确认漏洞状态:

nmap -sV -p 22 <目标 IP>
nmap `--script` vuln -p 22 <目标 IP>

如果使用漏洞扫描工具(如 Nessus、OpenVAS),运行再次扫描并对比前后报告,确认相关漏洞项已消除。

怎么检查当前服务器 SSH 服务版本是否存在已知漏洞

检查系统日志中 SSH 服务的启动记录,确认无异常报错:

journalctl -u sshd `--since` "1 hour ago"

常见坑

客户端与服务端版本混淆ssh -V 检查的是客户端工具版本,即使它很高,服务端 sshd 可能仍为旧版本存在漏洞。务必以服务端查询结果为准。

防火墙规则未真正生效:配置 iptables 或 firewalld 时,如果规则优先级错误或未持久化,重启后可能失效,导致 SSH 端口仍暴露。使用iptables -L -v -nfirewall-cmd `--list-all`验证规则。

非标准端口被忽略:SSH 服务可能配置为监听非 22 端口(如 2222),检查/etc/ssh/sshd_config中的 Port 配置项,确保所有实例都被覆盖。

容器或虚拟机中的 SSH 实例:主机上的 SSH 已关闭,但 Docker 容器或虚拟机内可能仍运行 SSH 服务,扫描工具能检测到这些实例。需要逐一检查各环境。

多个 SSH 服务实例:系统可能运行多个 SSH 服务,其中一个未被关闭。使用ps aux | grep ssh检查所有相关进程。

扫描器误报:有些情况下运维确认服务已停,但扫描器仍报漏洞。这是因为扫描器只相信网络层的三次握手响应,不关心 systemd 服务状态。需要从网络可达性角度排查。

参考来源

  • 安全分析师任务题库 - SSH 服务版本确认方法,标志提取(banner grabbing)原理说明
  • Nmap 官方文档 - 服务版本探测和 NSE 脚本使用,包括 sshv1、ssh2-enum-algos 等脚本
  • OpenSSH 官网 - 版本下载和安全公告发布渠道
  • 漏洞扫描工具说明 - Nessus、OpenVAS、Qualys 等工具的使用方法
  • CVE Details 和国家漏洞数据库(NVD)- 已知漏洞检索平台