前言
最近在学习计算机网络知识,学习过程中使用抓包工具Wireshark
抓取网络数据包,来辅助理解网络协议。
Wireshark
是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark
使用WinPCAP
作为接口,直接与网卡进行数据报文交换。
目录
基本使用
下载地址:https://www.wireshark.org/
支持系统:Windows、macOS
主要功能区:
- 显示过滤器
- 抓获的封包列表
- 封包详细信息
- 封包16进制数据
抓取HTTP
报文
1.开启捕捉任务
2.浏览器访问http://www.lizhengyang.cn/
3.停止捕捉任务
4.设置显示过滤条件
开启捕捉任务后,封包列表可能会出现很多无用的数据包,设置显示过滤器过滤掉冗余数据。
如下图,在显示过滤器中输入:http and ip.addr == 39.107.127.222
(IP地址替换为目标网站的IP)
按回车键,只剩下两个数据包:请求包、响应包。
5.查看HTTP报文
在任意数据包上点击右键:追踪流-->HTTP流
弹出窗口就是完整的HTTP报文
,红色字体为HTTP请求报文
,蓝色字体为HTTP响应报文
过滤器
如果不设置过滤器,会抓取很多杂乱冗余的数据,以至于很难找到自己需要的部分。使用过滤器可以帮助我们精准找到需要的信息。
过滤器分两种:
- 捕捉过滤器。只捕捉符合过滤规则的封包,其它数据不会存在封包列表中。在捕捉前设置。
- 显示过滤器。用来过滤抓取后的结果,可以随意更改过滤规则。
注意:两种过滤器的规则语法是不一样的,不要混淆。
捕捉过滤器
捕捉过滤器的语法与其它使用Lipcap(Linux)或者Winpcap(Windows)库开发的软件一样,比如著名的TCPdump。捕捉过滤器必须在开始捕捉前设置完毕,这一点跟显示过滤器是不同的。
设置捕捉过滤器的步骤是:
- 工具栏 -> 捕捉 -> 选项
- WLAN -> 捕捉过滤器中输入规则
- 点击开始(Start)进行捕捉
过滤公式
语法: | Protocol | Direction | Host(s) | Value | Logical Operations | Other expression | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
例子: | tcp | dst | 10.1.1.1 | 80 | and | tcp dst 10.2.2.2 3128 |
Protocol(协议):
可能的值: ether
, fddi
, ip
, arp
, rarp
, decnet
, lat
, sca
, moprc
, mopdl
, tcp
如果没有特别指明是什么协议,则默认使用所有支持的协议。
Direction(方向):
可能的值: src
, dst
, src and dst
, src or dst
如果没有特别指明来源或目的地,则默认使用 "src or dst" 作为关键字。
例如,host 10.2.2.2
与src or dst host 10.2.2.2
是一样的
Host(s)
可能的值: net
, port
, host
, portrange
如果没有指定此值,则默认使用"host"关键字。
例如,src 10.1.1.1与
src host 10.1.1.1`相同。
Logical Operations(逻辑运算):
可能的值:not
, and
, or
否(not
)具有最高的优先级。或(or
)和与(and
)具有相同的优先级,运算时从左至右进行。
例如
-
not tcp port 3128 and tcp port 23
与(not tcp port 3128) and tcp port23
相同。 -
not tcp port 3128 and tcp port 23
与not (tcp port 3128 and tcp port23)
不同。
案例
//显示目的TCP端口为3128的封包。
tcp dst port 3128
//显示来源IP地址为10.1.1.1的封包。
ip src host 10.1.1.1
//显示目的或来源IP地址为10.1.2.3的封包。
host 10.1.2.3
//显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。
src portrange 2000-2500
//显示除了icmp以外的所有封包。(icmp通常被ping工具使用)
not imcp
//显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。
src host 10.7.2.12 and not dst net 10.200.0.0/16
//显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络10.0.0.0/8内的所有封包。
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8
//显示目的TCP端口为3128的封包。
tcp dst port 3128`
//显示来源IP地址为10.1.1.1的封包。
ip src host 10.1.1.1
//显示目的或来源IP地址为10.1.2.3的封包。
host 10.1.2.3
//显示来源为UDP或TCP,并且端口号在2000至2500范围内的封包。
src portrange 2000-2500
//显示除了icmp以外的所有封包。(icmp通常被ping工具使用)
not imcp
//显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。
src host 10.7.2.12 and not dst net 10.200.0.0/16
显示过滤器
刚才抓取HTTP
报文使用的就是显示过滤器。
过滤公式
语法: | Protocol | . | String 1 | . | String 2 | Comparisonoperator | Value | LogicalOperations | Otherexpression |
---|---|---|---|---|---|---|---|---|---|
例子: | http | request | uri | == | "/index" | xor | ip.dst != 10.4.5.6 |
看到这里有是不是有点蒙,每个符号都认识,但为啥要这样组合呢?
不要怕,这个公式不需要记住,熟悉一下公式的结构即可,因为Wireshark
中可已通过表达式工具来动态生成规则。
动态生成过滤规则
点击“表达式”
弹出“显示过滤器表达式”窗口
上图圈住的五个模块对应着五个步骤:
第一步:搜索网络协议
第二步:选择协议(Protocol)
可以使用tcp、ip、udp等位于OSI模型第2至7层的协议。点击协议列表,可以选择需要参与过滤的协议。
举例:http.request.uri
(http请求中的uri)
其中http
为协议,request.uri
是协议的子类,通过 .
连接。Wireshark
的官网提供了对各种 协议以及它们子类的说明。
第三步:选择比较运算符(Comparison operators)
英文写法: | C语言写法: | 含义: |
---|---|---|
eq | == | 等于 |
ne | != | 不等于 |
gt | > | 大于 |
lt | < | 小于 |
ge | >= | 大于等于 |
le | <= | 小于等于 |
contains | contains | 包含 |
matches | matches | 正则表达式匹配 |
in | in | 在指定集中 |
第四步:选择比较的值
第五步:校验规则是否合法
以上的每一步操作都会在下方输入框自动生成过滤规则,合法的规则显示绿色背景,不合法的规则显示红色背景。
校验完成点击ok
,显示过滤器规则设置完成。
多个过滤条件
若需要通过过个条件筛选数据,比如:只显示80端口和8080端口的封包。就要用到逻辑运算符(Logical expressions),把多个条件连接。
英文写法: | C语言写法: | 含义: |
---|---|---|
and | && | 逻辑与 |
or | || | 逻辑或 |
xor | ^^ | 逻辑异或 |
not | ! | 逻辑非 |
被程序员们熟知的逻辑异或是一种排除性的或。当其被用在过滤器的两个条件之间时,只有当且仅当其中的一个条件满足时,这样的结果才会被显示在屏幕上。
举个例子:
//只有当目的TCP端口为80或者来源于端口1025(但又不能同时满足这两点)时,这样的封包才会被显示。
tcp.dstport 80 xor tcp.dstport 1025
案例
//显示HTTP或UDP议封包
http || udp
//显示来源或目的IP地址为10.1.1.1的封包
ip.addr == 10.1.1.1
//显示来源不为10.1.2.3或者目的不为10.4.5.6的封包。换句话说,显示的封包将会为:
//来源IP:除了10.1.2.3以外任意;目的IP:任意
//以及
//来源IP:任意;目的IP:除了10.4.5.6以外任意
`ip.src != 10.1.2.3 or ip.dst != 10.4.5.6`
//显示来源不为10.1.2.3并且目的IP不为10.4.5.6的封包。换句话说,显示的封包将会为:来源IP:除了10.1.2.3以外任意;同时须满足,目的IP:除了10.4.5.6以外任意
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6
//显示来源或目的TCP端口号为25的封包
tcp.port == 25
//显示目的TCP端口号为25的封包
tcp.dstport == 25
//显示包含TCP标志的封包
tcp.flags
//显示包含TCP SYN标志的封包
tcp.flags.syn == 0x02`
//显示HTPP域名中包含'baidu'的封包
http.host contains "baidu"
结束语
至此,Wireshark
的基本功能和使用方法已经介绍完了。如果有错误的地方恳请留言指出。
参考资料
https://wiki.wireshark.org/DisplayFilters
https://wiki.wireshark.org/CaptureFilters
http://openmaniak.com/cn/wireshark.php