介绍
Nmap一款开源网络扫描软件,支持主机发现、端口探测、服务识别、漏洞检测等功能。
支持主机名、IP、网段等多种格式,灵活适配不同扫描场景:
单个目标:scanme.nmap.org(域名)、192.168.199.107(IP)
网段目标:microsoft.com/24(CIDR 格式)、192.168.0.1; 10.0.0-255.1-254(分号分隔多网段)
范围目标:192.168.199.1-100(IP 范围)
安装Nmap
若kali系统可以跳过,kali自带nmap工具
基于debian内核:
apt update -y && apt install nmap -y
基于centos内核:
yum install epel-release -y && yum install namp -y
核心参数解析
| 参数分类 | 参数 | 作用说明 | 实用示例 |
|---|---|---|---|
| 主机探测 | -sn | 仅探测主机存活,不进行端口扫描(“Ping Scan”),避免触发告警 | nmap -sn 192.168.1.0/24 |
-PE | 使用 ICMP Echo Request(Ping 请求)探测存活,兼容性强 | nmap -sn -PE 192.168.1.1 | |
-Pn | 跳过存活探测,强制扫描端口(适用于防火墙屏蔽 Ping 的场景) | nmap -Pn -p 80 192.168.1.100 | |
-PS | 用 TCP SYN 包探测存活(如 -PS22,80 探测常用服务端口) | nmap -sn -PS22,80 192.168.1.0/24 | |
| 端口扫描 | -p | 指定扫描端口(单个:-p 80;范围:-p 1-1000;全端口:-p-) | nmap -p 22,80,443 192.168.1.1 |
-F | 快速扫描(仅扫描 Nmap 预设 100 个常用端口) | nmap -F 192.168.1.1 | |
--top-ports N | 扫描排名前 N 的常用端口(如 --top-ports 500 扫描前 500 个) | nmap --top-ports 500 192.168.1.1 | |
-sS | 半开放扫描(SYN Scan),不建立完整 TCP 连接,隐蔽性高、速度快(推荐) | sudo nmap -sS 192.168.1.1 | |
-sT | 全连接扫描(TCP Connect Scan),兼容性好,隐蔽性低(无 root 权限时默认) | nmap -sT 192.168.1.1 | |
-sU | UDP 端口扫描(适用于 DNS、SNMP 等 UDP 服务) | sudo nmap -sU -p 53 192.168.1.1 | |
| 服务与版本 | -sV | 探测服务版本(如 OpenSSH 7.9p1、Apache/2.4.49) | nmap -sV 192.168.1.1 |
--version-intensity N | 服务版本探测强度(1-9,5 为默认,9 最详细) | nmap -sV --version-intensity 7 192.168.1.1 | |
| 操作系统识别 | -O | 识别目标操作系统(如 Linux 5.4.x、Windows 10) | sudo nmap -O 192.168.1.1 |
--osscan-guess | 推测操作系统版本(适用于特征不明确的目标) | sudo nmap -O --osscan-guess 192.168.1.1 | |
| 输出格式 | -oN | 输出为纯文本文件(便于阅读) | nmap -oN scan_result.txt 192.168.1.1 |
-oX | 输出为 XML 文件(便于导入 Metasploit 等工具) | nmap -oX scan_result.xml 192.168.1.1 | |
-oG | 输出为 grep 可解析格式(便于快速筛选) | nmap -oG scan_result.grep 192.168.1.1 | |
| 速度调节 | -T0 | Paranoid(极慢,避免触发防护) | nmap -T0 192.168.1.1 |
-T4 | Aggressive(快速,平衡速度与稳定性,推荐) | nmap -T4 192.168.1.1 | |
-T5 | Insane(极快,可能导致目标崩溃,谨慎使用) | nmap -T5 192.168.1.1 | |
--scan-delay Nms | 扫描延迟(如 --scan-delay 10ms,降低被拦截概率) | nmap -T4 --scan-delay 10ms 192.168.1.1 | |
| 批量扫描 | -iL | 从文件读取目标列表(每行一个 IP / 域名) | nmap -iL targets.txt |
| 其他常用 | -v | 详细输出(-v 基础信息,-vv 更详细过程) | nmap -vv 192.168.1.1 |
--reason | 显示端口状态原因(如 open 原因、filtered 原因) | nmap --reason 192.168.1.1 |
案例:在线主机探测
需求:扫描 192.168.1.0/24 网段,找出所有在线主机,不扫描端口避免触发告警。
sudo nmap -sn -PE -T4 192.168.1.0/24 -oN live_hosts.txt
参数解析:
- -sn:仅探测存活,不扫端口;
- -PE:ICMP Ping 请求探测,兼容性强;
- -T4:快速模式,平衡速度与稳定性;
- -oN:输出结果到 live_hosts.txt 文件。
输出中 Host is up 表示主机在线,示例:
Nmap scan report for 192.168.1.100 (192.168.1.100)
Host is up (0.00080s latency).
Nmap scan report for 192.168.1.101 (192.168.1.101)
Host is up (0.0012s latency).
案例:单主机深度探测
需求:对 192.168.1.100 进行深度扫描,获取开放端口、服务版本、操作系统信息。
sudo nmap -sS -p 1-1000 -sV -O -T4 --reason 192.168.1.100 -oN host_detail.txt
参数解析:
- -sS:半开放扫描,隐蔽快速;
- -p 1-1000:扫描 1-1000 常用端口;
- -sV:识别服务版本;
- -O:识别操作系统;
- --reason:显示端口状态原因。结果解读:
开放端口示例(22/tcp open ssh 表示 22 端口开放,服务为 SSH):
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 256 1a:2b:3c:4d:5e:6f:7a:8b:9c:0d:1e:2f:3a:4b:5c:6d (ECDSA)
|_ 256 2a:3b:4c:5d:6e:7f:8a:9b:0c:1d:2e:3f:4a:5b:6c:7d (ED25519)
80/tcp open http Apache/2.4.49 (Ubuntu)
|_http-title: Welcome to My Server
操作系统识别示例:
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 5.4 - 5.19
案例:从文件批量端口扫描
需求:扫描 targets.txt 中的所有目标(每行一个 IP / 域名),仅探测 22(SSH)、80(HTTP)、443(HTTPS)端口,输出为 XML 格式供后续分析
sudo nmap -sS -p 22,80,443 -sV -iL targets.txt -oX batch_scan.xml -T4
参数解析:
- -iL targets.txt:从文件读取目标列表;
- -oX:输出为 XML 格式,便于导入 Metasploit 或自动化分析工具;
仅扫描核心服务端口,提高扫描效率。
结果应用:用 Python 解析 XML
import xml.etree.ElementTree as ET
# 解析 Nmap 输出的 XML 文件
tree = ET.parse("batch_scan.xml")
root = tree.getroot()
# 筛选开放 80 端口(HTTP)的目标
http_hosts = []
for host in root.findall("host"):
ip = host.find("address").get("addr")
for port in host.findall("ports/port"):
if port.get("portid") == "80" and port.get("state") == "open":
http_hosts.append(ip)
print("开放 HTTP 服务的主机:")
for ip in http_hosts:
print(ip)
也可直接用 xmllint 命令行工具快速提取信息:
xmllint --xpath '//host[ports/port[@portid="80" and @state="open"]]/address/@addr' batch_scan.xml
案例:隐蔽扫描
需求:对外部目标(如 www.example.com)进行扫描,降低被防火墙拦截的概率。
sudo nmap -sS -p 1-1000 -T2 --scan-delay 10ms -sV --version-intensity 3 -vv www.example.com
参数解析:
- -T2:慢速扫描模式,模拟正常网络流量;
- --scan-delay 10ms:每个探测包间隔 10 毫秒,减少流量特征;
--version-intensity 3:降低服务版本探测强度,减少探测包数量;
-vv:超详细输出,便于跟踪扫描状态。注意:隐蔽扫描速度极慢(可能耗时数小时),仅适用于防护严格的外部目标,内部网络无需过度隐蔽。
Nmap扫描结果解析
Nmap 输出结果包含主机信息、端口状态、服务版本、操作系统、漏洞等大量数据,需重点提取关键信息,避免遗漏风险点:
端口状态解读
Nmap 扫描端口后会返回 6 种状态,核心关注以下 4 种:
open(开放):端口正在提供服务,是安全审计的核心对象(如 22 端口开放可能存在 SSH 弱口令风险);
closed(关闭):端口存在但未提供服务,无直接风险; filtered(过滤):端口状态未知,可能被防火墙拦截(需进一步验证是否开放);
unfiltered(未过滤):端口可访问但状态未知(仅在特定扫描模式下出现)。
服务版本与漏洞关联
服务版本是漏洞检测的核心依据,例如:
OpenSSH 7.2p1 及以下版本存在 CVE-2016-6210 漏洞(权限提升); Apache 2.4.49 存在
CVE-2021-41773 漏洞(路径遍历 + RCE); MySQL 5.5.62 及以下版本存在默认账号风险。
实用技巧:通过 CVE 数据库(如 https://cve.mitre.org/)输入服务版本 +“vulnerability”,快速查询对应漏洞。
操作系统识别结果应用
操作系统识别结果可用于:
匹配对应系统的已知漏洞(如 Windows 10 1903 存在 CVE-2020-0796 漏洞);
制定渗透测试策略(如 Linux 系统重点关注 SSH、MySQL,Windows 系统重点关注 RDP、SMB)。
kali nmap主机探测扫描