💻 Nmap 扫描技术与原理详解
一、端口的六种状态(Port States)
Nmap 通过分析对发送探测包的响应来确定端口状态。
| 状态 | 含义 | 探测响应 | 通常原因 |
|---|
| 1. 打开 (Open) | 表示目标端口上有一个服务正在监听。这是渗透测试中最需要关注的状态。 | 目标响应 SYN-ACK (TCP) 或服务响应 (UDP)。 | 端口正在被应用程序使用。 | | 2. 已关闭 (Closed) | 表示指定端口上没有服务监听,但端口可访问。 | 目标响应 RST (TCP) 或 ICMP 端口不可达 (UDP)。 | 端口未被应用程序使用。 | | 3. 已过滤 (Filtered) | Nmap 无法确定端口是开放还是关闭,因为该端口不可访问。 | 无响应 或 目标发送 ICMP 主机/网络/端口不可达 错误。 | 通常是防火墙阻止了探测包到达或阻止了响应返回。 | | 4. 未过滤 (Unfiltered) | Nmap 无法确定端口是打开还是关闭,但端口可访问。 | 目标响应 RST (仅限 TCP ACK 扫描 -sA 或 Window 扫描 -sW)。 | 意味着探测包穿过了防火墙,但无法确定服务状态。 | | 5. 开放|过滤 (Open|Filtered) | Nmap 无法确定端口是 Open 还是 Filtered。 | 无响应 (常见于 UDP 扫描或 IP 协议扫描)。 | 常见于 UDP 扫描或无法收到明确的 RST/SYN-ACK 响应时。 | | 6. 关闭|过滤 (Closed|Filtered) | Nmap 无法判断端口是 Closed 还是 Filtered。 | 仅在使用少数不常见的扫描类型时出现。 | 类似于 `Open |
二、TCP 头部标志位(Flags)详解
TCP 标志位是 Nmap 高级扫描技术(如 Null、FIN、XMAS 扫描)的核心。
| 标志位 | 全称 | 作用 | 补充说明 |
|---|
| URG | Urgent | 紧急指针字段有效。 | 表示数据流中含有紧急数据,需优先处理。 | | ACK | Acknowledge | 确认号字段有效。 | 最常用。用于确认已收到的 TCP 数据段。 | | PSH | Push | 推送功能。 | 要求 TCP 立即将数据传递给应用程序,而不是等待缓冲区满。 | | RST | Reset | 重置连接。 | 立即终止连接。端口关闭、收到非法包或连接错误时发送。 | | SYN | Synchronize | 同步序列号。 | 用于发起 TCP 三次握手的第一步。 | | FIN | Finish | 发送方完成数据发送。 | 用于终止 TCP 连接。 |
三、主机发现(Host Discovery)原理与命令
主机发现(也称 Ping 扫描)是确定目标网络中哪些主机在线的过程。-sn 选项禁用端口扫描,只进行主机发现。
1. 局域网内(Local Network)主机发现
2. 局域网外(External Network)主机发现
| 探测类型 | 选项 | 工作层级 | 典型响应 | 主要用途 |
|---|
| ARP | -PR | 链路层 (L2) | ARP Reply | 局域网内,最可靠。 | | ICMP Ping | -PE | 网络层 (L3) | ICMP Echo Reply | 局域网外,易被过滤。 | | ICMP Timestamp | -PP | 网络层 (L3) | Timestamp Reply | 用于绕过 ICMP Echo 过滤器。 | | TCP SYN Ping | -PS | 传输层 (L4) | SYN-ACK 或 RST | 探测目标是否对 TCP 端口有响应。 | | TCP ACK Ping | -PA | 传输层 (L4) | RST | 探测目标是否对 TCP ACK 有响应,善于绕过防火墙。 |
四、核心扫描技术(Port Scanning Techniques)
| 扫描类型 | 选项 | 标志位 | 工作原理 | 端口状态判断 |
|---|
| TCP Connect 扫描 | -sT | SYN | Nmap 完成完整三次握手。 | Open → SYN-ACK
→
\to
→ ACK; Closed → RST
→
\to
→ N/A | | TCP SYN 扫描 | -sS | SYN | 发送 SYN,收到 SYN-ACK 后立即发送 RST 中断连接(不完成握手)。 | Open → SYN-ACK
→
\to
→ RST; Closed → RST
→
\to
→ N/A | | UDP 扫描 | -sU | N/A | 发送 UDP 报文。 | Closed
→
\to
→ ICMP Port Unreachable; Open|Filtered $KaTeX parse error: Undefined control sequence: \t at position 1: \̲t̲ 无响应 |
1. 隐蔽性扫描(Evasion Scans)
这些扫描利用 TCP 协议的特殊行为来绕过一些简单的防火墙和 IDS。
🔔 注意: 并非所有操作系统(尤其是 Windows)都严格遵守 RFC 793,它们可能会对 Null/FIN/XMAS 扫描的开放端口返回 RST 包,导致隐蔽扫描失败。
2. 防火墙探测扫描
-
TCP ACK 扫描
→
\to
→ -sA
-
标志位:
ACK=1
\text{ACK=1}
ACK=1 (仅设置 ACK 标志)。 -
原理: 发送一个只设置了 ACK 标志的 TCP 包。 -
目标响应:
-
用途: 无法判断端口开放状态,但是判断防火墙是否存在及其状态的最有效方法。 -
窗口扫描
→
\to
→ -sW
-
标志位:
ACK=1
\text{ACK=1}
ACK=1 (类似 ACK 扫描)。 -
原理: 检查返回的 RST 包中的 TCP 窗口大小字段。 -
判断:
-
用途: 在一些老旧或特定系统上,可以通过窗口大小区分 Open/Closed。不适用于有防火墙的环境。
五、高级隐蔽与逃逸技术
| 技术 | 选项 | 作用与原理 | 补充说明 |
|---|
| IP 地址欺骗 | -S <伪造 IP> | 伪造源 IP 地址,将响应引向其他机器。 | 仅在您能截获响应(如位于同一子网或通过 ARP 欺骗)时有效。 | | 诱饵扫描 | -D <诱饵IP1,ME,诱饵IP2,...> | 通过多个伪造 IP 发送扫描包,将真实 IP (ME) 混在其中。 | 增加日志分析难度。目标日志会记录多个 IP 尝试扫描。 | | MAC 地址伪造 | --spoof-mac | 伪造源设备的 MAC 地址。 | 仅在局域网内有效,用于隐藏真实设备身份。 | | 数据包分片 | -f 或 --mtu <大小> | 将 TCP/IP 头部切分为多个小数据包。 | 旨在绕过检查 TCP 头部完整性的简单防火墙或 IDS。 | | 空闲扫描 | -sI | 利用僵尸主机的 IP ID 增量间接扫描目标。 | 极度隐蔽,目标日志记录的是僵尸 IP。需要找到合适的“僵尸”主机(IP ID 增量可预测)。 |
六、常用 Nmap 选项速查表
| 选项 | 类别 | 描述 |
|---|
| -p- | 端口 | 扫描所有 65535 个端口。 | | -F | 端口 | 快速扫描,只扫描 100 个最常用的端口。 | | -r | 端口 | 按顺序扫描端口(不随机)。 | | -O | 侦查 | 尝试进行 操作系统 (OS) 检测。 | | -sV | 侦查 | 尝试进行 服务版本识别(如 Apache 2.4.49)。 | | -Pn | 发现 | 禁用 Ping 扫描,将所有目标视为在线。用于目标过滤 ICMP 时。 | | -t<0-5> | 时序 | 设置扫描时序模板(T0 最慢/隐蔽,T5 最快/响亮)。 | | --max-rate | 时序 | 限制发送速率(数据包/秒)。 | | -v / -vv | 输出 | 增加冗余级别,显示更多详细信息。 | | --reason | 输出 | 显示 Nmap 对特定状态的判断依据。 | | -oX | 输出 | 将结果输出为 XML 格式,方便脚本解析。 |
如果你想要查看更详细的命令请点击https://nmap.org/ 在你的一开始练习中这篇笔记绝对够用,整理了三四天。nmap的功能非常强大,点个赞吧制作不易。 |