从版本号到漏洞清单:CVE 查询 + NSE 脚本 + searchsploit 三步定位已知漏洞
网络安全实战 90 天 · Week 2 侦察 · 难度 ★★★ 进阶 | 关键词:漏洞初判 CVE CVSS NSE searchsploit vsftpd 后门 Samba RCE
扫出一堆版本号之后,真正的工作才开始:哪个有洞、洞有多严重、有没有现成 EXP。这篇把「漏洞初判」拆成三步------查 CVE 确认存在性、跑 NSE 脚本做主动验证、用 searchsploit 找可用的利用代码,最后整理成一份按 CVSS 排序的漏洞清单。
一、漏洞初判在侦察流程里的位置
前面三篇做完,手里有的是一张「端口 + 版本」清单。这份清单本身没有意义------真正的价值在于把它翻译成「哪些服务有已知漏洞、严重程度如何、能不能打」。
这一步是纯信息分析,绝大部分工作不需要碰目标。只有 NSE 脚本那一步会发探测包,而且也只是发送特定的验证请求,不构成实际攻击。
说明 本文所有 CVE 查询在公开漏洞库完成,NSE 与 searchsploit 仅做版本存在性验证,未执行任何利用代码。目标为自建 Metasploitable2 靶机。
二、第一步:圈出可疑版本
先做最粗糙的筛选:哪些版本「看起来就有问题」。经验法则是看发布年份------2010 年以前发布的服务,基本都有公开的漏洞记录,因为那时候安全研究刚起步,大量服务在设计时没有考虑对抗环境。

上一篇文章扫出来的五个版本,按年份排一下就很清楚:
| 服务 | 版本 | 发布年份 | 初判 |
|---|---|---|---|
| vsftpd | 2.3.4 | 2011 | 有源码植入后门,CVSS 9.8 |
| OpenSSH | 4.7p1 | 2008 | 无重大 RCE,但加密算法过时 |
| Apache httpd | 2.2.8 | 2008 | 多个 DoS 与信息泄露 |
| Samba | 3.0.20 | 2008 | usermap_script 远程命令执行 |
| MySQL | 5.0.51a | 2008 | 默认配置下 root 空口令 |
三、第二步:查 CVE 确认
3.1 四个常用漏洞库
| 站点 | 特点 | 适合场景 |
|---|---|---|
| cve.mitre.org | CVE 官方编号库,最权威 | 确认编号是否存在、看原始描述 |
| nvd.nist.gov | NIST 维护,带 CVSS 评分和 CPE 匹配 | 查严重程度、查影响版本范围 |
| cvedetails.com | 按厂商/产品聚合,可视化好 | 看某个产品的历史漏洞全貌 |
| exploit-db.com | 漏洞利用代码库 | 找现成 EXP、对应到 searchsploit |
3.2 查一条漏洞要抓四个东西
-
CVE 编号:唯一标识,后续沟通和报告都用它。
-
影响版本范围:确认自己的目标版本在不在范围内------这一步最容易出错,很多漏洞只影响特定小版本。
-
漏洞类型:RCE、信息泄露、DoS、提权,决定了危害方向。
-
有无公开 EXP:有 EXP 意味着利用门槛极低,优先级要往前提。
3.3 实例:vsftpd 2.3.4
在 NVD 上搜 vsftpd 2.3.4,第一条就是 CVE-2011-2523,CVSS 9.8(Critical)。

这条漏洞的性质非常特殊------不是代码缺陷,是源码被恶意植入了后门。2011 年 vsftpd 官方下载服务器被攻破,2.3.4 这个版本的源码里被加了一段:当登录用户名中包含「😃」这个表情符号时,服务会在 6200 端口启动一个 root 权限的 shell。
这意味着:只要版本是 2.3.4,不需要任何技巧,一个特定用户名就能拿到 root。这类「供应链投毒」型漏洞的危害远高于普通代码缺陷,因为它是设计上就给你留了门。
四、第三步:NSE 脚本主动验证
CVE 库告诉你「这个版本理论上存在漏洞」,NSE 脚本告诉你「这台机器上确实存在」。前者是情报,后者是证据。
4.1 先看有哪些脚本
列出漏洞检测脚本
bash
ls /usr/share/nmap/scripts/ | grep vuln
Nmap 自带几百个 NSE 脚本,vuln 类别下是专门的漏洞检测。命名规律是 服务名-vuln-漏洞名,比如 ftp-vsftpd-backdoor、smb-vuln-ms08-067。
4.2 按服务逐个跑
按服务分组检测
bash
nmap --script ftp-vsftpd-backdoor -p 21 192.168.159.137
nmap --script "smb-vuln*" -p 139,445 192.168.159.137
nmap --script "http-vuln*" -p 80 192.168.159.137
脚本返回 VULNERABLE 就说明漏洞真实存在,同时会给出 CVE 编号和利用参考。这比单纯查版本可靠得多------有些系统打了补丁但版本号没变,脚本能区分出来。

