当前位置: 首页 > news >正文

wireshark详解

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

在过去,网络封包分析软件是非常昂贵的,或是专门属于盈利用的软件。Ethereal的出现改变了这一切。在GNUGPL通用许可证的保障范围底下,使用者可以以免费的代价取得软件与其源代码,并拥有针对其源代码修改及客制化的权利。Ethereal是全世界最广泛的网络封包分析软件之一。

Wireshark优势:

1、强大的协议解析能力,一到七层全解码,一览无遗,对于协议细节的研究特别有帮助。

2、对于https加密流量,只要将浏览器的session key 自动导入wireshark,Wireshark可以自动解密https流量。

Wireshark不足之处:

尽管可以自定义过滤列表,但为了抓取一个特定TCP Flow /Session 流量需要写一个长长的过滤列表,这对于初学者很不友好。

应用

Wireshark使用目的

以下是一些使用Wireshark目的的例子:

网络管理员使用Wireshark来检测网络问题,网络安全工程师使用Wireshark来检查资讯安全相关问题,开发者使用Wireshark来为新的通讯协定除错,普通使用者使用Wireshark来学习网络协定的相关知识。当然,有的人也会“居心叵测”的用它来寻找一些敏感信息……

Wireshark不是入侵侦测系统(Intrusion Detection System,IDS)。对于网络上的异常流量行为,Wireshark不会产生警示或是任何提示。然而,仔细分析Wireshark撷取的封包能够帮助使用者对于网络行为有更清楚的了解。Wireshark不会对网络封包产生内容的修改,它只会反映出流通的封包资讯。 Wireshark本身也不会送出封包至网络上。

发展简史

1997年底,GeraldCombs需要一个能够追踪网络流量的工具软件作为其工作上的辅助。因此他开始撰写Ethereal软件。Ethereal在经过几次中断开发的事件过后,终于在1998年7月释出其第一个版本v0.2.0。自此之后,Combs收到了来自全世界的修补程式、错误回报与鼓励信件。Ethereal的发展就此开始。不久之后,GilbertRamirez看到了这套软件的开发潜力并开始参予低阶程式的开发。1998年10月,来自NetworkAppliance公司的GuyHarris在寻找一套比tcpview(另外一套网络封包撷取程式)更好的软件。于是他也开始参与Ethereal的开发工作。1998年底,一位在教授TCP/IP课程的讲师RichardSharpe,看到了这套软件的发展潜力,而后开始参与开发与加入新协定的功能。在当时,新的通讯协定的制定并不复杂,因此他开始在Ethereal上新增的封包撷取功能,几乎包含了当时所有通讯协定。

自此之后,数以千计的人开始参与Ethereal的开发,多半是因为希望能让Ethereal撷取特定的,尚未包含在Ethereal默认的网络协定的封包而参与新的开发。2006年6月,因为商标的问题,Ethereal更名为Wireshark。

工作流程

(1)确定Wireshark的位置。如果没有一个正确的位置,启动Wireshark后会花费很长的时间捕获一些与自己无关的数据。

(2)选择捕获接口一般都是选择连接到Internet网络的接口,这样才可以捕获到与网络相关的数据。否则,捕获到的其它数据对自己也没有任何帮助。

(3)使用捕获过滤器通过设置捕获过滤器,可以避免产生过大的捕获文件这样用户在分析数据时,也不会受其它数据干扰。而且,还可以为用户节约大量的时间。

(4)使用显示过滤器。通常使用捕获过滤器过滤后的数据,往往还是很复杂。为了使过滤的数据包再更细致,此时使用显示过滤器进行过滤。

(5)使用着色规则。通常使用显示过滤器过滤后的数据,都是有用的数据包。如果想更加突出的显示某个会话,可以使用着色规则高亮显示。

(6)构建图表。如果用户想要更明显的看出一个网络中数据的变化情况,使用图表的形式可以很方便的展现数据分布情况。

(7)重组数据。Wireshark的重组功能,可以重组一个会话中不同数据包的信息,或者是一个重组一个完整的图片或文件。由于传输的文件往往较大,所以信息分布在多个数据包中。为了能够查看到整个图片或文件,这时候就需要使用重组数据的方法来实现。

使用说明

以wireshark 2.6.3 汉化版为例

1. 安装

除了路径是自定义之外,其它均默认即可。

2. 使用技巧

1、点击每一行时,wireshark很智能的在记录前用标线表明了本次会话的记录范围[从三次握手到四次挥手]

å¨è¿éæå¥å¾çæè¿°
2、http请求是“请求->响应”式的,需要查看对应请求的响应时,可以在包上右键,选择“追踪流(Follow TCP Stream)

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

3、错误包的产生与解决办法:参考Wireshark抓包时显示TCP校验和错误(checksum incorrect)​​​​​​

