使用命令行工具控制wireshark对抓包文件举行针对性处理的总结 ...

打印 上一主题 下一主题

主题 1071|帖子 1071|积分 3213

克日,工作中有开发对抓包文件举行针对性过滤的小程序的需求,兜兜转转踩了许多坑后还是绕回了wireshark。
作为最出名的开源软件之一,wireshark也具有使用命令行举行操作的功能,这就是我们本日会总结到的“tshark.exe”。
通常,当你安装好wireshark,这个"tshark"就会和你的wireshark在同一路径下默默的躺着,就长这样:

这个程序和图形化的wireshark功能根本相同,接下来我会针对性地对使用该软件对已经完成抓包生成的抓包文件(.pacpng、.pacp)举行解析的功能命令举行总结。
先上一个例子:

D:\**你的路径**\tshark.exe -r "C:\**你的路径**\抓包数据.pcap" -Y esp -T fields -e esp.spi -e esp.sequence  -e ip.src -e ip.dst
运行输出结果如下:

这个代码以tshark的绝对路径开头(配置环境变量会更方便),然后是抓包文件的路径指定文件,然后是各种过滤指令和字段选择,达到了针对某文件输出我们必要的字段的结果。
下面开始系统性介绍。
1、读取抓包文件

使用 -r 读取已有的抓包文件:
  1. tshark -r <infile>
复制代码
是输入的抓包文件名。2. 过滤数据

2.1 显示过滤器

使用 -Y 选项指定显示过滤器,过滤解码数据或写入文件的包:
  1. tshark -r <infile> -Y
复制代码
是显示过滤器表达式,使用读/显示过滤器的语法,而不是捕获过滤器的语法。2.2 读取过滤器

使用 -R 选项指定读取过滤器,在分析的第一遍中应用,不匹配的包将不考虑后续遍历:
  1. tshark -r <infile> -R
复制代码
是读取过滤器表达式,同样使用读/显示过滤器的语法。3. 输出格式

3.1 输出格式范例

使用 -T 选项设置输出格式:
  1. tshark -r <infile> -T
复制代码
可以是以下之一:

  • ek:用于批量导入 Elasticsearch 的换行符分隔 JSON 格式。
  • fields:指定字段的值,格式由 -E 选项控制。
  • json:JSON 文件格式。
  • jsonraw:仅包含原始十六进制编码包数据的 JSON 文件格式。
  • pdml:XML 格式的包详情。
  • ps:PostScript 格式。
  • psml:XML 格式的包摘要。
  • tabs:类似于默认文本陈诉,但使用制表符分隔。
  • text:默认的人可读文本格式。
3.2 指定输出字段

使用 -e 选项添加要显示的字段,智能与 -T ek|fields|json|pdml 之一配合使用:
  1. tshark -r <infile> -T fields -e  -e  ...
复制代码
,  等是要显示的字段。3.3 设置字段打印选项

使用 -E 选项控制字段打印格式:
  1. tshark -r <infile> -T fields -E
复制代码
可以是以下之一:

  • bom=y|n:是否添加 UTF-8 字节顺序标记,默认为 n。
  • header=y|n:是否打印字段名作为输出的第一行,默认为 n。
  • separator=/t|/s|:设置字段分隔符,默认为制表符。
  • occurrence=f|l|a:选择字段的出现次数,默认为 a。
  • aggregator=,|/s|:设置字段聚合符,默认为逗号。
  • quote=d|s|n:设置字段的引用字符,默认为无。
  • escape=y|n:是否对字段值中的空白控制字符举行转义,默认为 y。
 
到这里我们就可以系统性地输出数据包中我们想要的值了!这时候有小同伴们要问了“博主博主,命令行我们明白了,但该怎么用到程序里呢?”欸,我演示一个函数你就明白了,调用起来不要太轻松:
  1.     def process_certificates(self, file_path, display_filter):
  2.         command = [
  3.             self.tshark_path,
  4.             '-r', file_path,
  5.             '-Y', f'tls.handshake.type==11&&{display_filter}',
  6.             '-T', 'fields',
  7.             '-e', 'ip.src',
  8.             '-e', 'ip.dst',
  9.             '-e', 'tls.handshake.certificate'
  10.         ]
  11.         lines = self.run_tshark_command(command)
  12.         for line in lines:
  13.             parts = line.split('\t')
  14.             if len(parts) < 3:
  15.                 continue
  16.             src_ip, dst_ip, certs_hex = parts
  17.             try:
  18.                 certs = certs_hex.split(',')
  19.                 for cert_hex in certs:
  20.                     cert_der = bytes.fromhex(cert_hex)
  21.                     self.process_single_cert(cert_der, src_ip, dst_ip)
  22.             except ValueError:
  23.                 continue
  24.                
  25.     def run_tshark_command(self, command):
  26.         try:
  27.             result = subprocess.run(
  28.                 command,
  29.                 stdout=subprocess.PIPE,
  30.                 stderr=subprocess.PIPE,
  31.                 check=True,
  32.                 text=True
  33.             )
  34.             return result.stdout.splitlines()
复制代码
通过调用上面的函数,我们就完成了对命令的拼接,对输出的读取。
颠末进一步简朴处理,我们就达到了筛选所有TLS握手过程中通报的证书的结果,还顺带得到了他们的源IP目的IP等信息。
最后颠末同理的简朴开发,可得到这样的结果

——END——

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

笑看天下无敌手

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表