news 2026/9/28 21:25:53

ctf-wiki 流量取证协议分析实战:Wireshark 过滤统计与 HTTP/HTTPS/FTP/DNS/WiFi/USB 流量解读

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ctf-wiki 流量取证协议分析实战:Wireshark 过滤统计与 HTTP/HTTPS/FTP/DNS/WiFi/USB 流量解读
  • 文档
  • 网络安全
  • 教程

【免费下载链接】ctf-wiki

Come and join us, we need you!

项目地址:https://gitcode.com/gh_mirrors/ct/ctf-wiki
点击查看免费下载

导读

本指南以 ctf-wiki 仓库的“流量包分析”章节(docs/zh/docs/misc/traffic/protocols/readme.md)为骨架,系统梳理 CTF 网络流量取证中的协议分析知识:先掌握 Wireshark 的显示过滤与统计功能,再逐一深入 HTTP、HTTPS、FTP、DNS、WiFi、USB 六大协议的流量特征与实战例题。读完本文,你将能够针对一份 pcap 流量包快速判断协议构成、定位异常流量、识别特殊字段,并借助 tshark 与 Python 脚本完成从原始字节到 flag 的完整还原。

网络协议与协议分析概述

网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合。例如,网络中一个微机用户和一个大型主机的操作员进行通信,由于这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。当然,对于不相容终端,除了需变换字符集字符外还需转换其他特性,如显示格式、行长、行数、屏幕滚动方式等也需作相应的变换。

在 CTF 比赛中,流量包的取证分析是一项重要考察方向:比赛通常提供一个包含流量数据的 PCAP 文件,有时还需要选手先修复或重构传输文件后再进行分析(参见 PCAP 文件修复)。PCAP 分析的重点难点在于数据包里充斥着大量无关流量,如何分类和过滤数据是参赛者需要完成的核心工作。其分析流程可概括为:

  • 总体把握:协议分级、端点统计,先搞清楚流量包“是什么”;
  • 过滤筛选:过滤语法、Host/Protocol/contains 特征值,锁定目标;
  • 发现异常:特殊字符串、协议某字段,判断 flag 可能藏身之处;
  • 数据提取:字符串提取、文件提取,最终还原 flag。

而协议分析正是其中承上启下的关键环节。本章节(协议分析概述)将从以下方面展开:

  • Wireshark 常用功能介绍
  • HTTP 协议分析
  • HTTPS 协议分析
  • FTP 协议分析
  • DNS 协议分析
  • WIFI 协议分析
  • USB 协议分析

Wireshark 常用功能:过滤与统计

Wireshark 是流量分析的核心工具,其两大基础能力是显示过滤器与信息统计,前者用于精确筛选数据包,后者用于从宏观上把握流量包的整体特征。

显示过滤器

显示过滤器可以用很多不同参数作为匹配标准,比如 IP 地址、协议、端口号、某些协议头部的参数。此外,用户也可以用条件工具和串联运算符创建出更复杂的表达式,将不同表达式组合起来,让软件显示的数据包范围更加精确。数据包列表面板中显示的所有数据包都可以用数据包中包含的字段进行过滤。

基本语法结构为:

[not] Expression [and|or] [not] Expression

经常要用到各种运算符:

运算符说明
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于
与and , &&
或or , ||
非! , not

配置方法有三种:

  1. 借助过滤器窗口(Ctrl+Alt+F或菜单视图 → 过滤器表达式):通过图形界面逐项选择字段与运算符拼装表达式;

  2. 借助工具条的输入栏:在主界面上方的过滤输入框中直接输入表达式并回车应用;

  3. 将数据包某个属性值指定为过滤条件:在数据包详情面板中右键点击某个字段,选择“作为过滤器应用 → 选中”(Apply as Filter),Wireshark 会自动生成对应过滤语法。

!!! note 复杂的过滤命令可以直接通过第三种方式得到过滤语法——右键选择字段即可自动生成,无需手工记忆复杂表达式。

信息统计:Protocol History(协议分级)

Protocol History窗口实现的是捕捉文件包含的所有协议的树状分支(菜单Statistics → Protocol Hierarchy),可以直观看到流量包中有哪些协议、各占多少比例。包含的字段如下:

