zoukankan      html  css  js  c++  java
  • wireshark 表达式备忘录

    参考资料:

    https://blog.csdn.net/wojiaopanpan/article/details/69944970

     wireshark分两种表达式,一种是捕获表达式,这个是在捕获时用的,根据表达式判断是否捕获;

    另一种是显示表达式,是针对捕获后的包进行过滤。

    二者支持的语法不完全一致。

    一、捕获表达式

    1、端口号为8080或9080,或ip为A或B

     tcp port 8080 or tcp port 9080 or host 10.45.4.46 or host 192.168.19.120

    2、tcp包,主机为A

    src or dst  host 10.15.4.46 and tcp 

    3、捕获两个ip主机间的通信

    一开始我是这么写的,分别捕获两个方向上的流量,后面感觉这也太冗余了:

    (src host 192.168.17.1  and dst host 192.168.17.128) and (dst host 192.168.17.1  and src host 192.168.17.128 and tcp port 6379) and tcp port 6379

    于是尝试了以下的表达式,证明是没问题的:

     host 192.168.17.1  and  host 192.168.17.128 and tcp port 6379

    4、一个重要发现

    在本地虚拟机搭建redis-sentinel集群后,想抓取三台linux主机间的流量,想着 wireshark 只能抓本机的包,没想到其实可以用下面的方法来抓包:

    抓虚拟机虚拟出来的网卡上的流量即可。

    二、捕获表达式之http捕获--tcp首部固定为20字节的情况:

    3、抓http post包

    tcp[20:2]=0x504f

    其实,捕获表达式默认支持的协议里,是不支持http这种应用层协议的。

    但是呢,大家如果仔细研究下下面的http包,就知道,还是有办法的:

    好了,如果说,我想抓post请求的http,应该怎么办呢,只要捕获表达式里面指定tcp头结束后的前两个字节为50 4F(对应“PO”)

    则可以知道,这个就是post请求。

    那这个怎么用表达式来表达呢?

    请看下面从别的网站摘录的:

    Interesting Parts of a TCP header
    =================================
    tcp[0:2]        source port
    tcp[2:2]        destination port
    tcp[4:4]        sequence number
    tcp[8:4]        acknowledgement number
    tcp[12]            header length
    tcp[13]            tcp flags
    tcp[14:2]        window size
    tcp[16:2]        checksum
    tcp[18:2]        urgent pointer
    tcp[20..60]        options or data

    我对照着抓包理解了下,

    tcp[startIndex:length],应该就是startIndex表示tcp头的第几个字节,从0开始。

    后面冒号后面的是长度。

    比如tcp[2:2] destination port 意思是从数组索引2开始,长度为2个字节的部分,就对应了目的端口。

    所以,抓http的post,就应该是:

    tcp[20:2]=0x504f

    4、抓http get请求

    tcp[20:2]=0x4745

    5、http响应

    发现个问题。上面的只能抓请求,却不能抓响应内容。

    只能看看响应包的特征了:

    原来,响应包的头两个字节为HT啊,(0x4854)。

    那么,表达式看来可以这样写:

    tcp[20:2]=0x4854

    6、抓取http请求和响应(get和post方法)

    tcp[20:2]=0x4745   or tcp[20:2]=0x504F or tcp[20:2]=0x4854

    表达式这个,可以参考:

    https://www.centos.bz/2017/09/tcpdump-capture-packet/

    三、捕获表达式之http捕获--tcp首部不固定为20字节的情况:

     以上第二章,3,4,5,6点,都是假设tcp的首部固定为20字节。那么20字节以后,肯定就是数据部分了。

    但是,请看下图:

    看完上面,再看下面,首部字段只占了高4位,从下图看出来,整个字节的十六进制为“50”,换成二进制为01010000:

    01010000,我们将其右移4位,变成0101.(换成十进制为5)。

    因为该处记录的是TCP报名头的长度,是一个偏移量,单位为4字节(1段),所以我们用长度×4,就能计数出整个个TCP头的字节了。

    所以就是5*4=20字节。

    那么,我们表达式可以这么写:

    ( tcp[12] >> 4 ) << 2,左移四位,右移两位,最后就是左移两位。就获取到数据开始的位置。

    汇总下,

    1、抓取http get请求

    tcp[(tcp[12]>>2)]= 0x4745

    2、抓取http post请求

    tcp[(tcp[12]>>2)]= 0x504f

    3、 抓取http请求和响应(get和post方法)

    tcp[(tcp[12]>>2):2]=0x4745 or tcp[(tcp[12]>>2):2]=0x504F or tcp[(tcp[12]>>2):2]=0x4854

    4、需要注意的地方

    如果你和我一样,拿着上面第三点的表达式去抓包,可能会发现下面的情况:

    先说我们期待的正确的结果是什么样的:

    但是,我发现结果是下面这样的:

    意思就是,第7个包,即上图,虽然显示为TCP,但是实际上,它的tcp首部后,跟着的内容就是http的内容。

    这又是怎么回事?

    这里长话短说,因为这里,http协议采用了chunk传输。

    具体的内容可以参考:https://blog.csdn.net/u014569188/article/details/78912469

    二、显示表达式

    1、http请求且ip地址为A或者B

    http &&( ip.addr == 10.15.4.46 or ip.addr == 192.168.19.120)

     1.1 请求源地址为A

    ip.src == 10.15.4.46

    2、http请求且端口号为9080

    http && tcp.port == 9080
  • 相关阅读:
    python 软件目录规范
    生成器与迭代器
    第四周-第08章节-Python3.5-装饰器
    第三周-第18章节-Python3.5-函数式编程与函数不同
    第三周-第17章节-Python3.5-递归
    第三周-第16章节-Python3.5-局部变量与全局变量作用域
    第三周-第14章节-Python3.5-函数式编程
    JAVA发红包案例
    JAVA字符串
    JAVA关于字符串&&字符数组处理的小题目
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/9486353.html
Copyright © 2011-2022 走看看