Wireshark1.12.3的使用(抓包、过滤器)及遇到的问题解决

 

the capture session could not be initiated on interface"\Device\NPF_(78032B7E-4968-42D3-9F37-287EA86C0AAA)" (failed to set hardware filter to promiscuous mode).

please check to make sure you have sufficient permissions and that you have the proper interface or pipe specified

解决方法:

打开菜单项“Capture”下的子菜单“Capture Options”选项;

找到设置面板中有一项“Capture all in promiscuous mode”选项;
“Capture all in promiscuous mode”选项默认是选中状态,修改该状态为未选中状态;

 

////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////

 

Capture Options   里的Capture Filter :ip dst host 000,00,00,00 and tcp

 

 

/////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////

 

Wireshark软件安装

  软件下载路径:wireshark官网。按照系统版本选择下载,下载完成后,按照软件提示一路Next安装。

  如果你是Win10系统,安装完成后,选择抓包但是不显示网卡,下载win10pcap兼容性安装包。下载路径:win10pcap兼容性安装包

Wireshark 开始抓包示例

   先介绍一个使用wireshark工具抓取ping命令操作的示例,让读者可以先上手操作感受一下抓包的具体过程。

  1、打开wireshark 2.6.5,主界面如下:

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216081023389-2002447427.png

  2、选择菜单栏上Capture -> Option,勾选WLAN网卡(这里需要根据各自电脑网卡使用情况选择,简单的办法可以看使用的IP对应的网卡)。点击Start。启动抓包。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216081719715-1763002076.png

  3、wireshark启动后,wireshark处于抓包状态中。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216082050941-1775919525.png

  4、执行需要抓包的操作,如ping www.baidu.com。

  5、操作完成后相关数据包就抓取到了。为避免其他无用的数据包影响分析,可以通过在过滤栏设置过滤条件进行数据包列表过滤,获取结果如下。说明:ip.addr == 119.75.217.26 and icmp 表示只显示ICPM协议且源主机IP或者目的主机IP为119.75.217.26的数据包。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216082650625-902953031.png

  5、wireshark抓包完成,就这么简单。关于wireshark过滤条件和如何查看数据包中的详细内容在后面介绍。

Wireshakr抓包界面

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216083953866-9796212.png

  说明:数据包列表区中不同的协议使用了不同的颜色区分。协议颜色标识定位在菜单栏View --> Coloring Rules。如下所示

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216092058380-751854098.png

WireShark 主要分为这几个界面

  1. Display Filter(显示过滤器),  用于设置过滤条件进行数据包列表过滤。菜单路径:Analyze --> Display Filters。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216161033619-451281242.png

  2. Packet List Pane(数据包列表), 显示捕获到的数据包,每个数据包包含编号,时间戳,源地址,目标地址,协议,长度,以及数据包信息。 不同协议的数据包使用了不同的颜色区分显示。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216161154412-766346180.png

  3. Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为

  (1)Frame:   物理层的数据帧概况

  (2)Ethernet II: 数据链路层以太网帧头部信息

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

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

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

http://www.cr173.com/up/2013-5/2013050217125736394.png

TCP包的具体内容

 从下图可以看到wireshark捕获到的TCP包中的每个字段。

http://www.cr173.com/up/2013-5/2013050217125787134.png

  4. Dissector Pane(数据包字节区)。

Wireshark过滤器设置

   初学者使用wireshark时,将会得到大量的冗余数据包列表,以至于很难找到自己自己抓取的数据包部分。wireshar工具中自带了两种类型的过滤器,学会使用这两种过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。

1)抓包过滤器

    捕获过滤器的菜单栏路径为Capture --> Capture Filters。用于在抓取数据包前设置。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216161942199-694292737.png

 如何使用?可以在抓取数据包前设置如下。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216162715878-976869768.png

ip host 60.207.246.216 and icmp表示只捕获主机IP为60.207.246.216的ICMP数据包。获取结果如下:

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216162922295-1140020404.png

(2)显示过滤器

  显示过滤器是用于在抓取数据包后设置过滤条件进行过滤数据包。通常是在抓取数据包时设置条件相对宽泛,抓取的数据包内容较多时使用显示过滤器设置条件顾虑以方便分析。同样上述场景,在捕获时未设置捕获规则直接通过网卡进行抓取所有数据包,如下

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216163301344-1400128534.png

