跳到主要内容

Nmap 服务识别与脚本扫描

Nmap (Network Mapper) 是渗透测试中最核心的侦察工具。RustScan 负责快速发现开放端口,Nmap 则负责对这些端口做服务版本识别、脚本探测和 OS 检测。几乎所有靶场打靶的第二步都是 Nmap。


安装

Kali Linux

Kali 默认已预装,无需额外安装。

Debian / Ubuntu

sudo apt update && sudo apt install -y nmap

macOS

brew install nmap

Windows

官方下载页 下载安装包,或使用 winget:

winget install Insecure.Nmap

核心参数速查

主机发现

参数说明示例
-sn仅 Ping 扫描,不扫端口nmap -sn 192.168.1.0/24
-Pn跳过主机发现,直接扫端口nmap -Pn 192.168.1.108
-PS <ports>TCP SYN Ping-PS 22,80,443
-PA <ports>TCP ACK Ping-PA 80
-PU <ports>UDP Ping-PU 53

靶场打靶场景下,目标 IP 已知且防火墙可能过滤 ICMP,建议始终使用 -Pn

扫描类型

参数说明需要 root备注
-sSSYN 半开扫描(默认)最常用,速度快,隐蔽性好
-sTTCP Connect 全连接扫描非 root 时的默认方式
-sUUDP 扫描速度慢,但不可忽略(DNS/SNMP/TFTP)
-sV服务版本识别必备,识别具体服务和版本号
-sC运行默认 NSE 脚本等同于 --script=default
-A激进扫描等同于 -sV -sC -O --traceroute
-sN / -sF / -sXNULL/FIN/Xmas 扫描绕过简单防火墙

端口指定

参数说明示例
-p <ports>指定端口-p 22,80,443
-p <range>端口范围-p 1-1000
-p-全端口 1-65535-p-
--top-ports <n>最常见的 n 个端口--top-ports 100
-F快速模式(前 100 端口)-F

输出格式

参数说明示例
-oN <file>标准文本输出-oN scan.txt
-oX <file>XML 输出-oX scan.xml
-oG <file>Greppable 输出-oG scan.grep
-oA <basename>同时输出以上三种格式-oA scan

建议始终使用 -oN 保存结果,方便复盘和写 writeup。

性能控制

参数说明
-T0-T5时间模板,0 最慢(偏执),5 最快(疯狂)
--min-rate <n>最小发包速率
--max-retries <n>最大重试次数
-v / -vv增加输出详细度

常用扫描模式

1. 靶场标准扫描(最常用)

配合 RustScan 发现的端口列表,做服务版本识别 + 默认脚本:

nmap -Pn -sV -sC -p 21,22,80,443,8080 192.168.1.108 -oN nmap_initial.txt

2. 全端口扫描

不使用 RustScan 时的替代方案(速度较慢):

nmap -Pn -p- --min-rate 5000 192.168.1.108 -oN nmap_allports.txt

发现端口后再做精细扫描:

nmap -Pn -sV -sC -p <发现的端口> 192.168.1.108 -oN nmap_detail.txt

3. UDP 扫描

不要忽略 UDP,DNS (53)、SNMP (161)、TFTP (69) 等服务只跑在 UDP 上:

nmap -Pn -sU --top-ports 20 192.168.1.108 -oN nmap_udp.txt

UDP 扫描天然比 TCP 慢很多,建议用 --top-ports 限制范围。

4. 激进扫描

一条命令拿到尽可能多的信息(版本、脚本、OS、traceroute):

nmap -Pn -A -p 22,80,445 192.168.1.108 -oN nmap_aggressive.txt

5. 子网存活主机发现

nmap -sn 192.168.1.0/24

或在 ICMP 被过滤时使用 ARP 扫描:

sudo nmap -sn -PR 192.168.1.0/24

NSE 脚本引擎

Nmap 内置数百个 Lua 脚本,按类别组织。脚本位于 /usr/share/nmap/scripts/

脚本类别

类别用途示例
default默认安全脚本(-sC 触发)http-title, ssh-hostkey
vuln漏洞检测smb-vuln-ms17-010
safe不会对目标造成影响的脚本ssl-cert
auth认证相关(弱口令等)ftp-anon, ssh-auth-methods
brute暴力破解http-brute, ssh-brute
discovery信息收集http-enum, smb-os-discovery

常用脚本命令

