当前位置: 首页 > article >正文

工具介绍《WireShark》

Wireshark 过滤命令中符号含义详解

一、比较运算符

Wireshark 支持两种比较运算符语法:英文缩写(如 eq)和 C语言风格符号(如 ==),两者功能等价。

符号(英文缩写)C语言风格符号含义示例
eq==等于ip.src == 192.168.1.1
ne!=不等于tcp.port != 80
gt>大于frame.len > 1000
lt<小于udp.length < 50
ge>=大于等于tcp.window_size >= 8192
le<=小于等于ip.len <= 1500

注意

  • 等于判断ip.addr eq 192.168.1.1ip.addr == 192.168.1.1 完全等价。
  • 不等于判断!=ne 均可,但需注意部分场景需用 not 组合(如 not tcp.port == 80)。

二、逻辑运算符

用于组合多个过滤条件,支持 英文缩写(如 and)和 C语言风格符号(如 &&)。

符号(英文缩写)C语言风格符号含义示例
and&&逻辑与(同时满足)ip.src == 192.168.1.1 && tcp.port == 80
or||逻辑或(满足其一)http.request.method == "GET" || http.request.method == "POST"
not!逻辑非(排除条件)!icmp(排除所有 ICMP 包)

注意

  • 优先级not > and > or,建议用括号明确优先级(如 (a and b) or c)。
  • 组合过滤:可联合使用比较和逻辑运算符,例如 ip.addr == 10.1.1.1 and (tcp.port == 80 or udp.port == 53)

三、特殊符号与高级操作
  1. containsmatches

    • contains:检查字段是否包含指定字符串(大小写敏感)
      http contains "password"  # 过滤 HTTP 报文含 "password" 的包
      
    • matches:支持正则表达式匹配(需用 ~ 符号)
      http.request.uri matches ".*\.php$"  # 匹配 URI 以 .php 结尾的请求
      
  2. [] 偏移量操作
    用于从协议头或载荷中提取特定字节:

    • tcp[20:4]:从 TCP 头的第 20 字节开始截取 4 个字节。
    • udp[8:3]==20:21:22:检查 UDP 载荷第 8 字节开始的 3 个字节是否为 0x20 0x21 0x22
  3. 按位运算符 <<>>
    用于处理协议头中的位移计算(常见于捕获过滤器):

    tcp[((tcp[12] & 0xf0) >> 2):4] == 0x47455420  # 匹配 TCP 载荷中的 "GET " 请求
    
    • >>:右移(除以 2 的幂次),如 (tcp[12] & 0xf0) >> 2 计算 TCP 头长度。
    • <<:左移(乘以 2 的幂次),如 (ip[0] & 0xf) << 2 计算 IPv4 头长度。

四、实际应用示例
  1. 组合逻辑过滤

    ip.addr == 192.168.1.1 and (tcp.port == 80 or udp.port == 53) and !http
    
    • 含义:过滤源或目的 IP 为 192.168.1.1,且端口为 80(TCP)或 53(UDP),但排除 HTTP 协议。
  2. 复杂协议分析

    tcp.flags.syn == 1 and tcp.flags.ack == 0  # 匹配 TCP SYN 包(不含 ACK)
    
    • 用途:检测异常连接请求。
  3. 内容提取与隐写检测

    icmp and icmp[8:1] == 0x66  # 检查 ICMP 数据段第 8 字节是否为 0x66(ASCII 'f')
    
    • 用途:分析 ICMP 协议中的隐写数据。

一、基础操作流程

  1. 数据包筛选与过滤

    • 协议筛选:直接输入协议名称(如httptcpicmp)过滤特定协议流量,排除无关干扰。
    • IP/端口定位
      • 源IP:ip.src == 192.168.1.1
      • 目标端口:tcp.dstport == 80
      • MAC地址:eth.addr == A0:00:00:04:C5:84
    • 内容搜索:按Ctrl+F搜索关键字,支持字符串、十六进制和正则表达式,常用于快速定位flag。
  2. 数据包还原技术

    • 追踪流(Follow Stream):右键数据包选择追踪TCP/UDP/HTTP流,可还原完整的会话内容,常用于提取HTTP上传文件、SQL注入语句等。
    • 文件导出:通过文件 -> 导出对象 -> HTTP批量提取传输的文件(如压缩包、图片),或手动从data层导出字节流。
  3. 协议层级分析

    • 分层解析:逐层展开数据包的物理层、传输层(TCP/UDP)、应用层(HTTP/FTP)信息,分析异常字段(如TCP标志位异常、HTTP请求参数含可疑代码)。

二、CTF常见题型与解法

