11、网络协议分析基础:Wireshark基础使用、TCP/UDP协议基础、HTTP/HTTPS协议分析、实战:分析一个恶意软件的C2通信

网络协议分析,说白了就是让网络流量「开口说话」。我见过太多安全工程师,配置了一堆防火墙和IDS,却连恶意软件在往外发什么数据都看不出来。Wireshark就是那个能让你「听」懂网络对话的工具。今天咱们就从抓包、过滤、追踪流这些基本功开始,一路深入到TCP/UDP、HTTP/HTTPS,最后拿一个真实的C2通信案例来练手。

网络协议分析知识体系 Wireshark基础 TCP/UDP协议 HTTP/HTTPS分析 抓包 · 过滤 · 追踪流 三次握手 · 滑动窗口 · 端口 请求方法 · 状态码 · TLS 实战:恶意软件C2通信分析 从抓包到协议理解,再到恶意流量识别,一条线串起来 公众号:蓝海资料掘金营

11.1 Wireshark基础使用:抓包、过滤、追踪流

Wireshark这东西,我刚开始用的时候也觉得眼花缭乱。但说白了,核心就三件事:抓到对的包、过滤出想要的、看懂流里的内容

11.1.1 抓包前的准备

我个人习惯,抓包前先做两件事:

  • 选对网卡——抓外网流量选物理网卡,抓本地回环用Loopback(Windows下需要装Npcap)
  • 设置捕获过滤器——别一上来就全量抓,流量大的时候机器会卡死。我吃过这个亏,有一次在办公网全量抓了5分钟,文件直接3个G,分析起来想哭。
小技巧:捕获过滤器用BPF语法,比如只抓某台主机的流量: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指令。

核心操作:追踪TCP流可以看到完整的应用层数据,不管是HTTP明文还是自定义协议。如果是HTTPS,你看到的是加密后的乱码——这时候就需要TLS密钥了。

11.2 TCP/UDP协议基础

TCP和UDP,一个是「打电话」,一个是「发短信」。这个比喻虽然老套,但很贴切。

11.2.1 TCP三次握手——你每天都在见证

每次你打开一个网页,背后都有一场「三次握手」的仪式:

  1. SYN:客户端说「我要连你」,发送SYN包,序列号随机生成(比如1000)
  2. SYN-ACK:服务器说「收到,我也准备好了」,回复SYN+ACK,确认号是1001
  3. ACK:客户端说「好,开始传数据」,发送ACK包

在Wireshark里看这个过程特别直观。你过滤tcp.flags.syn == 1,就能看到这三个包。我遇到过一个问题:某台服务器连接特别慢,一抓包发现三次握手有重传——原来是中间有个交换机在丢包。

11.2.2 TCP滑动窗口与流量控制

TCP的滑动窗口机制,说白了就是「你发慢点,我快跟不上了」。接收方会在ACK包里带上自己的窗口大小(Window Size),告诉发送方还能收多少数据。如果窗口变成0,发送方就得停下来等。

曾经踩过的坑:有一次分析一个文件传输慢的问题,发现窗口大小一直在0和65535之间跳变。查了半天,是接收方的应用程序处理不过来,导致TCP缓冲区满了。这不是网络问题,是应用层的问题。

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密钥要省事。

解密HTTPS的两种方式:
  • 有私钥: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-AgentMozilla/4.0 (compatible; MSIE 6.0)
心跳间隔30秒

这些IOC可以喂给防火墙、IDS或者威胁情报平台,实现全网检测。

注意:有些恶意软件会检测Wireshark。如果你在分析环境中跑样本,记得用ip link set lo promisc on之类的命令确保抓包不被发现。另外,别在真实生产环境跑样本——我见过有人把勒索软件跑在公司内网,后果很严重。

好了,这一章的内容就到这。Wireshark是个好工具,但真正值钱的是你分析流量的思路。从抓包到过滤,从协议理解到恶意流量识别,每一步都需要动手去练。下次你遇到一个可疑的流量,别慌,打开Wireshark,一步步来。