前言
Wireshark 是一款世界范围最广、最好用的开源抓包软件,是一个通用化的网络数据嗅探器和协议分析器,功能强大,界面友好直观,操作起来非常方便。它的创始人是 Gerald Combs,前身是 Ethereal,作为开源项目经过众多开发者的完善它已经成为使用量最大的安全工具之一。
1998 年以 GPL 开源许可证发布。如果是网络工程师,可以通过 Wireshark 对网絡进行故障定位和排错;如果是安全工程师,可以通过 Wireshark 对网络黑客渗透攻击进行快速定位并找出攻击源;如果是判试或者软件工程师,可以通过Wireshark 分析底层通信机制等等。
在 CTF 中也经常会使用 Wireshark 进行流量数据包分析,可以快速检测网络通讯数据,获取最为详细的网络封包资料。Wireshark 使用 WinPCAP (Linux 上是 LibCAP)作为接口,直接与网卡进行数据报文交换。用户将在图形界面中浏览这些数据,实时监控 TCP、session 等网络动态,轻松完成网络管理工作。
什么是数据包分析
数据包嗅探或协议分析:指捕获和解析网络上传输的数据的过程,以便更好地了解网络上正在发生的事情。
TCP/IP 四层模型
- 应用层:最高的一层,直接面对用户,各种程序都是基于这一层,主要作用是处理传输层提交的信息,与用户交换,并把信息传到下层发送。
- 传输层:主要作用对数据包的分割、重组、连接、管理、排序、重传等等,以及标记逻辑端口号—常见协议:TCP、UDP; 端口 0~65535 个端口,只是应该标识,方便管理(such as:21 端口是 FTP 程序,80 端口是 HTTP 程序,4000 端口是 QQ)
- 网络层:主要作用是实现与远程设备的连接,是 TCP/IP 模型中最重要的一层,封装为 IP 头部。封装中的重要部分为 IP 地址,每台设备唯一。
- 链路层:主要功能在两个网络实体之间提供数据链路链接,最常见的是以太网和 IEEE 802 封装,封装中有一个重要的部分就是 MAC 地址(网卡物理地址)。
- TCP 协议:可靠,面向连接,效验数据,超时重传,有序号,保证数据完整有序到达,但是协议复杂速度稍慢(适合文件传输和网页浏览,对数据完整有序要求比较高的场合)。
- UDP 协议:不可靠,仅发送数据,不保证数据完整有序到达,协议简单速度快(适合 DNS 查询,视频聊天,对数据完整有序要求比较低,但对数据即使性要求比较高的场合)。
抓包原理
网络原理:哪种网络情况能够抓到包?
一、本机环境,直接抓包本机网卡进出流量。
二、集线器环境:流量泛洪,同一冲突域。
三、交换机环境:分三种情况。
1、端口镜像:
2、ARP 欺骗:
3、MAC 泛洪:
底层原理:抓包的底层架构是怎样的?
1、Win-/libpcap:Wireshark 抓包时依赖的库文件;
2、Capture:捕包引擎,利用 Win-/libpcap 从底层抓取网络数据包,libpcap/WinPcap 提供了通用的抓包接口,能从不同类型的网络接口(包括以太网、令牌环网、ATM 网)获取数据包;
3、Wiretap:格式支持,从抓包文件中读取数据包,支持多种文件格式;
4、Core:核心引擎,通过函数调用将其它模块连接在一起,起到联动调度的作用;
- Epan:Wireshark Packetage Analyzing,包分析引擎
- Protocol-Tree:保存数据包的协议信息,wireshark的协议结构采用树形结构,解析协议报文时只需要从根节点通过函数句柄依次调用各层解析函数即可;
- Dissectors:在 epan/dissector 目录下,各种协议解码器,支持 700+ 种协议解析,对于每种协议,解码器都能识别出协议字段(field),并显示出字段值(field value)由于网络协议种类很多,为了使协议和协议间层次关系明显,对数据流里的各个层次的协议能够逐层处理,Wireshark 系统采用了协议树的方式;
- Plugins:一些协议解码器以插件形式实现,源码在 plugins 目录;
- Display-Filters:显示过滤引擎,源码在 epan/dfilter 目录;
5、GTK/Qt:处理用户的输入输出显示,源码在 gtk 目录.
准备
下载安装
关注文章首部微信公众号发送 #mac_wireshark
即可获取 wireshark Mac 版安装包百度网盘下载链接。
Wireshark 官网可下载全平台的 Wireshark 安装包,地址:https://www.wireshark.org/download.html。
安装过程就不多说了。
切换中文
安装完成后,Wireshark 默认是支持中文的,点击 Preferences
,在如下位置选中中文即可。
基本使用
快速抓包
安装完成后进入 Wireshark 的初始界面如下:
大致可以分为如上四块:
- 工具框,一些常用的操作可以通过它们快速完成,后面用到再说;
- 过滤器框,可以编写过滤表达式用来过滤出我们需要的报文;
- 接口类型下拉框,选择我们需要的监控的接口类型;
- 接口列表,对应选择的接口类型的接口都会在这里显示;
开始抓包前我们需要确定好我们需要抓取的报文经由哪一个接口进行请求与响应,这里我连接的是 WIFI,就选择无线接口:
选择指定的接口直接双击就可进入到抓包详细页面,在进入页面之前我们也可以在过滤器框编写好过滤表达式直接过滤指定接口的报文,不过过滤表达式我们现在还不知道怎么写,这里直接双击可以看到抓包的详细界面。
进入详细界面后默认抓包操作就是开启的,下面对上图几个重要区域做一下说明:
- 启动抓包,终止抓包后可点击;
- 终止抓包,正在抓包时可点击;
- 重新开始抓包,正在抓包时可点击;
- 加载捕获的文件,终止抓包后可点击;
- 保存抓包信息,将抓到的包信息保存到指定文件,终止抓包后可点击;
- 不保存此次抓包信息,终止抓包后可点击;
- 如果当前显示的抓包信息是从文件中读取的,点击此按钮可重新加载文件;
- 数据包过滤器框,依旧是可以让我们编写过滤表达式来筛选出我们需要的报文;
- 数据包列表栏,显示着每一个经由指定接口的连接状态;
- 数据包详细区,显示我们在报文流量信息条目栏中选中的连接解包后的信息;
- 数据包字节区,对连接的信息以二进制或十六进制的格式显示;
- 数据包统计区,显示着对启动抓包后这段时间的数据包统计信息;
常用设置与操作
1、设置时间格式:视图(菜单) > 时间显示格式
,然后可以选择中意的格式。
2、添加列:在数据包详细区某层的某一个字段上 右键 > 应用为列
,可将该字段显示到数据包列表列;
3、反解 IP 和 端口名称:捕获(菜单) > 选项 > 选项 > 勾选解析网络名称和解析传输层名称
;
4、手动解析指定 IP 解析名称:选中数据包列表某一条目,右键 > 编辑解析的名称
;
5、查看已有的地址解析库(包含 MAC、IP、端口解析):统计(菜单) > 已解析的地址
;
6、标记数据包:数据包列表上选中某一条目,右键 > Mark/Unmark Packet(s)
;
7、针对当前会话设置着色方案:数据包列表上选中某一条目,右键 > 对话着色
;
8、永久设置着色方案:视图(菜单) > 着色规则
;
9、给数据包添加注释:选中数据包列表某一条目,右键 > 分组注释...
,添加完后数据包详细区会添加一条包含注释信息的名为 Packet comments
条目;
10、合并数据包列表:文件(菜单) > 合并...
,选择一个数据包文件与当前打开的数据包文件合并为一个数据包列表;
11、导出数据包列表:文件(菜单) > 导出分组解析结果
,可将数据包列表导出为 txt、csv 等格式的文件;
12、设置默认打开的文件夹:Wireshark(菜单) > Preferences > 外观 > 打开文件夹中的文件 > 选择该文件夹指定一个文件夹
;
13、调整窗口布局:Wireshark(菜单) > Preferences > 外观 > 布局
;
14、启用混杂模式:捕获(菜单) > 选项 > 在所有接口上使用混杂模式
,该模式默认就是开启的,作用就是接收目标主机不是本机的报文;
15、实时输出捕获数据包信息到指定文件:捕获(菜单) > 选项 > 输出 > 捕获到指定文件
,其中环形缓冲器指定的是多个文件循环覆盖,在这里还可以设置指定条件滚动输出到多个文件,也可在选项框中设定何时停止捕获;
过滤器
抓包过滤器
如其名,抓包过滤器其实就是用来限定只抓取符合条件的数据包。
抓包过滤器使用的是 BPF 语法(Berkeley Packet Filter)—— 基于 libpcap/wincap 库,在抓包的过程中过滤掉某些类型的协议,不抓取过滤掉的协议,建议在流量特别大的情况下使用。
编写位置
1、启动页:
2、捕获(菜单)> 选项:
语法说明
要使用抓包过滤器我们必须要会写过滤表达式,抓包过滤器的表达式主要有如下几个语法元素:
- 类型(Type):
host
(主机地址)、net
(网络地址)、port
(端口); - 方向(Direction):
src
(源地址)、dst
(目标地址); - 协议(Protocol):
ether
、ip
、tcp
、udp
、icmp
、arp
等; - 逻辑运算符:
&&
或and
(与)、||
或or
(或)、!
或not
(非);
注:二三层的协议可以直接写入过滤表达式生效,而过滤 http 及 https 这些应用层协议可以通过过滤端口号 80、443 来实现。
示例
1、不抓取广播包。
!broadcast
2、过滤 MAC 地址。
ether host 00:88:ca:86:f8:od
ether src host 00:88:ca:86:f8:od
ether dst host 00:88:ca:86:f8:od
3、过滤 IP 地址。
host 192.168.1.1
src host 192.168.1.1
dst host 192.168.1.1
4、过滤端口。
port 80
! port 80
dst port 80
src port 80
5、过滤协议。
arp
icmp
6、过滤源地址和目的端口。
src host 192.168.1.1 && dst port 80
7、过滤协议或 IP 地址。
tcp or host 192.168.1.1 or host 192.168.1.2
显示过滤器
显示过滤器并不能限定抓取哪些数据包,但是能从抓取到的数据包中过滤出我们指定条件的数据包并显示的数据包列表区。
显示过滤器远比抓包过滤器更加灵活和强大。显示过滤器不会丢失数据包,只是为了增强用户阅读而将一部分数据包隐藏起来。丢弃数据包有时并非明智选择,因为一旦数据包被丢弃,这些数据包也就无法再恢复回来了。
编写位置
选定接口后的过滤显示页面:
语法说明
显示过滤器的过滤表达式与抓包过滤器的语法是不同的,它主要的几个语法元素如下:
- 比较操作符:
==
、!=
、<
、>
、>=
、=
; - 逻辑操作符:
and
(并且)、or
(或)、not
(非)、xor
(有且仅有一个条件满足); - 过滤 IP 地址:
ip.addr
(IP)、ip.src
(源 IP)、ip.dst
(目标 IP); - 过滤端口:
<protocol>.port
(端口)、<protocol>.srcport
(源端口)、<protocol>.dstport
(目标端口); - 过滤 tcp 协议标志位:
tcp.flag.syn
、tcp.flag.ack
等; - 协议过滤:
arp
、ip
、icmp
、udp
、tcp
、bootp
、dns
、http
、oicq
等;
示例
1、过滤 IP 地址案例。
ip.addr == 192.168.1.1
ip.src == 192.168.1.1
ip.dst == 192.168.1.1
2、过滤端口。
tcp.port == 80
tcp.srcport == 80
tcp.dstport == 80
3、过滤 tcp 协议标志位。
tcp.flags.syn == 1
4、过滤协议。
tcp
not http
not arp
5、过滤 IP 和协议端口。
ip.src == 192.168.1.100 and udp.port == 4000
评论区