1. HTTP协议相关
  • 文件上传/下载
    • 通过HTTP过滤器定位POST请求,追踪流查看上传内容;导出对象提取隐藏文件(如flag.rar)。
    • 分段传输:若文件分多包传输,需用dd命令合并并去除冗余头信息。
  • Web渗透痕迹
    • 筛选http.request.uri contains "upload.php",分析SQL注入或命令执行流量,提取攻击载荷。
2. ICMP协议隐写
  • Ping报文隐写:检查ICMP数据段,可能直接包含ASCII字符或通过脚本提取隐藏信息(如每包1字节组合成flag)。
  • 示例脚本
    import pyshark
    cap = pyshark.FileCapture('icmp.pcap')
    for pkt in cap:
        print(chr(int(pkt.icmp.data, 16)), end='')
    
3. USB流量分析
  • 键盘流量
    1. 使用tshark提取数据:
      tshark -r usb.pcap -T fields -e usb.capdata > usbdata.txt
      
    2. 过滤有效击键(HID Usage ID),通过映射表转换键位(如0x04对应"A")。
  • 鼠标流量:解析移动坐标(X/Y偏移量),绘制轨迹图还原操作。
4. 加密流量解密
  • SSL/TLS解密:需预置服务器私钥或SSLKEYLOGFILE,在Wireshark中配置密钥解密HTTPS流量,查找敏感数据。
  • Webshell流量(如蚁剑):
    • 识别Base64编码的PHP代码,通过URL解码和流量统计定位后门交互。

三、高级技巧与工具联动

  1. 协议统计与排序

    • 使用统计 -> 协议分级快速发现异常协议(如非常见端口HTTP或异常DNS隧道)。
    • I/O图表:分析流量时间分布,定位爆破攻击(如高频SSH登录尝试)。
  2. 联合工具分析

    • Tshark命令行:批量提取字段(如tshark -r file.pcap -Y 'http' -T json导出JSON格式)。
    • Foremost/Binwalk:自动分离流量中的嵌入文件(如图片碎片、PDF)。
  3. 无线流量处理

    • WiFi密码破解:捕获WPA握手包,用Aircrack-ng配合字典破解,需过滤eapol协议。

四、实战案例分析

  • 案例a:键盘流量还原密码
    通过USB协议过滤,提取击键数据并映射,得到6位数字密码flag{720093}
  • 案例b:HTTP文件分片重组
    合并5个分片包,去除364字节头部后合成fly.rar,解压得flag。
  • 案例c:蚁剑后门分析
    追踪info1.php流量,解密Base64载荷获取Webshell密码及下载的恶意文件。

实战案例1:HTTP流量中隐藏的压缩包文件

题目背景

给定一个名为web_traffic.pcap的流量包,分析并找到隐藏的Flag文件。

分析过程
  1. 初步筛选HTTP流量

    • 在Wireshark过滤栏输入 http,筛选所有HTTP协议流量,排除无关数据。
    • 观察HTTP请求方法(GET/POST),重点关注POST请求(可能用于文件上传)。
  2. 追踪TCP流还原完整会话

    • 右键任意HTTP数据包 → 追踪流TCP流,查看完整HTTP会话内容。
    • 发现关键信息:
      POST /upload.php HTTP/1.1
      ...(请求头)...
      Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABCDEFG
      
      ------WebKitFormBoundaryABCDEFG
      Content-Disposition: form-data; name="file"; filename="secret.zip"
      Content-Type: application/zip
      
      PK...(ZIP文件头标志)...
      
      (示例:POST请求上传了名为secret.zip的文件)
  3. 导出隐藏的ZIP文件

    • 点击菜单栏 文件导出对象HTTP,打开导出对话框。
    • 在列表中找到secret.zip的传输记录(文件名和大小匹配),点击Save导出文件。
  4. 解决文件损坏问题

    • 若导出的ZIP无法解压,可能因流量包截断或分片传输导致文件头缺失。
    • 手动修复
      1. 使用十六进制编辑器(如010 Editor)在文件头部添加ZIP文件头标志 50 4B 03 04(对应ASCII为PK..)。
      2. 若文件分片传输,需合并多个数据包的data字段内容(通过tcp.stream eq <流编号>筛选同一流的分片)。
  5. 解压获取Flag

    • 修复后的secret.zip解压得到flag.txt,内容为:
      flag{http_file_upload_928374}

实战案例2:ICMP协议中的Flag隐写

题目背景

icmp.pcapng流量包中,Flag通过ICMP报文的数据段隐写传输。

