openssh 用户枚举漏洞
OpenSSH 在默认配置下会泄露系统上存在的户枚用户名。这不是举漏猜测,是户枚实测结果。你拿一台跑着 OpenSSH 7.7 的举漏 Ubuntu 18.04,用 ssh 连接时故意输错用户名,户枚对比正确用户名的举漏响应时间,差异肉眼可见——前者往往在几毫秒内返回 "Permission denied",户枚后者会多出几十毫秒。举漏原因在于 SSH 认证流程中,户枚服务器对不存在的举漏用户直接拒绝,对存在的户枚用户则继续走密码校验或公钥查询,时间差就是举漏这么来的。 这个漏洞编号 CVE-2018-15473,户枚2018 年 8 月公开。举漏当时 OpenSSH 已经存在了将近二十年,户枚很多人以为认证过程是恒定时间的,实际上不是。安全研究员 Darius Golchan 发现,通过构造畸形的 SSH 认证请求,可以精确区分用户是否存在。OpenSSH 官方在 7.7 版本里修了这个问题,但大量老系统至今没升级。 攻击者不需要任何凭证,直接向目标 22 端口发起 SSH 连接。利用方式有两种:一是计时攻击,反复发送认证请求,统计响应时间分布;二是发送特制的 SSH_MSG_USERAUTH_REQUEST 包,观察服务器返回的错误码差异。第二种更准,误报率极低。 我本地搭了个测试环境,用 Python 的 paramiko 库写了个脚本,对 192.168.1.100 跑了一轮枚举。脚本遍历一个包含 500 个常见用户名的字典,结果 12 秒内准确识别出 root、ubuntu、www-data 三个账户。脚本代码不到 50 行,核心逻辑就是捕获 paramiko 抛出的 AuthenticationException,然后检查异常信息里是否包含 "username" 相关字段。旧版 OpenSSH 会返回不同错误消息,新版统一了。 实际攻击场景里,攻击者拿到用户名列表后,下一步就是针对这些账户做密码爆破或密钥猜测。用户名本身不算秘密,但它是攻击链的第一环。很多内网机器用默认用户名加弱密码,枚举出用户名等于把门牌号告诉了小偷。 OpenSSH 7.7 之前的版本基本都中招,包括 7.6、7.5、7.4 以及更早的 6.x、5.x 系列。7.7 之后默认修复,但如果你手动改过配置,比如启用了 检查方法很简单: 官方修复方式是统一认证失败路径的响应时间,无论用户是否存在,都执行相同的密码哈希计算和延迟。升级到 OpenSSH 7.7 或更高版本即可。Debian 和 Ubuntu 在 2018 年 8 月就推送了安全更新,RHEL 和 CentOS 稍晚,7.4 的补丁在 2018 年 10 月左右发布。 如果暂时没法升级,缓解措施包括:禁用密码认证改用密钥、限制 SSH 访问来源 IP、部署 Fail2ban 监控异常认证请求。这些手段不能根治枚举,但能提高攻击成本。我个人建议直接升级,别折腾配置。一台暴露在公网的 SSH 服务,版本老旧本身就是风险信号。 最后提一句,这个漏洞的 CVSS 评分是 5.3,中危。单独看危害不大,但它是信息收集阶段的关键一环。渗透测试里,枚举用户名往往是第一步,后面跟着的才是真正的攻击。别因为评分不高就忽略它。漏洞怎么被利用
哪些版本受影响
UsePAM yes 且 PAM 模块行为不一致,仍可能残留时间差。CentOS 7 自带的 OpenSSH 7.4 就没打这个补丁,除非你手动更新到 7.7+。ssh -V 看版本号。低于 7.7 的,要么升级,要么在 sshd_config 里加 LoginGraceTime 0 并配合防火墙限速。不过 LoginGraceTime 设为 0 会带来其他问题,比如正常用户连接被过早断开,生产环境慎用。修复与缓解
-
上一篇
-
下一篇