执行ping www.huawei.com获取的数据包列表如下

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216163359260-101806867.png

观察上述获取的数据包列表,含有大量的无效数据。这时可以通过设置显示器过滤条件进行提取分析信息。ip.addr == 211.162.2.183 and icmp。并进行过滤。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216163607973-642074591.png

  上述介绍了抓包过滤器和显示过滤器的基本使用方法。在组网不复杂或者流量不大情况下,使用显示器过滤器进行抓包后处理就可以满足我们使用。下面介绍一下两者间的语法以及它们的区别。

wireshark过滤器表达式的规则

1、抓包过滤器语法和实例

   抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)

(1)协议过滤 

  比较简单,直接在抓包过滤框中直接输入协议名即可。

  TCP,只显示TCP协议的数据包列表

  HTTP,只查看HTTP协议的数据包列表

  ICMP,只显示ICMP协议的数据包列表

(2)IP过滤

  host 192.168.1.104

  src host 192.168.1.104

  dst host 192.168.1.104

(3)端口过滤

  port 80

  src port 80

  dst port 80

(4)逻辑运算符&& 与、|| 或、!非

  src host 192.168.1.104 && dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包

  host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包

  !broadcast 不抓取广播数据包

2、显示过滤器语法和实例

(1)比较操作符

  比较操作符有== 等于、!= 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。

(2)协议过滤

  比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。

  tcp,只显示TCP协议的数据包列表

  http,只查看HTTP协议的数据包列表

  icmp,只显示ICMP协议的数据包列表

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216091233009-756441984.png

(3) ip过滤

   ip.src ==192.168.1.104 显示源地址为192.168.1.104的数据包列表

   ip.dst==192.168.1.104, 显示目标地址为192.168.1.104的数据包列表

   ip.addr == 192.168.1.104 显示源IP地址或目标IP地址为192.168.1.104的数据包列表

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216091553689-1436668121.png

(4)端口过滤

  tcp.port ==80,  显示源主机或者目的主机端口为80的数据包列表。

  tcp.srcport == 80,  只显示TCP协议的源主机端口为80的数据包列表。

  tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216092151712-331226826.png

(5) Http模式过滤

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

(6)逻辑运算符为 and/or/not

  过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.104的ICMP数据包表达式为ip.addr == 192.168.1.104 and icmp

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216092834478-225085029.png

(7)按照数据包内容过滤。假设我要以IMCP层中的内容进行过滤,可以单击选中界面中的码流,在下方进行选中数据。如下

https://img2018.cnblogs.com/blog/774327/201906/774327-20190619074816611-772694481.png

右键单击选中后出现如下界面

https://img2018.cnblogs.com/blog/774327/201906/774327-20190619074945293-3644404.png

选中Select后在过滤器中显示如下

https://img2018.cnblogs.com/blog/774327/201906/774327-20190619075028529-409167.png

后面条件表达式就需要自己填写。如下我想过滤出data数据包中包含"abcd"内容的数据流。包含的关键词是contains 后面跟上内容。

https://img2018.cnblogs.com/blog/774327/201906/774327-20190619075212180-801507805.png

看到这, 基本上对wireshak有了初步了解。

Wireshark抓包分析TCP三次握手

(1)TCP三次握手连接建立过程

    Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;

    Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;

   Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。

http://www.cr173.com/up/2013-5/2013050217125714223.png

(2)wireshark抓包获取访问指定服务端数据包

    Step1:启动wireshark抓包,打开浏览器输入www.huawei.com。

    Step2:使用ping www.huawei.com获取IP

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216104018866-329362658.png

    Step3:输入过滤条件获取待分析数据包列表 ip.addr == 211.162.2.183

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216104535874-2007397893.png

  图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图。

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216104744830-1050984889.png

数据包的关键属性如下:

  SYN :标志位,表示请求建立连接

  Seq = 0 :初始建立连接值为0,数据包的相对序列号从0开始,表示当前还没有发送数据

  Ack =0:初始建立连接值为0,已经收到包的数量,表示当前没有接收到数据

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216104950687-1236457395.png

 数据包的关键属性如下:

  [SYN + ACK]: 标志位,同意建立连接,并回送SYN+ACK

  Seq = 0 :初始建立值为0,表示当前还没有发送数据

  Ack = 1:表示当前端成功接收的数据位数,虽然客户端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位。(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)

