Nmap 网络扫描与安全评估完全指南 🔍
Nmap(Network Mapper)是一个开源的网络发现和安全审计工具,被广泛用于网络库存、管理服务升级计划以及监控主机或服务运行状况。
📊 目录
🚀 基础扫描技术
主机发现扫描
# 基本主机发现(Ping扫描)
nmap -sn 192.168.1.0/24
# 禁用DNS解析,加快扫描速度
nmap -sn -n 192.168.1.0/24
# 使用ARP扫描(局域网内最有效)
nmap -sn -PR 192.168.1.0/24
# TCP SYN Ping
nmap -sn -PS80,443,22 192.168.1.0/24
# ICMP Ping扫描
nmap -sn -PE 192.168.1.0/24
# UDP Ping扫描
nmap -sn -PU53,67,68,161 192.168.1.0/24
端口扫描技术
# TCP SYN扫描(半开扫描,默认方式)
nmap -sS 192.168.1.100
# TCP连接扫描(完整三次握手)
nmap -sT 192.168.1.100
# UDP扫描
nmap -sU 192.168.1.100
# 综合TCP和UDP扫描
nmap -sS -sU 192.168.1.100
# FIN扫描(隐蔽扫描)
nmap -sF 192.168.1.100
# NULL扫描
nmap -sN 192.168.1.100
# Xmas扫描
nmap -sX 192.168.1.100
# ACK扫描(检测防火墙规则)
nmap -sA 192.168.1.100
端口指定与范围
# 扫描特定端口
nmap -p 80,443,22 192.168.1.100
# 扫描端口范围
nmap -p 1-1000 192.168.1.100
# 扫描所有65535个端口
nmap -p- 192.168.1.100
# 扫描最常见的端口
nmap --top-ports 100 192.168.1.100
# 快速扫描(常见的1000个端口)
nmap -F 192.168.1.100
# 扫描指定协议的端口
nmap -p U:53,111,137,T:21-25,80,139,8080 192.168.1.100
🔧 高级扫描选项
服务和版本检测
# 服务版本检测
nmap -sV 192.168.1.100
# 操作系统检测
nmap -O 192.168.1.100
# 激进模式(包含OS检测、版本检测、脚本扫描和路由跟踪)
nmap -A 192.168.1.100
# 设置版本检测强度(0-9,默认7)
nmap -sV --version-intensity 9 192.168.1.100
# 轻量级版本检测
nmap -sV --version-light 192.168.1.100
# 全面版本检测
nmap -sV --version-all 192.168.1.100
时间和性能调优
# 设置扫描速度(0-5,5最快)
nmap -T4 192.168.1.100
# 自定义超时设置
nmap --host-timeout 300s 192.168.1.100
# 设置最大并行扫描数
nmap --max-parallelism 100 192.168.1.100
# 设置扫描延迟
nmap --scan-delay 1s 192.168.1.100
# 随机化主机扫描顺序
nmap --randomize-hosts 192.168.1.0/24
输出详细程度
# 详细输出
nmap -v 192.168.1.100
# 更详细输出
nmap -vv 192.168.1.100
# 调试模式
nmap -d 192.168.1.100
# 原因解释(显示端口状态的原因)
nmap --reason 192.168.1.100
# 显示主机和端口的所有信息
nmap --packet-trace 192.168.1.100
📜 脚本引擎使用
脚本分类扫描
# 运行默认脚本
nmap -sC 192.168.1.100
# 运行特定类别的脚本
nmap --script vuln 192.168.1.100
nmap --script auth 192.168.1.100
nmap --script brute 192.168.1.100
nmap --script discovery 192.168.1.100
nmap --script dos 192.168.1.100
nmap --script exploit 192.168.1.100
nmap --script external 192.168.1.100
nmap --script fuzzer 192.168.1.100
nmap --script intrusive 192.168.1.100
nmap --script malware 192.168.1.100
nmap --script safe 192.168.1.100
nmap --script version 192.168.1.100
特定服务脚本
# HTTP服务脚本
nmap -p 80 --script http-enum 192.168.1.100
nmap -p 80 --script http-headers 192.168.1.100
nmap -p 80 --script http-methods 192.168.1.100
nmap -p 80 --script http-robots.txt 192.168.1.100
nmap -p 80 --script http-title 192.168.1.100
# SSH服务脚本
nmap -p 22 --script ssh-auth-methods 192.168.1.100
nmap -p 22 --script ssh-hostkey 192.168.1.100
nmap -p 22 --script ssh-brute 192.168.1.100
# SMB服务脚本
nmap -p 445 --script smb-enum-shares 192.168.1.100
nmap -p 445 --script smb-os-discovery 192.168.1.100
nmap -p 445 --script smb-security-mode 192.168.1.100
nmap -p 445 --script smb-vuln-* 192.168.1.100
# FTP服务脚本
nmap -p 21 --script ftp-anon 192.168.1.100
nmap -p 21 --script ftp-bounce 192.168.1.100
nmap -p 21 --script ftp-brute 192.168.1.100
# DNS服务脚本
nmap -p 53 --script dns-zone-transfer 192.168.1.100
nmap --script broadcast-dns-service-discovery
漏洞扫描脚本
# 常见漏洞扫描
nmap --script vuln 192.168.1.100
# 特定CVE漏洞检测
nmap --script smb-vuln-ms17-010 192.168.1.100
nmap --script http-vuln-cve2017-5638 192.168.1.100
nmap --script ssl-heartbleed 192.168.1.100
# Web应用漏洞
nmap -p 80,443 --script http-sql-injection 192.168.1.100
nmap -p 80,443 --script http-xssed 192.168.1.100
nmap -p 80,443 --script http-shellshock 192.168.1.100
# SSL/TLS安全检测
nmap -p 443 --script ssl-enum-ciphers 192.168.1.100
nmap -p 443 --script ssl-cert 192.168.1.100
nmap -p 443 --script ssl-date 192.168.1.100
📄 输出格式详解
多种输出格式
# 正常输出
nmap -oN scan_results.txt 192.168.1.100
# XML输出
nmap -oX scan_results.xml 192.168.1.100
# Grepable输出
nmap -oG scan_results.grep 192.168.1.100
# 所有格式输出
nmap -oA scan_results 192.168.1.100
# 标准输出同时保存到文件
nmap 192.168.1.100 | tee scan_results.txt
输出控制
# 不显示运行时信息
nmap --stats-every 0 192.168.1.100
# 禁用DNS解析(加快扫描速度)
nmap -n 192.168.1.100
# 显示关闭的端口
nmap --open 192.168.1.100
# 只显示开放端口
nmap --open 192.168.1.0/24
# 追加到现有文件
nmap --append-output -oN existing_scan.txt 192.168.1.100
🎯 实际应用场景
网络资产发现
#!/bin/bash
# network_discovery.sh - 网络资产发现脚本
NETWORK="192.168.1.0/24"
OUTPUT_DIR="./network_scan_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
echo "开始网络资产发现..."
# 1. 主机发现
echo "1. 主机发现中..."
nmap -sn -PE -PP -PM -PO "$NETWORK" -oA "$OUTPUT_DIR/host_discovery"
# 提取活跃主机
grep "Up" "$OUTPUT_DIR/host_discovery.nmap" | awk '{print $2}' > "$OUTPUT_DIR/live_hosts.txt"
# 2. 端口扫描
echo "2. 端口扫描中..."
nmap -sS -T4 --top-ports 1000 -iL "$OUTPUT_DIR/live_hosts.txt" -oA "$OUTPUT_DIR/port_scan"
# 3. 服务识别
echo "3. 服务识别中..."
nmap -sV -sC -T4 -iL "$OUTPUT_DIR/live_hosts.txt" -oA "$OUTPUT_DIR/service_scan"
# 4. 操作系统识别
echo "4. 操作系统识别中..."
nmap -O -T4 -iL "$OUTPUT_DIR/live_hosts.txt" -oA "$OUTPUT_DIR/os_scan" 2>/dev/null
echo "扫描完成,结果保存在 $OUTPUT_DIR 目录中"
漏洞评估
#!/bin/bash
# vulnerability_assessment.sh - 漏洞评估脚本
TARGET="$1"
OUTPUT_DIR="./vuln_scan_$(date +%Y%m%d_%H%M%S)"
if [ -z "$TARGET" ]; then
echo "使用方法: $0 <target_ip_or_range>"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
echo "开始漏洞评估: $TARGET"
# 1. 基础扫描
echo "1. 基础扫描..."
nmap -sS -sV -T4 "$TARGET" -oA "$OUTPUT_DIR/basic_scan"
# 2. 漏洞扫描
echo "2. 漏洞扫描..."
nmap --script vuln -T4 "$TARGET" -oA "$OUTPUT_DIR/vuln_scan"
# 3. 常见服务漏洞检测
echo "3. 常见服务漏洞检测..."
# SMB漏洞
nmap -p 445 --script smb-vuln-* "$TARGET" -oN "$OUTPUT_DIR/smb_vulns.txt"
# Web服务漏洞
nmap -p 80,443,8080,8443 --script http-vuln-* "$TARGET" -oN "$OUTPUT_DIR/web_vulns.txt"
# SSL/TLS漏洞
nmap -p 443,993,995 --script ssl-* "$TARGET" -oN "$OUTPUT_DIR/ssl_vulns.txt"
# 4. 弱密码检测
echo "4. 弱密码检测..."
nmap --script brute "$TARGET" -oN "$OUTPUT_DIR/brute_force.txt"
echo "漏洞评估完成,结果保存在 $OUTPUT_DIR 目录中"
# 生成报告摘要
echo "生成报告摘要..."
{
echo "=== 漏洞评估报告 ==="
echo "目标: $TARGET"
echo "时间: $(date)"
echo ""
echo "=== 发现的漏洞 ==="
grep -i "vulnerable\|exploit\|CVE" "$OUTPUT_DIR"/*.txt | head -20
} > "$OUTPUT_DIR/summary.txt"
Web应用扫描
#!/bin/bash
# web_app_scan.sh - Web应用安全扫描
TARGET="$1"
PORT="${2:-80}"
if [ -z "$TARGET" ]; then
echo "使用方法: $0 <target> [port]"
exit 1
fi
echo "扫描Web应用: $TARGET:$PORT"
# HTTP方法检测
echo "检测HTTP方法..."
nmap -p "$PORT" --script http-methods "$TARGET"
# 目录枚举
echo "目录枚举..."
nmap -p "$PORT" --script http-enum "$TARGET"
# 常见漏洞检测
echo "漏洞检测..."
nmap -p "$PORT" --script http-vuln-* "$TARGET"
# SQL注入检测
echo "SQL注入检测..."
nmap -p "$PORT" --script http-sql-injection "$TARGET"
# XSS检测
echo "XSS检测..."
nmap -p "$PORT" --script http-xssed "$TARGET"
# 备份文件检测
echo "备份文件检测..."
nmap -p "$PORT" --script http-backup-finder "$TARGET"
# 敏感信息泄露
echo "敏感信息检测..."
nmap -p "$PORT" --script http-config-backup,http-frontpage-login "$TARGET"
🛡️ 防火墙规避技术
基本规避技术
# 分片扫描
nmap -f 192.168.1.100
# MTU设置
nmap --mtu 24 192.168.1.100
# 使用诱饵IP
nmap -D RND:10 192.168.1.100
nmap -D 192.168.1.10,192.168.1.11,ME 192.168.1.100
# 源端口欺骗
nmap --source-port 53 192.168.1.100
nmap -g 53 192.168.1.100
# 空闲扫描
nmap -sI zombie_host target_host
# FTP反弹扫描
nmap -b ftp_relay_host target_host
时间规避
# 慢速扫描
nmap -T0 192.168.1.100
# 添加随机延迟
nmap --scan-delay 10s 192.168.1.100
# 随机化扫描顺序
nmap --randomize-hosts 192.168.1.0/24
# 限制发包率
nmap --max-rate 10 192.168.1.100
高级规避技术
# 使用原始IP包
nmap --send-eth 192.168.1.100
# 自定义IP选项
nmap --ip-options "L 192.168.1.1 192.168.1.2" 192.168.1.100
# 坏校验和
nmap --badsum 192.168.1.100
# 数据填充
nmap --data-length 25 192.168.1.100
# MAC地址欺骗
nmap --spoof-mac Dell 192.168.1.100
nmap --spoof-mac 0 192.168.1.100
⚡ 性能优化
并行化和速度控制
# 设置并行主机数
nmap --min-hostgroup 50 --max-hostgroup 100 192.168.1.0/24
# 设置并行探测数
nmap --min-parallelism 10 --max-parallelism 300 192.168.1.100
# 设置重传次数
nmap --max-retries 2 192.168.1.100
# RTT超时设置
nmap --min-rtt-timeout 100ms --max-rtt-timeout 2s 192.168.1.100
# 发包速率控制
nmap --min-rate 100 --max-rate 1000 192.168.1.100
网络优化脚本
#!/bin/bash
# optimized_scan.sh - 优化的网络扫描
TARGET="$1"
THREADS="${2:-50}"
if [ -z "$TARGET" ]; then
echo "使用方法: $0 <target> [threads]"
exit 1
fi
# 快速主机发现
echo "快速主机发现..."
nmap -sn -T5 --min-hostgroup "$THREADS" "$TARGET" | \
grep "Nmap scan report" | awk '{print $5}' > live_hosts.tmp
HOST_COUNT=$(wc -l < live_hosts.tmp)
echo "发现 $HOST_COUNT 个活跃主机"
if [ "$HOST_COUNT" -eq 0 ]; then
echo "未发现活跃主机"
rm live_hosts.tmp
exit 1
fi
# 快速端口扫描
echo "快速端口扫描..."
nmap -sS -T5 --top-ports 100 \
--min-hostgroup "$THREADS" \
--max-retries 1 \
--host-timeout 5m \
-iL live_hosts.tmp
# 清理临时文件
rm live_hosts.tmp
🔐 安全与合规
合规扫描
#!/bin/bash
# compliance_scan.sh - 合规性扫描
TARGET="$1"
POLICY="${2:-pci}" # pci, hipaa, soc2
if [ -z "$TARGET" ]; then
echo "使用方法: $0 <target> [policy]"
exit 1
fi
OUTPUT_DIR="./compliance_scan_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
echo "开始 $POLICY 合规性扫描: $TARGET"
case "$POLICY" in
"pci")
echo "PCI DSS 合规性检测..."
# SSL/TLS配置检测
nmap -p 443 --script ssl-enum-ciphers,ssl-cert "$TARGET" -oN "$OUTPUT_DIR/ssl_pci.txt"
# 弱加密检测
nmap -p 80,443 --script ssl-dh-params "$TARGET" -oN "$OUTPUT_DIR/weak_crypto.txt"
;;
"hipaa")
echo "HIPAA 合规性检测..."
# 加密传输检测
nmap --script ssl-cert,ssl-enum-ciphers "$TARGET" -oN "$OUTPUT_DIR/encryption.txt"
;;
"soc2")
echo "SOC 2 合规性检测..."
# 访问控制检测
nmap --script auth "$TARGET" -oN "$OUTPUT_DIR/access_control.txt"
;;
esac
echo "合规性扫描完成,结果保存在 $OUTPUT_DIR"
安全扫描最佳实践
#!/bin/bash
# secure_scan.sh - 安全扫描最佳实践
TARGET="$1"
if [ -z "$TARGET" ]; then
echo "使用方法: $0 <target>"
exit 1
fi
# 检查扫描权限
echo "检查扫描授权..."
read -p "您是否有权限扫描目标 $TARGET? (y/n): " permission
if [ "$permission" != "y" ]; then
echo "未获得扫描授权,退出"
exit 1
fi
# 创建输出目录
OUTPUT_DIR="./authorized_scan_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
# 记录扫描日志
exec > >(tee -a "$OUTPUT_DIR/scan.log")
exec 2>&1
echo "=== 授权安全扫描开始 ==="
echo "操作员: $(whoami)"
echo "时间: $(date)"
echo "目标: $TARGET"
echo "=================================="
# 1. 轻量级初始扫描
echo "1. 执行初始扫描..."
nmap -sS -T3 --top-ports 100 "$TARGET" -oA "$OUTPUT_DIR/initial"
# 2. 服务识别
echo "2. 服务识别..."
nmap -sV -T3 "$TARGET" -oA "$OUTPUT_DIR/services"
# 3. 安全脚本扫描(非侵入性)
echo "3. 安全检测(非侵入性)..."
nmap --script "safe and not intrusive" "$TARGET" -oA "$OUTPUT_DIR/security"
# 4. 生成报告
echo "4. 生成安全报告..."
{
echo "=== 安全扫描报告 ==="
echo "扫描时间: $(date)"
echo "目标: $TARGET"
echo ""
echo "=== 开放端口 ==="
grep -E "^[0-9]+" "$OUTPUT_DIR/initial.nmap"
echo ""
echo "=== 识别的服务 ==="
grep -E "^[0-9]+" "$OUTPUT_DIR/services.nmap"
echo ""
echo "=== 安全发现 ==="
grep -i "vulnerable\|warning\|risk" "$OUTPUT_DIR/security.nmap"
} > "$OUTPUT_DIR/security_report.txt"
echo "扫描完成,报告保存在: $OUTPUT_DIR/security_report.txt"
📚 实用命令速查
常用扫描组合
# 快速网络概览
nmap -sn -T4 192.168.1.0/24
# 基本安全扫描
nmap -sS -sV -O -T4 --script=default 192.168.1.100
# 全面漏洞扫描
nmap -sS -sV -O -T4 --script=vuln 192.168.1.100
# Web服务器扫描
nmap -p 80,443 -sV --script=http-* 192.168.1.100
# 数据库服务扫描
nmap -p 1433,1521,3306,5432 -sV --script=*-brute 192.168.1.100
# 邮件服务器扫描
nmap -p 25,110,143,993,995 -sV --script=smtp-*,pop3-*,imap-* 192.168.1.100
# DNS服务器扫描
nmap -p 53 -sU -sV --script=dns-* 192.168.1.100
输出处理
# 提取开放端口
grep "open" scan.nmap | awk '{print $1}' | cut -d'/' -f1
# 提取HTTP服务
grep -E "80|443|8080|8443" scan.nmap | grep "open"
# 统计扫描结果
grep "Nmap scan report" scan.nmap | wc -l
# 转换XML到HTML
xsltproc /usr/share/nmap/nmap.xsl scan.xml -o scan.html
# 合并多个扫描结果
cat scan1.xml scan2.xml > combined.xml
⚠️ 注意事项
法律和道德考虑
- 获得授权:始终确保有权限扫描目标网络
- 遵守法律:了解当地网络安全法律法规
- 负责任的披露:发现漏洞后按照负责任披露原则处理
- 最小影响:使用适当的扫描强度,避免影响业务
技术注意事项
- 防火墙检测:现代防火墙可能检测到扫描行为
- 日志记录:扫描活动会被目标系统记录
- 网络影响:大规模扫描可能影响网络性能
- 误报处理:验证扫描结果,避免误报
💡 小贴士: Nmap是一个强大的工具,但强大意味着责任。始终确保在授权范围内使用,并遵守相关法律法规。定期更新Nmap及其脚本数据库以获得最新的检测能力。