Skip to content

Commit c8f2419

Browse files
committed
advanced/nmap: A complete rewrite
1 parent a0d8a8b commit c8f2419

File tree

2 files changed

+110
-91
lines changed

2 files changed

+110
-91
lines changed

docs/advanced/nmap.md

Lines changed: 110 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -2,160 +2,179 @@
22
icon: material/skull-scan
33
---
44

5-
# Nmap: 网络探测和安全检查工具
5+
# Nmap
66

77
!!! note "主要作者"
88

9-
[@sscscc][sscscc]
9+
[@taoky][taoky]、[@sscscc][sscscc]
1010

1111
!!! warning "本文已完成,等待校对"
1212

13-
Nmap(Network Mapper)是一个开源的网络探测和安全检查工具。它由 Gordon Lyon(也被称为 Fyodor Vaskovich)创造,并首次发布于 1997 年。主要功能包括,主机发现,端口扫描服务版本探测操作系统检测脚本扫描等。由于其强大的功能和灵活性,Nmap 已经成为世界上最受欢迎的网络扫描工具之一,并被广泛应用于安全社区和 IT 行业
13+
Nmap(Network Mapper)是开源的网络探测和安全检查工具。其主要功能包括主机发现、端口扫描服务版本探测操作系统检测脚本扫描等。不管是在红方(攻击方)还是蓝方(防御方)的工作中,Nmap 都是一个非常有用的工具
1414

15-
这是一份 Nmap 使用手册,你可以参考本文快速上手使用
15+
以下介绍 Nmap 的常用功能
1616

17-
## 安装 Nmap
17+
!!! danger "请勿进行未经授权的扫描操作"
1818

19-
在大多数 Linux 发行版中,可以直接使用包管理器安装 Nmap:
19+
再次重复:**扫描器本身是中性的工具,既可以帮助系统管理员检查已有的系统的问题,也可以帮助攻击者快速发现已有的安全漏洞。请仅在得到授权的前提下使用这类工具,否则可能会有严重的法律风险。**
2020

21-
### Debian/Ubuntu
21+
!!! tip "GUI 版本"
2222

23-
```shell
24-
sudo apt-get install nmap
25-
```
26-
27-
### CentOS/Fedora
28-
29-
```shell
30-
sudo yum install nmap
31-
```
32-
33-
### Arch Linux
34-
35-
```shell
36-
sudo pacman -S nmap
37-
```
23+
如果你不喜欢命令行,可以使用 Zenmap,它提供了相对用户友好的界面来运行 Nmap。
3824

39-
## Nmap 基本用法举例
25+
## 基本扫描 {#basic-scanning}
4026

41-
!!! question
27+
对系统管理员,Nmap 的一个重要用途是搞清楚自己管理的网络中的资产情况。Nmap 可以扫描指定网段中存活(在线)的主机与开放的端口。
4228

43-
你的室友有一台服务器,在上面运行了很多服务。有些是只给自己仅限他自己本机使用的,有些也许不小心对外开放了。你非常热心,想帮它检查一下意外暴露的服务,要怎么做呢?
29+
以下假设网络段为 192.168.1.0/24。
4430

45-
### 基本扫描
31+
!!! tip "扫描到哪里了?"
4632

47-
扫描网络中的主机,开放的端口和对应的运行的服务
33+
在扫描中按下任意键可以显示进度
4834

49-
![nmap 扫描结果示例](../images/nmap-result.png)
35+
### 存活检测 {#alive-detection}
5036

51-
!!! tip
37+
Nmap 的 `-sn` 选项会关闭端口扫描,只进行存活检测。`-sn` 选项会发送 ICMP Echo(ping)、TCP SYN 到 443(HTTPS)端口和 TCP ACK 到 80(HTTP)端口,以及发送 ICMP Timestamp 请求来检测主机是否在线。
5238

53-
在扫描中按下任意键可以显示进度
39+
!!! note "为什么 TCP SYN 到 443,但是 TCP ACK 到 80?"
5440

55-
#### 指定地址
41+
很多防火墙会配置直接丢弃对非公开服务端口的 TCP SYN 请求包,但是不是所有防火墙都会丢弃 TCP ACK 请求包,特别是对应防火墙没有记录 TCP 连接状态的情况下。因此采取不同的 TCP 包探测方式可以提高存活检测的成功率。
5642

57-
扫描单个主机:
43+
!!! note "ICMP Timestamp"
5844

59-
```shell
60-
nmap [target]
61-
```
45+
ICMP Timestamp 请求是一个较少使用的 ICMP 类型,用来获取目标主机的时间信息。部分现代操作系统默认不响应此请求。
6246

63-
扫描多个主机
47+
可以使用 Nmap 提供的 `nping` 工具测试
6448

65-
```shell
66-
nmap [target1] [target2] [target3]
67-
```
49+
```shell
50+
sudo nping --icmp --icmp-type timestamp 192.168.1.2
51+
```
6852