第三次握手的数据包

  客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216105102440-1450961874.png

数据包的关键属性如下:

  ACK :标志位,表示已经收到记录

  Seq = 1 :表示当前已经发送1个数据

  Ack = 1 : 表示当前端成功接收的数据位数,虽然服务端没有发送任何有效数据,确认号还是被加1,因为包含SYN或FIN标志位(并不会对有效数据的计数产生影响,因为含有SYN或FIN标志位的包并不携带有效数据)。

  就这样通过了TCP三次握手,建立了连接。开始进行数据交互

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216112117277-377988567.png

下面针对数据交互过程的数据包进行一些说明:

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216112320086-467982290.png

数据包的关键属性说明

  Seq: 1

  Ack: 1: 说明现在共收到1字节数据

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216112705306-1390447949.png

  Seq: 1 
  Ack: 951: 说明现在服务端共收到951字节数据

  在TCP层,有个FLAGS字段,这个字段有以下几个标识:SYN, FIN, ACK, PSH, RST, URG。如下

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216113119425-2072328757.png

    其中,对于我们日常的分析有用的就是前面的五个字段。它们的含义是:SYN表示建立连接,FIN表示关闭连接,ACK表示响应,PSH表示有DATA数据传输,RST表示连接重置。

Wireshark分析常用操作

  调整数据包列表中时间戳显示格式。调整方法为View -->Time Display Format --> Date and Time of Day。调整后格式如下:

https://img2018.cnblogs.com/blog/774327/201812/774327-20181216113851595-75851722.png

 

 

 

/////////////////////////////////////////////使用////////////////////////////////////

1)ip.addr==192.168.5.6,只显示192.168.5.6这个地址相关数据包

2)frame.len<=128,只查看长度小于128字节的数据包

3)http,只显示http数据包

4)ip.addr==192.168.5.6 && tcp.port==15566,只显示与192.168.5.6有关且与tcp端口15566有关的数据包

ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107

或者ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP

tcp.port eq 80 // 不管端口是来源的还是目标的都显示

tcp.port == 80

tcp.port eq 2722

tcp.port eq 80 or udp.port eq 80

tcp.dstport == 80 // 只显tcp协议的目标端口80

tcp.srcport == 80 // 只显tcp协议的来源端口80

udp.port eq 15000

过滤端口范围

tcp.port >= 1 and tcp.port <= 80

tcp udp arp icmp http smtp ftp dns msnms ip ssl oicq bootp等等排除arp如!arp not arp

太以网头过滤

eth.dst == A0:00:00:04:C5:84 // 过滤目标mac

eth.src eq A0:00:00:04:C5:84 // 过滤来源mac

eth.dst==A0:00:00:04:C5:84

eth.dst==A0-00-00-04-C5-84

eth.addr eq A0:00:00:04:C5:84 // 过滤来源MAC和目标MAC都等于A0:00:00:04:C5:84的less than 小于 < lt 小于等于 le等于 eq大于 gt大于等于 ge不等 ne

udp.length == 26 这个长度是指udp本身固定长度8加上udp下面那块数据包之和

tcp.len >= 7   指的是ip数据包(tcp下面那块数据),不包括tcp本身

ip.len == 94 除了以太网头固定长度14,其它都算是ip.len,即从ip本身到最后

frame.len == 119 整个数据包长度,从eth开始到最后

eth —> ip or arp —> tcp or udp —> data

http.request.method == “GET”

http.request.method == “POST”

http.request.uri == “/img/logo-edu.gif”

http contains “GET”

http contains “HTTP/1.”

// GET

http.request.method == “GET” && http contains “Host: “

http.request.method == “GET” && http contains “User-Agent: “

// POST

http.request.method == “POST” && http contains “Host: “

http.request.method == “POST” && http contains “User-Agent: “

// 响应包

http contains “HTTP/1.1 200 OK” && http contains “Content-Type: “

http contains “HTTP/1.0 200 OK” && http contains “Content-Type: “

