神刀安全网

WireShark学习笔记

抓包工具 Wireshark, 用来获取网络数据封包,包括 HTTP、TCP、UDP 等网络协议包。

wireshark是开源软件,可以放心使用。 可以运行在WindowsMac OS上。

wireshark只能查看封包,而不能修改封包的内容,或者发送封包。

Wireshark VS Fiddler

Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。

wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容。

总结,如果是处理HTTP,HTTPS 还是用Fiddler,  其他协议比如TCP,UDP 就用wireshark。

同类的其他工具微软的network monitor,sniffer

开始抓包

wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。

点击Caputre->Interfaces.. 出现下面对话框,选择正确的网卡。然后点击”Start”按钮, 开始抓包。

WireShark学习笔记

Caputre->Interfaces

WireShark 主要分为这几个界面

1. Display Filter(显示过滤器),  用于过滤

2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表

3. Packet Details Pane(封包详细信息), 显示封包中的字段

4. Dissector Pane(16进制数据)

5. Miscellanous(地址栏,杂项)

WireShark学习笔记

界面

过滤器有两种:

一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录

一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置

过滤表达式的规则

表达式规则

1. 协议过滤

比如TCP,只显示TCP协议。

2. IP 过滤

比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,

ip.dst==192.168.1.102, 目标地址为192.168.1.102

3. 端口过滤

tcp.port ==80,  端口为80的

tcp.srcport == 80,  只显示TCP协议的愿端口为80的。

4. Http模式过滤

http.request.method==”GET”,   只显示HTTP GET方法的。

5. 逻辑运算符为 AND/ OR

封包列表(Packet List Pane)

封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。

你也可以修改这些显示颜色的规则,  View ->Coloring Rules.

封包详细信息 (Packet Details Pane)

这个面板是我们最重要的,用来查看协议中的每一个字段。

各行信息分别为

Frame:物理层的数据帧概况

EthernetII:数据链路层以太网帧头部信息

Internet Protocol Version 4:互联网层IP包头部信息

Transmission Control Protocol:传输层T的数据段头部信息,此处是TCP

Hypertext Transfer Protocol:应用层的信息,此处是HTTP协议

WireShark学习笔记

对应七层模型

WireShark学习笔记

TCP包中的每个字段

WireShark学习笔记

TCP三次握手

TCP:

TCP/IP通过三次握手建立一个连接。这一过程中的三种报文是:SYN,SYN/ACK,ACK。

第一步是找到PC发送到网络服务器的第一个SYN报文,这标识了TCP三次握手的开始。

如果你找不到第一个SYN报文,选择Edit -> Find Packet菜单选项。选择Display Filter,输入过滤条件:tcp.flags,这时会看到一个flag列表用于选择。选择合适的flag,tcp.flags.syn并且加上==1。点击Find,之后trace中的第一个SYN报文就会高亮出来了。

WireShark学习笔记

注意:Find Packet也可以用于搜索十六进制字符,比如恶意软件信号,或搜索字符串,比如抓包文件中的协议命令。

一个快速过滤TCP报文流的方式是在Packet List Panel中右键报文,并且选择Follow TCP Stream。这就创建了一个只显示TCP会话报文的自动过滤条件。

这一步骤会弹出一个会话显示窗口,默认情况下包含TCP会话的ASCII代码,客户端报文用红色表示,服务器报文则为蓝色。

HTTP

当HTTP发送初始GET命令之后,TCP继续数据传输过程,接下来的链接过程中HTTP会从服务器请求数据并使用TCP将数据传回客户端。传送数据之前,服务器通过发送HTTP  OK消息告知客户端请求有效。如果服务器没有将目标发送给客户端的许可,将会返回403 Forbidden。如果服务器找不到客户端所请求的目标,会返回404。

如果没有更多数据,连接可被终止,类似于TCP三次握手信号的SYN和ACK报文,这里发送的是FIN和ACK报文。当服务器结束传送数据,就发送FIN/ACK给客户端,此报文表示结束连接。接下来客户端返回ACK报文并且对FIN/ACK中的序列号加1。这就从服务器端终止了通信。要结束这一过程客户端必须重新对服务器端发起这一过程。必须在客户端和服务器端都发起并确认FIN/ACK过程。

基本IO Graphs:

IO graphs是一个非常好用的工具。基本的Wireshark IO

graph会显示抓包文件中的整体流量情况,通常是以每秒为单位(报文数或字节数)。默认X轴时间间隔是1秒,Y轴是每一时间间隔的报文数。如果想要查看每秒bit数或byte数,点击“Unit”,在“Y

Axis”下拉列表中选择想要查看的内容。这是一种基本的应用,对于查看流量中的波峰/波谷很有帮助。要进一步查看,点击图形中的任意点就会看到报文的细节。

过滤:

每一个图形都可以应用一个过滤条件。这里创建两个不同的graph,一个HTTP一个ICMP。可以看到过滤条件中Graph 1使用“http”Graph 2使用“icmp”。图中可以看到红色ICMP流量中有些间隙,进一步分析。

WireShark学习笔记

过滤

常用排错过滤条件:

对于排查网络延时/应用问题有一些过滤条件是非常有用的:

tcp.analysis.lost_segment:表明已经在抓包中看到不连续的序列号。报文丢失会造成重复的ACK,这会导致重传。

tcp.analysis.duplicate_ack:显示被确认过不止一次的报文。大凉的重复ACK是TCP端点之间高延时的迹象。