在Windows平台上用Ethereal抓包时发现TCP校验和错误,

但应用层的反应告诉我,这个报文的TCP校验和没问题。

A: 2000-03​​​​​​​

网卡配置->高级->Rx Checksum Offload/Tx Checksum Offload,

很可能你的这两处设置是Enable,将之调整成Disable即可,代价是网络性能降低。

一般由操作系统的TCP/IP协议栈完成TCP/UDP/IP校验和的计算工作,

这两处设置成Enable之后,协议栈不再进行校验和的计算,而是由网卡自己完成。

如果在前述位置没有发现Rx Checksum Offload/Tx Checksum Offload项,

有两种可能,一种是网卡本身不支持这种功能,另一种是网卡驱动未提供配置项,后一种情形居多。

解决方法:

把网卡的属性修改一下就可以,禁用 Checksum Offload(原理是让网卡硬件自己计算校验和,而不是交给操作系统的 tcp/ip 协议栈来计算):

å¨è¿éæå¥å¾çæè¿°

2.1. 捕获过滤器表达式

这个主要还是需要多看输入的提示,我也是靠蒙写个简单的

//表示只过滤主机10.6.161.15或者10.10.65.67的包

host 10.6.161.15 or host 10.10.65.67

//使用域名

host baidu.com

å¨è¿éæå¥å¾çæè¿°

//表示只显示Source为10.6.161.15的

ip.src==10.6.161.15

2.2. 开始捕获

菜单“捕获-选项”,设置需要捕获的网络适配器,点击“开始”。也可以在菜单“捕获-开始”、“捕获-结束”来控制开始结束。在“捕获-捕获过滤器”编辑捕获表达式

å¨è¿éæå¥å¾çæè¿°

在上述“捕获”菜单中进行的操作,也可以在工具栏进行,如下图

2.3. 捕获结果

双击每一行记录,可在弹出窗口中查看详细记录

å¨è¿éæå¥å¾çæè¿°

2.3.1. 着色规则

在菜单“视图-着色规则”下查看

å¨è¿éæå¥å¾çæè¿°

2.3.2. 数据包的大致结构

  • 第一行:数据包整体概述
  • 第二行:链路层详细信息,主要的是双方的mac地址(关注mac)
  • 第三行:网络层详细信息,主要的是双方的IP地址(关注IP)
  • 第四行:传输层的详细信息,主要的是双方的端口号(关注端口号)。

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

2.3.3. 示例
注:window查看本机ip、mac等,可在cmd下使用命令ipconfig/all

2.3.3.1. 三次握手
客户端->服务器:发送标识为SYN=1、随机产生的客户端序号seq(发送序号)
服务器->客户端:发送标识为SYN=1、ACK=1、第一步产生的客户端序号seq+1(确认序号)、随机产生的服务端序号seq
客户端->服务器:第一步产生的客户端序号seq+1(发送序号)、第二步产生的服务端序号seq+1(确认序号)、ACK=1

三次数据包

其中[SYN]意为SYN位为1(如果没有,则表示为0)。同理如果[]中有ACK,表示ACK位为1

å¨è¿éæå¥å¾çæè¿°

客户端==》服务器

å¨è¿éæå¥å¾çæè¿°

服务器==》客户端

å¨è¿éæå¥å¾çæè¿°

客户端==》服务器

2.3.3.2. 四次挥手

摘抄自:TCP三次握手和四次挥手过程(握手是见面,挥手是再见)

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,“告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息”。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,“告诉Client端,好了,我这边数据发完了,准备好关闭连接了”。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,“就知道可以断开连接了”。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

å¨è¿éæå¥å¾çæè¿°

四次数据包

å¨è¿éæå¥å¾çæè¿°

数据含义同三次握手

2.3.3.3. tcp/ip数据包
标志位对应的功能:

URG: 紧急指针( urgent pointer)有效。
ACK: 确认序号有效。
PSH: 接收方应该尽快将这个报文段交给应用层。
RST: 重建连接。
SYN: 同步序号用来发起一个连接。
FIN: 发端完成发送任务。
窗口大小:用于流量控制。
检验和:检验和覆盖了整个的 TCP报文段: TCP首部和TCP数据,与udp相似需要计算伪首部。
tcp数据包结构及在wireshark中的位置

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

ip数据包:(不画了,耐心已为负值)

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

2.3.3.4. 使用实例

抓取财政会计行业管理系统的一些示例

点击页面中的任意一个查询

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

如下,将包的内容和浏览器的内容对比一下

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

查看响应包(注意http和tcp流的不同)

å¨è¿éæå¥å¾çæè¿°

å¨è¿éæå¥å¾çæè¿°

捕捉过滤器

