Wireshark 抓包分析安全事件实战:从流量中揪出攻击者
引言
安全事件响应中,最头疼的问题往往不是攻击本身,而是“证据在哪里”。当系统被入侵、数据被窃取或服务异常时,日志可能被篡改、进程可能被清除,但网络流量是攻击者无法完全抹去的痕迹。Wireshark 作为业界最强大的网络协议分析工具,能让我们直接“看到”数据包中的每一个字节,还原攻击链的完整画面。

本文将从真实安全事件出发,手把手演示如何使用 Wireshark 分析恶意软件通信、检测数据外泄、识别端口扫描和暴力破解行为。所有操作均基于实际抓包文件,你可以跟随步骤复现分析过程。
环境准备
在开始之前,确保你已安装 Wireshark 3.x 以上版本,并准备以下抓包文件(可使用 tcpdump 自行捕获或下载公开样本):
- 恶意软件通信样本:
malware_communication.pcap - 暴力破解 SSH 样本:
ssh_bruteforce.pcap - DNS 隧道样本:
dns_tunnel.pcap
安装命令(Ubuntu/Debian):
sudo apt update && sudo apt install wireshark tshark
实战一:从恶意软件通信中提取 C2 地址
场景描述
某企业内网一台 Windows 服务器出现异常出站连接,安全团队怀疑已感染后门程序。通过镜像交换机端口捕获了 30 分钟的流量。
步骤 1:筛选可疑流量
打开 malware_communication.pcap,首先查看整体流量统计:
Statistics → Protocol Hierarchy
观察 HTTP、HTTPS、DNS 和 ICMP 的占比。如果发现大量非标准端口或异常协议,立即标记。
步骤 2:定位异常 DNS 查询
恶意软件常使用 DNS 隧道或频繁查询特定域名进行通信。使用显示过滤器:
dns.qry.name contains "."
重点关注:
– 查询间隔极短(<1 秒)的域名
– 包含随机字符串的子域名(如 asdjkla23.malware.com)
– 从未见过的顶级域名(如 .xyz、.top)
步骤 3:追踪 HTTP 通信
恶意软件可能通过 HTTP POST 发送窃取的数据。过滤 HTTP 请求:
http.request
查看 User-Agent 字段,攻击者常伪造为常见浏览器但版本过旧。分析请求体内容:
Follow → HTTP Stream
如果看到 Base64 编码数据或明文凭据,立即提取。
步骤 4:识别非标准端口通信
使用过滤器筛选高编号端口:
tcp.port >= 1024 && tcp.port <= 65535
检查 SYN 包的目的端口。常见 C2 端口包括 4444、8080、8443 等。右键可疑包 → Follow → TCP Stream,查看数据内容。
实战结果
在某次分析中,我们发现内网主机持续向 185.xxx.xxx.xxx:8080 发送包含 Base64 编码数据的 HTTP POST 请求。解码后是系统用户名、进程列表和最近打开的文档路径——典型的侦察行为。
实战二:检测 DNS 隧道数据外泄
场景描述
安全设备告警显示某台服务器 DNS 查询量异常升高,怀疑利用 DNS 协议外泄数据。
步骤 1:统计 DNS 查询频率
使用 Wireshark 的 IO Graph 功能:
Statistics → IO Graph
设置 Y 轴为 Packets/Tick,过滤条件为 dns。正常网络 DNS 查询应呈平稳分布,若出现周期性尖峰则异常。
步骤 2:分析 DNS 查询特征
筛选出所有 DNS 查询:
dns.flags.response == 0
观察查询域名模式。合法域名通常包含有意义的单词,而 DNS 隧道域名呈现:
– 高熵:子域名部分包含大量随机字符(如 3f8a2b1c9d.example.com)
– 长度异常:单个子域名超过 30 字节
– 频繁 NXDOMAIN 响应:查询的域名不存在
步骤 3:提取编码数据
找到可疑 DNS 查询包后,提取子域名部分。使用 tshark 命令批量提取:
tshark -r dns_tunnel.pcap -Y "dns.flags.response == 0" -T fields -e dns.qry.name > queries.txt
使用 Python 脚本解码 Base32/Base64 编码的数据:
import base64
with open('queries.txt') as f:
for line in f:
domain = line.strip()
subdomain = domain.split('.')[0]
try:
decoded = base64.b64decode(subdomain + '==')
print(decoded)
except:
pass
实战结果
在某次红队演练中,我们发现攻击者通过 DNS 查询将 /etc/passwd 文件分片编码后传输。每个查询包含 32 字节的 Base64 数据,通过 200+ 次查询完成外泄。
实战三:识别 SSH 暴力破解
场景描述
云服务器日志显示大量 SSH 登录失败记录,但不确定攻击源 IP 和攻击模式。
步骤 1:过滤 SSH 流量
使用过滤器:
tcp.port == 22
观察 SYN 包数量。正常 SSH 连接每秒不超过 2 个 SYN,暴力破解通常每秒 10-50 个。
步骤 2:分析连接尝试频率
使用 Conversations 统计:
Statistics → Conversations → TCP
按 Packets 降序排序。攻击者 IP 会与目标 IP 产生大量短连接(每个连接仅 3-4 个包)。
步骤 3:提取攻击者 IP
使用 tshark 提取所有 SSH 连接的源 IP:
tshark -r ssh_bruteforce.pcap -Y "tcp.port==22 and tcp.flags.syn==1 and tcp.flags.ack==0" -T fields -e ip.src | sort | uniq -c | sort -nr
输出示例:
1542 192.168.1.100
23 10.0.0.5
1 8.8.8.8
源 IP 192.168.1.100 发起 1542 次 SYN 包,明显是暴力破解。
步骤 4:查看攻击时间线
使用 IO Graph 设置时间粒度:
Filter: ip.src==192.168.1.100 and tcp.port==22
Unit: Packets/Tick (1 sec)
如果看到持续 30 分钟以上的攻击波形,说明是自动化工具。
实战四:检测 ARP 欺骗和中间人攻击
场景描述
内网用户反映网页内容被篡改,怀疑存在 ARP 欺骗攻击。
步骤 1:识别异常 ARP 响应
使用过滤器:
arp.opcode == 2
检查 MAC 地址对应关系。正常情况下,一个 IP 对应一个 MAC。如果出现:
– 同一 IP 对应多个 MAC
– 网关 IP 的 MAC 地址不是真实网关 MAC
步骤 2:验证 ARP 欺骗
查看网关 IP 的 ARP 响应:
arp.src.proto_ipv4 == 192.168.1.1
如果看到两个不同 MAC 地址交替响应,说明存在 ARP 欺骗。
步骤 3:追踪被篡改的流量
找到攻击者 MAC 地址后,过滤该 MAC 的流量:
eth.src == aa:bb:cc:dd:ee:ff
查看 HTTP 响应内容,如果发现被插入的恶意 JavaScript 或重定向代码,即可确认攻击。
总结:安全分析最佳实践
抓包注意事项
- 存储策略:保留至少 7 天的全流量日志,使用
tcpdump -C 100 -W 10轮转存储,每个文件 100MB - 时间同步:确保所有设备 NTP 同步,否则时间戳混乱会导致分析困难
- 过滤规则:生产环境抓包前使用
tcpdump -n -c 1000测试流量大小,避免磁盘写满
分析技巧
- 分层分析法:从物理层(MAC)→ 网络层(IP)→ 传输层(端口)→ 应用层(协议内容)逐层排查
- 关注异常值:80% 的安全事件隐藏在“非标准”行为中:非工作时间连接、非常用端口、非常用协议
- 自动化辅助:使用
tshark -T fields结合 Python 脚本批量分析,提高效率
工具链推荐
- 流量采集:tcpdump、ngrep
- 离线分析:Wireshark、NetworkMiner
- 自动化分析:Moloch、Arkime(开源全流量分析平台)
- 威胁情报关联:将提取的 IP 和域名与 AlienVault OTX、VirusTotal 交叉验证
最后的建议
网络流量分析是一项需要长期积累的技能。建议从日常网络故障排查开始练习,逐步过渡到安全事件分析。每次分析后建立自己的特征库,记录常见的恶意流量模式(如特定的 TTL 值、TCP 窗口大小、HTTP 头部顺序等)。
记住:攻击者可以隐藏进程、清除日志,但无法抹去网络上的每一个字节。掌握 Wireshark,你就掌握了网络空间中最真实的证据。
附录:常用 Wireshark 显示过滤器速查
| 目的 | 过滤器 |
|---|---|
| 只看 HTTP 请求 | http.request |
| 只看 DNS 查询 | dns.flags.response == 0 |
| 只看 SYN 包 | tcp.flags.syn == 1 and tcp.flags.ack == 0 |
| 排除广播流量 | not broadcast and not multicast |
| 只看特定 IP 通信 | ip.addr == 192.168.1.100 |
| 只看非标准端口 | tcp.port not in {22,80,443,53} |
💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者