# 运行默认脚本
nmap -sC -p 80 target

# 运行特定脚本
nmap --script http-enum -p 80 target

# 运行某个类别的所有脚本
nmap --script vuln -p 445 target

# 组合多个脚本或类别
nmap --script "vuln and safe" -p 445 target

# 传递脚本参数
nmap --script http-brute --script-args http-brute.path=/admin -p 80 target

渗透测试高频脚本

场景脚本命令
HTTP 目录枚举http-enumnmap --script http-enum -p 80 target
HTTP 标题http-titlenmap --script http-title -p 80,8080,8443 target
SMB 漏洞检测smb-vuln-*nmap --script smb-vuln* -p 445 target
SMB 共享枚举smb-enum-sharesnmap --script smb-enum-shares -p 445 target
FTP 匿名登录ftp-anonnmap --script ftp-anon -p 21 target
SSL 证书信息ssl-certnmap --script ssl-cert -p 443 target
DNS 域传送dns-zone-transfernmap --script dns-zone-transfer -p 53 target
MySQL 信息mysql-infonmap --script mysql-info -p 3306 target
全漏洞扫描vulnnmap --script vuln -p 445 target

--script vuln 扫描耗时较长且流量大,优先对已发现的关键端口执行,避免搭配 -p- 全端口使用。仅在授权靶场或确认范围内运行。

查找和搜索脚本

# 列出所有脚本
ls /usr/share/nmap/scripts/

# 按关键词搜索
ls /usr/share/nmap/scripts/ | grep smb

# 查看脚本帮助
nmap --script-help http-enum

OS 检测

sudo nmap -O -p 22,80 192.168.1.108

需要至少一个开放端口和一个关闭端口才能准确判断。如果结果不确定,可以加 --osscan-guess 强制猜测:

sudo nmap -O --osscan-guess 192.168.1.108

OS 检测需要 root 权限(发送原始数据包)。


输出与结果处理

保存结果(推荐 -oA)

nmap -Pn -sV -sC -p 22,80,445 target -oA nmap_target

生成三个文件:nmap_target.nmapnmap_target.xmlnmap_target.gnmap

从 Greppable 输出提取信息

# 提取所有开放端口
grep -oP '\d+/open' nmap_target.gnmap | cut -d/ -f1 | sort -un | tr '\n' ','

# 筛选有特定服务的主机
grep "80/open/tcp" nmap_target.gnmap

XML 转 HTML 报告

xsltproc nmap_target.xml -o nmap_report.html

防火墙 / IDS 绕过技巧

以下技巧仅用于授权测试和理解扫描行为,不应用于未授权的网络。在靶场环境中通常不需要这些技巧,但了解它们有助于理解真实场景下的扫描检测机制。

技巧参数说明
分片-f将探测包分成 8 字节片段
MTU 自定义--mtu 24自定义分片大小(8 的倍数)
诱饵-D RND:5混入 5 个随机假源 IP
指定源端口--source-port 53伪装成 DNS 流量
慢速扫描-T0-T1降低扫描速度以躲避检测
数据填充--data-length 50在探测包中附加随机数据

靶场实战速查

根据 RustScan 发现的服务,快速选择 Nmap 后续动作:

发现的服务下一步命令
FTP (21)nmap --script ftp-anon,ftp-vsftpd-backdoor -p 21 target
SSH (22)nmap --script ssh-auth-methods -p 22 target
SMTP (25)nmap --script smtp-commands,smtp-enum-users -p 25 target
DNS (53)nmap --script dns-zone-transfer --script-args dns-zone-transfer.domain=target.com -p 53 target
HTTP (80/8080)nmap --script http-enum,http-title,http-methods -p 80 target
SMB (139/445)nmap --script smb-enum-shares,smb-enum-users,smb-vuln* -p 445 target
MySQL (3306)nmap --script mysql-info,mysql-enum -p 3306 target
RDP (3389)nmap --script rdp-enum-encryption -p 3389 target

与 RustScan 配合的标准流程

1. RustScan 全端口快扫 → rustscan -a target -g
2. Nmap 服务识别 + 默认脚本 → nmap -Pn -sV -sC -p <ports> target -oN initial.txt
3. 针对关键服务跑专项脚本 → nmap --script smb-vuln* -p 445 target
4. 有需要时补充 UDP 扫描 → nmap -Pn -sU --top-ports 20 target

相关知识