Protocol(协议):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果没有特别指明是什么协议,则默认使用所有支持的协议。

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 port 23″相同。
“not tcp port 3128 and tcp port 23″与”not (tcp port 3128 and tcp port 23)”不同。

例子:

tcp dst port 3128  //捕捉目的TCP端口为3128的封包。
ip src host 10.1.1.1  //捕捉来源IP地址为10.1.1.1的封包。
host 10.1.2.3  //捕捉目的或来源IP地址为10.1.2.3的封包。
ether host e0-05-c5-44-b1-3c //捕捉目的或来源MAC地址为e0-05-c5-44-b1-3c的封包。如果你想抓本机与所有外网通讯的数据包时,可以将这里的mac地址换成路由的mac地址即可。
src portrange 2000-2500  //捕捉来源为UDP或TCP,并且端口号在2000至2500范围内的封包。
not imcp  //显示除了icmp以外的所有封包。(icmp通常被ping工具使用)
src host 10.7.2.12 and not dst net 10.200.0.0/16 //显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包。
(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  //捕捉来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,并且目的位于网络 10.0.0.0/8内的所有封包。
src net 192.168.0.0/24 
src net 192.168.0.0 mask 255.255.255.0  //捕捉源地址为192.168.0.0网络内的所有封包。

注意事项:

当使用关键字作为值时,需使用反斜杠“/”。

“ether proto /ip” (与关键字”ip”相同).

这样写将会以IP协议作为目标。

“ip proto /icmp” (与关键字”icmp”相同).

这样写将会以ping工具常用的icmp作为目标。

可以在”ip”或”ether”后面使用”multicast”及”broadcast”关键字。

当您想排除广播请求时,”no broadcast”就会非常有用。

Protocol(协议):
您可以使用大量位于OSI模型第2至7层的协议。点击”Expression…”按钮后,您可以看到它们。
比如:IP,TCP,DNS,SSH

String1, String2 (可选项):

协议的子类。
点击相关父类旁的”+”号,然后选择其子类。

Comparison operators (比较运算符):
可以使用6种比较运算符:
 


Logical e­xpressions(逻辑运算符):


显示过滤器

例子:
snmp || dns || icmp //显示SNMP或DNS或ICMP封包。 
ip.addr == 10.1.1.1  //显示来源或目的IP地址为10.1.1.1的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6  //显示来源不为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 and 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以外任意
tcp.port == 25  //显示来源或目的TCP端口号为25的封包。 
tcp.dstport == 25  //显示目的TCP端口号为25的封包。 
tcp.flags  //显示包含TCP标志的封包。 
tcp.flags.syn == 0×02  //显示包含TCP SYN标志的封包。 
如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
更为详细的说明请见:WIRESHARK - 简明教程 - 过滤器

相关文章:

  • AForge详解
  • C#版本和.NET版本以及VS版本的对应关系
  • ActionBar、TitleBar、ToolBar的联系和区别
  • xmlns, xmlns:xsi, xsi:schemaLocation 解释
  • Android SplashActivity
  • ICE详解
  • Retrofit2深入浅出
  • Android中的单位(dp、sp、dpi)
  • VS生成项目时,有些文件无法复制到输出目录的解决办法
  • .net framework4与其client profile版本的区别
  • ICE中的基本概念
  • ICE简单介绍及使用示例
  • ICE的proxy使用
  • Composite UI Application Block (CAB) 详解
  • 什么是实例化,实例化、声明、初始化的区别
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • Mithril.js 入门介绍
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Spring Boot快速入门(一):Hello Spring Boot
  • 对超线程几个不同角度的解释
  • 聊聊hikari连接池的leakDetectionThreshold
  • 手机端车牌号码键盘的vue组件
  • 无服务器化是企业 IT 架构的未来吗?
  • 7行Python代码的人脸识别
  • hi-nginx-1.3.4编译安装
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # centos7下FFmpeg环境部署记录
  • #{} 和 ${}区别
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (SpringBoot)第二章:Spring创建和使用
  • (多级缓存)多级缓存
  • (南京观海微电子)——I3C协议介绍
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (万字长文)Spring的核心知识尽揽其中
  • .Net Core 中间件验签
  • .Net 垃圾回收机制原理(二)
  • .NET 命令行参数包含应用程序路径吗?
  • .Net多线程总结
  • @Pointcut 使用
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [CakePHP] 在Controller中使用Helper
  • [C语言]编译和链接
  • [Docker]五.Docker中Dockerfile详解
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [HarmonyOS]第一课:从简单的页面开始
  • [hdu4622 Reincarnation]后缀数组
  • [IE编程] 如何编程清除IE缓存
  • [Unity]出android包出错:java.nio.file.accessdeniedexception
  • [win10] ffmpeg gpu加速
  • [Windows编程] stack overflow != stack buffer overflow