名称含义
Protocol:协议名称
% Packets:含有该协议的包数目在捕捉文件所有包所占的比例
Packets:含有该协议的包的数目
Bytes:含有该协议的字节数
Mbit/s:抓包时间内的协议带宽
End Packets:该协议中的包的数目(作为文件中的最高协议层)
End Bytes:该协议中的字节数(作为文件中的最高协议层)
End Mbit/s:抓包时间内的协议带宽(作为文件中的最高协议层)

这一功能可以为分析数据包的主要方向提供依据:先看协议分级,就能大致判断这是一份 HTTP 流量包、DNS 流量包还是 USB 抓包,从而选择后续的分析路线。

Conversation(对话)

Conversation(Statistics → Conversations)列出了发生于一特定端点的 IP 间的所有流量。它的两个典型用途:

  • 查看收发大量数据流的 IP 地址。如果是你已知的服务器(记得服务器的地址或地址范围),问题就解决了;但也有可能只是某台设备正在扫描网络,或仅是一台产生过多数据的 PC。
  • 查看扫描模式(scan pattern)。这可能是一次正常的扫描(如 SNMP 软件发送 ping 报文以查找网络),但通常扫描都不是好事情。

EndPoints(端点)

EndPoints(Statistics → Endpoints)工具列出了 Wireshark 发现的所有端点(endpoint)上的统计信息,即每个 IP/MAC/端口维度的收发流量与包数,配合 Conversation 可以快速定位“谁在跟谁通信、谁的数据量异常”。

HTTP 统计

Wireshark 还针对 HTTP 协议提供专用统计面板(Statistics → HTTP),其中Packet Counter可以按请求方法(GET/POST 等)与响应状态码统计 HTTP 包的分布,帮助快速理解 HTTP 流量的构成。

HTTP 协议分析

HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网数据通信的基础。

例题:江苏省领航杯 2017——hack

题目:江苏省领航杯-2017:hack

总体观察可以得出:

  • HTTP为主
  • 192.168.173.134为主
  • 不存在附件

从这张图(结合 HTTP 请求的 URL 特征),基本可以判断这是一个SQL 注入-盲注时产生的流量包。到此为止,基本可以判断 flag 的方向:提取出所有的 URL 后,用python辅助即可得到 flag。

第一步,提取 URL:

tshark -r hack.pcap -T fields -e http.request.full_uri|tr -s '\n'|grep flag > log

该命令用 tshark 将 pcap 中每个 HTTP 请求的完整 URI(http.request.full_uri字段)导出,去重空行后筛选出包含flag的请求,写入log文件。

第二步,Python 还原盲注结果:

import re with open('log') as f: tmp = f.read() flag = '' data = re.findall(r'=(\d*)%23',tmp) data = [int(i) for i in data] for i,num in enumerate(data): try: if num > data[i+1]: flag += chr(num) except Exception: pass print flag

盲注流量中每个请求携带的注入参数值会随猜测的字符变化,脚本提取=数字%23形式的注入值,当某个值大于下一个值时,说明该字符命中(ASCII 码递增规律),从而逐字还原出 flag。注意该脚本为 Python 2 写法(print flag),使用时需按环境适配。

HTTPS 协议分析

HTTPS = HTTP + SSL / TLS。服务端和客户端的信息传输都会通过 TLS 进行加密,所以传输的数据都是加密后的数据。分析 HTTPS 流量包的关键在于拿到加密所用的密钥(如服务端私钥或会话密钥),并在 Wireshark 中完成配置。

例题:hack-dat-kiwi-ctf-2015——ssl-sniff-2

题目:hack-dat-kiwi-ctf-2015:ssl-sniff-2

打开流量包发现是SSL加密过的数据,导入题目提供的server.key.insecure(在Edit → Preferences → Protocols → TLS/SSL → RSA keys中配置私钥),即可解密看到明文 HTTP 内容:

