11、网络协议分析基础:Wireshark基础使用、TCP/UDP协议基础、HTTP/HTTPS协议分析、实战:分析一个恶意软件的C2通信
网络协议分析,说白了就是让网络流量「开口说话」。我见过太多安全工程师,配置了一堆防火墙和IDS,却连恶意软件在往外发什么数据都看不出来。Wireshark就是那个能让你「听」懂网络对话的工具。今天咱们就从抓包、过滤、追踪流这些基本功开始,一路深入到TCP/UDP、HTTP/HTTPS,最后拿一个真实的C2通信案例来练手。
11.1 Wireshark基础使用:抓包、过滤、追踪流
Wireshark这东西,我刚开始用的时候也觉得眼花缭乱。但说白了,核心就三件事:抓到对的包、过滤出想要的、看懂流里的内容。
11.1.1 抓包前的准备
我个人习惯,抓包前先做两件事:
- 选对网卡——抓外网流量选物理网卡,抓本地回环用Loopback(Windows下需要装Npcap)
- 设置捕获过滤器——别一上来就全量抓,流量大的时候机器会卡死。我吃过这个亏,有一次在办公网全量抓了5分钟,文件直接3个G,分析起来想哭。
host 192.168.1.100,或者只抓HTTP:tcp port 80。这比抓完再过滤要高效得多。
11.1.2 显示过滤器——这才是核心
抓完包之后,显示过滤器才是你真正需要花时间学的。我列几个最常用的:
| 过滤表达式 | 含义 | 使用场景 |
|---|---|---|
ip.addr == 10.0.0.5 | 显示源或目标IP为10.0.0.5的包 | 定位特定主机 |
tcp.port == 443 | 显示TCP端口443的流量 | 只看HTTPS |
http.request | 只显示HTTP请求 | 分析Web请求 |
tcp.flags.syn == 1 | 显示SYN包 | 观察连接建立 |
!arp | 排除ARP协议 | 减少噪音 |
嗯,这里要注意:显示过滤器是Wireshark自己的语法,和捕获过滤器的BPF语法不一样。别搞混了。
11.1.3 追踪流
追踪流是我最常用的功能。右键一个包 → Follow → TCP Stream,Wireshark会自动把整个会话的数据重组出来。我曾经靠这个功能,直接从一堆乱码里看到了恶意软件发送的Base64编码的C2指令。
11.2 TCP/UDP协议基础
TCP和UDP,一个是「打电话」,一个是「发短信」。这个比喻虽然老套,但很贴切。
11.2.1 TCP三次握手——你每天都在见证
每次你打开一个网页,背后都有一场「三次握手」的仪式:
- SYN:客户端说「我要连你」,发送SYN包,序列号随机生成(比如1000)
- SYN-ACK:服务器说「收到,我也准备好了」,回复SYN+ACK,确认号是1001
- ACK:客户端说「好,开始传数据」,发送ACK包
在Wireshark里看这个过程特别直观。你过滤tcp.flags.syn == 1,就能看到这三个包。我遇到过一个问题:某台服务器连接特别慢,一抓包发现三次握手有重传——原来是中间有个交换机在丢包。
11.2.2 TCP滑动窗口与流量控制
TCP的滑动窗口机制,说白了就是「你发慢点,我快跟不上了」。接收方会在ACK包里带上自己的窗口大小(Window Size),告诉发送方还能收多少数据。如果窗口变成0,发送方就得停下来等。
11.2.3 UDP——简单粗暴
UDP没有握手,没有确认,没有重传。发出去就不管了。DNS查询、视频流、游戏数据都用UDP。在Wireshark里看UDP,你只需要关注源端口、目标端口和长度。我经常用udp.port == 53来过滤DNS查询,看恶意软件在解析哪个域名。
11.3 HTTP/HTTPS协议分析
HTTP是明文协议,在Wireshark里看HTTP请求和响应,就像看裸奔一样清楚。HTTPS则多了一层TLS加密。
11.3.1 HTTP请求与响应
一个典型的HTTP请求长这样:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
响应则是:
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
<html>...</html>
在Wireshark里,过滤http.request就能看到所有请求,过滤http.response看响应。我经常用http.request.method == "POST"来筛选POST请求——恶意软件通常用POST来外传数据。
11.3.2 HTTPS——TLS握手
HTTPS的流量在Wireshark里默认是加密的。但如果你有服务器的私钥,或者用SSLKEYLOGFILE环境变量导出了会话密钥,就可以解密。我个人习惯在分析恶意软件时,如果它用HTTPS,我会先尝试用MITM代理来抓明文——比折腾TLS密钥要省事。
- 有私钥:Wireshark → Edit → Preferences → Protocols → TLS → 添加RSA密钥
- 有SSLKEYLOGFILE:设置环境变量,浏览器或支持的程序会自动导出密钥
11.4 实战:分析一个恶意软件的C2通信
好了,理论说完了,咱们来点真格的。假设你拿到一个恶意软件样本,跑起来之后抓到了它的网络流量。怎么分析?
11.4.1 第一步:找异常流量
先看整体流量特征。正常软件不会频繁往一个陌生IP发心跳包。过滤!arp and !dns and !dhcp,把基础协议去掉,剩下的就是可疑流量。我见过一个样本,每30秒往185.xxx.xxx.xxx:8080发一个HTTP POST请求,数据体是Base64编码的。
11.4.2 第二步:追踪TCP流
右键那个POST包 → Follow → TCP Stream。你会看到类似这样的内容:
POST /gate.php HTTP/1.1
Host: 185.xxx.xxx.xxx:8080
Content-Type: application/x-www-form-urlencoded
Content-Length: 128
id=WIN-7X9K2M&data=eyJjbWQiOiAiaG9zdG5hbWUiLCAicGFyYW0iOiAiIn0=
看到那个data=eyJ...了吗?Base64编码的。解码一下:
{"cmd": "hostname", "param": ""}
这就是C2指令——让受害机返回主机名。
11.4.3 第三步:识别C2模式
常见的C2通信模式有:
- HTTP轮询:每隔固定时间发请求,响应里带指令
- DNS隧道:把数据编码在DNS查询里,比如
data1234.malware.com - TCP直连:直接连到C2服务器的某个端口,自定义协议
我分析过一个用DNS隧道的样本,Wireshark里全是AAAA查询,域名长得离谱。过滤dns.qry.name contains "malware"就能揪出来。
- 固定时间间隔的心跳包(比如每60秒一次)
- 数据体是Base64、Hex或自定义编码
- 目标IP不在常见服务商范围内
- User-Agent很奇怪(比如
Mozilla/4.0这种老版本)
11.4.4 第四步:提取IOC
分析完C2通信后,提取出IOC(威胁情报指标):
| 类型 | 示例 |
|---|---|
| IP地址 | 185.xxx.xxx.xxx |
| 域名 | malware-c2.example.com |
| URL路径 | /gate.php |
| User-Agent | Mozilla/4.0 (compatible; MSIE 6.0) |
| 心跳间隔 | 30秒 |
这些IOC可以喂给防火墙、IDS或者威胁情报平台,实现全网检测。
ip link set lo promisc on之类的命令确保抓包不被发现。另外,别在真实生产环境跑样本——我见过有人把勒索软件跑在公司内网,后果很严重。
好了,这一章的内容就到这。Wireshark是个好工具,但真正值钱的是你分析流量的思路。从抓包到过滤,从协议理解到恶意流量识别,每一步都需要动手去练。下次你遇到一个可疑的流量,别慌,打开Wireshark,一步步来。