🎯 Nmap扫描 — 端口发现与服务识别

安全评估的第一步:发现目标、识别服务

📖 Nmap简介

Nmap(Network Mapper)是网络安全领域最知名的扫描工具,被全球安全专业人员广泛使用。它可以发现主机、识别开放端口、检测服务和操作系统。在渗透测试中,Nmap是侦察阶段的核心工具。

Nmap扫描流程 ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ 主机发现 │───→│ 端口扫描 │───→│ 服务识别 │───→│ OS检测 │ │ -sP/-sn │ │ -sS/-sT │ │ -sV │ │ -O │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ 哪些主机存活? 哪些端口开放? 运行什么服务? 什么操作系统? │ │ │ │ └───────────────┴───────────────┴───────────────┘ 攻击面分析

🔍 主机发现

在扫描端口之前,先确定目标网络中有哪些存活主机。

# 安装Nmap
apt install nmap          # Debian/Ubuntu
yum install nmap          # CentOS/RHEL

# Ping扫描(发现存活主机)
nmap -sn 192.168.1.0/24   # 扫描整个C段
nmap -sn 10.0.0.1-50      # 扫描IP范围
nmap -sn 192.168.1.*      # 通配符扫描

# 不使用Ping(跳过主机发现,直接扫描端口)
nmap -Pn 192.168.1.100    # 防火墙可能阻止ping,跳过

# 仅使用ARP Ping(同网段最快)
nmap -PR -sn 192.168.1.0/24

# 使用特定端口做主机发现
nmap -PS22,80,443 -sn 192.168.1.0/24   # TCP SYN Ping
nmap -PA80 -sn 192.168.1.0/24          # TCP ACK Ping
nmap -PU53 -sn 192.168.1.0/24          # UDP Ping

# 使用ICMP做主机发现
nmap -PE -sn 192.168.1.0/24            # ICMP Echo
nmap -PP -sn 192.168.1.0/24            # ICMP Timestamp
nmap -PM -sn 192.168.1.0/24            # ICMP Address Mask

🎯 端口扫描技术

端口扫描是Nmap的核心功能。不同的扫描技术适用于不同场景。

扫描类型参数原理特点
TCP SYN-sS半开连接快速隐蔽,需root
TCP Connect-sT完整连接无需root,可被记录
UDP-sUUDP探测慢,发现DNS/SNMP
TCP ACK-sAACK探测检测防火墙规则
TCP Window-sW窗口大小检测开放端口
Maimon-sMFIN+ACK绕过某些防火墙

常用端口扫描命令

# SYN扫描(最常用,需root权限)
sudo nmap -sS 192.168.1.100

# TCP Connect扫描(无需root)
nmap -sT 192.168.1.100

# UDP扫描(慢但重要)
sudo nmap -sU 192.168.1.100

# 扫描指定端口
nmap -p 22,80,443 192.168.1.100        # 指定端口
nmap -p 1-1000 192.168.1.100           # 端口范围
nmap -p- 192.168.1.100                 # 全端口扫描(65535)
nmap -p 80,443,8080,8443 192.168.1.0/24  # Web常用端口

# 快速扫描(Top 100端口)
nmap -F 192.168.1.100

# 扫描速度控制
nmap -T0 192.168.1.100    # 极慢( IDS逃避)
nmap -T1 192.168.1.100    # 慢速
nmap -T3 192.168.1.100    # 默认
nmap -T4 192.168.1.100    # 快速(推荐)
nmap -T5 192.168.1.100    # 极快(可能不准)

扫描结果解读

# 典型Nmap扫描输出
$ nmap -sS -sV -p 22,80,443,3306,8080 192.168.1.100

PORT     STATE  SERVICE  VERSION
22/tcp   open   ssh      OpenSSH 8.9p1 Ubuntu
80/tcp   open   http     Apache httpd 2.4.52
443/tcp  open   https    nginx 1.24.0
3306/tcp open   mysql    MySQL 8.0.32
8080/tcp closed http-proxy

# STATE字段含义:
# open      → 端口开放,服务正在监听
# closed    → 端口关闭,但主机可达
# filtered  → 被防火墙阻止,无法确定
# unfiltered → 可达但无法判断开放/关闭

🔧 服务与OS识别

# 服务版本检测
nmap -sV 192.168.1.100              # 基础版本检测
nmap -sV --version-intensity 5 192.168.1.100  # 中等强度
nmap -sV --version-all 192.168.1.100          # 最高强度(最慢)

# 操作系统检测
sudo nmap -O 192.168.1.100          # OS指纹识别
sudo nmap -O --osscan-guess 192.168.1.100  # 更积极猜测

# 综合扫描(最常用的组合)
sudo nmap -sS -sV -O -A 192.168.1.100
# -A = 启用OS检测、版本检测、脚本扫描、traceroute

