网络扫描与指纹识别:信息收集的“敲门砖”

各位同学,欢迎来到第三章。前面我们聊了漏洞排查的思路和情报收集,但那些大多是“外围战”。真正要动手,你得先知道目标“门朝哪开、墙上有没有洞”。

网络扫描和指纹识别,说白了就是干这个的。我做了这么多年渗透,见过太多人一上来就掏漏洞工具猛打,结果连目标开了几个端口、跑了什么服务都没搞清楚。嗯,这就像蒙着眼拆炸弹——不是不行,是容易把自己炸飞。

这一章,我们聚焦四个核心技能:Nmap 基础使用、端口扫描原理、服务与版本探测、Web 指纹识别。学完这些,你至少能回答三个问题:目标在哪儿?开了什么?跑的是什么?

核心观点:扫描不是“扫得越快越好”,而是“扫得准、扫得全、扫得隐蔽”。我见过不少新手用默认参数扫内网,结果被 IDS 抓个正着——那叫“自投罗网”。

网络扫描与指纹识别知识体系 信息收集核心 Nmap 基础使用 端口扫描原理 服务与版本探测 Web 指纹识别 常用参数 扫描类型 TCP/SYN/UDP 状态判断 -sV 参数 指纹库匹配 WhatWeb Wappalyzer 扫描是渗透的“眼睛”,指纹是“身份证” 先扫后探,再识别,步步为营

3.1 Nmap 基础使用:你的“瑞士军刀”

Nmap 这工具,我估计在座各位都听过。但听过和会用,中间差着十个实战项目。我个人习惯,不管目标多简单,第一件事永远是 Nmap 扫一轮。

先看最基本的用法:

# 基础扫描(默认参数)
nmap 192.168.1.1

# 指定端口范围
nmap -p 1-1000 192.168.1.1

# 扫描常见端口(快速)
nmap --top-ports 100 192.168.1.1

# 扫描整个网段
nmap 192.168.1.0/24

你可能会问:为什么不用图形界面?我告诉你,命令行才是渗透的灵魂。脚本化、批量跑、远程执行,GUI 根本做不到。

我的习惯:每次扫描前,先确认目标是否在线。用 -sn 参数做 Ping 扫描,避免浪费流量。我曾经在红队演练中,因为没做存活检测,对着一个空 IP 段扫了半小时——尴尬不?

3.2 端口扫描原理:别只当“脚本小子”

很多人用 Nmap 只会敲回车,但端口扫描到底怎么工作的?我简单拆一下。

端口扫描的本质,就是向目标端口发送特定数据包,然后根据回应判断端口状态。常见的扫描类型有:

扫描类型 原理简述 优点 缺点
TCP Connect 扫描 (-sT) 完成三次握手 准确、不需要 root 容易被日志记录
SYN 扫描 (-sS) 只发 SYN,收到 SYN/ACK 后发 RST 半连接、速度快、隐蔽 需要 root 权限
UDP 扫描 (-sU) 发 UDP 包,根据 ICMP 不可达判断 发现 UDP 服务 慢、不可靠
FIN/Null/Xmas 扫描 发送异常标志位 绕过部分防火墙 对 Windows 无效

端口状态有六种:open、closed、filtered、unfiltered、open|filtered、closed|filtered。我最关注的是 open 和 filtered——前者是入口,后者可能是 WAF 或防火墙。

避坑指南:我曾经在测试中,目标返回大量 filtered 状态。我以为是端口全关了,结果后来发现是 IDS 做了“端口清洗”——所有未授权端口统一返回 filtered。嗯,差点被误导。遇到大量 filtered,建议换源 IP 或加 --reason 参数看具体原因。

3.3 服务与版本探测:知道“是什么”比“有没有”更重要

端口开了,但跑的是什么服务?Apache 还是 Nginx?版本是 2.4.49 还是 2.4.50?这直接决定了你能不能找到对应的漏洞。

Nmap 的服务探测靠 -sV 参数:

# 服务版本探测
nmap -sV 192.168.1.1