69-
扫描整个子网:
53+
!!! tip "使用 root 执行"
7054

71-
```shell
72-
nmap [subnet]/24
73-
```
55+
由于发送 ICMP 包需要特权(创建 raw socket),如果希望 Nmap 把所有的扫描方法都用上,建议采用 `sudo` 执行 Nmap。此外,只发送 TCP SYN、TCP ACK 也需要特权,如果以普通用户运行,Nmap 会使用 `connect()` 系统调用来检测存活主机,因此只发送 TCP ACK 在这种条件下无法实现。
7456

75-
!!! tip
57+
如果扫描的是本地网络并且是 root,Nmap 还会尝试使用 ARP 请求来检测存活主机。
7658

77-
如果你想扫描整个网络,但需要跳过某些主机,可以使用 --exclude 选项。
59+
!!! tip "关闭 DNS 解析"
7860

79-
!!! question
61+
Nmap 默认会尝试从 IP 地址使用 DNS 解析主机名,这很多时候是没有必要的,而且会占用大量时间。可以使用 `-n` 选项关闭 DNS 解析。
8062

81-
你的服务器在大机房里,你记得你在上面开了一个运行在25565端口上的服务。但是……你忘记它的ip了。怎么快速找到它呢
63+
!!! tip "减小等待时间"
8264

83-
#### 指定端口
65+
Nmap 的 `-T` 参数会控制操作的时间间隔,默认是 `-T3`。如果网络情况好,可以使用 `-T4` 或 `-T5` 来加快扫描速度。
8466

85-
扫描特定端口
67+
可以使用 `-P` 系列参数限制存活检测的方式(默认行为相当于 `-PE -PS443 -PA80 -PP`),例如只允许进行 ICMP Echo 请求(在权限不足的情况下,Nmap 会自动降级到使用 TCP)
8668

8769
```shell
88-
nmap -p [port] [target]
70+
nmap -n -sn -PE 192.168.1.0/24
8971
```
9072

91-
扫描多个端口
73+
或者只允许 TCP SYN 到 443 端口
9274

9375
```shell
94-
nmap -p [port1],[port2],[port3] [target]
76+
nmap -n -sn -PS443 192.168.1.0/24
9577
```
9678

97-
扫描一个范围内的端口:
79+
!!! tip "跳过某些主机"
9880

99-
```shell
100-
nmap -p [start_port]-[end_port] [target]
101-
```
81+
如果你想扫描整个网络,但需要跳过某些主机,可以使用 `--exclude` 选项。
10282

103-
#### 指定网络协议
83+
!!! question "第一天的工作"
10484

105-
执行 SYN 扫描:
85+
假设你刚刚加入了一个新的团队,上一任的系统管理员没有留下任何文档。为了搞清楚有哪些机器,你需要做什么来获取你需要扫描的网段?
10686

107-
(可能需要 root 权限,否则无法发送原始报文)
87+
### 端口扫描 {#port-scanning}
10888

109-
```shell
110-
sudo nmap -sS [target]
111-
```
89+
获取存活主机后,下一步是获取这些主机上开放的端口。最常用的扫描方式有三种:
11290

113-
执行 UDP 扫描(可能需要较长时间):
91+
- TCP SYN 扫描 `-sS`(需要特权)
92+
- TCP connect 扫描 `-sT`
93+
- UDP 扫描 `-sU`
11494

115-
```shell
116-
sudo nmap -sU [target]
117-
```
95+
此外,Nmap 默认只会扫描最常用的 1000 种端口。`-p` 选项可以指定要扫描的端口(例如 `-p 12345`),或者端口范围(例如 `-p 1-1024`)。如果希望让 Nmap 扫描所有端口,可以使用 `-p-`
11896

119-
### 服务和版本检测
97+
!!! question "扫描网段内的指定端口"
12098

121-
检测服务的版本信息:
99+
你想扫描整个网段内有哪些主机开放了 22 端口(SSH),应该怎么写参数?
122100

123-
```shell
124-
nmap -sV [target]
125-
```
101+
!!! tip "rustscan 和 masscan"
126102