靶机上 ftp-vsftpd-backdoor 报 VULNERABLE,smb-vuln-ms08-067 也报 VULNERABLE。两条都拿到了明确的验证证据。
4.3 别用 --script vuln 一把梭
全量漏洞脚本(不推荐)
bash
nmap --script vuln 192.168.159.137
这个命令会跑所有 vuln 类脚本,听起来很爽,实际体验很差------几百个脚本逐个跑,一台机器能耗掉半小时以上,而且输出量大到没法读。
正确做法是按服务分组:先看开了哪些端口,只对相关服务跑对应的脚本组。21 端口跑 ftp-,139/445 跑 smb-,80 跑 http-*。这样又快又能读懂。
五、第四步:searchsploit 找现成 EXP
确认漏洞存在之后,下一个问题是「有没有现成的利用代码」。searchsploit 是 Exploit-DB 的命令行客户端,本地就有一份完整的漏洞库副本。
搜索利用代码
text
searchsploit vsftpd
searchsploit samba 3.0
searchsploit openssh 4.7



结果里有两个直接对应的:17491.rb 是 vsftpd 2.3.4 后门的 Metasploit 模块,usermap_script 是 Samba 3.0.20 的 CVE-2007-2447 远程命令执行。
5.1 下载与查看 EXP
下载并查看利用代码
text
searchsploit -m 17491
searchsploit -x exploits/unix/remote/17491.rb
-m 把 EXP 复制到当前目录,-x 直接在终端打开看源码。看源码的意义不是「学会怎么打」,而是搞清楚触发条件------比如 vsftpd 那个需要用户名含「😃」,Samba 那个需要特定的用户名格式,这些细节决定了后续能不能成功。
openssh 4.7 搜出来是空的。这个结果本身也是情报:说明这个版本没有公开的可用 EXP。前面查到它「无重大 RCE」,两者互相印证。
六、第五步:整理漏洞清单
所有信息汇到一起,按 CVSS 分数排序,形成一份可直接执行的清单。
| # | 服务/端口 | 漏洞 | CVE | CVSS | 等级 | 有 EXP |
|---|---|---|---|---|---|---|
| 1 | vsftpd 2.3.4 / 21 | 源码植入后门,可获 root shell | CVE-2011-2523 | 9.8 | 严重 | 有 |
| 2 | Samba 3.0.20 / 139,445 | usermap_script 远程命令执行 | CVE-2007-2447 | 9.3 | 严重 | 有 |
| 3 | bindshell / 1524 | 直接暴露 root shell | --- | 9.0 | 严重 | 无需 |
| 4 | MySQL 5.0.51a / 3306 | root 空口令 | --- | 8.5 | 严重 | 无需 |
| 5 | Apache 2.2.8 / 80 | 多类 DoS 与信息泄露 | 多个 | 7.5 | 高 | 有 |
| 6 | UnrealIRCd 3.2.8.1 | 后门命令执行 | CVE-2010-2075 | 7.5 | 高 | 有 |
| 7 | DistCC / 3632 | 未授权远程命令执行 | CVE-2004-2687 | 7.1 | 高 | 有 |
| 8 | OpenSSH 4.7p1 / 22 | 算法过时,无重大 RCE | --- | 4.3 | 中 | 无 |