GET /key.html HTTP/1.1 Host: localhost HTTP/1.1 200 OK Date: Fri, 20 Nov 2015 14:16:24 GMT Server: Apache/2.4.7 (Ubuntu) Last-Modified: Fri, 20 Nov 2015 14:15:54 GMT ETag: "1c-524f98378d4e1" Accept-Ranges: bytes Content-Length: 28 Content-Type: text/html The key is 39u7v25n1jxkl123

解密后直接在响应体中看到了The key is 39u7v25n1jxkl123,即本题答案。这类题目的通用解法是:识别加密流量 → 寻找题目提供的密钥文件 → 在 Wireshark 中配置 RSA 私钥(旧版本协议栏为 SSL,新版为 TLS)→ 追踪 HTTP 流读取明文。

FTP 协议分析

FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。FTP 协议包括两个组成部分,其一为 FTP 服务器,其二为 FTP 客户端。其中 FTP 服务器用来存储文件,用户可以使用 FTP 客户端通过 FTP 协议访问位于 FTP 服务器上的资源。在开发网站的时候,通常利用 FTP 协议把网页或程序传到 Web 服务器上。此外,由于 FTP 传输效率非常高,在网络上传输大的文件时,一般也采用该协议。

默认情况下 FTP 协议使用TCP端口中的20和21这两个端口,其中20用于传输数据,21用于传输控制信息。但是,是否使用20作为传输数据的端口与 FTP 使用的传输模式有关:

  • 主动模式(Active):数据传输端口就是20,由服务器主动连接客户端;
  • 被动模式(Passive):具体最终使用哪个端口由服务器端和客户端协商决定,客户端先通过控制连接获取服务器开放的随机数据端口再建立数据连接。

在分析 FTP 流量时,应重点关注21端口控制连接中的USER/PASS命令与响应码(如 230 登录成功、530 登录失败),以及数据连接中传输的文件内容(可通过Follow TCP Stream或导出对象提取)。

DNS 协议分析

报文格式

DNS通常基于UDP协议,报文格式如下:

+-------------------------------+ | 报文头 | +-------------------------------+ | 问题 (向服务器提出的查询部分) | +-------------------------------+ | 回答 (服务器回复的资源记录) | +-------------------------------+ | 授权 (权威的资源记录) | +-------------------------------+ | 额外的 (额外的资源记录) | +-------------------------------+

查询包只有头部和问题两个部分;DNS 服务器收到查询包后,根据查询到的信息追加回答信息、授权机构、额外资源记录,并且修改包头的相关标识再返回给客户端。

每个question部分的字段布局:

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | / QNAME / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • QNAME:为查询的域名,是可变长的,编码格式为:将域名用.号划分为多个部分,每个部分前面加上一个字节表示该部分的长度,最后加一个0字节表示结束;
  • QTYPE:占16位,表示查询类型,共有16种,常用值有:1(A记录,请求主机IP地址)、2(NS,请求授权DNS服务器)、5(CNAME别名查询);
  • QCLASS:查询类别,通常为1(IN,Internet 类)。

例题:BSides San Francisco CTF 2017——dnscap.pcap

题目:BSides San Francisco CTF 2017:dnscap.pcap

用 Wireshark 打开发现全部为 DNS 协议,查询名为大量字符串(([\w\.]+)\.skullseclabs\.org)。通过 tshark 提取后,利用 Python 转码:

tshark -r dnscap.pcap -T fields -e dns.qry.name > hex
import re find = "" with open('hex','rb') as f: for i in f: text = re.findall(r'([\w\.]+)\.skull',i) if text: find += text[0].replace('.','') print find

我们发现了几条关键信息:

Welcome to dnscap! The flag is below, have fun!! Welcome to dnscap! The flag is below, have fun!! !command (sirvimes) ... IHDR gAMA bKGD pHYs IHDR gAMA bKGD pHYs tIME IDATx ... 2017-02-01T21:04:00-08:00 IEND console (sirvimes) console (sirvimes) Good luck! That was dnscat2 traffic on a flaky connection with lots of re-transmits. Seriously, Good luck! That was dnscat2 traffic on a flaky connection with lots of re-transmits. Seriously, d[ good luck. :)+

