模块:Network Enumeration with Nmap(Module 19)
范围:全章 12 小节
定位:在已授权的实验、靶场或渗透测试范围内进行网络发现、端口扫描、服务识别和防护规则验证。
整理原则:以方法、判断逻辑和操作流程为主,不照搬网页原文;实验题不记录答案。
1. 本章主线
Nmap 的价值不只是“列出开放端口”,而是用可解释、可复现的方式逐步缩小攻击面:
确认授权范围
↓
主机发现:哪些地址在线?
↓
端口扫描:哪些 TCP/UDP 入口可达?
↓
服务枚举:端口后面是什么服务与版本?
↓
脚本化验证:服务公开了什么信息,是否存在已知风险?
↓
保存与比较结果
↓
根据网络质量和防护措施调整速度、探针与扫描方式
贯穿全章的关键思想:
- 工具只负责产生信号,真正重要的是理解协议和响应含义。
- 自动化扫描可能因超时、防火墙或服务行为而漏报,必要时必须手工验证。
- filtered、open|filtered 和“没有响应”都不是终点,而是继续分析过滤规则的线索。
- 每次扫描都应保存结果,方便比较、复盘和报告。
2. 首次使用前的环境与工具准备
2.1 使用环境
本章命令面向 Linux 终端,可使用 HTB Pwnbox 或已连接 HTB VPN 的攻击机。
前置条件:
- 只扫描授权目标、网段和端口。
- 确认目标地址、CIDR 范围或目标列表。
- 需要原始数据包权限的扫描使用 sudo,例如 SYN、ACK、UDP 和操作系统检测。
- 需要辨别经过哪块网卡发包时,先确认实验所用接口,例如 eth0 或 VPN 接口 tun0。
- Medium Lab 明确要求 VPN 使用 UDP 协议连接。
- 扫描前确定结果文件前缀,避免后续扫描覆盖已有证据。
2.2 本章工具及使用场景
工具 本章用途 首次使用检查 关键前置条件 nmap 主机发现、端口扫描、服务/系统识别、NSE 脚本 nmap --version、nmap --help 明确目标;部分扫描需要 sudo ncat / nc 手工连接端口并读取服务横幅 查看帮助或版本信息 目标端口可达;必要时指定源端口 tcpdump 同时抓包,观察握手、标志位和服务横幅 确认监听接口 抓包一般需要 sudo xsltproc 将 Nmap XML 结果转换为 HTML 报告 确认命令可运行 已有 -oX 或 -oA 生成的 XML 文件 grep、cut、wc 从扫描输出中提取主机、端口或统计数量 Linux 常用文本工具 理解过滤字段,避免把格式变化误判为扫描结果变化
本章没有给出软件包安装命令,因此这里不额外引入外部安装步骤。Pwnbox 中通常已准备课程所需工具;若本机缺少命令,应按所用发行版的软件源处理。
2.3 Nmap 最小语法
nmap <扫描类型> <选项> <目标>
目标可以是:
单个地址:10.129.2.18
多个地址:10.129.2.18 10.129.2.19 10.129.2.20
连续范围:10.129.2.18-20
CIDR 网段:10.129.2.0/24
文件列表:-iL hosts.lst
2.4 推荐的首次操作流程
# 1. 确认工具
nmap --version
nmap --help
# 2. 只做主机发现,并保存全部格式
sudo nmap 10.129.2.0/24 -sn -oA tnet
# 3. 对在线主机快速查看常用端口
sudo nmap 10.129.2.18 --top-ports=10 -oA top10
# 4. 完整 TCP 端口扫描并识别服务版本
sudo nmap 10.129.2.18 -p- -sV -oA full-tcp
# 5. 对已确认端口做定向脚本或手工验证
sudo nmap 10.129.2.18 -p 25 --script banner,smtp-commands
nc -nv 10.129.2.18 25
每一步都应回答一个明确问题,不要一开始就把所有高流量选项堆在同一条命令中。
3. 小节 1:枚举(Enumeration)
3.1 核心认识
枚举不是机械地运行更多工具,而是尽可能把模糊信息转化为可行动的细节。重点寻找两类信息:
- 能与目标交互、继续获取信息的功能或资源。
- 能引出更关键访问路径的新信息。
3.2 为什么必须手工验证
自动化工具通常设置响应超时。服务响应太慢时,扫描器可能把端口标记为 closed、filtered 或 unknown。其中最危险的是误判为关闭,因为后续流程可能直接忽略该入口。
因此,扫描结果应当被看作“假设”,而不是最终事实。对异常端口、过滤端口和关键服务应结合:
- 不同扫描类型;
- --reason;
- --packet-trace;
- nc / ncat 手工连接;
- tcpdump 抓包。
4. 小节 2:Nmap 简介
4.1 主要使用场景
- 网络安全审计与网络映射;
- 模拟渗透测试;
- 检查防火墙和 IDS 配置;
- 识别在线主机、开放端口、服务和版本;
- 操作系统识别;
- 使用 NSE 与服务交互或进行漏洞评估。
4.2 Nmap 的能力结构
Host Discovery 主机发现
Port Scanning 端口扫描
Service Detection 服务与版本识别
OS Detection 操作系统识别
NSE 脚本化服务交互
4.3 TCP SYN 扫描的判断逻辑
-sS 只发送 SYN,不完成完整三次握手,因此也称半开放扫描。
目标响应 Nmap 判断 含义 SYN-ACK open 端口接受建立连接 RST closed 主机可达,但端口关闭 无响应或过滤错误 filtered 无法确认端口状态,常见于防火墙丢包
示例:
sudo nmap -sS localhost
使用条件与注意事项:
- 创建原始 TCP 数据包需要相应权限,因此通常使用 sudo。
- 高级 IDS/IPS 仍能识别 SYN 扫描,不能把“未完成握手”等同于“不可检测”。
5. 小节 3:主机发现
5.1 扫描网段
sudo nmap 10.129.2.0/24 -sn -oA tnet
- -sn:只发现主机,不进行端口扫描。
- -oA tnet:以 tnet 为前缀保存全部三种结果格式。
课程用下面的文本管道只提取在线主机地址:
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5
5.2 从目标列表读取
hosts.lst 每行放一个目标:
10. 129.2.4
10. 129.2.10
10. 129.2.11
sudo nmap -sn -oA tnet -iL hosts.lst
5.3 多个地址、连续范围和单个地址
# 多个地址
sudo nmap -sn -oA tnet 10.129.2.18 10.129.2.19 10.129.2.20
# 连续地址范围
sudo nmap -sn -oA tnet 10.129.2.18-20
# 单个主机
sudo nmap 10.129.2.18 -sn -oA host
5.4 ARP 与 ICMP 的区别
在本地二层网络上,即使指定 -PE,Nmap 也可能先通过 ARP 请求确认主机在线。需要用数据包证据判断实际采用了哪种发现方式:
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace
sudo nmap 10.129.2.18 -sn -oA host -PE --reason
强制禁用 ARP ping 后再观察 ICMP:
sudo nmap 10.129.2.18 -sn -oA host -PE --packet-trace --disable-arp-ping
判断要点:
- --packet-trace 显示实际发送和接收的数据包。
- --reason 解释 Nmap 为什么把主机或端口判为当前状态。
- 没有 ICMP 响应不等于主机离线,可能只是防火墙忽略了探测。
6. 小节 4:主机与端口扫描
6.1 六种端口状态
状态 解释 open 已确认目标端口可以建立 TCP、UDP 或 SCTP 通信 closed 端口可达但未监听;TCP 常返回 RST filtered 无法确认开放或关闭,常见于丢包或过滤错误 unfiltered ACK 扫描确认端口可达,但不能判断开放/关闭 open|filtered 无响应,既可能开放,也可能被过滤;UDP 中常见 closed|filtered 空闲扫描无法区分关闭和过滤
6.2 端口范围选择
# 指定端口
sudo nmap <target> -p 22,25,80,139,445
# 端口范围
sudo nmap <target> -p 22-445
# 最常用的 10 个端口
sudo nmap <target> --top-ports=10
# 所有 TCP 端口
sudo nmap <target> -p-
# 快速扫描常用 100 个端口
sudo nmap <target> -F
默认行为:以 root 身份运行时通常采用 SYN 扫描;没有原始套接字权限时会退回 TCP Connect 扫描。
6.3 用数据包跟踪解释结果
sudo nmap 10.129.2.28 -p 21 --packet-trace -Pn -n --disable-arp-ping
- -Pn:跳过主机发现,按目标在线处理。
- -n:禁用 DNS 解析,减少额外请求。
- --disable-arp-ping:禁用 ARP 主机发现。
- --packet-trace:显示探针和响应。
如果收到 RA(RST + ACK),说明主机可达但端口关闭。没有响应时要结合重试次数、耗时和防火墙行为判断。
6.4 TCP Connect 扫描
sudo nmap 10.129.2.28 -p 443 -sT -Pn -n --disable-arp-ping --packet-trace --reason
特点:
- 完成完整 TCP 三次握手,状态判断准确;
- 行为类似普通客户端,对服务较“规整”;
- 容易写入系统日志,也更容易被 IDS/IPS 发现。
适合强调准确性、且不以隐蔽性为首要目标的场景。
6.5 防火墙丢弃与拒绝
- 丢弃:没有响应,Nmap 会等待并重试,扫描明显变慢。
- 拒绝:目标返回 RST 或 ICMP 不可达错误,通常能更快形成判断。
sudo nmap 10.129.2.28 -p 139 -Pn -n --disable-arp-ping --packet-trace
sudo nmap 10.129.2.28 -p 445 -Pn -n --disable-arp-ping --packet-trace
6.6 UDP 扫描
# 常用 100 个 UDP 端口
sudo nmap 10.129.2.28 -F -sU
# 定向验证 UDP 137
sudo nmap 10.129.2.28 -sU -Pn -n --disable-arp-ping \
--packet-trace -p 137 --reason
UDP 无连接、无握手,空数据报经常得不到响应,因此通常比 TCP 扫描慢。
响应 常见判断 应用返回 UDP 数据 open ICMP type 3 / code 3:端口不可达 closed 无响应或其他过滤错误 open|filtered
6.7 服务版本扫描
sudo nmap 10.129.2.28 -p 445 -sV -Pn -n --disable-arp-ping \
--packet-trace --reason
-sV 会主动探测服务、匹配响应签名,从而识别服务名、版本及部分主机信息;代价是产生更多交互并增加扫描时间。
7. 小节 5:保存结果
7.1 三种输出格式
选项 扩展名 用途 -oN .nmap 人工阅读的标准输出 -oG .gnmap 便于 grep 等文本工具处理 -oX .xml 机器处理、转换和报告生成 -oA 三种都生成 一次保存完整结果集
sudo nmap 10.129.2.28 -p- -oA target
若不指定完整路径,文件保存在当前工作目录:
target.nmap
target.gnmap
target.xml
7.2 用 xsltproc 生成 HTML
首次使用条件:已经通过 -oX 或 -oA 得到 XML 文件。
xsltproc target.xml -o target.html
验证方法:确认 target.html 已生成,再使用浏览器打开。HTML 更适合向非技术人员展示结构化扫描结果。

