Wireshark 的背景
Wireshark(前称 Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark 使用 WinPCAP 作为接口,直接与网卡进行数据报文交换。
在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件,Ethereal 的出现改变了这一切。在 GNU GPL 通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal 是全世界最广泛的网络封包分析软件之一。
使用 Wireshark 目的:
- 网络管理员使用 Wireshark 来检测网络问题;
- 网络安全工程师使用 Wireshark 来检查资讯安全相关问题;
- 开发者使用 Wireshark 来为新的通讯协定除错;
- 普通使用者使用 Wireshark 来学习网络协定的相关知识。
当然,有的人也会”居心叵测”的用它来寻找一些敏感信息……
Wireshark 不是入侵侦测系统(Intrusion Detection System,IDS)。对于网络上的异常流量行为,Wireshark 不会产生警示或是任何提示。然而,仔细分析 Wireshark 撷取的封包能够帮助使用者对于网络行为有更清楚的了解。Wireshark 不会对网络封包产生内容的修改,它只会反映出流通的封包资讯,Wireshark 本身也不会送出封包至网络上。
参考网址:
Wireshark 的功能和使用
界面功能
WireShark 主要分为这几个界面:
- Display Filter(显示过滤器),用于过滤;
- Packet List Pane(封包列表),显示捕获到的封包,有源地址和目标地址、端口号,颜色不同代表不同协议;
- Packet Details Pane(封包详细信息),显示封包中的字段;
- Dissector Pane(16 进制数据);
- Miscellanous(地址栏,杂项)。
封包列表(Packet List Pane):封包列表的面板中显示编号、时间戳、源地址、目标地址、协议、长度以及封包信息。你可以看到不同的协议用了不同的颜色显示,也可以修改这些显示颜色的规则:View -> Coloring Rules。
封包详细信息(Packet Details Pane):这个面板是我们最重要的,用来查看协议中的每一个字段。各行信息分别为:
| 行 | 含义 |
|---|---|
| Frame | 物理层的数据帧概况 |
| Ethernet II | 数据链路层以太网帧头部信息 |
| Internet Protocol Version 4 | 互联网层 IP 包头部信息 |
| Transmission Control Protocol | 传输层的数据段头部信息,此处是 TCP |
| Hypertext Transfer Protocol | 应用层的信息,此处是 HTTP 协议 |
过滤器表达式
显示过滤器表达式作用在 wireshark 捕获数据包之后,从已捕获的所有数据包中显示出符合条件的数据包,隐藏不符合条件的数据包。显示过滤表达式在工具栏下方的”显示过滤器”输入框输入即可生效。
基本过滤表达式:一条基本的表达式由过滤项、过滤关系、过滤值三项组成。比如 ip.addr == 192.168.1.1,这条表达式中 ip.addr 是过滤项、== 是过滤关系,192.168.1.1 是过滤值(整条表达式的意思是找出所有 ip 协议中源或目标 ip 等于 192.168.1.1 的数据包)。
过滤项:初学者感觉的”过滤表达式复杂”,最主要就是在这个过滤项上:一是不知道有哪些过滤项,二是不知道过滤项该怎么写。这两个问题有一个共同的答案——wireshark 的过滤项是”协议” + ”.” + “协议字段”的模式。以端口为例,端口出现于 tcp 协议中所以有端口这个过滤项且其写法就是 tcp.port。
推广到其他协议,如 eth、ip、udp、http、telnet、ftp、icmp、snmp 等等其他协议都是这么个书写思路。当然 wireshark 出于缩减长度的原因有些字段没有使用协议规定的名称而是使用简写(比如 Destination Port 在 wireshark 中写为 dstport),又出于简便使用增加了一些协议中没有的字段(比如 tcp 协议只有源端口和目标端口字段,为了简便使用 wireshark 增加了 tcp.port 字段来同时代表这两个),但思路总的算是不变的。而且在实际使用时我们输入”协议” + ”.”,wireshark 就会有支持的字段提示(特别是过滤表达式字段的首字母和 wireshark 在上边 2 窗口显示的字段名称首字母通常是一样的),看下名称就大概知道要用哪个字段了。wireshark 支持的全部协议及协议字段可查看官方说明。
过滤关系:过滤关系就是大于、小于、等于等几种等式关系,可以直接看官方给出的表。注意其中有 “English” 和 “C-like” 两个字段,这个意思是说 “English” 和 “C-like” 这两种写法在 wireshark 中是等价的、都是可用的。
过滤值:过滤值就是设定的过滤项应该满足过滤关系的标准,比如 500、5000、50000 等等。过滤值的写法一般已经被过滤项和过滤关系设定好了,只是填下自己的期望值就可以了。
复合过滤表达式:所谓复合过滤表达式,就是指由多条基本过滤表达式组合而成的表达式。基本过滤表达式的写法还是不变的,复合过滤表达式多出来的东西就只是基本过滤表达式的”连接词”。同样参照官方给出的表,“English” 和 “C-like” 这两种写法也是等价的、都是可用的。
常见用显示过滤需求及其对应表达式:
# 数据链路层
筛选mac地址为04:f9:38:ad:13:26的数据包
eth.src == 04:f9:38:ad:13:26
筛选源mac地址为04:f9:38:ad:13:26的数据包
eth.src == 04:f9:38:ad:13:26
# 网络层
筛选ip地址为192.168.1.1的数据包
ip.addr == 192.168.1.1
筛选192.168.1.0网段的数据
ip contains "192.168.1"
筛选192.168.1.1和192.168.1.2之间的数据包
ip.addr == 192.168.1.1 && ip.addr == 192.168.1.2
筛选从192.168.1.1到192.168.1.2的数据包
ip.src == 192.168.1.1 && ip.dst == 192.168.1.2
# 传输层
筛选tcp协议的数据包
tcp
筛选除tcp协议以外的数据包
!tcp
筛选端口为80的数据包
tcp.port == 80
筛选12345端口和80端口之间的数据包
tcp.port == 12345 && tcp.port == 80
筛选从12345端口到80端口的数据包
tcp.srcport == 12345 && tcp.dstport == 80
# 应用层
# 特别说明:http中http.request表示请求头中的第一行(如GET index.jsp HTTP/1.1),
# http.response表示响应头中的第一行(如HTTP/1.1 200 OK),其他头部都用http.header_name形式
筛选url中包含.php的http数据包
http.request.uri contains ".php"
筛选内容包含username的http数据包
http contains "username"
使用:基本抓包
双击选择了网卡之后,就开始抓包了。
过滤地址:
ip.addr==192.168.10.10 或 ip.addr eq 192.168.10.10 #过滤地址
ip.src==192.168.10.10 #过滤源地址
ip.dst==192.168.10.10 #过滤目的地址
过滤协议,直接输入协议名:
icmp
http
过滤协议和端口:
tcp.port==80
tcp.srcport==80
tcp.dstport==80
过滤 http 协议的请求方式:
http.request.method=="GET"
http.request.method=="POST"
http.request.uri contains admin #url中包含admin的
http.request.code==404 #http请求状态码的
连接符:
&& ||
and or
通过连接符可以把上面的命令连接在一起,比如:
ip.src==192.168.10.10 and http.request.method=="POST"
停止抓包后,我们可以选择保存抓取到的数据包:文件 -> 另存为 -> 选择一个存储路径,然后就保存为后缀为 .pcap 格式的文件了,可以双击直接用 wireshark 打开。
使用:Wireshark 分析 TCP 协议的三次握手和四次挥手
TCP 报文首部回顾
首先看下 TCP 报文首部,和 wireshark 捕获到的 TCP 包中的每个字段如下图所示:
| 字段 | 说明 |
|---|---|
| 源端口号 | 数据发起者的端口号,16bit |
| 目的端口号 | 数据接收者的端口号,16bit |
| 序号 | 32bit 的序列号,由发送方使用 |
| 确认序号 | 32bit 的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加 1 |
| 首部长度 | 首部中 32bit 字的数目,可表示 15*32bit=60 字节的首部,一般首部长度为 20 字节 |
| 保留 | 6bit,均为 0 |
| 紧急 URG | 当 URG=1 时,表示报文段中有紧急数据,应尽快传送 |
| 确认比特 ACK | ACK=1 时代表这是一个确认的 TCP 包,取值 0 则不是确认包 |
| 推送比特 PSH | 当发送端 PSH=1 时,接收端尽快地交付给应用进程 |
| 复位比特 RST | 当 RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,再重新建立连接 |
| 同步比特 SYN | 在建立连接时用来同步序号。SYN=1、ACK=0 表示一个连接请求报文段;SYN=1、ACK=1 表示同意建立连接 |
| 终止比特 FIN | FIN=1 时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接 |
| 窗口 | 用来控制对方发送的数据量,通知对方已确定的发送窗口上限 |
| 检验和 | 该字段检验的范围包括首部和数据这两部分,由发端计算和存储,并由收端进行验证 |
| 紧急指针 | 紧急指针在 URG=1 时才有效,它指出本报文段中的紧急数据的字节数 |
| 选项 | 长度可变,最长可达 40 字节 |
回顾三次握手四次挥手
详解请参考前文:TCP 协议详解。
TCP 三次握手
因为建立了连接,所以 wireshark 抓到数据包了。
当客户端向服务器发送请求连接的报文时:
- Seq 序列号 = x(这时客户端的序列号为 0);
- SYN = 1(表示发送连接请求)。
服务器端收到客户端发来的请求报文后,同意建立连接,则向客户端发送确认报文:
- Seq 序列号 = y(这时服务器也会产生一个序列号 y);
- Ack 确认号 = 1(Seq 序列号 x+1,表示确认收到了客户端的请求);
- ACK = 1(表示这是条确认请求);
- SYN = 1(同时也发送一个建立连接的请求)。
客户端进程收到服务端进程的确认后,还要向服务端给出确认,然后连接成功建立:
- Seq 序列号 = x+1(这时客户端的序号为 1);
- Ack 确认号 = y+1(表示确认收到了服务器的连接请求);
- ACK = 1(表示这是确认报文)。
TCP 四次挥手
(这时我们将服务器也就是虚拟机关机,使得服务器主动要求断开连接,这时服务器和客户端身份对调。)
客户端进程发出连接释放报文,并停止发送数据:
- Seq 序列号 = x(客户端序列号);
- Ack 确认号 = 673(产生一个初始确认号);
- ACK = 1(表示发出确认报文);
- FIN = 1(表示请求断开连接)。
服务器收到连接释放报文,发出确认报文:
- Seq 序列号 = y(这时服务器的序列号);
- Ack 确认号 = x+1(这时确认号为 x+1=674,确认收到客户端的请求);
- ACK = 1(表示这是确认请求)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文:
- Seq 序列号 = z(服务器更新序列号为 673);
- Ack 确认号 = 674(这时还是 x+1=674);
- ACK = 1(表示这是确认请求);
- FIN = 1(表示请求断开连接)。
客户端收到服务器的连接释放报文后,必须发出确认才能成功断开连接:
- Seq 序列号 = x+1(这时客户端序列号需要 +1=674);
- Ack 确认号 = z+1(服务器的序列号 +1=674,确认收到服务器的请求);
- ACK = 1(表示这是确认请求)。
注:本节例子来源于 https://blog.csdn.net/shengjie87/article/details/106095866,同时推荐阅读 wireshark 抓包分析——TCP/IP 协议。
参考文章
- https://www.cnblogs.com/auguse/p/11749466.html
- https://mlog.club/article/620963
- https://sq.163yun.com/blog/article/193066493804396544?tag=M_tg_144_70
系列导航
- 上一篇:输入 URL 到页面加载过程详解
- 下一篇:tcpdump 使用详解
- 相关阅读:TCP 协议详解(对照三次握手四次挥手分析) | HTTP 协议详解 | netstat 查看服务及监听端口详解