flag确实包含在其中,但是有大量重复信息,一是因为question在 DNS 协议中查询和反馈时都会用到,用-Y "ip.src == 192.168.43.91"进行过滤后发现还是有不少重复部分:

%2A} %2A} %2A}q %2A}x %2A} IHDR gAMA bKGD pHYs tIME IDATx HBBH CxRH! C1%t ceyF i4ZI32 rP@1 ceyF i4ZI32 rP@1 ceyF i4ZI32 rP@1 ceyF i4ZI32 rP@1

根据发现的dnscat字样可定位到 dnscat2 协议——这是一种通过 DNS 传递数据的变种协议,题目文件中应该未使用加密,所以可以直接看这里的数据块信息。dnscat 的 MSG 消息格式为:

MESSAGE_TYPE_MSG: [0x01] (uint16_t) packet_id (uint8_t) message_type [0x01] (uint16_t) session_id (uint16_t) seq (uint16_t) ack (byte[]) data

在qry.name中去除其余字段,只留下data块,从而合并数据,再从十六进制中检索89504e.....6082提取png,得到 flag:

import re find = [] with open('hex','rb') as f: for i in f: text = re.findall(r'([\w\.]+)\.skull',i) if text: tmp = text[0].replace('.','') find.append(tmp[18:]) last = [] for i in find: if i not in last: last.append(i) print ''.join(last)

本题的套路很有代表性:DNS 隧道(DNS Tunneling)。当检测到大量形如随机字符串的 DNS 查询域名时,应怀疑数据被编码在 QNAME 中(如 dnscat2、iodine 等工具),此时只需解析dns.qry.name字段并按协议格式重组,即可还原隐藏在 DNS 流量中的文件或指令。

WIFI 协议分析

802.11是现今无线局域网通用的标准,常见认证方式:

  • 不启用安全
  • WEP
  • WPA/WPA2-PSK(预共享密钥)
  • WPA/WPA2 802.1X(radius认证)

WPA-PSK 四次握手

WPA-PSK 认证的大致过程如下(详见 wifi.md 中的figure/wpa-psk.png),其中四次握手是关键环节:

  1. 四次握手开始于验证器(AP),它产生一个随机的值(ANonce)发送给请求者;
  2. 请求者也产生了它自己的随机值 SNonce,然后用这两个 Nonces 以及 PMK 生成了 PTK。请求者回复消息 2 给验证器,还有一个 MIC(message integrity code,消息验证码)作为 PMK 的验证;
  3. 验证器先要验证请求者在消息 2 中发来的 MIC 等信息,验证成功后,如果需要就生成 GTK。然后发送消息 3;
  4. 请求者收到消息 3,验证 MIC,安装密钥,发送消息 4(一个确认信息)。验证器收到消息 4,验证 MIC,安装相同的密钥。

对 CTF 而言,只要能抓到完整的四次握手包(EAPOL 帧),就可以离线暴力破解预共享密钥,因为握手包中包含了可供验证的 MIC 信息。

例题:实验吧——shipin.cap

题目:实验吧:shipin.cap

从大量的Deauth(去认证)攻击基本可以判断这是一个破解wifi时的流量攻击(攻击者先发送 Deauth 迫使客户端断线重连,从而趁机抓取握手包),同时也成功发现了握手包信息。

接下来跑密码:

  • linux:aircrack套件(aircrack-ng -w 字典 shipin.cap);
  • windows:wifipr,速度比esaw快。

得到密码88888888后,在 Wireshark 中Edit -> Preferences -> Protocols -> IEEE802.11 -> Edit,以key:SSID形式填入(例如88888888:test),即可解密 wifi 包看到明文流量。

这类题目的通用流程为:识别 Deauth 攻击与 EAPOL 握手包 → 用 aircrack-ng/wifipr 跑字典破解 PSK → 将密码注入 Wireshark 解密 802.11 流量 → 继续按常规流量分析方法取 flag。

USB 协议分析

USB 三种使用方式

USB 有不同的规格,以下是使用 USB 的三种方式:

l USB UART l USB HID l USB Memory
  • UART(Universal Asynchronous Receiver/Transmitter):设备只是简单地将 USB 用于接受和发射数据,除此之外就再没有其他通讯功能了;
  • HID(人性化接口):适用于交互式设备,如键盘、鼠标、游戏手柄和数字显示设备;
  • USB Memory(数据存储):如 External HDD、thumb drive/flash drive 等。

其中使用最广的不是 USB HID 就是 USB Memory。CTF 中重点关注USB HID下的键盘流量和鼠标流量。

设备识别:Vendor ID 与 Product ID

每一个 USB 设备(尤其是 HID 或 Memory)都有一个供应商 ID(Vendor ID)和产品识别码(Product ID)。Vendor ID用来标记哪个厂商生产了这个 USB 设备,Product ID用来标记不同的产品。

用lsusb查看所有 USB 设备,例如 VMware 下的无线鼠标:

Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse

其中ID 0e0f:0003就是Vendor-Product ID对:Vendor ID的值是0e0f,Product ID的值是0003。Bus 002 Device 002代表 USB 设备正常连接——这个 Bus 编号对应后续 Wireshark 中的 usbmonX 接口编号,需要记下来。

捕获 USB 数据流:usbmon 配置

用 root 权限运行 Wireshark 可以捕获 USB 数据流,但通常不建议这么做。更规范的做法是给用户足够权限来获取 Linux 中的 USB 数据流,可以用udev来实现:创建一个用户组usbmon,并把账户添加到该组中:

addgroup usbmon gpasswd -a $USER usbmon echo 'SUBSYSTEM=="usbmon", GROUP="usbmon", MODE="640"' > /etc/udev/rules.d/99-usbmon.rules

接下来需要usbmon内核模块。如果该模块没有被加载,可以通过以下命令加载:

modprobe usbmon

打开 Wireshark,会看到usbmonX(其中 X 代表数字),该数字对应 USB Bus 编号。如果接口处于活跃状态或者有数据流经过,Wireshark 的界面就会把它以波形图的方式显示出来。选择与目标设备 Bus 编号对应的接口(如usbmon0)即可开始观察数据包,从而了解 USB 设备与主机之间的通信过程。

提取 USB 数据:tshark 与 usb.capdata

USB 协议的数据部分在Leftover Capture Data域中。在 Mac 和 Linux 下可以用 tshark 将 leftover capture data 单独提取出来:

tshark -r example.pcap -T fields -e usb.capdata # 如果想导入 usbdata.txt 文件中,后面加上参数: tshark -r example.pcap -T fields -e usb.capdata > usbdata.txt

Windows 下装了 Wireshark 的环境中,在 Wireshark 目录下有个tshark.exe,调用 cmd 定位到当前目录下输入同样命令即可:

tshark.exe -r example.pcap -T fields -e usb.capdata > usbdata.txt

键盘协议与鼠标协议

提取出的usbdata.txt中,每行即一个 USB HID 数据包:

  • 键盘数据包:数据长度为8个字节,击键信息集中在第3个字节,每次 key stroke 都会产生一个 keyboard event usb packet;
  • 鼠标数据包:数据长度为4个字节,第一个字节代表按键——取0x00时代表没有按键、为0x01时代表按左键、为0x02时代表当前按键为右键;第二个字节可以看成是一个signed byte类型,其最高位为符号位,当值为正时代表鼠标水平右移多少像素,为负时代表水平左移多少像素;第三个字节与第二字节类似,代表垂直上下移动的偏移。

得到这些点的信息后,即可恢复出鼠标移动轨迹或键盘按键序列。键盘数据包第 3 字节的 data 值与具体键位的对应关系参考 USB HID 规范(Usage Tables),常用的解码映射如下:

