【网络学习笔记】使用Wireshark抓取HTTP报文

前言

最近在学习计算机网络知识,学习过程中使用抓包工具Wireshark抓取网络数据包,来辅助理解网络协议。

Wireshark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。

目录

文章目录

基本使用

下载地址:https://www.wireshark.org/

支持系统:Windows、macOS

基本使用
基本使用
主要功能区

主要功能区:

  1. 显示过滤器
  2. 抓获的封包列表
  3. 封包详细信息
  4. 封包16进制数据

抓取HTTP报文

抓取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响应报文

查看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.2src or dst host 10.2.2.2是一样的

Host(s)

可能的值: net, port, host, portrange

如果没有指定此值,则默认使用"host"关键字。

例如,src 10.1.1.1src 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 23not (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

你可能感兴趣的:(【网络学习笔记】使用Wireshark抓取HTTP报文)