游客发表
直接说命令:nmap -p- <目标>。扫描这一条就能扫全部 65535 个端口。端口默认情况下 nmap 只扫最常见的命令 1000 个端口,很多人以为扫完了,扫描其实漏了一大半。端口加 -p- 才是命令真的全量。
我最早用 nmap 的扫描时候踩过坑。当时扫一台内网服务器,端口结果只出来 22、命令80、扫描443 三个端口,端口我以为机器很干净。命令后来同事让我加 -p- 再跑一遍,扫描冒出来一个 6379 的端口 Redis,还没设密码。命令那之后我就养成了习惯——不确定的时候,直接全端口扫。
全端口扫描最大的问题是慢。65535 个端口,默认的 SYN 扫描在局域网里可能几分钟,扫公网 IP 可能要半小时甚至更久。原因在于 nmap 默认会做主机发现、端口状态判断、有时候还带版本探测,每一步都花时间。
想快一点,几个参数可以组合:
nmap -p- -T4 <目标>
-T4 是时间模板,从 0 到 5,数字越大越快,但太快会丢包或者被目标防火墙拉黑。T4 是比较稳妥的加速档,T5 适合内网自己玩,公网上用 T5 经常误报。
再狠一点可以加 --min-rate:
nmap -p- --min-rate 5000 <目标>
这意思是每秒至少发 5000 个包。实测在带宽够的情况下,扫一个 C 段全端口能压到几十秒。但代价是准确性下降,网络抖动时有些开放端口会被漏掉。
上面说的都是 TCP 端口。-p- 只覆盖 TCP。UDP 端口得单独扫:
nmap -sU -p- <目标>
UDP 扫描慢得多,而且结果不如 TCP 可靠。很多 UDP 服务不回应空包,nmap 只能标成 open|filtered,你没法确定到底是开着还是被过滤了。实际工作中,UDP 全端口扫描一般只在内网做,公网上扫 UDP 基本是自找麻烦。
全端口扫完,终端里刷屏几千行,眼睛看不过来。用 -oN 或者 -oX 把结果存下来:
nmap -p- -T4 -oX result.xml <目标>
XML 格式方便后续用脚本解析。我一般会再配合 grep 过滤出 open 状态的端口:
grep "port protocol" result.xml | grep "open"
这样一眼就能看到哪些端口真的开着,不用在几千行 closed 里面翻。
防火墙和 IDS 会记录你的扫描行为。公网上扫全端口,大概率几分钟内你的 IP 就被封了。做授权测试之前确认好范围,别扫着扫着扫到别人的网段去了。
另外 -p- 等价于 -p 1-65535,写哪个都行。有人喜欢写全,觉得直观;有人喜欢 -p-,少打几个字。看个人习惯。
还有一点,nmap 扫全端口不代表能发现所有服务。有些服务只监听在特定 IP 上,或者用了端口敲门(port knocking),你不先发特定的包,端口看起来就是关的。这种情况 nmap 也没辙,得靠其他信息收集手段配合。
最后给个我常用的完整命令:
nmap -p- -T4 --min-rate 2000 -sV -oX scan.xml <目标>
-sV 是版本探测,会拖慢速度,但能告诉你端口上跑的是什么服务、什么版本。扫内网资产的时候这个信息很值钱。扫公网大范围的话,建议先不加 -sV,等确定开放端口之后再针对性地探测版本。
友情链接