8 条里 5 条严重。这个比例在 Metasploitable2 上很正常------它本身就是故意做旧的教学靶机。但清单的结构值得记住:编号、位置、漏洞、编号、分数、等级、有无 EXP,七列足够支撑后续的利用决策。
6.1 CVSS 分级标准
| 分数区间 | 等级 | 含义 |
|---|---|---|
| 9.0 -- 10.0 | 严重 Critical | 远程可直接拿到最高权限,或造成大范围影响 |
| 7.0 -- 8.9 | 高 High | 远程可利用,但可能需要特定条件 |
| 4.0 -- 6.9 | 中 Medium | 需要本地权限或特定前置条件 |
| 0.1 -- 3.9 | 低 Low | 影响有限,通常是信息泄露 |
七、踩坑记录
| 现象 | 原因 | 解决办法 |
|---|---|---|
| searchsploit openssh 4.7 无结果 | 该版本无公开 EXP | 缩短关键词只搜 openssh,看整体情况 |
| --script vuln 跑半小时 | 几百个脚本全量执行 | 按服务分组,只跑相关脚本 |
| NSE 脚本报错或超时 | 脚本对目标服务版本不兼容 | 跳过该脚本,用版本+CVE 的方式判断 |
| 版本号对不上 CVE 的影响范围 | 补丁后版本号不变,或发行版自己 backport | 以 NSE 脚本的实际检测结果为准 |
| 清单越整理越乱 | 没有统一的字段结构 | 固定七列:编号/位置/漏洞/CVE/CVSS/等级/EXP |
坑 1:searchsploit 搜不到就以为没洞
searchsploit openssh 4.7 返回空,第一反应是「这个版本很安全」。
实际上「没有公开 EXP」和「没有漏洞」是两件事。OpenSSH 4.7p1 确实没有重大 RCE 的公开利用,但它的加密算法已经过时(不支持现代密钥交换),在实战中会限制后续的横向手段。
所以搜不到的时候,要缩短关键词再搜一遍(openssh 而不是 openssh 4.7),看这个产品的整体漏洞历史,再结合版本判断哪些可能适用。
坑 2:--script vuln 一把梭
看教程说 nmap --script vuln 能一次跑完所有漏洞检测,直接照做,结果跑了半小时还没完,输出几百行根本读不下去。
原因:vuln 类别下有几百个脚本,Nmap 会逐个对每个开放端口跑一遍。8 个端口 × 几百个脚本,组合爆炸。
正确做法是按服务分组。先看端口,21 就跑 ftp-vsftpd-backdoor,139/445 就跑 smb-vuln*,80 就跑 http-vuln*。针对性强、速度快、输出干净。
坑 3:版本号对不上 CVE 的影响范围
查到一个 CVE 说影响 Apache 2.2.x,但靶机是 2.2.8,不确定在不在范围内。
这种情况很常见,原因是:发行版会自己 backport 安全补丁但不动版本号,所以「版本号相同」不等于「漏洞存在」。
判断方法:优先信 NSE 脚本的实测结果,其次看 NVD 的 CPE 匹配(它列出了精确的版本范围),最后才靠版本号猜。三者冲突时,实测优先。
坑 4:清单没有统一结构
第一版漏洞清单是随手记的,一会儿写「21 端口有后门」,一会儿写「CVE-2007-2447 严重」,格式混乱,没法排序也没法交给别人看。
改法:固定七列------编号、服务/端口、漏洞描述、CVE 编号、CVSS 分数、等级、有无 EXP。有了固定结构才能按 CVSS 排序,才能一眼看出先打哪个。
八、小结
-
漏洞初判三步走:圈可疑版本(看年份)→ 查 CVE(确认存在)→ 跑 NSE(实测验证)。
-
查 CVE 抓四样:编号、影响版本范围、漏洞类型、有无公开 EXP。
-
NSE 脚本是「证据」不是「情报」------它验证的是这台机器上确实存在,比查版本可靠。
-
searchsploit 搜不到不等于没洞,只说明没有公开 EXP;缩短关键词重搜看全貌。
-
清单必须结构化:编号/位置/漏洞/CVE/CVSS/等级/EXP,七列固定,才能排序决策。
-
CVSS 9.0 以上是严重,7.0--8.9 是高;但实战中「有无 EXP」往往比分数更能决定先打哪个。
下一篇:Day013 把一周的侦察成果写成一份能交付的渗透测试报告------七段式结构、证据链组织、攻击路径规划。