适用场景
本教程适用于网络安全运维人员、渗透测试工程师和开发者,需要通过网络流量抓包分析来排查安全威胁的场景。典型应用包括:分析恶意软件的 C2 通信模式、检测未加密的敏感数据传输、识别 DNS 隧道攻击、定位慢速攻击的源特征、验证 WAF 规则是否生效等。
前置条件
- 安装了 Wireshark 的 Windows/Linux/macOS 机器(下载地址)
- 管理员/root 权限(抓包需要 RAW socket 权限)
- 基本的 TCP/IP 网络协议知识
Linux 下通过命令行安装:
# Ubuntu/Debian
sudo apt-get install -y wireshark tshark
# CentOS/RHEL
sudo yum install -y wireshark
# 将当前用户加入 wireshark 组(避免每次 sudo)
sudo usermod -aG wireshark $USER
# 重新登录后生效
原理说明
Wireshark 是目前最广泛使用的网络协议分析工具,基于 libpcap/WinPcap 库捕获网卡上的原始数据包。其工作流程为:
- 捕获:网卡设置为混杂模式(promiscuous mode),捕获所有经过的数据包
- 过滤:使用 BPF(Berkeley Packet Filter)语法实时筛选感兴趣的数据流
- 分析:对捕获的包进行协议解析,逐层展示以太网帧、IP 头、TCP/UDP 段、应用层负载
- 追踪:通过”Follow TCP Stream”功能重建完整的应用层会话内容
抓包分析在网络安全上的核心价值在于:攻击者的行为必然在网络层留下痕迹,而 Wireshark 可以让这些痕迹变得可视化。
操作步骤
步骤一:选择正确的捕获接口
# 命令行:列出所有可用接口
tshark -D
# Wireshark GUI:启动后选择 Capture → Options
# 通常选择:
# - eth0/ens33:有线网卡(服务器流量)
# - wlan0:无线网卡
# - any:所有接口(Linux 特有)
在云服务器上抓包时,注意选择正确的虚拟网卡(如 eth0、ens5)。如不确定,先运行 ip addr 确认活跃接口。
步骤二:配置捕获过滤器(Capture Filter)
BPF 语法在捕获阶段过滤,减少不必要的包量:
# 仅捕获目标端口 80 和 443 的 TCP 流量
tcp port 80 or tcp port 443
# 仅捕获来自/去往特定 IP 的流量
host 192.168.1.100
# 仅捕获 DNS 查询和响应
port 53
# 排除 SSH 流量(避免自己产生的大量干扰数据)
not port 22
# 组合:捕获特定 IP 的 HTTP/HTTPS 流量,排除 SSH
host 10.0.0.5 and (tcp port 80 or tcp port 443) and not port 22
步骤三:使用显示过滤器(Display Filter)分析威胁
显示过滤器在捕获后应用,语法比 BPF 更强大,支持协议字段级过滤:
1. 检测未加密的 HTTP 登录
http.request.method == "POST" and http contains "password"
在 Follow TCP Stream 中可以直接看到明文用户名密码。
2. 识别 DNS 隧道攻击
dns.qry.name.len > 30 and dns.flags.response == 0
DNS 隧道通常使用超长子域名编码数据,查询长度显著超过正常值(正常 DNS 查询通常 < 30 字符)。
3. 检测端口扫描
tcp.flags.syn == 1 and tcp.flags.ack == 0 and tcp.flags.reset == 1
SYN-ACK-RST 三连模式是端口扫描的典型特征。大量不同目标端口的 SYN 包(无后继 ACK)表明 SYN 扫描。
4. 发现异常大包(可能的数据泄露)
frame.len > 1000 and tcp.port == 80
正常 HTTP 请求通常较小,响应体大的页面可能需要排除 CDN 资源。结合 data.len 过滤出站方向的异常大包。
5. 定位 Slowloris 慢速攻击
http.request and frame.time_delta > 10
Slowloris 攻击者会缓慢发送 HTTP headers,包间延迟远高于正常浏览器。过滤出包间隔 > 10 秒的 HTTP 请求。
步骤四:Follow TCP Stream 重建会话
在 Wireshark GUI 中:
# 选中任意一个感兴趣的包 → 右键 → Follow → TCP Stream
# 或快捷键:Ctrl+Alt+Shift+T
命令行方式:
# 先导出特定流
tshark -r capture.pcap -Y "tcp.stream eq 0" -T fields -e tcp.payload
# 或直接查看 HTTP 请求+响应
tshark -r capture.pcap -Y "http" -T fields -e http.request.full_uri -e http.response.code
通过 TCP Stream 可以完整看到客户端和服务器的对话,包括未加密的凭据、SQL 注入载荷、XSS payload 等攻击内容。
步骤五:统计与导出报告
# 协议层级统计
tshark -r capture.pcap -z io,phs
# HTTP 请求统计
tshark -r capture.pcap -Y "http.request" -T fields -e http.host -e http.request.uri | sort | uniq -c | sort -rn | head -20
# 端点统计(哪些 IP 通信量最大)
tshark -r capture.pcap -z endpoints,ip
# 导出特定对话
tshark -r capture.pcap -Y "ip.addr == 10.0.0.5" -w filtered.pcap
步骤六:实战案例——分析 SQL 注入尝试
# 捕获期间过滤 HTTP POST 请求
tshark -i eth0 -Y "http.request.method == POST" -T fields -e http.host -e http.request.uri -e http.file_data
# 查找包含 SQL 关键字的包
tshark -r capture.pcap -Y "http contains \"SELECT\" or http contains \"UNION\" or http contains \"1=1\"" -T fields -e frame.number -e http.request.uri -e http.file_data
配置验证
# 验证抓包本身正常工作
tshark -i eth0 -c 10 # 捕获 10 个包后自动停止
# 验证 pcap 文件可读
tshark -r capture.pcap -q -z io,stats
# 测试 BPF 过滤器
tcpdump -i eth0 -c 5 "tcp port 80" # 与 Wireshark 共享 BPF 语法,先用 tcpdump 确认过滤器正确
常见问题
Q1:抓包时只能看到自己的包(没有其他流量)?
有两种可能:① 在交换机网络中,非镜像端口无法看到其他主机的流量(需要端口镜像/SPAN);② 在云环境中,虚拟交换机默认隔离。解决方案:在目标主机上直接抓包,或配置 VPC 流量镜像/安全日志。云服务器建议将 Wireshark 直接安装在目标机器上。
Q2:pcap 文件太大,如何分段?
# 按文件大小分片(每片 100MB)
tshark -i eth0 -b filesize:102400 -b files:5 -w capture.pcap
# 按时间分片(每 30 分钟一个文件)
tshark -i eth0 -b duration:1800 -b files:10 -w capture.pcap
参数 -b filesize 按 KB 计算(102400 = 100MB),-b files 最多保留 N 个文件(循环覆盖)。对于持续监控场景,建议配合 logrotate 管理抓包文件。
Q3:Wireshark 显示很多 TCP Retransmission,是攻击吗?
不一定。TCP 重传可能由网络拥塞、链路质量问题、服务器负载过高导致。如果大量重传集中在特定 IP 且伴随 ZeroWindow 通告,则可能是攻击者在耗尽目标连接资源(如 Slowloris 或 SYN flood)。通过 tcp.analysis.retransmission 过滤可以定位问题流。
总结
Wireshark 是网络安全分析中最基础也最强大的工具之一。通过精确设置捕获和显示过滤器,可以从海量流量中快速定位攻击特征。建议将此技能与入侵检测系统(IDS)配合使用——先用 Suricata/Snort 生成告警,再用 Wireshark 深度分析告警对应的流量。定期对关键服务器的流量进行抓包审计,是发现隐蔽威胁的有效手段。