自动化工具入门: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?估计得三天。

对比项NmapMasscan
设计目标全面、精准极速、大范围
扫描速率默认较低,可控可达到数百万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“精准垂钓”,取回服务版本和指纹信息。

Nmap + Masscan 配合流程 目标IP段/范围 Masscan 快速扫描 输出:开放端口 精细化扫描列表 Nmap 服务/版本探测 结构化接口清单 先粗扫,再精扫 避免浪费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脚本用集合搞定。

总结一下我的套路

  1. 先拿Masscan把目标IP段所有端口扫一遍——用 --rate 5000,输出JSON。
  2. 解析JSON,提取所有开放端口,生成“待扫描列表”。
  3. 把列表传给Nmap,加上 -sV -sC(版本+默认脚本),输出XML。
  4. 最后用工具(比如nmap-parse-output或自写脚本)转成CSV,入库。

这套流程我在三个大型项目里验证过,从几千IP的资产到跨机房网段都扛得住。工具终归是工具,关键还是看你怎么组合。下回你遇到海量接口扫描任务,试试先把Masscan调教好,剩下的事Nmap帮你搞定。