Wireshark CLI | 过滤包含特定字符串的流

server/2024/9/25 21:44:03/

问题背景

源自于和朋友的一次技术讨论,关于 Wireshark 如何查找特定字符串所在的 TCP 流,原始问题如下:

cli.jpg

仔细琢磨了下,基于我对 Wireshark 的使用经验,感觉一步到位实现比较困难,所以想着说用 Wireshark CLI 工具 Tshark 来实现试试。

当然实际上我对 CLI 工具用得也不是很多,并不太熟悉,这也是 Wireshark CLI 这个系列也很少单独更新的缘故,用得少,自然也想不到。😅

问题信息

分析原始图片上的问题,实际上原作者的需求如下:

  1. 第一步需求,查找包含特定 string 的 TCP 流,伪代码:tcp.stream contains "string"
  2. 第二步需求,实际上是要过滤掉上述包含特定 string 的 TCP 流,伪代码:(tcp.stream contains "string I do not want")

首先说到 TCP 流显示过滤语法,也就是 tcp.stream,日常使用的语法如下,但却并没有 contains 或者 matches 相关 。

tcp.stream
tcp.stream == 1
tcp.stream != 1
tcp.stream eq 1
not tcp.stream eq 1
tcp.stream in {0,1,2}
...

所以大概计划通过以下几步,进行处理:

  1. 首先查找包含特定 string 的数据包;
  2. 之后输出上述数据包所在的流;
  3. 最后过滤掉上述流,保留其他剩余的数据包。

问题分析

处理的第一步,额,得先造一个案例数据包文件 test.pcapng,信息如下:

image.png

string:
heartbeattcp.stream:
0 和 2过滤后需保留的数据包:
No.10 和 No.11
  1. 查找包含特定 string 的数据包

既然没有明确说明是在什么字段里,需要过滤什么 string,那么就简单通过 frame 来包含,-Y 参数来实现,得到 No.4 和 No.12 数据包。

frame contains "heartbeat"λ tshark -r test.pcapng -Y 'frame contains "heartbeat"'4 0.000002126  192.168.0.1 → 10.10.10.1   HTTP 1 222 1 275 POST /api/heartbeat.json?md5=144072c14a5282c76bd44bdd864fadccdmid =a67b54f37b7120c3983c4d6519b71e55&ver=1.0 HTTP/1.112 2.200002126  192.168.0.2 → 10.10.10.1   HTTP 1 222 1 275 POST /api/heartbeat.json?md5=144072c14a5282c76bd44bdd864fadccdmid =a67b54f37b7120c3983c4d6519b71e55&ver=1.0 HTTP/1.1
λ

当然这一步在 Wireshark 上也是可以做到的,和 tshark -Y 是同样的语法。

image.png

  1. 输出上述数据包所在的流

再次通过 tshark 输出所要的字段值,这里需要的是数据包所在 tcp.stream 的编号,-T 和 -e 参数组合来实现,得到 No.4 和 No.12 数据包所在的 TCP Stream 0 和 2。

λ tshark -r test.pcapng -Y 'frame contains "heartbeat"' -T fields -e tcp.stream
0                                                                              
2         
λ 考虑到关键字也可能出现在同一条流中的几个数据包中,会重复输出同一条流的编号,此处可以再加上 uniq 去重。
λ tshark -r test.pcapng -Y 'frame contains "heartbeat"' -T fields -e tcp.stream | uniq
0                                                                              
2         
λ 
  1. 过滤掉上述流,保留其他剩余的数据包

如果只是过滤掉上述流,过滤表达式比较简单,如下可以得到最终的结果 No.10 和 No.11 数据包。

!(tcp.stream==0) and !(tcp.stream==2)
!tcp.stream in {0,2}λ tshark -r test.pcapng -Y '!(tcp.stream==0) and !(tcp.stream==2)'10 0.100016618  192.168.0.1 → 192.10.3.1   TCP 1 1 0 58 [TCP Window Update] 0 → 0 [<None>] Seq=1 Win=65532 Len=011 0.200016618  192.168.0.1 → 192.168.0.255 UDP    46 0 → 0 [BAD UDP LENGTH 26 > IP PAYLOAD LENGTH] Len=18[Malformed Packet]
λ

image.png

但也是考虑到不同的案例数据包过滤出来的 TCP Stream 会有很多,再一个个去手写过滤条件会很麻烦,这也是最开始说通过 Wireshark 一步到位无法实现的原因,做是可以做,很不方便,确实没有 CLI 脚本工具来得快。