127-
!!! question
103+
在端口扫描领域,除了 Nmap 以外还有一些其他的工具。其中常用的包括:
104+
105+
- [rustscan](https://github.com/bee-san/RustScan),其默认配置就能够非常快速扫描全部端口。
106+
- [masscan](https://github.com/robertdavidgraham/masscan),用于超大规模扫描的工具,其宣称可以在 5 分钟内扫描整个互联网。
128107

129-
实验室跑了 20 年的古董服务器是什么操作系统呢?🤔
108+
## 进一步检测 {#further-detection}
130109

131-
### 操作系统检测
110+
### 服务和版本检测 {#service-and-version-detection}
132111

133-
检测某个主机的操作系统
112+
`-sV` 选项可以让 Nmap 尝试检测开放端口上运行的服务和版本信息,因为很多网络服务的实现都会以某种方式透露自己的信息,例如 SSH 服务会在连接时发送版本信息
134113

135-
```shell
136-
nmap -O [target]
114+
```console
115+
$ nc example.com 22
116+
SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u6
137117
```
138118

139-
!!! tip
119+
服务和版本检测耗费时间较长,特别是在不限制端口的情况下。一个检测例子如下:
120+
121+
```console
122+
$ nmap -sV 192.168.1.247
123+
Starting Nmap 7.97 ( https://nmap.org ) at 2025-08-03 21:43 +0800
124+
Nmap scan report for bogon (192.168.1.247)
125+
Host is up (0.000069s latency).
126+
Not shown: 992 closed tcp ports (conn-refused)
127+
PORT STATE SERVICE VERSION
128+
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u6 (protocol 2.0)
129+
80/tcp open http OpenResty web app server 1.27.1.2
130+
111/tcp open rpcbind 2-4 (RPC #100000)
131+
1145/tcp open http Caddy httpd
132+
2049/tcp open nfs_acl 3 (RPC #100227)
133+
3260/tcp open iscsi?
134+
10000/tcp open snet-sensor-mgmt?
135+
10001/tcp open http Node.js Express framework
136+
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
137+
(省略)
138+
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
139+
Nmap done: 1 IP address (1 host up) scanned in 172.50 seconds
140+
```
140141

141-
使用 -T 选项可以设置 Nmap 的扫描速度,-T4 和 -T5 选项可以加快扫描速度,但也更容易被入侵检测系统(IDS)发现。如果想要更隐蔽地扫描,可以选择 -T2 或 -T3。
142+
### 操作系统检测 {#os-detection}
142143

143-
## 输出格式
144+
`-O` 选项可以让 Nmap 尝试检测目标主机的操作系统。Nmap 会根据 TCP/IP 协议栈的特征来猜测操作系统类型和版本。该操作需要特权。
144145

145-
Nmap 支持的输出格式包括:
146+
```console
147+
$ sudo nmap -O 192.168.1.253
148+
(省略)
149+
Device type: general purpose|router
150+
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
151+
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
152+
OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
153+
Network Distance: 1 hop
154+
(省略)
155+
```
146156

147-
- 标准输出到控制台。
148-
- -oN 输出到普通文件。
149-
- -oX 输出为 XML 格式。
150-
- -oG 输出为 grep 友好格式。
151-
- -oA 输出所有上述格式。
157+
## 脚本简介 {#scripts}
152158

153-
例如想要输出到文件,可以这样做:
159+
Nmap 的 Nmap Scripting Engine(NSE)功能允许用户编写 Lua 脚本扩展 Nmap 的功能,执行自动化任务。目前,Nmap 自带了[六百多种 NSE 脚本](https://nmap.org/nsedoc/scripts/),分为不同的几类(详见 [Usage and Examples](https://nmap.org/book/nse-usage.html))。使用 `-sC``--script=default` 选项可以让 Nmap 使用默认(default)这一分类的脚本对指定主机执行,能够做一些基本的信息收集任务。
154160

155-
```shell
156-
nmap -oN output.txt [target]
161+
如果要执行具体某个脚本,使用 `--script` 选项指定脚本名称。例如获取 banner(服务版本信息):
162+
163+
```console
164+
$ nmap --script=banner 192.168.1.253
165+
Starting Nmap 7.97 ( https://nmap.org ) at 2025-08-04 01:45 +0800
166+
Nmap scan report for bogon (192.168.1.253)
167+
Host is up (0.0034s latency).
168+
Not shown: 999 closed tcp ports (conn-refused)
169+
PORT STATE SERVICE
170+
22/tcp open ssh
171+
|_banner: SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u7
172+
173+
Nmap done: 1 IP address (1 host up) scanned in 10.23 seconds
157174
```
158175

159-
!!! tip
176+
!!! tip "部分 NSE 脚本示例"
177+
178+
正如最开始所说的那样,Nmap 是一个中性的工具,其自带脚本集也是如此:一些脚本可以用于调试用途,另一些脚本则非常有攻击性。例如 [`broadcast-dhcp-discover`](https://nmap.org/nsedoc/scripts/broadcast-dhcp-discover.html) 脚本会广播发送 `DHCPDISCOVER`,输出得到的 `DHCPOFFER`,可以帮助系统管理员检查 DHCP 服务器是否存在问题;而 [`ssh-brute`](https://nmap.org/nsedoc/scripts/ssh-brute.html) 则会尝试暴力破解 SSH 密码。
160179

161-
如果你不喜欢命令行,可以使用 Nmap 的图形用户界面版本 Zenmap,它提供了用户友好的界面来运行扫描和分析结果
180+
可以补充阅读 [Red Hat Blog 的文章 *5 scripts for getting started with the Nmap Scripting Engine*](https://www.redhat.com/en/blog/nmap-scripting-engine) 作为参考

docs/images/nmap-result.png

-27.4 KB
Binary file not shown.

0 commit comments

Comments
 (0)