recon-nmapSkill recon-nmap

网络侦察和安全审计工具,使用Nmap进行端口扫描、服务枚举和漏洞检测。

渗透测试 0 次安装 0 次浏览 更新于 3/1/2026

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)
  • 启用防火墙日志记录并监视扫描模式
  • 对敏感服务使用端口敲击或服务隐藏
  • 在边界防火墙上实施速率限制
  • 部署蜜罐以检测和跟踪侦察

参考资料