#!/usr/bin/env python import sys import os DataFileName = "usb.dat" presses = [] normalKeys = {"04":"a", "05":"b", "06":"c", "07":"d", "08":"e", "09":"f", "0a":"g", "0b":"h", "0c":"i", "0d":"j", "0e":"k", "0f":"l", "10":"m", "11":"n", "12":"o", "13":"p", "14":"q", "15":"r", "16":"s", "17":"t", "18":"u", "19":"v", "1a":"w", "1b":"x", "1c":"y", "1d":"z","1e":"1", "1f":"2", "20":"3", "21":"4", "22":"5", "23":"6","24":"7","25":"8","26":"9","27":"0","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"-","2e":"=","2f":"[","30":"]","31":"\\","32":"<NON>","33":";","34":"'","35":"<GA>","36":",","37":".","38":"/","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"} shiftKeys = {"04":"A", "05":"B", "06":"C", "07":"D", "08":"E", "09":"F", "0a":"G", "0b":"H", "0c":"I", "0d":"J", "0e":"K", "0f":"L", "10":"M", "11":"N", "12":"O", "13":"P", "14":"Q", "15":"R", "16":"S", "17":"T", "18":"U", "19":"V", "1a":"W", "1b":"X", "1c":"Y", "1d":"Z","1e":"!", "1f":"@", "20":"#", "21":"$", "22":"%", "23":"^","24":"&","25":"*","26":"(","27":")","28":"<RET>","29":"<ESC>","2a":"<DEL>", "2b":"\t","2c":"<SPACE>","2d":"_","2e":"+","2f":"{","30":"}","31":"|","32":"<NON>","33":"\"","34":":","35":"<GA>","36":"<","37":">","38":"?","39":"<CAP>","3a":"<F1>","3b":"<F2>", "3c":"<F3>","3d":"<F4>","3e":"<F5>","3f":"<F6>","40":"<F7>","41":"<F8>","42":"<F9>","43":"<F10>","44":"<F11>","45":"<F12>"} def main(): # check argv if len(sys.argv) != 2: print "Usage : " print " python UsbKeyboardHacker.py data.pcap" print "Tips : " print " To use this python script , you must install the tshark first." print " You can use `sudo apt-get install tshark` to install it" print " Thank you for using." exit(1) # get argv pcapFilePath = sys.argv[1] # get data of pcap os.system("tshark -r %s -T fields -e usb.capdata > %s" % (pcapFilePath, DataFileName)) # read data with open(DataFileName, "r") as f: for line in f: presses.append(line[0:-1]) # handle result = "" for press in presses: Bytes = press.split(":") if Bytes[0] == "00": if Bytes[2] != "00": result += normalKeys[Bytes[2]] elif Bytes[0] == "20": # shift key is pressed. if Bytes[2] != "00": result += shiftKeys[Bytes[2]] else: print "[-] Unknow Key : %s" % (Bytes[0]) print "[+] Found : %s" % (result) # clean the temp data os.system("rm ./%s" % (DataFileName)) if __name__ == "__main__": main()

鼠标流量数据包转换脚本(累计位移并还原点击轨迹):

nums = [] keys = open('usbdata.txt','r') posx = 0 posy = 0 for line in keys: if len(line) != 12 : continue x = int(line[3:5],16) y = int(line[6:8],16) if x > 127 : x -= 256 if y > 127 : y -= 256 posx += x posy += y btn_flag = int(line[0:2],16) # 1 for left , 2 for right , 0 for nothing if btn_flag == 1 : print posx , posy keys.close()

例题:Xman 三期夏令营排位赛——AutoKey

Xman三期夏令营排位赛练习题:AutoKey

流量包是如何捕获的?首先从数据包分析可知这是 USB 流量包。USB 有三种使用方式(UART / HID / Memory),本题涉及的键盘属于 HID 设备。捕获方法即上文所述:配置 usbmon 用户组与内核模块,在 Wireshark 中打开对应 usbmonX 接口抓包。

如何去分析一个 USB 流量包?先用 tshark 将usb.capdata全部导出:

tshark -r task_AutoKey.pcapng -T fields -e usb.capdata > usbdata.txt

然后用脚本将第三个字节取出来,对应对照表得到解码:

mappings = { 0x04:"A", 0x05:"B", 0x06:"C", 0x07:"D", 0x08:"E", 0x09:"F", 0x0A:"G", 0x0B:"H", 0x0C:"I", 0x0D:"J", 0x0E:"K", 0x0F:"L", 0x10:"M", 0x11:"N",0x12:"O", 0x13:"P", 0x14:"Q", 0x15:"R", 0x16:"S", 0x17:"T", 0x18:"U",0x19:"V", 0x1A:"W", 0x1B:"X", 0x1C:"Y", 0x1D:"Z", 0x1E:"1", 0x1F:"2", 0x20:"3", 0x21:"4", 0x22:"5", 0x23:"6", 0x24:"7", 0x25:"8", 0x26:"9", 0x27:"0", 0x28:"n", 0x2a:"[DEL]", 0X2B:" ", 0x2C:" ", 0x2D:"-", 0x2E:"=", 0x2F:"[", 0x30:"]", 0x31:"\\", 0x32:"~", 0x33:";", 0x34:"'", 0x36:",", 0x37:"." } nums = [] keys = open('usbdata.txt') for line in keys: if line[0]!='0' or line[1]!='0' or line[3]!='0' or line[4]!='0' or line[9]!='0' or line[10]!='0' or line[12]!='0' or line[13]!='0' or line[15]!='0' or line[16]!='0' or line[18]!='0' or line[19]!='0' or line[21]!='0' or line[22]!='0': continue nums.append(int(line[6:8],16)) # 00:00:xx:.... keys.close() output = "" for n in nums: if n == 0 : continue if n in mappings: output += mappings[n] else: output += '[unknown]' print('output :n' + output)

运行结果:

output :n[unknown]A[unknown]UTOKEY''.DECIPHER'[unknown]MPLRVFFCZEYOUJFJKYBXGZVDGQAURKXZOLKOLVTUFBLRNJESQITWAHXNSIJXPNMPLSHCJBTYHZEALOGVIAAISSPLFHLFSWFEHJNCRWHTINSMAMBVEXO[DEL]PZE[DEL]IZ'

可以看出这是自动密钥(Autokey)密码加密后的密文,现在的问题是在不知道密钥的情况下应该如何解码。Autokey 密码可以通过基于 n-gram 评分的随机搜索(stochastic search)来爆破密钥,爆破脚本如下(依赖pycipher与 ngram_score 语料库):

from ngram_score import ngram_score from pycipher import Autokey import re from itertools import permutations qgram = ngram_score('quadgrams.txt') trigram = ngram_score('trigrams.txt') ctext = 'MPLRVFFCZEYOUJFJKYBXGZVDGQAURKXZOLKOLVTUFBLRNJESQITWAHXNSIJXPNMPLSHCJBTYHZEALOGVIAAISSPLFHLFSWFEHJNCRWHTINSMAMBVEXPZIZ' ctext = re.sub(r'[^A-Z]','',ctext.upper()) # keep a list of the N best things we have seen, discard anything else class nbest(object): def __init__(self,N=1000): self.store = [] self.N = N def add(self,item): self.store.append(item) self.store.sort(reverse=True) self.store = self.store[:self.N] def __getitem__(self,k): return self.store[k] def __len__(self): return len(self.store) #init N=100 for KLEN in range(3,20): rec = nbest(N) for i in permutations('ABCDEFGHIJKLMNOPQRSTUVWXYZ',3): key = ''.join(i) + 'A'*(KLEN-len(i)) pt = Autokey(key).decipher(ctext) score = 0 for j in range(0,len(ctext),KLEN): score += trigram.score(pt[j:j+3]) rec.add((score,''.join(i),pt[:30])) next_rec = nbest(N) for i in range(0,KLEN-3): for k in xrange(N): for c in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ': key = rec[k][1] + c fullkey = key + 'A'*(KLEN-len(key)) pt = Autokey(fullkey).decipher(ctext) score = 0 for j in range(0,len(ctext),KLEN): score += qgram.score(pt[j:j+len(key)]) next_rec.add((score,key,pt[:30])) rec = next_rec next_rec = nbest(N) bestkey = rec[0][1] pt = Autokey(bestkey).decipher(ctext) bestscore = qgram.score(pt) for i in range(N): pt = Autokey(rec[i][1]).decipher(ctext) score = qgram.score(pt) if score > bestscore: bestkey = rec[i][1] bestscore = score print bestscore,'autokey, klen',KLEN,':"'+bestkey+'",',Autokey(bestkey).decipher(ctext)