一定包含如下

Content-Type:

tcp.flags 显示包含TCP标志的封包。

tcp.flags.syn == 0x02     显示包含TCP SYN标志的封包。

tcp.window_size == 0 && tcp.flags.reset != 1

tcp[20]表示从20开始,取1个字符

tcp[20:]表示从20开始,取1个字符以上

tcp[20:8]表示从20开始,取8个字符

tcp[offset,n]

udp[8:3]==81:60:03 // 偏移8个bytes,再取3个数,是否与==后面的数据相等?

udp[8:1]==32   如果我猜的没有错的话,应该是udp[offset:截取个数]=nValue

eth.addr[0:3]==00:06:5B

例子:

判断upd下面那块数据包前三个是否等于0x20 0x21 0x22

我们都知道udp固定长度为8

udp[8:3]==20:21:22

判断tcp那块数据包前三个是否等于0x20 0x21 0x22

tcp一般情况下,长度为20,但也有不是20的时候

tcp[8:3]==20:21:22

如果想得到最准确的,应该先知道tcp长度

matches(匹配)和contains(包含某字符串)语法

ip.src==192.168.1.107 and udp[8:5] matches “\\x02\\x12\\x21\\x00\\x22″        ------???--------

ip.src==192.168.1.107 and udp contains 02:12:21:00:22

ip.src==192.168.1.107 and tcp contains “GET”

udp contains 7c:7c:7d:7d 匹配payload中含有0x7c7c7d7d的UDP数据包,不一定是从第一字节匹配。

得到本地qq登陆数据包(判断条件是第一个包==0x02,第四和第五个包等于0x00x22,最后一个包等于0x03)

0x02 xx xx 0x00 0x22 … 0x03

如何拼写过虑条件???

    

udp[11:2]==00:00 表示命令编号为00:00

udp[11:2]==00:80 表示命令编号为00:80

当命令编号为00:80时,QQ号码为00:00:00:00

得到msn登陆成功账号(判断条件是”USR 7 OK “,即前三个等于USR,再通过两个0x20,就到OK,OK后面是一个字符0x20,后面就是mail了)

USR xx OK [email protected]

正确

msnms and tcp and ip.addr==192.168.1.107 and tcp[20:] matches “^USR\\x20[\\x30-\\x39]+\\x20OK\\x20[\\x00-\\xff]+”

注意:DHCP协议的检索规则不是dhcp/DHCP, 而是bootp

以寻找伪造DHCP服务器为例,介绍Wireshark的用法。在显示过滤器中加入过滤规则,

显示所有非来自DHCP服务器并且bootp.type==0x02(Offer/Ack/NAK)的信息:

bootp.type==0x02 and not ip.src==192.168.1.1

常用捕获过滤器:

tcp[13]&32==32 (设置了URG位的TCP数据包)

tcp[13]&16==16 (设置了ACK位的TCP数据包)

tcp[13]&8==8 (设置了PSH位的TCP数据包)

tcp[13]&4==4 (设置了RST位的TCP数据包)

tcp[13]&2==2 (设置了SYN位的TCP数据包)

tcp[13]&1==1 (设置了FIN位的TCP数据包)

tcp[13]==18 (TCP SYN-ACK 数据包)

ether host 00:00:00:00:00:00 (流入或流出MAC地址的流量,替换为你的mac)

!ether host 00:00:00:00:00:00 (不流入或流出MAC地址的流量,替换为你的mac)

broadcast (仅广播流量)

icmp (ICMP流量)

icmp[0:2]==0x0301 (ICMP目标不可达、主机不可达)

ip (仅IPv4流量)

ip6 (仅IPv6流量)

udp (仅UDP流量)

常用显示过滤器:

!tcp.port==3389 (排除RDP流量)

tcp.flags.syn==1 (具有SYN标志位的TCP数据包)

tcp.flags.rst==1 (具有RST标志位的TCP数据包)

!arp (排除ARP流量)

http (所有HTTP流量)

tcp.port==23||tcp.port ==21 (FTP或telnet)

smtp||pop||imap (smtp、pop或imap)

混杂模式:开启混杂模式的网卡可以捕获所有流过该网卡的帧,不开启则只能捕获广播帧以及发给该网卡的帧。需要配合交换机端口镜像才能实现。

 