# 激进探测(更准,但更慢)
nmap -sV --version-intensity 9 192.168.1.1

# 结合操作系统识别
nmap -O -sV 192.168.1.1

它的原理是:先连接目标端口,然后发送一系列探针,根据回应匹配内置的指纹库。指纹库在 nmap-service-probes 文件里,有几千条规则。

举个例子,你扫到 80 端口,Nmap 返回:

80/tcp open  http  Apache httpd 2.4.49 ((Unix))

看到 2.4.49 了吗?这个版本有个路径遍历漏洞(CVE-2021-41773)。如果你只扫端口不扫版本,这个漏洞就错过了。

关键点:版本探测不是万能的。有些服务会伪装 banner,或者用自定义协议。我遇到过一台设备,80 端口返回的是“Apache”,但实际是嵌入式 HTTP 服务器——指纹库没收录,Nmap 就误判了。这时候需要手动验证。

3.4 Web 指纹识别:给网站“验明正身”

Nmap 能扫端口和服务,但到了 Web 层面,它就不够细了。你需要专门的 Web 指纹识别工具。

我个人常用的有两款:WhatWeb 和 Wappalyzer。一个命令行,一个浏览器插件,各有千秋。

3.4.1 WhatWeb:命令行里的“老炮儿”

WhatWeb 是 Ruby 写的,指纹库非常全。它能识别 CMS、框架、服务器、JS 库、甚至某些 WAF。

# 基础使用
whatweb https://example.com

# 详细输出
whatweb --verbose https://example.com

# 批量扫描
whatweb --input-file=targets.txt

输出示例:

http://192.168.1.100 [200 OK] Apache[2.4.41], PHP[7.4.3], 
WordPress[5.8.1], jQuery, MetaGenerator[WordPress 5.8.1]

看到没?一条命令,服务器、语言、CMS、版本全出来了。WordPress 5.8.1 有什么洞?你心里应该有数。

我的技巧:WhatWeb 的 -a 3 参数可以开启激进模式,会发送更多探测请求。但注意,激进模式容易被 WAF 拦截。我一般先用默认级别,没结果再上激进。

3.4.2 Wappalyzer:浏览器里的“快枪手”

Wappalyzer 是浏览器扩展,装好后访问网站,它自动在工具栏显示技术栈。适合快速侦察,尤其是你手动浏览目标网站时。

它识别的范围包括:

  • Web 服务器(Nginx、Apache、IIS)
  • 前端框架(React、Vue、Angular)
  • 后端语言(PHP、Python、Java)
  • 分析工具(Google Analytics、Hotjar)
  • CDN 和云服务(Cloudflare、AWS)

但注意,Wappalyzer 依赖浏览器环境,有些隐藏页面或 API 端点它扫不到。而且它只能识别“公开”的技术栈——如果网站用了自定义框架,它就抓瞎了。

避坑指南:我曾经遇到一个目标,Wappalyzer 显示“Nginx 1.18”,但 WhatWeb 却识别出“Apache 2.4.46”。为什么?因为前端是 Nginx 反向代理,后端才是 Apache。只看一个工具,你就会被误导。所以,交叉验证是必须的。

3.5 实战组合拳:从扫描到指纹的完整流程

光说不练假把式。我给你们一个我常用的流程:

  1. 存活探测:nmap -sn 192.168.1.0/24,找出在线主机。
  2. 端口扫描:nmap -sS -p- 192.168.1.100,全端口扫描(慢,但全)。
  3. 服务版本:nmap -sV -p 80,443,22,3306 192.168.1.100,只扫开放端口。
  4. Web 指纹:whatweb https://192.168.1.100,识别 Web 技术栈。
  5. 手动验证:浏览器打开,配合 Wappalyzer 确认。

这个流程走下来,目标的基本信息就全了。接下来才是漏洞排查的正戏。

总结一句话:扫描和指纹识别不是终点,而是起点。信息越全,后面的漏洞排查越准。别嫌麻烦,磨刀不误砍柴工。