tcp.analysis.retransmission:显示抓包中的所有重传。如果重传次数不多的话还是正常的,过多重传可能有问题。这通常意味着应用性能缓慢和/或用户报文丢失。

tcp.analysis.window_update:将传输过程中的TCP window大小图形化。如果看到窗口大小下降为零,这意味着发送方已经退出了,并等待接收方确认所有已传送数据。这可能表明接收端已经不堪重负了。

tcp.analysis.bytes_in_flight:某一时间点网络上未确认字节数。未确认字节数不能超过你的TCP窗口大小(定义于最初3此TCP握手),为了最大化吞吐量你想要获得尽可能接近TCP窗口大小。如果看到连续低于TCP窗口大小,可能意味着报文丢失或路径上其他影响吞吐量的问题。

tcp.analysis.ack_rtt:衡量抓取的TCP报文与相应的ACK。如果这一时间间隔比较长那可能表示某种类型的网络延时(报文丢失,拥塞,等等)。

函数:

IO Graphs有六个可用函数:SUM, MIN, AVG, MAX, COUNT, LOAD。

MIN( ), AVG( ), MAX( )

首先看一下帧之间的最小,平均和最大时间,这对于查看帧/报文之间的延时非常有用。我们可以将这些函数结合“frame.time_delta过滤条件看清楚帧延时,并使得往返延时更为明显。如果抓包文件中包含不同主机之间的多个会话,而只想知道其中一个pair,可将“frame.time_delta”结合源和目标主机条件如“ip.addr==x.x.x.x &&ip.addr==y.y.y.y”。如下图所示:

WireShark学习笔记

函数

我们做了以下步骤:

将Y轴设置为“Advanced”,让Caculation域可见。不做这一步就看不到计算选项。

X轴时间间隔1秒,所以每个柱状图代表1秒间隔的计算结果。

过滤出两个特定IP地址的HTTP会话,使用条件:“(ip.addr==192.168.1.4&& ip.addr==128.173.87.169) && http”。

使用3个不同的graph,分别计算Min(), Avg(), Max()。

对每一个计算结果应用条件“frame.time_delta”,将style设置成“FBar”,显示效果最佳。

Count( ):此函数计算时间间隔内事件发生的次数,在查看TCP分析标识符时很有用,例如重传。

Sum( ):该函数统计事件的累加值。有两种常见的用例是看在捕获TCP数据量,以及检查TCP序列号。

协议过滤器:

arp:显示所有包括ARP请求和回复在内的所有ARP数据流。

ip:显示内含IPv4头在内的(如ICMP目的地址不可达报文,在ICMP报文头之后返回到来方向的IPv4头)IP数据流。

ipv6:显示所有IPv6数据流,包括内含IPv6报文头的IPv4报文,如6to4,Teredo,以及ISATAP数据流。

tcp:显示所有基于TCP的数据流。

应用过滤器:

bootp:显示所有DHCP数据流(基于BOOTP)。

dns:显示包括TCP区域传输以及基于标准UDP的DNS请求和回复在内的所有DNS数据流。

tftp:显示所有TFTP(Trivial File Transfer Protocol)数据流。

http:显示所有HTTP命令,回复以及数据传输报文,但不显示TCP握手报文,TCP ACK报文以及TCP结束报文。

icmp:显示所有ICMP报文。

域过滤器:

boot.option.hostname:显示所有包含主机名的DHCP数据流(DHCP基于BOOTP)。

http:host:显示所有包含HTTP主机名字段的所有HTTP报文。此报文是客户端向网络服务器发送请求时发出的。

ftp.request.command:显示所有包含命令的FTP数据流,比如USER,PASS,或RETR命令。

字符过滤器:

tcp.analysis.flags:显示所有包含TCP分析标识的所有报文,包括报文丢失,重传,或零窗口标识。

tcp.analysis,zero_window:显示含有表明发送方的接收缓存用完标识的报文。

显示过滤器比较运算符:

通过扩展过滤条件可查找某一域值,Wireshark针对此功能支持数字比较运算符。

1. ==或eq

例如:ip.src == 10.2.2.2

显示所有源地址为10.2.2.2的IPv4数据流

2. !=或ne

例如:tcp.srcport != 80

显示源端口除了80以外的所有TCP数据流

3. >或gt

例如:frame.time_relative > 1

显示距前一个报文到达时间相差1秒的报文

4. <或lt

例如:tcp.window_size < 1460

显示当TCP接收窗口小于1460字节时的报文

5. >=或ge

例如:dns.count.answers >= 10

显示包含10个以上answer的DNS响应报文

6. <=或le

例如:ip.ttl <= 10

显示IP报文中Time to Live字段小于等于10的报文

7. contains

例如:http contains “GET”

显示所有HTTP客户端发送给HTTP服务器的GET请求

对于基于TCP应用的过滤条件采用比较运算符。例如,如果想看端口80上面的HTTP数据流,使用HTTP.port==80。

小贴士:

运算符两边不用留空格。ip.src == 10.2.2.2与ip.src==10.2.2.2的效果是相同的。

过滤HTTP数据流:

在排查网页浏览器会话或检查网速过慢问题时,对浏览器会话进行过滤就显得尤为重要。过滤HTTP数据流有两种方式:

http

tcp.port==xx(xx表示所使用的HTTP端口)

第二种过滤方法更加有效。

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » WireShark学习笔记

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址