# 典型输出
# OS details: Linux 5.x
# Network Distance: 2 hops
# TCP Sequence Prediction: Difficulty=261 (Good luck!)

📜 NSE脚本引擎

Nmap Scripting Engine (NSE) 是Nmap最强大的功能,提供了600+安全检测脚本。

# 脚本分类
nmap --script-help "default"        # 默认脚本
nmap --script-help "vuln"           # 漏洞检测脚本
nmap --script-help "exploit"        # 漏洞利用脚本
nmap --script-help "auth"           # 认证相关脚本
nmap --script-help "discovery"      # 信息发现脚本

# 常用脚本扫描
# 检测已知漏洞
nmap --script vuln 192.168.1.100

# SMB漏洞检测
nmap --script smb-vuln* -p 445 192.168.1.100

# SSL/TLS检测
nmap --script ssl-enum-ciphers -p 443 192.168.1.100
nmap --script ssl-heartbleed -p 443 192.168.1.100

# HTTP枚举
nmap --script http-enum -p 80 192.168.1.100
nmap --script http-headers -p 80 192.168.1.100
nmap --script http-sql-injection -p 80 192.168.1.100

# DNS区域传输
nmap --script dns-zone-transfer -p 53 192.168.1.100

# SSH算法检测
nmap --script ssh2-enum-algos -p 22 192.168.1.100

# MySQL空密码检测
nmap --script mysql-empty-password -p 3306 192.168.1.100

# 运行多个脚本
nmap --script "http-enum,http-headers,http-methods" -p 80 192.168.1.100

🛡️ 规避与防御

IDS/IPS规避技术

# 碎片化扫描
nmap -f 192.168.1.100              # 小碎片
nmap --mtu 24 192.168.1.100       # 指定MTU

# 诱饵扫描
nmap -D RND:10 192.168.1.100      # 随机10个诱饵
nmap -D decoy1,decoy2,ME 192.168.1.100  # 指定诱饵

# 空闲扫描(使用僵尸主机)
nmap -sI zombie-host 192.168.1.100

# 随机化扫描顺序
nmap --randomize-hosts 192.168.1.0/24

# 源端口欺骗
nmap --source-port 53 192.168.1.100  # 伪装为DNS流量
nmap --source-port 80 192.168.1.100  # 伪装为HTTP流量

# MAC地址欺骗
nmap --spoof-mac 0 192.168.1.100     # 随机MAC
nmap --spoof-mac Apple 192.168.1.100 # 伪装Apple设备

# 数据包延迟
nmap --scan-delay 1s 192.168.1.100   # 每个包延迟1秒
nmap --max-rate 10 192.168.1.100     # 限制每秒10个包

防御Nmap扫描

# 1. 关闭不必要端口
ss -tlnp                             # 查看监听端口
systemctl disable unnecessary-service

# 2. 配置防火墙
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -j DROP             # 默认拒绝

# 3. 隐藏服务版本
# Nginx: server_tokens off;
# Apache: ServerTokens Prod
# SSH: 修改banner

# 4. 端口敲击(Port Knocking)
# 只有按特定顺序访问端口才开放服务

# 5. 部署IDS/IPS
# Snort/Suricata可以检测和阻止扫描行为

📋 输出与报告

# 保存扫描结果
nmap -oN scan.txt 192.168.1.100       # 标准输出
nmap -oX scan.xml 192.168.1.100       # XML格式
nmap -oG scan.gnmap 192.168.1.100     # Grepable格式
nmap -oA scan 192.168.1.100           # 所有格式

# 生成HTML报告
xsltproc scan.xml -o scan.html        # XML转HTML

# 比较两次扫描结果
ndiff scan1.xml scan2.xml

# 实用组合命令
# 扫描整个网段,识别Web服务器
nmap -sS -p 80,443,8080 -oG web-servers.gnmap 192.168.1.0/24
grep "open" web-servers.gnmap
Nmap扫描 — 你已掌握主机发现、端口扫描技术、服务版本识别、NSE脚本、IDS规避和防御策略!
命令已验证:nmap -sT/nmap -sV/nmap -p/nmap --script — 所有命令在Docker沙箱验证通过
课后思考题:
  1. SYN扫描(-sS)和Connect扫描(-sT)的区别是什么?各自适用什么场景?
  2. 如何区分端口状态为filteredclosed?它们在安全意义上有什么区别?
  3. 为什么说Nmap的NSE脚本比单纯的端口扫描更有价值?
  4. 诱饵扫描(-D)的原理是什么?目标如何识别真实扫描源?

📚 进阶资源

参考资料:Nmap Network Scanning (Gordon Lyon) | nmap(1) | NSE Documentation | RFC 793