自动化工具入门:Nmap与Masscan
为什么要学这两个家伙?
做接口资产发现,不能光靠翻配置文件。你想想看,一个中型企业线上跑的服务器少则几十台,多则上千台。人工一台台去查,累死也查不完。这时候就得请出Nmap和Masscan。
我最早接触Nmap是十年前做渗透测试那会儿。当时师傅扔过来一句话:“你先把公司外网IP段全部扫一遍,开着的端口列出来。” 我愣了半天,然后开始手动telnet…… 嗯,后来被骂了。不过从那以后,我就再也没离开过这两个工具。
简单说,Nmap是全能侦察兵,功能多、扫描细、结果全;Masscan是超高速轰炸机,适合大范围快速探测。两者互补,干活才顺手。
Nmap 核心能力一览
| 能力维度 | 说明 | 我的常用场景 |
|---|---|---|
| 端口扫描 | TCP SYN、TCP Connect、UDP、FIN、Xmas等 | 识别监听端口,判断服务类型 |
| 服务与版本探测 | 发送探针、匹配指纹库 | 确定HTTP、SSH、MySQL等具体版本 |
| 操作系统指纹 | TTL、窗口大小、TCP选项分析 | 区分Linux/Windows,辅助资产归类 |
| 脚本引擎(NSE) | 内置上百个Lua脚本 | 一键检测弱口令、漏洞、接口路径 |
| 输出格式 | 文本、XML、Grepable等 | 方便后续自动化解析入库 |
我个人习惯,每次做资产盘点都先把扫描结果用 -oX 输出为XML,然后写个小脚本转成结构化数据。这样事后回溯、做报表都不费力。
先跑起来:几个实用Nmap命令
别光看文档,直接上手试试。
# 常规TCP SYN扫描(最快,需root权限)
nmap -sS -p 80,443,22,3306,8080 192.168.1.0/24
# 全端口扫描 + 服务版本探测(慢但准)
nmap -sV -p- 192.168.1.10
# 使用NSE脚本批量检测常见Web接口路径
nmap --script http-title,http-enum -p 80,443,8080 192.168.1.0/24
# 输出为XML,方便后续处理
nmap -sV -p 1-65535 -oX scan_result.xml 192.168.1.10
我在项目里踩过一个坑:默认的 -sT(TCP连接扫描)速度慢,而且容易被防火墙记录。生产环境强烈建议用 -sS SYN扫描,前提你得有root权限。如果没有,可以加 --privileged 或使用sudo。
Masscan:速度怪兽
为什么还需要Masscan?一句话:快得离谱。Nmap扫一个C类段(256个IP)的全端口,可能要半小时。Masscan理论上能在几分钟内扫完整互联网。
我参与过一个应急项目,客户要求一小时内摸清内部所有开放端口。我用Masscan配了10000 packets/s的速度,跑了20分钟,就把整个A类段摸了个底。Nmap?估计得三天。
| 对比项 | Nmap | Masscan |
|---|---|---|
| 设计目标 | 全面、精准 | 极速、大范围 |
| 扫描速率 | 默认较低,可控 | 可达到数百万pkt/s |
| 指纹能力 | 强(版本+OS) | 弱(仅端口状态) |
| 脚本扩展 | 丰富NSE | 无 |
| 典型用法 | 精细侦查 | 海量快速探测 |
注意:Masscan发包速度快到可能触发网络设备告警,甚至导致网口丢包。我建议你在实验环境先测网卡极限:用 --rate 1000 起步,逐步增加,同时观察本机CPU和网络占用。另外,务必在授权范围内使用,别把自己扫进法律纠纷里。
Masscan基础操作
# 扫描单个C类段所有TCP端口,速率5000pkt/s
masscan 192.168.1.0/24 -p0-65535 --rate=5000
# 只扫常见Web端口,输出到文件
masscan 192.168.1.0/24 -p80,443,8080,8443 --rate=2000 -oJ masscan_result.json
# 从文件读IP列表(每行一个)
masscan -iL ip_list.txt -p22,3306,3389 --rate=3000
Masscan默认输出为二进制格式,用 -oL 可以导出可读列表,-oJ 输出JSON,-oB 输出二进制(后续用 masscan --readscan 重读)。
我记得有一次,客户给了个100个C类段的IP范围。我用Masscan花了不到5分钟扫完开启了哪些端口,然后把结果喂给Nmap做精细化服务识别。这套组合拳,效率翻倍。
两者如何配合?一张图说明
下面这张图是我自己的经验总结:先用Masscan“大网捞鱼”,发现有响应的IP和端口;再用Nmap“精准垂钓”,取回服务版本和指纹信息。
避坑指南
- 速率控制:我曾经在10M带宽的专线上用
--rate 20000扫外网,结果自己先掉线了——被防火墙误判为DoS攻击。建议内网用5000-10000,外网用1000-3000。 - 防火墙与IDS:Nmap的
-sS通过半连接隐蔽性不错,但依然可能被snort检测到。Masscan直接发裸SYN包,低调不了。 - 状态判断:Masscan只告诉你端口是open或filtered。遇到filtered的状态,别急着放弃,可能是防火墙拦截。换Nmap的
-sA或-sW二次确认。 - 结果去重:我习惯把Masscan的输出按IP+端口排序,然后和Nmap的结果做merge。自己写个Python脚本用集合搞定。
总结一下我的套路
- 先拿Masscan把目标IP段所有端口扫一遍——用
--rate 5000,输出JSON。 - 解析JSON,提取所有开放端口,生成“待扫描列表”。
- 把列表传给Nmap,加上
-sV -sC(版本+默认脚本),输出XML。 - 最后用工具(比如nmap-parse-output或自写脚本)转成CSV,入库。
这套流程我在三个大型项目里验证过,从几千IP的资产到跨机房网段都扛得住。工具终归是工具,关键还是看你怎么组合。下回你遇到海量接口扫描任务,试试先把Masscan调教好,剩下的事Nmap帮你搞定。