8. 小节 6:服务枚举
8.1 推荐顺序
- 先快速扫描,建立开放端口的初步视图。
- 在后台运行 -p- 查找全部 TCP 端口。
- 只对确认开放的端口使用 -sV、NSE 或手工交互。
这种分层方式减少无效流量,也降低被防护系统立即识别和阻断的概率。
8.2 查看扫描进度
sudo nmap 10.129.2.28 -p- -sV
运行中按空格键可显示当前状态。也可以定时输出:
sudo nmap 10.129.2.28 -p- -sV --stats-every=5s
增加详细程度:
sudo nmap 10.129.2.28 -p- -sV -v
- -v / -vv:提高输出详细度;发现开放端口时可更早看到结果。
- --stats-every=5s:每 5 秒显示一次状态。
8.3 横幅抓取与手工验证
Nmap 主要依据横幅和响应签名识别服务,但自动解析可能遗漏信息,服务也可能隐藏或伪造横幅。
使用 tcpdump 观察两台主机之间的流量:
sudo tcpdump -i eth0 host 10.10.14.2 and 10.129.2.28
另开一个终端,用 Netcat 连接 SMTP:
nc -nv 10.129.2.28 25
可能直接看到:
220 inlane ESMTP Postfix (Ubuntu)
观察 TCP 序列:
SYN → SYN-ACK → ACK → PSH-ACK(服务横幅)→ ACK
这说明手工连接和抓包可以补全 Nmap 摘要中未直接显示的信息。
9. 小节 7:Nmap 脚本引擎(NSE)
9.1 使用方式
# 默认脚本
sudo nmap <target> -sC
# 指定脚本类别
sudo nmap <target> --script <category>
# 指定脚本
sudo nmap <target> --script <script-name>,<script-name>
9.2 14 个脚本类别
类别 用途与风险提示 auth 查找身份验证信息 broadcast 广播发现主机 brute 尝试凭据组合,流量和账户风险较高 default -sC 默认脚本 discovery 进一步发现服务信息 dos 检查拒绝服务风险,可能损害服务 exploit 尝试利用已知漏洞 external 借助外部服务处理信息 fuzzer 发送变异数据,耗时且可能影响服务 intrusive 可能对目标产生负面影响 malware 检查恶意软件迹象 safe 相对非侵入的信息收集 version 扩展服务识别 vuln 检查具体漏洞
即使课程展示了这些类别,也应根据授权范围选择;不能把 safe 以外的类别视作默认可执行项。
9.3 定向脚本示例
sudo nmap 10.129.2.28 -p 25 --script banner,smtp-commands
这可以同时获取 SMTP 横幅和服务器支持的命令,用于判断后续应如何与服务交互。
9.4 激进扫描
sudo nmap 10.129.2.28 -p 80 -A
-A 组合了:
- 服务版本检测 -sV;
- 操作系统检测 -O;
- 路由跟踪 --traceroute;
- 默认 NSE 脚本 -sC。
它信息丰富,但流量和可识别特征都更多,适合明确授权、目标范围较小且需要综合画像的场景。
9.5 漏洞类别
sudo nmap 10.129.2.28 -p 80 -sV --script vuln
输出可能包含应用路径、版本、用户线索和已知 CVE。应把这些结果作为“待验证线索”,不要仅凭脚本结果断言目标一定存在可利用漏洞。
10. 小节 8:扫描性能
性能调优是在速度、准确性、带宽占用和可检测性之间做取舍。
10.1 RTT 超时
sudo nmap 10.129.2.0/24 -F \
--initial-rtt-timeout 50ms --max-rtt-timeout 100ms
超时设置过短会显著加快扫描,但可能把慢响应主机漏掉。课程示例中速度提升的同时,在线主机数量从 10 台下降到 8 台。
10.2 最大重试次数
sudo nmap 10.129.2.0/24 -F --max-retries 0
--max-retries 0 不对无响应端口重试,速度更快,但更容易漏报。
10.3 最小发包速率
sudo nmap 10.129.2.0/24 -F -oN tnet.minrate300 --min-rate 300
已知网络带宽、且测试流量被允许或列入白名单时,可以提高最小发包速率。黑盒测试中盲目提高速率可能触发防护或造成丢包。
10.4 定时模板
模板 名称 倾向 -T 0 paranoid 极慢、低频 -T 1 sneaky 慢、低频 -T 2 polite 降低网络负担 -T 3 normal 默认模板 -T 4 aggressive 较快、较明显 -T 5 insane 极快,漏报与触发防护风险更高
sudo nmap 10.129.2.0/24 -F -oN tnet.T5 -T 5
调优时应同时比较:扫描耗时、在线主机数、开放端口数和目标告警情况,而不是只看速度。
11. 小节 9:防火墙与 IDS/IPS 规避
11.1 三类防护的区别
- 防火墙:按规则允许、拒绝或丢弃流量。
- IDS:被动检测可疑模式并产生告警。
- IPS:在检测基础上主动阻断连接或来源。
11.2 用 ACK 扫描分析规则
# SYN 扫描
sudo nmap 10.129.2.28 -p 21,22,25 -sS -Pn -n \
--disable-arp-ping --packet-trace
# ACK 扫描
sudo nmap 10.129.2.28 -p 21,22,25 -sA -Pn -n \
--disable-arp-ping --packet-trace
解释:
- -sS 主要用于判断开放、关闭或过滤。
- -sA 主要用于判断过滤规则;收到 RST 时显示 unfiltered,但不能据此断言端口开放。
- 对同一端口比较两种扫描,可以推断防火墙如何处理 SYN 与 ACK。
11.3 识别 IDS/IPS 的思路
IDS/IPS 往往不会直接返回“这里有防护系统”。本章通过行为变化进行判断:
- 对单一端口进行较明显的探测;
- 观察来源地址是否随后被阻断;
- 若某个来源失去访问能力,而其他测试来源仍可访问,说明可能触发了防护措施。
这类验证只能在明确授权下进行,并应控制流量和影响。
11.4 诱饵扫描
sudo nmap 10.129.2.28 -p 80 -sS -Pn -n \
--disable-arp-ping --packet-trace -D RND:5
-D RND:5 生成 5 个随机诱饵地址,并把真实来源混在其中。
注意事项:
- 诱饵主机需要存活,否则可能触发 SYN Flood 防护,反而影响服务可达性。
- 伪造流量可能被 ISP 或路由设备直接过滤。
- 诱饵可以配合 SYN、ACK、ICMP 和操作系统检测,但不会让扫描天然“不可追踪”。
11.5 指定来源地址与网卡
sudo nmap 10.129.2.28 -n -Pn -p 445 -O \
-S 10.129.2.200 -e tun0
- -S:指定源 IP。
- -e tun0:指定发包接口。
适合验证防火墙是否对不同来源地址或网段使用不同规则。源地址必须与实际路由和实验环境相符,否则返回流量不会到达扫描机。
11.6 DNS 代理与源端口 53
# 普通 SYN 探测
sudo nmap 10.129.2.28 -p 50000 -sS -Pn -n \
--disable-arp-ping --packet-trace
# 从 TCP 源端口 53 发起探测
sudo nmap 10.129.2.28 -p 50000 -sS -Pn -n \
--disable-arp-ping --packet-trace --source-port 53
如果防火墙错误地信任来自源端口 53 的流量,第二次扫描可能把原先 filtered 的端口识别为 open。
用 Ncat 进行手工确认:
ncat -nv --source-port 53 10.129.2.28 50000
课程示例连接后读到了 220 ProFTPd 横幅,证明服务实际可达。
Nmap 还可指定 DNS 服务器:
--dns-server <ns>,<ns>
在 DMZ 等环境中,公司 DNS 服务器可能比互联网来源更受信任,但是否可用仍取决于目标网络的实际规则。
12. 小节 10–12:分级规避实验
12.1 Easy Lab
场景:目标受 IDS/IPS 保护,并提供状态页:
http://<target>/status.php
状态页用于观察告警数量;达到阈值后会被封禁。因此实验重点不是“最快扫完”,而是在尽量低的告警成本下获得指定信息。
建议记录:
- 每条命令及时间;
- 使用的扫描类型、端口和速率;
- 扫描前后的告警数;
- 收到的响应与 --reason;
- 是否出现访问受限。
12.2 Medium Lab
管理员已加严防火墙和 IDS/IPS 配置。额外前置条件:
完成本练习时,VPN 必须使用 UDP 协议。
实验前先确认 VPN 连接方式,再开始探测,避免把连接协议问题误判成端口过滤。
12.3 Hard Lab
管理员经过 IDS/IPS 培训后进一步修改了防护和服务通信方式。重点是重新建立证据,而不是沿用前两关的结论。
推荐实验方法:
- 先用低流量探针建立基线。
- 比较 SYN、ACK 和指定源端口的结果。
- 对关键端口使用 --packet-trace 与 --reason。
- 仅对确认可达的服务使用版本检测或 NSE。
- 用 ncat / nc 手工确认横幅。
- 持续记录告警变化和阻断行为。
13. 常用命令速查
主机发现
sudo nmap <network/CIDR> -sn -oA discovery
sudo nmap -sn -iL hosts.lst -oA discovery-list
sudo nmap <target> -sn -PE --packet-trace --reason
sudo nmap <target> -sn -PE --disable-arp-ping --packet-trace
TCP / UDP 端口扫描
sudo nmap <target> --top-ports=10
sudo nmap <target> -p-
sudo nmap <target> -p 22,80,443 -sS
sudo nmap <target> -p 443 -sT --reason
sudo nmap <target> -F -sU
服务与脚本
sudo nmap <target> -p- -sV --stats-every=5s -v
sudo nmap <target> -p 25 --script banner,smtp-commands
sudo nmap <target> -p 80 -A
sudo nmap <target> -p 80 -sV --script vuln
保存和转换
sudo nmap <target> -p- -oA target
xsltproc target.xml -o target.html
防火墙与过滤规则分析
sudo nmap <target> -p 21,22,25 -sS -Pn -n --packet-trace
sudo nmap <target> -p 21,22,25 -sA -Pn -n --packet-trace
sudo nmap <target> -p 80 -sS -Pn -n -D RND:5
sudo nmap <target> -p 50000 -sS -Pn -n --source-port 53
ncat -nv --source-port 53 <target> 50000
14. 易错点与结果校验
- -Pn 不是“确认主机在线”,而是跳过发现阶段、直接假定在线。
- -sA 的 unfiltered 不代表端口开放,只表示 ACK 探针未被过滤。
- UDP 无响应不能直接判定关闭,常见结果是 open|filtered。
- 本地网段中的主机发现可能由 ARP 完成,即使命令中写了 -PE。
- -T 5、低 RTT、低重试和高 --min-rate 都可能造成漏报或触发防护。
- -A、--script vuln、brute、exploit、dos 和 intrusive 会显著增加交互或风险,只能在授权范围内使用。
- 服务横幅可能被删除、修改或伪造;Nmap 的版本判断也需要手工交叉验证。
- 输出比较时不仅看耗时,还应比较在线主机、开放端口、响应原因和告警变化。
- 不保存结果会失去比较依据;优先用 -oA 保留完整记录。
- 防火墙的“丢弃”和“拒绝”会产生不同的时间与响应特征,应通过数据包和 --reason 区分。
15. 一套可复用的枚举思路
# A. 发现主机
sudo nmap <network/CIDR> -sn -oA 01-discovery
# B. 快速建立端口基线
sudo nmap <target> --top-ports=10 -oA 02-top
# C. 完整 TCP 扫描
sudo nmap <target> -p- -oA 03-full-tcp
# D. 对开放端口做版本识别
sudo nmap <target> -p <open-ports> -sV -oA 04-services
# E. 仅对需要的服务运行定向脚本
sudo nmap <target> -p <ports> --script <scripts> -oA 05-nse
# F. 对矛盾或过滤结果做解释性扫描
sudo nmap <target> -p <ports> -Pn -n --packet-trace --reason
最终应形成四类结论:
- 哪些主机确认在线,依据是什么;
- 哪些端口开放、关闭或被过滤;
- 服务、版本、操作系统和应用线索;
- 哪些结论受超时、网络质量、防火墙或 IDS/IPS 影响,仍需复核。