以下仍然通过 tshark ,首先通过 awk 构建出过滤掉上述流的显示过滤表达式。

awk '{printf("%s!(tcp.stream==%d)",sep,$1);sep=" and "}'λ tshark -r test.pcapng -Y 'frame contains "heartbeat"' -T fields -e tcp.stream | uniq | awk '{printf("%s!(tcp.stream==%d)",sep, $1);sep=" and "}'
!(tcp.stream==0) and !(tcp.stream==2)
λ 

再套用一次 tshark -Y + 上述得到的显示过滤表达式,结果如下:

λ tshark -r test.pcapng -Y '!(tcp.stream==0) and !(tcp.stream==2)'                                                                               10 0.100016618  192.168.0.1 → 192.10.3.1   TCP 1 1 0 58 [TCP Window Update] 0 → 0 [<None>] Seq=1 Win=65532 Len=0             11 0.200016618  192.168.0.1 → 192.168.0.255 UDP    46 0 → 0 [BAD UDP LENGTH 26 > IP PAYLOAD LENGTH] Len=18[Malformed Packet]                                                                                                                                                                                                                             
λ                     

最终命令如下:

tshark -r test.pcapng -Y "$(tshark -r test.pcapng -Y 'frame contains "heartbeat"' -T fields -e tcp.stream | uniq | awk '{printf("%s!(tcp.stream==%d)",sep,$1);sep=" and "}')"    


http://www.ppmy.cn/server/33657.html

相关文章

零基础学习数据库SQL语句之查询表中数据的DQL语句

是用来查询数据库表的记录的语句 在SQL语句中占有90%以上 也是最为复杂的操作 最为繁琐的操作 DQL语句很重要很重要 初始化数据库和表 USE dduo;create table tb_emp(id int unsigned primary key auto_increment comment ID,username varchar(20) not null unique comment…

【计算机网络】循环冗余校验:Cyclic Redundancy Check

1. 任务目标 利用循环冗余校验&#xff08;CRC&#xff09;检测错误。 循环冗余校验&#xff08;英语&#xff1a;Cyclic redundancy check&#xff0c;通称 CRC&#xff09;是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数&#xff0c;主要用来…

20232803 2023-2024-2 《网络攻防实践》实践八报告

目录 1. 实践内容2. 实践过程2.1 动手实践任务一2.2 动手实践任务二&#xff1a;分析Crackme程序2.2.1 crackme1.exe2.2.2 crackme2.exe 2.3 分析实践任务一2.4 分析实践任务二 3. 学习中遇到的问题及解决4. 学习感悟、思考等 1. 实践内容 动手实践任务一&#xff1a;对提供的r…

嘉楠堪智 CanMV K230 进行 Linux、RT-smart 系统开发

本文记录学习、使用 K230 SDK 进行 Linux、RT-smart 系统的开发的一些关键步骤&#xff0c;如何获取系统源代码&#xff0c;如何配置环境&#xff0c;如何使用 Docker 进行编译&#xff0c;获得系统文件。 具体详细的教程&#xff0c;可以学习 CanMV K230 教程。 目录 一、S…

深度学习之基于Matlab NN的伦敦房价预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 房价预测是房地产领域的一个重要问题&#xff0c;对于投资者、开发商以及政策制定者等都具有重要的指…

Python异步Redis客户端与通用缓存装饰器

前言 这里我将通过 redis-py 简易封装一个异步的Redis客户端&#xff0c;然后主要讲解设计一个支持各种缓存代理&#xff08;本地内存、Redis等&#xff09;的缓存装饰器&#xff0c;用于在减少一些不必要的计算、存储层的查询、网络IO等。 具体代码都封装在 HuiDBK/py-tools: …

C# 中 IOC (Inversion of Control,控制反转)

在 C# 中&#xff0c;IOC (Inversion of Control&#xff0c;控制反转) 是一种设计模式和软件开发原则&#xff0c;用于解耦组件之间的依赖关系&#xff0c;提高代码的可维护性和可测试性。IOC 容器是实现 IOC 的关键组件&#xff0c;它负责管理对象的创建、生命周期和依赖注入…

将要上市的自动驾驶新书《自动驾驶系统开发》中摘录各章片段 1

以下摘录一些章节片段&#xff1a; 1. 概论 自动驾驶系统的认知中有一些模糊的地方&#xff0c;比如自动驾驶系统如何定义的问题&#xff0c;自动驾驶的研发为什么会有那么多的子模块&#xff0c;怎么才算自动驾驶落地等等。本章想先给读者一个概括介绍&#xff0c;了解自动驾…