zoukankan      html  css  js  c++  java
  • wireshark过滤语法总结-重点偏移过滤

    http://chenjiji.com/post/3371.html

    做应用识别这一块经常要对应用产生的数据流量进行分析。

    抓包采用wireshark,提取特征时,要对session进行过滤,找到关键的stream,这里总结了wireshark过滤的基本语法,供自己以后参考。(脑子记不住东西)

    wireshark进行过滤时,按照过滤的语法可分为协议过滤和内容过滤。

    对标准协议,既支持粗粒度的过滤如HTTP,也支持细粒度的、依据协议属性值进行的过滤如tcp.port==53、http.request.method==”GET”。

    对内容的过滤,既支持深度的字符串匹配过滤如http contains “Server”,也支持特定偏移处值的匹配过滤如tcp[20:3] == 47:45:54。

    wireshark有两种过滤器:

    捕捉过滤器(CaptureFilters):用于决定将什么样的信息记录在捕捉结果中。
    显示过滤器(DisplayFilters):用于在捕捉结果中进行详细查找。

    捕捉过滤器在抓抱前进行设置,决定抓取怎样的数据;显示过滤器用于过滤抓包数据,方便stream的追踪和排查。

    捕捉过滤器仅支持协议过滤,显示过滤器既支持协议过滤也支持内容过滤。

    两种过滤器它们支持的过滤语法并不一样。

    捕捉过滤器–捕捉前依据协议的相关信息进行过滤设置

    语法:

    Protocol

    Direction

    Host(s)

    Value

    Logical Operations

    Other expression

    例子:

    tcp

    dst

    10.1.1.1

    80

    and

    tcp dst 10.2.2.2 3128

    示例:

    (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或者源IP位于网络10.6.0.0/16,目的IP的TCP端口号在200至10000之间,并且目的IP位于网络 10.0.0.0/8内的所有封包。

    字段详解:

    Protocol(协议):
    可能值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
    如果没指明协议类型,则默认为捕捉所有支持的协议。
    注:在wiresharkHELP-Manual Pages-Wireshark Filter中查到其支持的协议。

    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)”不等价。

    显示过滤器–对捕捉到的数据包依据协议或包的内容进行过滤

    1.协议过滤语法

    语法:

    Protocol

    .

    String 1

    .

    String 2

    Comparison operator

      Value

    Logical Operations

    Other expression

    例子:

    http

     

    request

     

    method

    ==

    “POST”

    or

    icmp.type

    string1和string2是可选的。

    依据协议过滤时,可直接通过协议来进行过滤,也能依据协议的属性值进行过滤。

    按协议进行过滤:

    snmp || dns || icmp

    显示SNMP或DNS或ICMP封包。

    按协议的属性值进行过滤:

    ip.addr == 10.1.1.1

    ip.src != 10.1.2.3 or ip.dst != 10.4.5.6

    ip.src == 10.230.0.0/16

    显示来自10.230网段的封包。

    tcp.port == 25

    显示来源或目的TCP端口号为25的封包。

    tcp.dstport == 25

    显示目的TCP端口号为25的封包。

    http.request.method== “POST”

    显示post请求方式的http封包。

    http.host == “tracker.1ting.com”

    显示请求的域名为tracker.1ting.com的http封包。

    tcp.flags.syn == 0×02

    显示包含TCP SYN标志的封包。

    2.内容过滤语法

    2.1深度字符串匹配

    contains :Does the protocol, field or slice contain a value

    示例

    tcp contains “http”

    显示payload中包含”http”字符串的tcp封包。

    http.request.uri contains “online”

    显示请求的uri包含”online”的http封包。

    2.2特定偏移处值的过滤

    tcp[20:3] == 47:45:54 /* 16进制形式,tcp头部一般是20字节,所以这个是对payload的前三个字节进行过滤*/

    http.host[0:4] == “trac”

    表 6.4. 显示过滤的逻辑操作符

    English

    C-linke

    描述和范例

    and

    &&

    Logical AND

    ip.addr==10.0.0.5 and tcp.flags.fin

    or

    ||

    Logical OR

    ip.addr==10.0.0.5 or ip.addr==192.1.1.1

    xor

    ^^

    Logical XOR

    tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29

    not

    !

    Logical Not

    not llc

    […]

     

    Substring Operator

    Wireshark允许选择一个序列的子序列。在标签后你可以加上一对[]号,在里面包含用逗号(是不是冒号?)分离的列表范围。

    eht.src[0:3] == 00:00:83

    eth.addrp[] == 00:19:e0:97:8b:9a

    上例使用n:m格式指定一个范围。在这种情况下,n是起始位置偏移(0表示没有偏移,即是第一位,同理1表示向右偏移一位,便是第二位),m是从指定起始位置的区域长度。

    eth.src[1-2] == 00:83

    上例使用n-m格式一个范围。在本例中n表示起始位置偏移,m表示终止位置偏移

    eth.src[:4]=00:00:83:00

    上例使用:m格式,表示从起始位置到偏移偏移位置m。等价于0:m

    eth.src[4:]=20:20

    上例使用n:格式,表示从最后位置偏移n个序列

    eht.src[2] == 83

    上例使用 n 形式指定一个单独的位置。在此例中中序列中的单元已经在偏移量n中指定。它等价于n:1

    eth.src[0:3,102,:4,4:,2] == 00:00:83:00:83:00:00:83:00:20:20:83

    Wireshark 允许你将多个分号隔开的列表组合在一起表示复合区域,如上例所示

    过滤中函数的使用(upper、lower)

    upper(string-field) – converts a string field to uppercaselower(string-field) – converts a string field to lowercase示例
    upper(http.request.uri) contains “ONLINE”
    wireshark过滤支持比较运算符、逻辑运算符,内容过滤时还能使用位运算。

    如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
    参考:

    wiresharkHELP-Manual Pages-Wireshark Filter

    http://blog.csdn.net/yhwxxx/article/details/5643095

    http://tieba.baidu.com/p/739516717

    以下是语法的实际使用:

    hcorecore 的 WireShark 过滤语法
    /* WireShark 过滤语法 */
    1.
    过滤IP,如来源IP或者目标IP等于某个IP
    例子:
    ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107
    或者
    ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP
    2.
    过滤端口
    例子:
    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
    3.
    过滤协议
    例子:
    tcp
    udp
    arp
    icmp
    http
    smtp
    ftp
    dns
    msnms
    ip
    ssl
    oicq
    bootp
    等等
    排除arp包,如!arp  或者  not arp
    4.
    过滤MAC
    太以网头过滤
    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
    5.
    包长度过滤
    例子:
    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
    6.
    http模式过滤
    例子:
    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:
    7.
    TCP参数过滤
    tcp.flags 显示包含TCP标志的封包。
    tcp.flags.syn == 0x02    显示包含TCP SYN标志的封包。
    tcp.window_size == 0 && tcp.flags.reset != 1
    8.
    过滤内容
    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
    正确
    oicq and udp[8:] matches “^\x02[\x00-\xff][\x00-\xff]\x00\x22[\x00-\xff]+\x03$”
    oicq and udp[8:] matches “^\x02[\x00-\xff]{2}\x00\x22[\x00-\xff]+\x03$” // 登陆包
    oicq and (udp[8:] matches “^\x02[\x00-\xff]{2}\x03$” or tcp[8:] matches “^\x02[\x00-\xff]{2}\x03$”)
    oicq and (udp[8:] matches “^\x02[\x00-\xff]{2}\x00\x22[\x00-\xff]+\x03$” or tcp[20:] matches “^\x02[\x00-\xff]{2}\x00\x22[\x00-\xff]+\x03$”)
    不单单是00:22才有QQ号码,其它的包也有,要满足下面条件(tcp也有,但没有做):
    oicq and udp[8:] matches “^\x02[\x00-\xff]+\x03$” and !(udp[11:2]==00:00) and !(udp[11:2]==00:80)
    oicq and udp[8:] matches “^\x02[\x00-\xff]+\x03$” and !(udp[11:2]==00:00) and !(udp[15:4]==00:00:00:00)
    说明:
    udp[15:4]==00:00:00:00 表示QQ号码为空
    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 mail@hotmail.com
    正确
    msnms and tcp and ip.addr==192.168.1.107 and tcp[20:] matches “^USR\x20[\x30-\x39]+\x20OK\x20[\x00-\xff]+”
    9.
    dns模式过滤
    10.
    DHCP
    以寻找伪造DHCP服务器为例,介绍Wireshark的用法。在显示过滤器中加入过滤规则,
    显示所有非来自DHCP服务器并且bootp.type==0x02(Offer/Ack)的信息:
    bootp.type==0x02 and not ip.src==192.168.1.1
    11.
    msn
    msnms && tcp[23:1] == 20 // 第四个是0x20的msn数据包
    msnms && tcp[20:1] >= 41 && tcp[20:1] <= 5A && tcp[21:1] >= 41 && tcp[21:1] <= 5A && tcp[22:1] >= 41 && tcp[22:1] <= 5A
    msnms && tcp[20:3]==”USR” // 找到命令编码是USR的数据包
    msnms && tcp[20:3]==”MSG” // 找到命令编码是MSG的数据包
    tcp.port == 1863 || tcp.port == 80
    如何判断数据包是含有命令编码的MSN数据包?
    1)端口为1863或者80,如:tcp.port == 1863 || tcp.port == 80
    2)数据这段前三个是大写字母,如:
    tcp[20:1] >= 41 && tcp[20:1] <= 5A && tcp[21:1] >= 41 && tcp[21:1] <= 5A && tcp[22:1] >= 41 && tcp[22:1] <= 5A
    3)第四个为0x20,如:tcp[23:1] == 20
    4)msn是属于TCP协议的,如tcp
    MSN Messenger 协议分析
    http://blog.csdn.net/Hopping/archive/2008/11/13/3292257.aspx
    MSN 协议分析
    http://blog.csdn.net/lzyzuixin/archive/2009/03/13/3986597.aspx
    更详细的说明
    <<wireshark过滤表达式实例介绍>>
    http://www.csna.cn/viewthread.php?tid=14614
    Wireshark 主界面的操作菜单中英对比
    http://www.csna.cn/viewthread.php?tid=9645&extra=page%3D1
    又一款好的网络分析软件
    “科来网络分析系统”
    学习Ethereal/Wireshark网站
    http://www.csna.cn/index.php

  • 相关阅读:
    Linux网络设置
    Linux文件权限
    对象缓冲池
    环形缓冲区ringbuffer
    linux字符集设置
    共享内存(ShareMemory)
    堆算法(make_heap,push_heap,pop_heap, sort_heap)
    (广州)软件开发定制服务,工作流引擎 OA 库存管理系统
    工作流规范WfMC是什么?
    开启MSDTC的方法
  • 原文地址:https://www.cnblogs.com/bigben0123/p/5019078.html
Copyright © 2011-2022 走看看