nmap收集网站漏洞
用nmap扫漏洞,收集本质上不是网站nmap在找漏洞,而是漏洞它帮你把门牌号、窗户位置、收集甚至哪扇窗没关严实全列出来。网站真正判断能不能翻进去,漏洞靠的收集是后面接的那些脚本。很多人把nmap当扫描器用,网站扫完端口就完事,漏洞这跟拿着望远镜看了一圈小区却从不推门试试锁一样,收集漏掉了最核心的网站部分。
Nmap的漏洞NSE(Nmap Scripting Engine)才是收集网站漏洞的主力。默认安装下自带几百个脚本,收集放在/usr/share/nmap/scripts/目录里。网站跟Web漏洞相关的漏洞集中在http-*系列。比如http-enum,它不光是扫目录,还会根据返回的响应码、页面标题、甚至favicon的哈希去匹配已知应用的指纹。我上次拿它扫一个测试站,直接返回了/admin/login.php和/backup.zip,后者下载下来是整站源码。这不是nmap有多神,是运维把备份文件扔在web根目录下,脚本只是替你发了个GET请求。
http-vuln-*系列脚本更直接。http-vuln-cve2017-5638对应Struts2的远程代码执行,脚本会构造一个恶意的Content-Type头,看服务器是否返回异常。http-vuln-cve2014-3704是Drupal的SQL注入,它通过特定的请求参数去触发报错。这些脚本的检测逻辑其实很粗糙——发一个包,看回应。误报率不低,但胜在快。你拿它扫一个B段,几分钟就能筛出可能有问题的目标,再手工验证。
真正有意思的是http-wordpress-enum和http-joomla-brute这类针对特定CMS的脚本。它们会枚举插件版本、主题文件、甚至尝试弱口令。我见过一个WordPress站,xmlrpc.php没关,http-wordpress-enum直接列出了wp-content/plugins/下的所有目录,其中有个revslider插件,版本号对应一个已知的任意文件下载漏洞。整个过程nmap只发了不到二十个请求。你说这是漏洞收集还是信息泄露?边界很模糊。
用nmap收集网站漏洞有个前提:你得知道目标开了什么服务。直接nmap -sV -p 80,443 target.com只能告诉你跑的是nginx还是apache。要触发NSE脚本,得加--script参数。比如:
nmap -sV -p 80,443 --script "http-vuln-* and not http-vuln-cve2010-0738" target.com 那个not排除是因为cve2010-0738是JBoss的,跟Web服务器不沾边。NSE的脚本选择支持逻辑表达式,这点比很多商业扫描器都灵活。但别指望它像Acunetix那样爬遍整个站。nmap的http爬虫(http-spider)很弱,它只抓页面里的链接,不解析JavaScript,也不提交表单。所以对于SPA或者需要登录才能访问的功能,nmap基本瞎。
我自己的做法是分两步。先用nmap做资产发现和已知CVE的快速匹配:
nmap -p 80,443,8080,8443 --script "http-title,http-headers,http-enum,http-vuln-*" -oX scan.xml target.com 然后拿scan.xml里的结果去喂给Burp Suite或者ffuf做深度爬取和模糊测试。nmap负责广度,Burp负责深度。别颠倒过来。有人拿nmap去跑http-brute猜目录,那效率低得让人想砸键盘——nmap的字典就那几十个词,还不如用dirsearch。
还有一点:nmap的http脚本默认不跟随重定向。如果目标把http跳转到https,你得手动加--script-args http-follow-redirects=1。这个坑我踩过。扫一个站,http-enum返回空,以为没目录,后来发现是301跳走了。加上参数后,/api/v1/、/swagger-ui.html全出来了。Swagger UI没鉴权,直接能调接口。这算漏洞吗?算,但nmap只是告诉你它存在,能不能利用得看你自己。
最后说个真实的翻车案例。有次我用http-shellshock扫一批服务器,脚本返回“VULNERABLE”,我兴冲冲去手工验证,结果发现是CDN节点返回了伪造的响应头。nmap的脚本判断逻辑是匹配响应里的特定字符串,CDN缓存了那个字符串,导致误报。所以nmap扫出来的漏洞,永远要手工确认。它是个指南针,不是挖掘机。









