流量分析工具(Wireshark)

在CTF比赛中的MISC的类别下,流量分析是一项十分重要的考察方向。

通常比赛中会提供一个流量数据包文件(PCAP/PCAPNG),让选手对该数据包分析来获得flag。

Wireshark是目前使用最广泛功能基本上最强大的开源网络封包分析软件,也叫小鲨鱼。

Wireshark可以用来抓取流量包也可以用来对抓取到的流量包(pcap/pcapng文件)进行解析。

CTF比赛中,一般使用Wireshark解决流量分析类题目。

界面

wireshark界面.png

开始抓包或者将一个已经打包好的流量包文件使用Wireshark打开后便会出现这样的界面。

其中,过滤栏、数据列表、数据包详情、原始数据四部分最为重要。

在数据列表中,各类型的数据包会被着上如下所示的不同颜色,可以方便我们快速判断数据包类别。

image-20231118145822008.png

过滤器(过滤栏)

初使用wireshark时,由于目前计算机网络会在同时段内进行大量的数据交互,你将会得到大量的冗余数据包列表,以至于很难找到自己真正需要的数据包部分。

而流量分析题目最复杂的地方,便是靠大量冗余数据包进行混淆而使得真正包含flag相关内容的数据包被隐藏。这对选手的分类过滤流量包能力进行了挑战。

因此,学习解答流量分析类题目的第一步便是要学会如何使用Wireshark的过滤器。

基本格式

1
[not] Expression [and|or] [not] Expression

比较运算符

1
2
3
4
5
6
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

逻辑运算符(可以用于连接多条语句或元素)

1
2
3
4
and , &&  #与
or , || #或
! , not #非
contains #包含

协议过滤(直接输入小写协议名称)

1
2
3
4
5
6
tcp    #筛选协议为tcp的流量包
udp #筛选协议为udp的流量包
arp/icmp/http/ftp/dns/ip
#筛选协议为arp/icmp/http/ftp/dns/ip的流量包
#可用 !或者not 加协议表示排除该协议
not arp 或 !arp

描述符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
host  #主机
net #网络
port #端口
src #源
dst #目标
addr #地址
eth #mac地址(Ethernet)

#特殊描述符
len/length #长度
request #请求
method #方法
request.method #请求方法
...

用例

1
2
3
4
5
6
7
8
9
ip.src == 地址     #源ip筛选
ip.dst == 地址 #目标ip筛选
ip.addr == 地址 #ip地址筛选

udp.srcport == 80 #筛选udp协议的源端口为80的流量包
eth.dst == A0:00:00:04:C5:84 #目标mac地址筛选

http.request.method =="POST" #筛选HTTP请求方法为POST的流量包
http contains "FLAG" #筛选HTTP内容为/FLAG的流量包

常用表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#数据链路层

eth.dst == A0:00:00:04:C5:84 #目标mac地址筛选

#网络层:

ip.addr == 192.168.1.1 #筛选ip地址为192.168.1.1的数据包

ip contains "192.168.1" #筛选192.168.1.0网段的数据

#传输层:

tcp.port == 80 #筛选tcp端口为80的数据包

tcp.srcport == 12345 && tcp.dstport == 80 #筛选从12345端口到80端口的数据包

#应用层:

http.request.uri contains ".php" #筛选url中包含.php的http数据包

http contains "username" #筛选内容包含username的http数据包

需要特别注意的是:

http协议的语句中

http.request表示请求头中的第一行 (如GET index.jsp HTTP/1.1)
http.response表示响应头中的第一行(如HTTP/1.1 200 OK)
其他头部都用http.header_name形式

实际用例

image-20231118153817872.png

1
2
ip.dst == 210.30.97.133 and http
#筛选 目标 IP 地址为 "210.30.97.133" 且 协议为 HTTP

直接选中过滤

image-20231118154209615.png

也可直接点选后作为过滤器应用

数据包还原

Wireshark还具有一个追踪数据流的功能,它可以将分散的HTTP或TCP流量集合在一起并还原出原始数据。

image-20231118160003579.png

右键点击需要追踪的数据流中的其中一条,选择追踪流 —— (TCP 流/ UPD 流/ SSL 流/ HTTP 流)

image-20231118160124584.png

即可还原出整条完整的数据包流

数据提取

Wireshark 还支持对于通过 HTTP 协议传输的文件内容进行提取

文件——导出对象——选择HTTP流

Wireshark会自动识别可导出的传输的文件和文件类型,如果Wireshark识别不了则需要我们手动处理

image-20231118162032926.png

图片隐写补充

在上一篇文章中已经介绍了几种图片隐写,本次补充一些内容

EXIF信息

简单来说,Exif 信息是数码相机(或智能手机)在拍摄过程中采集的一系列的信息,它一般会放在照片文件的头部,使用010editor可以查看或直接在Windows下右键图片查看详细信息

严格意义上,EXIF信息不算隐写术,但题目中经常将一些隐藏的信息写入EXIF

image-20231118164015253.png

PNG文件标准

PNG文件以它本身的性质成为了CTF竞赛中图片隐写题的常客,因此了解PNG文件的标准是有必要的。

参考来源:PNG文件格式详解

PNG是20世纪90年代中期开始开发的图像文件存储格式,其目的是替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性。流式网络图形格式(Portable Network Graphic Format,PNG)名称来源于非官方的“PNG’s Not GIF”,是一种位图文件(bitmap file)存储格式,读成“ping”。

PNG图像格式文件由文件署名和数据块(chunk)组成,其中每个数据块都由下表所示的的4个域组成。

image-20231118164232133.png

其中最后四字节是使用CRC-32算法对Chunk Type Code域和Chunk Data域中的数据进行计算得到的,是一种校验码,可以检测数据是否损坏或被篡改过。

CRC(循环冗余校验)在线计算

关键数据块

PNG文件拥有4个标准的关键数据块,分别是文件头数据块IHDR(header chunk),调色板数据块PLTE(palette chunk),图像数据块IDAT(image data chunk)以及图像结束数据IEND(image trailer chunk),这四个数据库对于每个PNG文件都是必不可少的,而多数PNG的图片隐写题也是对这四个数据块进行修改。

文件头数据块IHDR(header chunk):

IHDR包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。文件头数据块固定长度为13字节,组成结构如下:

image-20231118164815903.png

其中Width和Height两项数据可以被篡改,于是就有了宽高隐写类型题目。

调色板数据块PLTE(palette chunk)重要程度较低,此处暂且按下不表。

图像数据块IDAT(image data chunk)

存储实际的数据,在数据流中可包含多个连续顺序的图像数据块。

图像结束数据IEND(image trailer chunk)

它用来标记PNG文件或者数据流已经结束,并且必须要放在文件的尾部。

并且它总是为以下的12字符

1
00 00 00 00 49 45 4E 44 AE 42 60 82

不难明白,由于数据块结构的定义,IEND数据块的长度总是0(00 00 00 00,除非人为加入信息),数据标识总是IEND(49 45 4E 44),因此,CRC码也总是AE 42 60 82。

最后,除了表示数据块开始的IHDR必须放在最前面, 表示PNG文件结束的IEND数据块放在最后面之外,其他数据块的存放顺序没有限制。