抓包过滤器:

1、ethernet过滤器,第二层的过滤器,根据mac地址来进行过滤

例:

ether host XX:抓取源和目的为指定的mac的以太网帧

ether dst XX:抓取目的为指定mac的以太网帧

ether src XX:抓取源为指定mac的以太网帧

ether broadcast:抓取所有以太网广播流量

ether multicast:抓取多播流量

ether proto <protocol>:抓取指定协议的以太网流量,比如以太网类型为0x0800,ether proto 0800。以太网类型指的是以太网帧帧头的ether-type字段,表示上层的协议类型。0x0800为ipv4、0x86dd为ipv6、0x0806为arp。

vlan <vlan_id>:抓取指定的vlan流量,也可以用and连接抓取多个vlan的流量,如:vlan <vlan_id> and vlan <vlan_id> and vlan <vlan_id>

要起反作用可以用!或者not,如:

! ether broadcast

not ether broadcast

2、主机和网络过滤器,第三层过滤器

ip或ipv6:抓取ipv4或ipv6流量

host <host>:抓取源或目的为指定主机名(网址)或ip的流量

dst host <host>:抓取目的为指定主机名(网址)或ip的流量

src host <host>:抓取源为指定主机名(网址)或ip的流量

gateway <host>:抓取穿越网关的流量,host必须是主机名。

net <net>:抓取源或目的为指定网络号的流量,如:net 192.168.1或net 192.168.1.0

dst net <net>:抓取目的为指定网络号的流量

src net <net>:抓取源为指定网络号的流量

net <net> mask <netmask>:抓取源或目的由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。如:net 192.168.1.0 mask 255.255.255.0

dst net <net> mask <netmask>:抓取目的由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。

src net <net> mask <netmask>:抓取源由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。

net <net>/<len>:抓取源或目的为指定网络和长度的流量,如:net 192.168.1.0/24

dst net <net>/<len>:抓取目的为指定网络和长度的流量

src net <net>/<len>:抓取源为指定网络和长度的流量

broadcast:抓取ip广播包,通常如:ip broadcast

multicast: 抓取ip多播包

ip proto <protocol code>:抓取ip包头协议类型字段值等于特定值的数据包。如:tcp为6,udp为17,icmp为1

ip6 proto <protocol>: 抓取ipv6包头中下一个包头字段值等于特定值的ipv6数据包。无法用该原词根据ipv6扩展包头链中的相关字段值执行过滤。

icmp [icmptype]==<identifier>:抓取特定类型[icmptype]的icmp数据包,<identifier>表示的是icmp头部中的类型字段值,如,0(icmp echo reply数据包)或8(icmp echo request数据包)等。如:icmp[icmptype]==icmp-echo 或 icmp[icmptype]==8

ip[2:2]==<number>:抓取指定长度的ip数据包(number表示ip包头中的ip包总长度字段值)

ip[8]==<number>:抓取具有指定ttl的ip数据包(number表示ip包头中的ttl字段值)

ip[9]==<number>:抓取指定协议类型的ip数据包(number表示ip包头中的协议类型字段值)

ip[12:4]==ip[16:4]:表示数据包源和目的ip相同

注:中括号内的数字表示相关协议头部的内容,第一个数字指从协议头部的第几个字节开始关注,第二个数字表示所要关注的字节数。

3、tcp和udp及端口过滤,第四层

port <port>:匹配port指明的端口号,如:port 80或port http

dst port <port>:目的端口号为指定的端口号

src port <port>:源端口号为指定的端口号

tcp portrange <p1>-<p2>或udp portrange <p1>-<p2>:用来抓取端口范围介于p1和p2之间的tcp或udp数据包

tcp src portrange <p1>-<p2>或udp dst portrange <p1>-<p2>

tcp [tcpflags] & (tcp-syn|tcp-fin)!=0:抓取tcp连接中用来发起连接(syn标记位置1)或终止连接(FIN标记位置1)的数据包

tcp [tcpflags] &(tcp-rst)!=0:抓取所有RST标记位置1的TCP数据包,RST标记位用来立刻拆除连接,PSH用来表示将数据提交给末端进程处理。

