Nmap 网络侦察
概览
Nmap(Network Mapper)是网络发现、安全审计和漏洞评估的行业标准工具。这项技能提供了结构化的工作流程,用于授权的侦察操作,包括端口扫描、服务枚举、操作系统指纹识别和使用Nmap Scripting Engine(NSE)进行漏洞检测。
重要提示:网络扫描可能会造成干扰,必须在适当的授权下进行。在扫描非您拥有的网络或系统之前,始终确保获得书面许可。
快速开始
基本的主机发现和端口扫描:
# 快速扫描常用端口
nmap -F <目标IP>
# 扫描前1000个端口并检测服务
nmap -sV <目标IP>
# 综合扫描,包括操作系统检测和默认脚本
nmap -A <目标IP>
核心工作流程
网络侦察工作流程
进度: [ ] 1. 验证授权和范围 [ ] 2. 执行主机发现和资产枚举 [ ] 3. 对活动主机进行端口扫描 [ ] 4. 枚举服务和版本 [ ] 5. 执行操作系统指纹识别和检测 [ ] 6. 运行NSE脚本进行漏洞检测 [ ] 7. 记录结果并生成报告 [ ] 8. 验证结果并识别误报
系统地完成每个步骤。检查已完成的项目。
1. 授权验证
关键:在任何扫描活动之前:
- 确认网络所有者的书面授权
- 审查范围文件,以确定在范围内的IP范围和域名
- 验证扫描窗口和速率限制要求
- 记录紧急联系人以应对意外中断
- 确认黑名单主机(生产数据库、关键基础设施)
2. 主机发现
在目标网络中识别活动主机:
# ICMP回声(-PE):标准ping,通常被阻止
- TCP SYN(-PS):半开放连接到指定端口
- TCP ACK(-PA):发送ACK包,适用于有状态防火墙
- UDP(-PU):向指定端口发送UDP包
- ARP(-PR):第2层发现,仅在本地网络上有效
将活动主机输出到文件,以便后续扫描:
```bash
nmap -sn <目标网络>/24 -oG - | awk '/Up$/{print $2}' > live_hosts.txt
3. 端口扫描
扫描发现的主机以查找开放端口:
# 快速扫描(前100个端口)
nmap -F -iL live_hosts.txt
# 前1000个端口(默认)
nmap -iL live_hosts.txt
# 扫描所有65535个端口
nmap -p- -iL live_hosts.txt
# 扫描特定端口
nmap -p 22,80,443,3389,8080 -iL live_hosts.txt
# 扫描端口范围
nmap -p 1-1024,3000-9000 -iL live_hosts.txt
扫描技术:
-
TCP SYN扫描(-sS):默认,隐蔽的半开放扫描(需要root)
sudo nmap -sS <目标IP> -
TCP连接扫描(-sT):完整的TCP连接(不需要root)
nmap -sT <目标IP> -
UDP扫描(-sU):扫描UDP端口(慢但关键)
sudo nmap -sU -p 53,161,500 <目标IP> -
版本检测(-sV):探测服务版本信息
nmap -sV <目标IP> -
积极扫描(-A):启用操作系统检测、版本检测、脚本扫描、traceroute
sudo nmap -A <目标IP>
定时和性能:
# 极度谨慎(0)-极慢,IDS规避
nmap -T0 <目标IP>
# 隐蔽(1)-非常慢,IDS规避
nmap -T1 <目标IP>
# 礼貌(2)-减慢速度以减少带宽使用
nmap -T2 <目标IP>
# 正常(3)-默认定时
nmap -T3 <目标IP>
# 积极(4)-更快,假设可靠的网络
nmap -T4 <目标IP>
# 疯狂(5)-非常快,可能会错过结果
nmap -T5 <目标IP>
安全限速:
# 限制为每秒100包
nmap --max-rate 100 <目标IP>
# 最小10包/秒
nmap --min-rate 10 <目标IP>
# 扫描延迟以避免检测
nmap --scan-delay 1s <目标IP>
4. 服务枚举
识别服务并提取版本信息:
# 服务版本检测
nmap -sV <目标IP>
# 积极版本检测(更多探测)
nmap -sV --version-intensity 5 <目标IP>
# 轻量版本检测(更少探测,更快)
nmap -sV --version-intensity 0 <目标IP>
# 特定服务枚举
nmap -sV -p 80,443 --script=http-headers,http-title <目标IP>
服务特定枚举:
# SMB枚举
nmap -p 445 --script=smb-os-discovery,smb-security-mode <目标IP>
# SSH枚举
nmap -p 22 --script=ssh-hostkey,ssh-auth-methods <目标IP>
# DNS枚举
nmap -p 53 --script=dns-nsid,dns-recursion <目标IP>
# HTTP/HTTPS枚举
nmap -p 80,443 --script=http-methods,http-robots.txt,http-title <目标IP>
# 数据库枚举
nmap -p 3306 --script=mysql-info <目标IP>
nmap -p 5432 --script=pgsql-brute <目标IP>
nmap -p 1433 --script=ms-sql-info <目标IP>
5. 操作系统检测
识别目标操作系统:
# 操作系统检测
sudo nmap -O <目标IP>
# 积极操作系统检测与版本扫描
sudo nmap -A <目标IP>
# 限制操作系统检测到有希望的目标
sudo nmap -O --osscan-limit <目标IP>
# 积极猜测操作系统
sudo nmap -O --osscan-guess <目标IP>
操作系统指纹识别指标:
- TCP/IP栈特征
- 开放端口模式
- 服务横幅和版本
- TTL值和TCP窗口大小
6. NSE脚本扫描
Nmap Scripting Engine用于高级侦察和漏洞检测:
# 运行默认NSE脚本
nmap -sC <目标IP>
# 运行所有类别的脚本
nmap --script=vuln <目标IP>
nmap --script=exploit <目标IP>
nmap --script=discovery <目标IP>
# 运行特定脚本
nmap --script=http-sql-injection <目标IP>
# 多个脚本
nmap --script=smb-vuln-ms17-010,smb-vuln-cve-2017-7494 <目标IP>
# 带参数的脚本
nmap --script=http-brute --script-args http-brute.path=/admin <目标IP>
NSE脚本类别:
- auth:认证测试
- broadcast:网络广播/多播发现
- brute:暴力破解密码审计
- default:默认安全脚本(-sC)
- discovery:网络和服务发现
- dos:拒绝服务测试(慎用)
- exploit:利用尝试(仅限授权)
- external:外部资源查询(WHOIS等)
- fuzzer:模糊攻击
- intrusive:侵入性扫描(可能导致服务崩溃)
- malware:恶意软件检测
- safe:不太可能导致服务崩溃的安全脚本
- version:版本检测增强
- vuln:漏洞检测
常见漏洞检测脚本:
# 检查永恒之蓝(MS17-010)
nmap -p 445 --script=smb-vuln-ms17-010 <目标IP>
# 心脏出血检测
nmap -p 443 --script=ssl-heartbleed <目标IP>
# 壳震检测
nmap --script=http-shellshock --script-args uri=/cgi-bin/test.sh <目标IP>
# 检查弱SSL/TLS
nmap -p 443 --script=ssl-enum-ciphers <目标IP>
# SQL注入测试
nmap -p 80 --script=http-sql-injection <目标IP>
# 检查匿名FTP
nmap -p 21 --script=ftp-anon <目标IP>
7. 输出和报告
生成多种格式的报告:
# 正常输出到屏幕和文件
nmap <目标IP> -oN scan_results.txt
# XML输出(用于解析/导入)
nmap <目标IP> -oX scan_results.xml
# Grepable输出(易于解析)
nmap <目标IP> -oG scan_results.gnmap
# 所有格式
nmap <目标IP> -oA scan_results
# 脚本小子输出(娱乐)
nmap <目标IP> -oS scan_results.skid
转换和处理结果:
# 将XML转换为HTML报告
xsltproc /usr/share/nmap/nmap.xsl scan_results.xml -o report.html
# 使用Python解析XML
python3 -c "import xml.etree.ElementTree as ET; tree = ET.parse('scan_results.xml'); root = tree.getroot(); [print(host.find('address').get('addr')) for host in root.findall('host')]"
# 从grepable输出中提取开放端口
grep 'Ports:' scan_results.gnmap | awk '{print $2, $5}'
8. 防火墙和IDS规避
规避检测的技术(仅限授权测试):
# 分片数据包
sudo nmap -f <目标IP>
# 使用诱饵
sudo nmap -D RND:10 <目标IP>
sudo nmap -D decoy1,decoy2,ME,decoy3 <目标IP>
# 伪造源IP(需要原始数据包权限)
sudo nmap -S <伪造IP> -e <接口> <目标IP>
# 随机化目标顺序
nmap --randomize-hosts -iL targets.txt
# 使用代理
nmap --proxies http://proxy:8080 <目标IP>
# 空闲扫描(需要僵尸主机)
sudo nmap -sI <僵尸主机> <目标IP>
安全考虑
授权和法律合规
- 书面许可:在扫描任何网络之前获得明确的授权
- 范围定义:仅扫描明确授权的IP范围和端口
- 干扰风险:某些扫描(DOS、利用脚本)可能导致服务崩溃
- 隐私:服务枚举可能暴露敏感信息
- 日志追踪:扫描活动通常被防火墙和IDS记录
运营安全
- 限速:使用
--max-rate以避免压倒目标 - 定时:在批准的维护窗口期间安排扫描
- 带宽:考虑对大型扫描的网络影响
- 噪音:积极的扫描很容易被安全监控检测到
- 误报:在报告漏洞之前验证发现
审计日志
记录所有侦察活动:
- 扫描开始和结束时间戳
- 源IP地址和扫描器主机名
- 扫描的IP范围和端口
- 使用的Nmap命令行参数
- 发现的主机数量和找到的端口
- 通过NSE脚本识别的漏洞
- 任何服务中断或异常
合规性
- PTES:渗透测试执行标准(PTES)的侦察阶段
- OWASP:网络安全ASVS验证要求
- MITRE ATT&CK:T1046(网络服务扫描)
- PCI-DSS 11.2:外部和内部漏洞扫描
- ISO 27001:A.12.6技术漏洞管理
常见模式
模式1:外部边界评估
# 第1阶段:识别活动主机
nmap -sn -PE -PS80,443 -PA3389 <外部网络>/24 -oG - | awk '/Up$/{print $2}' > external_hosts.txt
# 第2阶段:扫描常见外部服务
nmap -Pn -sV -p 21,22,25,53,80,110,143,443,587,993,995,3389,8080,8443 -iL external_hosts.txt -oA external_scan
# 第3阶段:漏洞检测
nmap -Pn -sV --script=vuln -p 21,22,25,80,443,3389,8080,8443 -iL external_hosts.txt -oA external_vulns
# 第4阶段:SSL/TLS安全审计
nmap -Pn -p 443,8443 --script=ssl-enum-ciphers,ssl-cert -iL external_hosts.txt -oA ssl_audit
模式2:内部网络映射
# 第1阶段:快速主机发现
nmap -sn -PR <内部网络>/24 -oG - | awk '/Up$/{print $2}' > internal_hosts.txt
# 第2阶段:全面的端口扫描
nmap -sV -p- -T4 -iL internal_hosts.txt -oA internal_full_scan
# 第3阶段:操作系统指纹识别
sudo nmap -O -iL internal_hosts.txt -oA internal_os_detection
# 第4阶段:服务枚举
nmap -sV --script=default,discovery -iL internal_hosts.txt -oA internal_services
模式3:Web应用程序发现
# 识别Web服务器
nmap -p 80,443,8000,8080,8443 --open -oG - <目标网络>/24 | grep 'open' | awk '{print $2}' > web_servers.txt
# 枚举Web技术
nmap -sV -p 80,443,8080,8443 --script=http-enum,http-headers,http-methods,http-title,http-server-header -iL web_servers.txt -oA web_enum
# 检查常见Web漏洞
nmap -p 80,443 --script=http-sql-injection,http-csrf,http-vuln-cve2017-5638 -iL web_servers.txt -oA web_vulns
模式4:SMB/CIFS安全审计
# 枚举SMB主机
nmap -p 445 --open <目标网络>/24 -oG - | grep 'open' | awk '{print $2}' > smb_hosts.txt
# SMB版本和配置
nmap -p 445 --script=smb-protocols,smb-security-mode,smb-os-discovery -iL smb_hosts.txt -oA smb_enum
# 检查SMB漏洞
nmap -p 445 --script=smb-vuln* -iL smb_hosts.txt -oA smb_vulns
# 枚举共享(可能需要认证)
nmap -p 445 --script=smb-enum-shares,smb-enum-users -iL smb_hosts.txt -oA smb_shares
模式5:数据库服务器发现
# 扫描常用数据库端口
nmap -sV -p 1433,1521,3306,5432,5984,6379,9200,27017 <目标网络>/24 -oA database_scan
# MySQL枚举
nmap -p 3306 --script=mysql-info,mysql-databases,mysql-variables <目标IP>
# PostgreSQL枚举
nmap -p 5432 --script=pgsql-brute <目标IP>
# MongoDB枚举
nmap -p 27017 --script=mongodb-info,mongodb-databases <目标IP>
# Redis枚举
nmap -p 6379 --script=redis-info <目标IP>
集成点
CI/CD集成
在管道中自动进行安全扫描:
#!/bin/bash
# ci_network_scan.sh - 持续网络安全验证
TARGET_NETWORK="$1"
OUTPUT_DIR="scan_results/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$OUTPUT_DIR"
# 快速安全扫描
nmap -Pn -sV --script=vuln -p 21,22,25,80,443,3389,8080 \
"$TARGET_NETWORK" -oA "$OUTPUT_DIR/security_scan"
# 解析结果以找出关键发现
if grep -i "VULNERABLE" "$OUTPUT_DIR/security_scan.nmap"; then
echo "CRITICAL: Vulnerabilities detected!"
exit 1
fi
echo "Security scan completed successfully"
exit 0
安全工具集成
- Metasploit集成:使用
db_import导入Nmap XML - 漏洞扫描器:将Nmap结果输入Nessus、OpenVAS、Qualys
- SIEM集成:解析Nmap输出以进行安全监控
- 资产管理:使用发现的主机和服务更新CMDB
- Shodan/Censys:验证外部暴露发现
MITRE ATT&CK映射
将Nmap侦察映射到ATT&CK框架:
- 侦察:T1595(主动扫描)
- T1595.001(扫描IP块)
- T1595.002(漏洞扫描)
- 发现:T1046(网络服务扫描)
- 发现:T1040(网络嗅探)
- 凭证访问:T1110(暴力破解)-当使用NSE暴力脚本时
故障排除
问题:尽管主机在线,但没有结果
原因:
- 由防火墙阻止ICMP
- 主机防火墙丢弃探测
- 网络ACL过滤流量
解决方案:
# 跳过ping,假设所有主机都在线
nmap -Pn <目标IP>
# 尝试TCP ping而不是ICMP
nmap -PS80,443 -PA3389 <目标IP>
# 尝试多种发现技术
nmap -PE -PS22,80,443 -PA3389 -PU53,161 <目标IP>
问题:扫描太慢
解决方案:
# 增加定时模板
nmap -T4 <目标IP>
# 扫描较少的端口
nmap -F <目标IP> # 前100个端口
nmap --top-ports 1000 <目标IP>
# 通过拆分目标并行化
nmap -T4 192.168.1.1-50 &
nmap -T4 192.168.1.51-100 &
nmap -T4 192.168.1.101-150 &
wait
# 使用masscan进行非常快速的端口扫描
masscan -p 1-65535 --rate 10000 <目标网络>/24
问题:漏洞脚本中的误报
解决方案:
- 手动使用特定漏洞工具验证发现
- 检查服务版本与CVE数据库
- 使用
--version-intensity 9进行更准确的版本检测 - 运行特定漏洞NSE脚本而不是宽泛类别
- 与经过身份验证的漏洞扫描器交叉参考
问题:被防火墙/IDS阻止
解决方案:
# 降低扫描速度
nmap -T1 --scan-delay 1s <目标IP>
# 分片数据包
sudo nmap -f <目标IP>
# 随机化扫描顺序
nmap --randomize-hosts -iL targets.txt
# 使用源端口53(通常被允许)
nmap -g 53 <目标IP>
# 将扫描分成更小的部分,分时进行
nmap -p 1-1000 <目标IP>
# 等待几个小时
nmap -p 1001-2000 <目标IP>
防御性考虑
组织可以通过以下方式检测Nmap扫描:
- 网络IDS:扫描模式的签名检测(垂直/水平扫描)
- 防火墙日志:单个源的多次连接尝试
- 端口扫描检测:监视未完成的SYN包
- 蜜罐:触发警报时访问诱饵服务
- 流量分析:不寻常的数据包模式(分片、定时异常)
增强防御姿态:
- 部署网络入侵检测系统(Snort、Suricata)
- 启用防火墙日志记录并监视扫描模式
- 对敏感服务使用端口敲击或服务隐藏
- 在边界防火墙上实施速率限制
- 部署蜜罐以检测和跟踪侦察