分析过程
  1. 筛选ICMP流量

    • 输入过滤器 icmp,仅显示ICMP协议报文。
    • 观察Echo request(Ping请求)报文,数据段(Data)可能包含隐写信息。
  2. 提取数据段内容

    • 展开ICMP报文 → Data字段,发现数据段为十六进制值,例如:
      Data: 66 6c 61 67 7b 69 63 6d 70 5f 73 74 65 67 6f 7d
    • 手动转换:将十六进制转换为ASCII:
      bytes = [0x66, 0x6c, 0x61, 0x67, 0x7b, 0x69, 0x63, 0x6d, 0x70, 0x5f, 0x73, 0x74, 0x65, 0x67, 0x6f, 0x7d]
      print(''.join([chr(b) for b in bytes]))  # 输出:flag{icmp_stego}
      
  3. 自动化提取脚本

    • 若Flag分散在多个ICMP包中(如每包1字节),编写Python脚本批量提取:
      import pyshark
      
      cap = pyshark.FileCapture('icmp.pcap', display_filter='icmp')
      flag = ''
      for pkt in cap:
          if hasattr(pkt.icmp, 'data'):
              hex_data = pkt.icmp.data.replace(':', '')
              flag += bytes.fromhex(hex_data).decode('latin-1')
      print(flag)  # 输出:flag{icmp_stego_123}
      

实战案例3:USB键盘流量还原密码

题目背景

流量包usb_keyboard.pcap记录了USB键盘输入,需还原输入的6位数字密码。

分析过程
  1. 筛选USB键盘流量

    • 输入过滤器 usb.transfer_type == 0x01 && usb.dst == "host",筛选键盘输入事件。
  2. 提取击键数据

    • 使用tshark命令行提取usb.capdata字段:
      tshark -r usb_keyboard.pcap -T fields -e usb.capdata > keystrokes.txt
      
    • 输出示例(每行对应一次击键):
      00:00:04:00:00:00:00:00
      00:00:05:00:00:00:00:00
  3. 映射HID Usage ID到字符

    • 提取第三字节(如04对应字母a05对应b)。
    • HID键位表(部分):
      0x04: a, 0x05: b, 0x06: c, ..., 0x1d: 0, 0x1e: 1, ..., 0x27: 9
      
    • 脚本转换
      hid_map = {
          0x04: 'a', 0x05: 'b', 0x06: 'c', 0x07: 'd', 0x08: 'e',
          0x09: 'f', 0x0a: 'g', 0x1d: '0', 0x1e: '1', 0x1f: '2', 
          0x20: '3', 0x21: '4', 0x22: '5', 0x23: '6', 0x24: '7',
          0x25: '8', 0x26: '9'
      }
      
      with open('keystrokes.txt') as f:
          for line in f:
              if line.strip() == '00:00:00:00:00:00:00:00':
                  continue  # 跳过无效数据
              key_code = int(line.split(':')[2], 16)
              print(hid_map.get(key_code, ''), end='')
      # 输出:flag{720931}
      

总结与技巧

  1. 快速定位关键点
    • HTTP文件传输 → 过滤http并检查POST请求。
    • 隐写数据 → 检查协议数据段的十六进制/ASCII内容。
  2. 工具联动
    • 使用tshark批量提取字段,pyshark自动化分析。
  3. 数据修复
    • 文件头修复、分片重组、字符映射是常见解题关键。

http://www.kler.cn/a/612586.html

相关文章:

  • Ubuntu22.04美化MacOS主题
  • 前端技术(28) : 拖拽、粘贴和点击浏览文件上传
  • 3大支柱+8种方法:拆解分布式系统性能优化的底层逻辑
  • 谷歌决定终止开源Android
  • 【黑皮书】 AVL树
  • kafka部署手册
  • 关于ArcGIS中加载影像数据,符号系统中渲染参数的解析
  • HarmonyOS:GridObjectSortComponent(两个Grid之间网格元素交换)
  • 深度探秘K8s服务(Service):架构基石与应用实践
  • 【LeetCode 热题 100】解答汇总
  • 苏宁开放平台关键字搜索接口接入教程‌
  • springboot 四层架构之间的关系整理笔记一
  • es 3期 第27节-运用Script脚本实现复杂需求
  • 简记_FPGA 硬件最小系统设计
  • Springbean(二)@Component及其派生注解自动注入(2)使用注意和加载问题
  • 一周掌握Flutter开发--8. 调试与性能优化(下)
  • 计算机网络--传输层(1)
  • html dom 的 event 事件
  • 【Elasticsearch基础】基本核心概念介绍
  • [实操]MySQL8 读写分离后,配合redis的方法与步骤