less <length>:抓取不长于指定长度的数据包,写法等价于:len <= <length>

greater <length>:抓取不短于标识符指定的长度的数据包,写法等价于:len >= <length>

tcp portrange 2000-2500:抓取端口在这个范围内的tcp数据包

tcp[13] & 0x00=0:抓取所有标记位都未置1的tcp流量(在怀疑遭遇空扫描攻击时使用)

tcp[13] & 0x01=1:抓取FIN位置1,但ACK位置0的TCP流量

tcp[13] & 0x03=3:抓取SYN和FIN位同时置1的TCP流量

tcp[13] & 0x05=5:抓取RST和FIN位同时置1的TCP流量

tcp[13] & 0x06=6:抓取SYN和RST位同时置1的TCP流量

tcp[13] & 0x08=8:抓取PSH位置1,但ACK位置0的TCP流量

//13指代TCP头部中的标记字段,‘=’号后面数字表示tcp标记位的置位情况。0表示标记位都没置1,1表示FIN位置1,但ACK位置0,1+2表示SYN和FIN位同时置1,1+4表示RST和FIN同时置1,2+4表示SYN和RST同时置1,8表示PSH位置1,但ACK置0.

4、复合过滤器

!或not

&&或and

||或or

例子:

not braodcast and not multicast 只抓单播

host www.youtube.com and port 80 抓取往来于youtube站点的http流量

tcp port 23 and host 192.180.1.1

tcp port 23 and not src host 192.168.1.1

5、配置字节偏移和净载匹配型过滤器,更加灵活

格式: proto [offset:bytes],协议可以是ip、udp、tcp

协议 [从协议头部开始所偏移的字节数:抓包过滤器所要检查的字节数]

tcp[2:2]>50 and tcp[2:2]<100 //抓取目的端口范围为50~100的tcp数据包

tcp[14:2]<8192 //抓窗口大小字段值低于8192的tcp数据包

wireshark有字节偏移和净载匹配抓包过滤器生成工具:https://www.wireshark.org/tools/string-cf.html

也可以看这篇文章http://www.packetlevel.ch/html/txt/byte_offsets.txt

Intro

This document is meant to serve as a quick reference for points

of interest in IP, TCP, UDP and ICMP headers. I cobbled the

information from a variety of sources, all listed at the bottom

of this page. This information will (hopefully) be useful to

people building filters for network tools that use BPF, such

as tcpdump or snort. I was moved to collect all of this stuff

in one place after completing "Intrusion Detection In-Depth"

at a recent SANS conference. Yes, I'm aware that some of these

offsets are covered by tcpdump macros. So what? Use the byte

offsets instead and let them ph33r your m@d sk1lz. Corrections,

additions and so on are welcome. Send them to:

jquinby (at) node.to

Cheers,

JQ

IP byte offsets

 

ip[0] & 0x0f                - protocol version

ip[0] & 0xf0                - protocol options

ip[0] & 0xff00            - internet header length

ip[1]                    - TOS

ip[2:2]                         - Total length

ip[4:2]                         - IP identification

ip[6] & 0xa                 - IP flags

ip[6:2] & 0x1fff        - fragment offset area

ip[8]                    - TTL

ip[9]                    - protocol field

ip[10:2]             - header checksum

ip[12:4]              - src IP address

ip[16:4]              - dst IP address

ip[20:3]              - options

ip[24]                           - padding

 

Src IP = Dest IP (land attack)

(ip[12:4] = ip[16:4])

 

IP versions !=4

(ip[0] & 0xf0 != 0x40)

 

IP with options set:

(ip[0:1] & 0x0f > 5)

 

Broadcasts to x.x.x.255:

(ip[19] = 0xff)

 

Broadcasts to x.x.x.0

(ip[19] = 0x00)

 

 

TCP byte offsets, including anomalous TCP flag settings.

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

 

tcp[0:2]             - src port

tcp[2:2]             - dst port

tcp[4:4]             - seq number

tcp[8:4]             - ack number

tcp[12] & 0x00ff       - data offset

tcp[12] & 0xff00       - reserved

tcp[13]                        - tcp flags

 

tcp[13] & 0x3f = 0    - no flags set (null packet)

