wireshark 表达式备忘录
参考资料:
https://blog.csdn.net/wojiaopanpan/article/details/69944970
wireshark分两种表达式,一种是捕获表达式,这个是在捕获时用的,根据表达式判断是否捕获;
另一种是显示表达式,是针对捕获后的包进行过滤。
二者支持的语法不完全一致。
一、捕获表达式
1、端口号为8080或9080,或ip为A或B
tcp port or tcp port 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 ) and tcp port
于是尝试了以下的表达式,证明是没问题的:
host 192.168.17.1 and host 192.168.17.128 and tcp port
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[:]=0x4854
6、抓取http请求和响应(get和post方法)
tcp[:]=0x4745 or tcp[:]=0x504F or tcp[:]=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 ==
wireshark 表达式备忘录的更多相关文章
- tcpdump统计http请求并导出URL文本
tcpdump统计http请求并导出URL文本 tcpdump tcpdump是一个用于截取网络分组,并输出分组内容的工具.凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排 ...
- 【协议分析】Wireshark 过滤表达式实例
Wireshark 过滤表达式实例 1.wireshark基本的语法 字符 \d 0-9的数字 \D \d的补集(以所以字符为全集,下同),即所有非数字的字符 ...
- wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
首先说几个最常用的关键字,"eq" 和 "=="等同,可以使用 "and" 表示并且,"or"表示或者."!& ...
- 2011 wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...
- tcpdump wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容) 实例介绍
tcpdump wireshark 实用过滤表达式(针对ip.协议.端口.长度和内容) 实例介绍 标签: 网络tcpdst工具windowslinux 2012-05-15 18:12 3777人阅读 ...
- [转]wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
首先说几个最常用的关键字,“eq” 和 “==”等同,可以使用 “and” 表示并且,“or”表示或者.“!" 和 "not” 都表示取反. 一.针对wireshark最常用的自然 ...
- wireshark 过滤表达式
一.针对wireshark最常用的自然是针对IP地址的过滤.其中有几种情况: (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包. 表达式为:ip.src == ...
- wireshark捕获/显示过滤器表达式书写规律说明
一.说明 1.1 背景说明 对于大多数刚开始接触wireshark的使用者而言,经常是开始的时候时候看到wireshark能把所有数据包都拦截下来觉得强无敌,但是面对一大堆的数据包要问有什么用或者说想 ...
- [Java 8] (9) Lambda表达式对递归的优化(下) - 使用备忘录模式(Memoization Pattern) .
使用备忘录模式(Memoization Pattern)提高性能 这个模式说白了,就是将需要进行大量计算的结果缓存起来,然后在下次需要的时候直接取得就好了.因此,底层只需要使用一个Map就够了. 但是 ...
随机推荐
- Windows版Jenkins+SVN+Maven自动化部署环境搭建【转】
前言 因今年公司新产品线较多,为了降低耦合,达到业务分离.重用,提高内部开发效率的目的,采用了基于服务组件.前后端分离的架构体系.与之前传统单应用架构相比,系统部署.配置更加复杂,为了能够频繁地将软件 ...
- 设置wetty不需要账号登录便可进行命令行操作
前一篇随笔我们将了Linux怎么安装部署Wetty服务,但是我们看到,在浏览器中输入http://127.0.0.1:3000进行访问的时候,还需要我们输入账号密码进行认证(如下图第一行所示). 但在 ...
- Java编程思想学习笔记——一切都是对象
前言 Java是基于C++的,但Java是一种更加纯粹的面向对象程序设计语言. C++和Java都是混合/杂合型语言.杂合型语言允许多种编程风格. 用引用操纵对象 每种编程语言都有自己操纵内存中元素的 ...
- js替换数组中的一个对象用for循环遍历
for(let i=0;i<statusList.length;i++){ if (statusList[i]['tableId'] === tableId) { statusList[i]=d ...
- NAS 创建大文件
不是很懂,但是管用.先记录下来. http://www.111cn.net/sys/linux/55537.htm
- javascript提取联通个人信息和通话记录的代码
由于一些巨大的困难,一些后端爬虫改成了前端爬虫. 前端爬虫是只有js语言,后端爬虫有python java nodejs php这些语言. 前端爬虫有window.document对象,在浏览器端的爬 ...
- Java显示指定类型的文件
文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型.在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理.本实例实现的是读取文件夹指定类型的文件并显示到表格控件中.这 ...
- Mybatis -- 批量更新 -- updateBatch
mysql数据库配置: 数据库连接必须配置:&allowMultiQueries=true并且‘&’ 用&替换 jdbc.url=jdbc:mysql://192.168.10 ...
- SpringMVC -- 梗概--源码--贰--拦截器:Interceptor
附:实体类 1.配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app versi ...
- LHC大神问的矩阵转置问题
数学中线性代数中提到的矩阵转置,其实在我们的业务场景中也有需要的地方,比如LHC大神问到的这个问题 那么如何进行行列转换呢? 代码如下: <?php $array=array( '部门1'=&g ...