跑出来的结果:

-674.914569565 autokey, klen 8 :"FLAGHERE", HELLOBOYSANDGIRLSYOUARESOSMARTTHATYOUCANFINDTHEFLAGTHATIHIDEINTHEKEYBOARDPACKAGEFLAGISJHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF

把字段进行分割:

HELLO BOYS AND GIRLS YOU ARE SO SMART THAT YOU CAN FIND THE FLAG THAT IH IDE IN THE KEY BOARD PACKAGE FLAG IS JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF

最后的 flag 就是flag{JHAWLZKEWXHNCDHSLWBAQJTUQZDXZQPF}。

本题完整呈现了 USB 键盘流量题的标准解法链:tshark 提取 usb.capdata → 按 HID Usage Table 映射第 3 字节还原按键 → 得到密文后按对应密码体制(如 Autokey)爆破解密 → 还原 flag。

从流量包到 flag:协议分析方法论总结

综合 ctf-wiki 流量包分析章节的整体框架(流量包分析简介),一次完整的流量取证分析应遵循以下步骤:

  1. 总体把握:先用 Wireshark 的Statistics → Protocol Hierarchy(协议分级)与Endpoints(端点统计)判断流量包类型与主要通信双方,这一步决定了后续分析路线(是 HTTP 流量、DNS 隧道、WiFi 握手包还是 USB HID 数据);
  2. 过滤筛选:用显示过滤器(ip.src、http.request.uri、dns.qry.name、usb.capdata等字段)与 tshark 的-T fields -e <字段>精确提取目标数据;
  3. 发现异常:关注特殊字符串、协议某字段的异常(如随机域名、Deauth 攻击、超大 DNS 查询等),据此推断加密方式或隐藏通道;
  4. 数据提取:按协议格式重组数据(如 dnscat2 数据块、USB HID 键码),必要时借助 Python 脚本解码或爆破,最终提取 flag 或隐藏文件。

协议分析类题目的核心,正是理解各协议的数据结构与特征字段,再利用 Wireshark/tshark 将流量还原为可读信息。本章节七个主题(Wireshark 功能、HTTP、HTTPS、FTP、DNS、WIFI、USB)覆盖了 CTF 流量取证中最常出现的协议类型,配合 PCAP 文件修复 的知识,即可构成完整的流量分析能力闭环。

  • 文档
  • 网络安全
  • 教程

【免费下载链接】ctf-wiki

Come and join us, we need you!

项目地址:https://gitcode.com/gh_mirrors/ct/ctf-wiki
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 21:25:07

大模型时代的开发提效实践:从 Prompt 工程到 AI Agent 开发

大模型时代的开发提效实践&#xff1a;从 Prompt 工程到 AI Agent 开发 一、引言2026 年&#xff0c;大模型已经深度融入软件开发的每一个环节。从代码补全、单元测试生成&#xff0c;到能自主规划任务的 AI Agent&#xff0c;AI 正在把程序员从大量重复劳动中解放出来。本文结…

作者头像 李华
网站建设 2026/9/28 21:23:42

论文重复率和AI率都没达标?10款降AI工具对比,哪些支持双降?

论文重复率和AI率都没达标&#xff1f;10款降AI工具对比&#xff0c;哪些支持双降&#xff1f; 知网AIGC检测系统又更新了&#xff0c;AI率变高&#xff0c;网上的各种免费降AI率提示词试了一个又一个&#xff0c;AIGC疑似度还是没变化&#xff1f; 学校要求AI率低于20%&…

作者头像 李华
网站建设 2026/9/28 21:22:25

社区旧物回收捐赠一体化平台

摘 要 随着居民消费升级&#xff0c;社区闲置旧物激增&#xff0c;传统回收渠道分散、捐赠流程不透明&#xff0c;既造成资源浪费也加重环境负担。垃圾分类与双碳政策推进、社区公益帮扶需求提升&#xff0c;亟需数字化平台整合回收与捐赠&#xff0c;打通资源流转闭环&#x…

作者头像 李华