4. 边界的眼睛:端口扫描、服务识别与指纹识别
边界渗透的第一步是什么?说白了就是信息收集。而端口扫描、服务识别、指纹识别,就是信息收集的三板斧。我个人习惯把这三件事揉在一起做,但心里得清楚每一步到底在干什么。曾经有个项目,我图省事直接拿默认的nmap全端口扫描,结果被对方WAF把整个源IP封了24小时——嗯,从那以后我再也不敢不看场景就乱扫了。
4.1 端口扫描 —— 快与准的权衡
端口扫描的核心就两个指标:速度和准确率。你想快速发现段开放端口,用masscan或zmap;你想对具体主机做精细化探测,还得靠nmap。
| 工具 | 速度 | 准确率 | 适用场景 |
|---|---|---|---|
| masscan | 极快(10万包/秒) | 中 | 大规模网段快速发现 |
| nmap | 较慢 | 极高 | 单机或小范围精确探测 |
| unicornscan | 较快 | 中高 | 自定义扫描策略 |
| zmap | 极快 | 低(仅TCP SYN) | 全互联网扫描 |
masscan -p1-65535 --rate=10000 -oG masscan.gnmap 192.168.1.0/24,拿到开放端口列表后,再用nmap做深入探测。这样既快又不浪费nmap的精细能力。
4.2 服务识别 —— 不仅仅是端口号
你想想看,一台服务器把22端口藏着,却在80端口跑着SSH,你只扫端口号能发现什么?所以服务识别必须做协议指纹。nmap的-sV选项会向每个开放端口发送若干探测报文,然后匹配内置的签名库。
我遇到过最典型的例子:客户说他们边界设备上只开了53端口做DNS,结果我用nmap -sV -p 53一抓,返回的是ISC BIND 9.11.0。后来内部巡检发现,有人把SSH挂到了53端口上——DNS服务器默认响应,但协议指纹直接暴露了。
nmap-service-probes,你可以自己添加特定应用的签名。比如我曾在项目里加过某个工业控制设备的私有协议,效果很好。
4.3 指纹识别 —— 操作系统与中间件的烙印
操作系统指纹(OS Fingerprinting)利用的是网络协议栈的细微差异。比如TTL初始值、窗口大小、TCP选项的顺序。nmap的-O选项就是干这个的。但注意,很多NAT设备和代理会篡改这些参数,导致误判。
中间件指纹更实用。比如你想知道目标Web服务器是Apache还是Nginx,随便发个HTTP请求看看Server头就行——但真实场景中很多管理员会隐藏Server头。这时就得用工具如whatweb或wappalyzer,它们会尝试多种检测手段:cookies、HTML注释、响应格式等。
# 一个典型的OS + 服务 + 脚本扫描命令
nmap -sS -sV -O -T4 --script=http-title,ssl-enum-ciphers -p 80,443,22 192.168.1.100
4.4 实战流程与组合技巧
我自己的标准流程是三步走:
- 快速开火:masscan全端口扫描,输出grepable格式
- 精准点名:用nmap对开放端口做-service, -O, -sC(默认脚本)
- 深挖细节:根据服务类型,手动调用特定nse脚本或第三方工具(如
sslscan、nikto)
另外,隐蔽性也值得注意。部署在公网上的扫描容易被WAF识别,我习惯在nmap里加--data-length 100 --spoof-mac 0随机填充数据包,或者使用--source-port 53伪装成DNS响应。
这张图把本章的知识点串起来了。从端口扫描到服务识别再到指纹识别,最终汇聚成一份完整的目标画像。我建议你在实际项目中,把每一步的结果都记到一个文档里,方便下一步渗透测试使用。
nmap -oA output生成所有格式(.nmap、.gnmap、.xml),后续用searchsploit或vulners脚本自动关联漏洞库。效率翻倍。
说到法律风险,我再啰嗦一句:未经授权扫描目标网络,在多数国家属于非法。我曾经有客户紧急委托做内部渗透,结果扫到合作伙伴的网段,差点引发纠纷。所以扫描前一定确认好授权范围,必要时用白名单IP隔离。