安全评估的第一步:发现目标、识别服务
Nmap(Network Mapper)是网络安全领域最知名的扫描工具,被全球安全专业人员广泛使用。它可以发现主机、识别开放端口、检测服务和操作系统。在渗透测试中,Nmap是侦察阶段的核心工具。
在扫描端口之前,先确定目标网络中有哪些存活主机。
# 安装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 | -sU | UDP探测 | 慢,发现DNS/SNMP |
| TCP ACK | -sA | ACK探测 | 检测防火墙规则 |
| TCP Window | -sW | 窗口大小 | 检测开放端口 |
| Maimon | -sM | FIN+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 → 可达但无法判断开放/关闭
# 服务版本检测
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!)
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
# 碎片化扫描
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个包
# 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
filtered和closed?它们在安全意义上有什么区别?