Nmap 工具的详细使用教程
Nmap(Network Mapper)是一款开源且功能强大的网络扫描和安全审计工具。它被广泛用于网络发现、端口扫描、操作系统检测、服务版本探测以及漏洞扫描等。
官方链接:
- Nmap 官方网站: https://nmap.org/
- Nmap 官方文档 (英文): https://nmap.org/book/man.html
- Nmap 参考指南 (中文翻译可能存在,但官方以英文为主): 你可以在官方网站上寻找是否有社区翻译的中文文档,或者通过搜索引擎查找。
Nmap 核心功能:
- 主机发现 (Host Discovery): 识别网络上存活的主机。
- 端口扫描 (Port Scanning): 枚举目标主机上开放的 TCP 和 UDP 端口。
- 服务版本探测 (Version Detection): 确定在开放端口上运行的应用程序的名称和版本号。
- 操作系统检测 (OS Detection): 尝试确定目标主机的操作系统类型和版本。
- 脚本扫描 (Scriptable Interaction): 使用 Nmap 脚本引擎 (NSE) 执行各种高级的检测和漏洞扫描任务。
安装 Nmap:
Nmap 支持多种操作系统,包括 Windows, Linux, 和 macOS。
- Linux: 大多数 Linux 发行版的官方仓库都包含 Nmap。你可以使用包管理器进行安装,例如:
- Debian/Ubuntu:
sudo apt update && sudo apt install nmap
- Fedora/RHEL/CentOS:
sudo dnf install nmap
或sudo yum install nmap
- Debian/Ubuntu:
- Windows: 从 Nmap 官方网站下载可执行的安装程序 (.exe) 并按照提示进行安装。
- macOS: 可以通过 Homebrew 安装:
brew install nmap
,或者从官网下载 .dmg 文件安装。
Nmap 基本语法:
Nmap 的基本命令行语法如下:
nmap [扫描类型...] [选项] {目标规范}
目标规范 (Target Specification):
你可以通过多种方式指定扫描目标:
- IP 地址:
nmap 192.168.1.1
- 主机名:
nmap scanme.nmap.org
- IP 地址范围:
- CIDR 表示法:
nmap 192.168.1.0/24
- 连字符表示法:
nmap 192.168.1.1-100
- CIDR 表示法:
- 从文件读取目标列表:
nmap -iL target_list.txt
(每行一个目标) - 随机选择目标:
nmap -iR <数量>
(例如:nmap -iR 10
扫描10个随机主机) - 排除目标:
--exclude <主机1[,主机2][,主机3],...>
或--excludefile <排除文件>
常用扫描类型 (Scan Types):
-sS
(TCP SYN 扫描 / 半开放扫描): 这是最常用且默认的扫描类型(如果用户有足够权限)。它发送 SYN 包,如果收到 SYN/ACK 则表示端口开放,收到 RST 则表示端口关闭。因为它不完成 TCP 连接,所以通常比较隐蔽且快速。需要 root/管理员权限。sudo nmap -sS 192.168.1.1
-sT
(TCP Connect() 扫描): 当 SYN 扫描不可用时(例如,用户没有原始套接字权限),Nmap 会默认使用此类型。它通过完成完整的 TCP 连接来判断端口是否开放。这种方式更容易被检测到。nmap -sT 192.168.1.1
-sU
(UDP 扫描): 扫描 UDP 端口。UDP 扫描通常更慢且更困难,因为 UDP 是无连接协议,开放的端口可能不会响应,而关闭的端口通常会返回 ICMP “port unreachable” 消息。sudo nmap -sU 192.168.1.1
-sA
(TCP ACK 扫描): 用于探测防火墙规则集,判断端口是否被防火墙过滤。它发送 ACK 包,如果收到 RST 则表示端口未被过滤(可能开放或关闭),如果没有收到响应或收到 ICMP 错误则表示端口被过滤。sudo nmap -sA 192.168.1.1
-sW
(TCP Window 扫描): 与 ACK 扫描类似,但在某些系统上可以区分开放端口和关闭端口。-sM
(TCP Maimon 扫描): 一种非常隐蔽的扫描技术,以其发现者 Uriel Maimon 命名。-sN
,-sF
,-sX
(TCP Null, FIN, 和 Xmas 扫描): 这些是非常隐蔽的扫描技术,利用了 TCP RFC 中的一些细微差别。它们向目标端口发送特殊的 TCP 包(不设置 SYN, RST, 或 ACK 位)。如果端口关闭,目标主机会响应一个 RST 包;如果端口开放或被过滤,则不会有响应。这些扫描在非 Windows 系统上效果较好。sudo nmap -sN 192.168.1.1 sudo nmap -sF 192.168.1.1 sudo nmap -sX 192.168.1.1
--scanflags <flags>
(自定义 TCP 扫描): 允许你指定自定义的 TCP 标志位 (URG, ACK, PSH, RST, SYN, FIN)。-sI <僵尸主机[:探测端口]>
(空闲扫描 / Idle Scan): 一种极其隐蔽的扫描技术,它利用一个空闲的“僵尸”主机来间接探测目标。设置起来比较复杂。-b <FTP中继主机>
(FTP bounce 扫描): 利用 FTP 服务器的代理特性进行扫描。现在很少有 FTP 服务器支持这种配置。
常用选项 (Options):
- 端口规范 (Port Specification):
-p <端口范围>
: 指定要扫描的端口。例如:-p 22
(扫描端口 22)-p 1-100
(扫描端口 1 到 100)-p U:53,T:21-25,80
(扫描 UDP 端口 53,TCP 端口 21 到 25 和 80)-p-
(扫描所有 65535 个端口)--top-ports <数量>
(扫描最常见的 N 个端口)
-F
(快速扫描模式): 仅扫描 Nmap 内置服务文件中列出的端口(比--top-ports 100
更少)。
- 服务和版本探测 (Service and Version Detection):
-sV
(版本探测): 尝试确定在开放端口上运行的服务及其版本。nmap -sV 192.168.1.1
--version-intensity <级别>
: 设置版本探测的强度 (0-9,默认为 7)。级别越高,探测越全面但也越慢。--version-light
: 等同于--version-intensity 2
。--version-all
: 等同于--version-intensity 9
。
- 操作系统检测 (OS Detection):
-O
(启用操作系统检测):sudo nmap -O 192.168.1.1
--osscan-limit
: 仅对有希望的主机进行 OS 检测。--osscan-guess
或--fuzzy
: 推测操作系统,即使 Nmap 无法精确确定。
- 时间和性能 (Timing and Performance):
-T<0-5>
(设置时序模板):T0
(paranoid): 非常慢,用于躲避 IDS。T1
(sneaky): 比较慢,用于躲避 IDS。T2
(polite): 降低扫描速度以减少带宽和目标主机资源的消耗。T3
(normal): 默认速度。T4
(aggressive): 假设网络状况良好,速度较快。T5
(insane): 非常快,但可能导致结果不准确或淹没目标网络。
nmap -T4 192.168.1.1
--min-hostgroup <数量>
,--max-hostgroup <数量>
: 并行扫描的主机组大小。--min-parallelism <数量>
,--max-parallelism <数量>
: 并行探测的数量。--min-rtt-timeout <时间>
,--max-rtt-timeout <时间>
,--initial-rtt-timeout <时间>
: 控制探测超时。--max-retries <次数>
: 放弃前重试探测的次数。--host-timeout <时间>
: 扫描单个主机超时时间。--scan-delay <时间>
,--max-scan-delay <时间>
: 控制探测之间的时间间隔。
- 主机发现 (Host Discovery / Ping Sweeping):
-sn
(Ping 扫描 / 禁止端口扫描): 只进行主机发现,不进行端口扫描。nmap -sn 192.168.1.0/24
-Pn
(跳过主机发现 / 将所有主机视为在线): 不进行主机发现,直接对指定目标进行端口扫描。当你确定目标主机在线,但它可能屏蔽了 Ping 请求时很有用。nmap -Pn 192.168.1.1
-PS [端口列表]
(TCP SYN Ping): 发送 SYN 包到指定端口进行主机发现。默认端口 80。-PA [端口列表]
(TCP ACK Ping): 发送 ACK 包到指定端口进行主机发现。默认端口 80。-PU [端口列表]
(UDP Ping): 发送 UDP 包到指定端口进行主机发现。默认端口 40125。-PE
,-PP
,-PM
(ICMP Ping 类型): 分别发送 ICMP Echo Request, Timestamp Request, Address Mask Request。-PR
(ARP Ping): 在本地网络上进行 ARP 扫描。通常比基于 IP 的 Ping 更快更可靠。--dns-servers <服务器1[,服务器2],...>
: 指定用于反向 DNS 解析的 DNS 服务器。-n
(不进行 DNS 解析)。-R
(总是进行 DNS 解析)。
- 输出格式 (Output Formats):
-oN <文件名>
(标准输出): 将结果保存为人类可读的文本文件。-oX <文件名>
(XML 输出): 将结果保存为 XML 格式,方便程序解析。-oS <文件名>
(ScRipTKIdd|3 oUTpuT): 脚本小子格式输出(不推荐)。-oG <文件名>
(Grepable 输出): 将结果保存为易于 grep 等工具处理的格式。-oA <基本文件名>
(输出所有格式): 同时生成标准、XML 和 Grepable 三种格式的输出文件,文件名为<基本文件名>.nmap
,<基本文件名>.xml
,<基本文件名>.gnmap
。nmap -oA scan_results 192.168.1.1
-v
(详细模式): 显示更详细的输出信息。可以使用-vv
获得更详细的信息。-d [级别]
(调试模式): 显示调试信息。级别越高,信息越详细。--reason
: 显示端口处于特定状态的原因。--open
: 只显示开放的端口。--packet-trace
: 显示发送和接收的每个数据包。--iflist
: 显示主机接口和路由信息。
- Nmap 脚本引擎 (NSE - Nmap Scripting Engine):
-sC
或--script=default
: 执行默认类别的脚本。这些脚本通常被认为是安全且有用的。nmap -sC 192.168.1.1
--script <脚本名|类别|目录|表达式>
: 执行指定的脚本、类别中的脚本、目录下的所有脚本或匹配表达式的脚本。- 按名称:
--script=http-title
- 按类别:
--script=vuln
(扫描漏洞) - 按目录:
--script=./my-custom-scripts/
- 使用通配符:
--script "http-*"
- 按名称:
--script-args <参数名1=值1,参数名2=值2,...>
: 为 NSE 脚本提供参数。--script-help <脚本名|类别|目录|表达式>
: 显示脚本的帮助信息。--script-updatedb
: 更新 NSE 脚本数据库。
- 防火墙/IDS 规避和欺骗 (Firewall/IDS Evasion and Spoofing):
-f
(分片数据包): 将 TCP 头部拆分成更小的数据包,可能绕过一些简单的包过滤器。--mtu <值>
: 设置自定义的 MTU。-D <诱饵1,诱饵2,ME,...>
(使用诱饵进行扫描): 使扫描看起来像是从多个 IP 地址发起的,其中ME
代表你自己的真实 IP 地址。
(RND:10 表示随机生成10个诱饵IP)sudo nmap -D RND:10,192.168.1.101,ME 192.168.1.1
-S <源IP地址>
(源地址欺骗): 欺骗源 IP 地址。通常只有在你能看到响应的情况下才有用。-e <接口>
(指定网络接口)。--source-port <端口号>
或-g <端口号>
(源端口欺骗)。--data-length <数值>
(在发送的包中附加随机数据)。--proxies <代理URL列表>
: 通过 HTTP/SOCKS4 代理进行扫描。
- 其他选项:
-6
(启用 IPv6 扫描)。-A
(启用 OS 检测、版本探测、脚本扫描和 Traceroute): 这是一个方便的聚合选项,等同于-O -sV -sC --traceroute
。sudo nmap -A 192.168.1.1
--traceroute
: 跟踪到目标主机的路径。
Nmap 扫描示例:
-
快速扫描单个主机,识别最常见的开放端口:
nmap -F 192.168.1.1
-
对整个子网进行 Ping 扫描,找出存活主机:
nmap -sn 192.168.1.0/24
-
对目标主机进行详细扫描,包括 TCP SYN 扫描所有端口、操作系统检测、服务版本探测,并执行默认脚本,将结果保存到所有格式:
sudo nmap -sS -p- -O -sV -sC -oA detailed_scan_results 192.168.1.1
(注意:
-p-
扫描所有端口会非常耗时) -
扫描特定 TCP 端口 (例如 80, 443) 和 UDP 端口 (例如 53),并进行版本探测:
sudo nmap -sS -sU -p T:80,443,U:53 -sV 192.168.1.1
-
使用
vuln
类别的 NSE 脚本扫描目标主机上的已知漏洞:sudo nmap --script vuln 192.168.1.1
-
扫描一个网站,尝试获取 HTTP 头部信息和网站标题:
nmap -sV --script=http-headers,http-title scanme.nmap.org
-
在本地网络中进行 ARP 扫描以快速发现主机:
sudo nmap -PR 192.168.1.0/24
-
隐蔽扫描,使用 TCP Null 扫描,设置较慢的时序模板,并使用诱饵:
sudo nmap -sN -T1 -D RND:5,ME 192.168.1.1
理解 Nmap 输出:
Nmap 的输出通常包含以下信息:
- Starting Nmap …: Nmap 开始扫描的时间和版本信息。
- Nmap scan report for <目标IP/主机名>: 目标的信息。
- Host is up (<延迟>s latency). (如果进行了主机发现且主机在线)
- Not shown: XXX closed ports / XXX filtered ports: 未显示的关闭或被过滤的端口数量。
- PORT STATE SERVICE VERSION:
- PORT: 端口号和协议 (例如
22/tcp
)。 - STATE: 端口的状态:
open
: 端口开放,应用程序正在监听连接。closed
: 端口关闭,没有应用程序在监听。但主机可达。filtered
: Nmap 无法确定端口是开放还是关闭,因为防火墙或其他网络设备阻止了探测。unfiltered
: 端口可访问,但 Nmap 无法确定其是开放还是关闭 (通常见于 ACK 扫描)。open|filtered
: Nmap 无法区分端口是开放还是被过滤 (例如,某些 UDP 扫描的结果)。closed|filtered
: Nmap 无法区分端口是关闭还是被过滤。
- SERVICE: Nmap 根据端口号猜测的服务名称 (例如
ssh
)。 - VERSION: (如果使用了
-sV
) 在该端口上运行的服务的详细版本信息。
- PORT: 端口号和协议 (例如
- OS CPE: (如果使用了
-O
) 操作系统的通用平台枚举 (CPE) 标识符。 - OS details: (如果使用了
-O
) Nmap 对操作系统的猜测。 - TRACEROUTE (using <协议> to port <端口>): (如果使用了
--traceroute
) 到目标的路由跳数。 - NSE Script Results: (如果使用了脚本扫描) NSE 脚本的输出。
- Nmap done: 扫描完成的信息,包括扫描的主机数量、耗时等。