|
端口扫描是漏洞漏洞扫描里最基础的一环。Nmap 这类工具往目标 IP 发一串 TCP SYN 包,扫描看哪些端口回了 SYN-ACK,般采哪些直接 RST,技术哪些石沉大海。漏洞开放端口列表一出来,扫描扫描器就知道该往哪儿使劲了。般采我见过一台对外服务器,技术运维以为只开了 80 和 443,漏洞结果 Nmap 一扫,扫描8080 上跑着个没设密码的般采 Tomcat 管理后台。这种事儿不新鲜,技术端口扫描的漏洞价值就在这儿——它不判断漏洞,但它告诉你攻击面有多大。扫描 版本识别比端口扫描更进一步。般采同样是 22 端口,OpenSSH 7.4 和 9.3 面临的风险完全不同。扫描器会连上去抓 banner,或者发特定探测包比对响应指纹,判断服务类型和版本号。这活儿有时候挺糙的,banner 可以伪造,指纹库也可能过时。但多数场景下够用。去年有个客户坚持说他们的 Redis 是 6.x 版本,扫描器识别出来是 3.2,登上去一查,还真是 3.2——他们看错了另一台机器的版本。 真正让扫描器有“漏洞”可报的,是插件匹配机制。Nessus 的插件库有十几万个脚本,每个脚本针对一个或一类 CVE。扫描器先做端口和版本识别,然后根据结果决定调哪些插件。比如识别到 Apache 2.4.49,就触发 CVE-2021-41773 路径穿越的检测插件,发一个特制请求看能不能读到 /etc/passwd。这种基于插件的架构好处是扩展性强,坏处是误报率不低。我统计过某次内网扫描结果,Nessus 报的 47 个高危漏洞里,真正能复现的只有 19 个。剩下的要么是版本号误判,要么是补丁已打但指纹没更新。 Web 漏洞扫描走的是另一条路。AWVS、Burp Suite 这类工具不靠端口和版本,它们爬站、抓表单、分析参数,然后往每个输入点灌 payload。SQL 注入测单引号报不报错,XSS 测 <script>alert(1)</script> 反不反射,文件包含测 ../../etc/passwd 能不能读出来。这种方式更贴近真实攻击路径,但也更依赖爬虫的覆盖率和 payload 的质量。一个需要登录才能访问的页面,爬虫进不去,扫描器就瞎了。 配置核查是容易被忽略的一块。很多漏洞不是代码写错了,是配错了。比如 Tomcat 开了 PUT 方法、Nginx 配了目录列表、MySQL 允许 root 远程空密码登录。这类问题端口扫描和版本识别都发现不了,得靠专门的配置审计脚本去连、去读、去比对基线。CIS Benchmark 就是干这个的,它列了几百条配置项,逐条检查。我个人的经验是,配置类漏洞在内网里比软件漏洞更常见,修起来也更快——改个配置文件重启服务的事儿。 还有一类技术是模糊测试。AFL、Boofuzz 这些工具往目标程序喂大量变异数据,看它崩不崩。崩了就可能存在内存破坏漏洞。这种方式不需要知道目标是什么版本、跑了什么服务,纯靠输入输出反馈来挖洞。缺点是慢,而且对网络服务不太友好——很多崩溃在远程根本触发不了。但在工控和嵌入式领域,模糊测试仍然是发现未知漏洞的主力手段。 这些技术不是互斥的,实际扫描器往往是组合拳。先端口扫描缩小范围,再版本识别确定目标,然后插件匹配查已知漏洞,配置核查补漏,Web 扫描覆盖应用层。每一层都有盲区,叠在一起也不能保证全覆盖。扫描报告出来之后,人工验证这一步省不掉。 |