tcp[13] & 0x11 = 1   - FIN set and ACK not set

tcp[13] & 0x03 = 3   - SYN set and FIN set

tcp[13] & 0x05 = 5   - RST set and FIN set

tcp[13] & 0x06 = 6   - SYN set and RST set

tcp[13] & 0x18 = 8   - PSH set and ACK not set

tcp[13] & 0x30 = 0x20      - URG set and ACK not set

tcp[13] & 0xc0 != 0  - >= one of the reserved bits of tcp[13] is set

 

tcp[14:2]           - window

tcp[16:2]           - checksum

tcp[18:2]           - urgent pointer

tcp[20:3]           - options

tcp[23]                        - padding

tcp[24]                        - data

 

UDP byte offsets, header only

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

 

udp[0:2]            - src port

udp[2:2]            - dst port

udp[4:2]            - length

udp[6:2]            - checksum

udp[8:4]            - first 4 octets of data

 

Crafted packets with impossible UDP lengths:

udp[4:2] < 0) or (udp[4:2] > 1500

 

 

ICMP

=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+

 

icmp[0]                       - type

icmp[1]                       - code

icmp[3:2]          - checksum

 

Destination Unreachable:

icmp[0] = 0x3 (3)

 

icmp[4:4]          - unused (per RFC]

icmp[8:4]          - internet header + 64 bits original data

icmp[1]                       - 0 = net unreachable;

                            - 1 = host unreachable;

                            - 2 = protocol unreachable;

                            - 3 = port unreachable;

                            - 4 = fragmentation needed and DF set;

                            - 5 = source route failed.

 

Time Exceeded:

icmp[0] = 0xB (11)   

 

icmp[4:4]          - unused (per RFC]

icmp[8:4]          - internet header + 64 bits original data

icmp[1]                       - 0 = TTL exceeded intransit

                            - 1 = fragment reassembly time exceeded

 

Parameter Problem:

icmp[0] = 0xC (12)   

 

icmp[1]                       - 0 = pointer indicates error

icmp[4]                       - pointer

icmp[5:3]          - unused, per RFC

icmp[8:4]          - internet header + 64 bits original data

 

 

Source Quench:

icmp[0] = 0x4 (4)

 

icmp[1]                       - 0 = may be received by gateway or host

icmp[4:4]          - unused, per RFC

icmp[8:4]          - internet header + 64 bits original data

 

Redirect Message:

icmp[0] = 0x5 (5)

 

icmp[1]                       - 0 = redirect for network

                            - 1 = redirect for host

                            - 2 = redirect for TOS & network

                            - 3 = redirect for TOS & host

icmp[4:4]          - gateway internet address

icmp[8:4]          - internet header + 64 bits original data

 

Echo/Echo Reply:

icmp[0]     = 0x0 (0) (echo reply)

icmp[0]     = 0x8 (8) (echo request)

 

icmp[4:2]          - identifier

icmp[6:2]          - sequence number

icmp[8]                       - data begins

                  

Timestamp/Timestamp Reply:

icmp[0] = 0xD (13) (timestamp request)

icmp[0] = 0xE (14) (timestamp reply)

 

icmp[1]                       - 0

icmp[4:2]          - identifier

icmp[6:2]          - sequence number

icmp[8:4]          - originate timestamp

icmp[12:4]                 - receive timestamp

icmp[16:4]                 - transmit timestamp

 

Information Request/Reply:

icmp[0] = 0xF (15) (info request)

icmp[0] = 0x10  (16) (info reply)

 

icmp[1]                       - 0

icmp[4:2]          - identifier

icmp[6:2]          - sequence number

 

Address Mask Request/Reply:

icmp[0] = 0x11 (11) (address mask request)

icmp[0] = 0x12 (12) (address mask reply)

 

 

Sources:

 

RFC768, "User Datagram Protocol Specification"

RFC791, "Internet Protocol Specification"

RFC792, "Internet Control Message Protocol Specification"

RFC793, "Transmission Control Protocol"

filter files from SHADOW-1.8 source distribution

man pages for tcpdump

"TCP/IP and tcpdump Pocket Reference Guide", SANS

 

发布了16 篇原创文章 · 获赞 44 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/Game_jqd/article/details/90116312
今日推荐