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

杂项——USB键盘与鼠标流量分析——BUUCTF——流量分析

第一次做USB键盘与鼠标流量分析的题目,现在来好好做一个总结

1. 基础知识

USB流量指的是USB设备接口的流量,攻击者能够通过监听usb接口流量获取键盘敲击键、鼠标移动与点击、存储设备的铭文传输通信、USB无线网卡网络传输内容等等。

在正式介绍 USB HID 协议之前,先解释一下上图,这是我们最初捕获到的几个流量包,其中包含了最常见的两种 USB 数据传输方式:

GET DESCRIPTOR
URB_INTERRUPT in
GET DESCRIPTOR 和 URB_INTERRUPT in 都属于 USB 数据传输方式,但它们的用途不同,GET DESCRIPTOR 用于获取设备信息,而 URB_INTERRUPT in 用于实时地获取设备数据。

GET DESCRIPTOR
GET DESCRIPTOR 是 USB 设备和主机之间进行控制传输的一种方式,用于获取设备信息(即各种描述符信息)。GET DESCRIPTOR 一般使用控制传输的 SETUP、DATA 和 STATUS 三个阶段来完成。

USB 描述符
USB 描述符是用于描述 USB 设备、接口、端点等属性的数据结构,主要包括以下几种类型:

设备描述符(Device Descriptor):用于描述 USB 设备的基本属性,如设备厂商 ID、设备产品 ID、设备类别等。
配置描述符(Configuration Descriptor):用于描述 USB 设备的配置信息,包括设备接口、端点数量、传输类型等信息。
接口描述符(Interface Descriptor):用于描述USB设备的接口信息,包括接口类别、子类别、协议等信息。
端点描述符(Endpoint Descriptor):用于描述USB设备的端点信息,包括端点地址、端点类型、端点方向、最大包大小等信息。
字符串描述符(String Descriptor):用于描述USB设备的字符串信息,如设备名称、制造商名称、产品名称等。
HID 描述符(HID Descriptor):仅用于 HID(Human Interface Device)设备,描述 HID 设备的属性和报告信息。


bDeviceClass/bDeviceSubClass:HID 设备在其设备描述符中的类/子类值均为 0。
idVendor:厂商 ID。
idProduct:产品 ID。
接口描述符(INTERFACE DESCRIPTOR)


bInterfaceClass:3,标识 HID 设备。
bInterfaceSubClass:1 表示设备支持引导协议, 0 表示设备只支持报告协议。
bInterfaceProtocol:1表示HID设备是键盘,2表示HID设备是鼠标。
请记住,接口描述符不能手动请求,必须与配置和端点描述符一起获取。

URB_INTERRUPT in


URB_INTERRUPT in 是一种 USB 中断传输方式,用于实时地从 USB 设备中读取数据。它允许 USB 设备向主机发送中断数据包,主机通过轮询的方式来获取数据。URB_INTERRUPT in 的数据传输是非常实时的,因为设备每隔一段时间就会发送一个中断数据包,主机只需要等待这个数据包到达即可获取数据。

HID 报告数据就通过这种方式来传输,即图中的 HID Data 字段。

击键信息集中在第3个字节,每次击键都会产生一个数据包。所以如果看到给出的数据包中的信息都是个字节,并且只有第 3 个字节不为0000,那么几乎可以肯定是一个键盘流量了。

就是要将HID Data 里的数据弄出来,然后进行查找这样子

做题步骤

1.使用wireshark检查流量包,发现了大量的可用USB数据,说明用键盘输入了东西,flag应该就是键盘输入的

2.使用tshark

我靠这个真的弄死我了,死活弄不出来,弄了一个小时,现在总结一下怎么弄

打开下载的wireshark文件夹

在文件夹输入cmd,进入该文件夹的目录

然后输入语句

tshark.exe -T json -r C:\Users\24514\Desktop\atta.pcapng  > C:\Users\24514\Desktop\fdsf.txt

就是将我桌面上的atta.pcapng文件弄成txt

3.使用py脚本提取出 HID Data

import redef extract_usbhid_data(file_path):usbhid_data_list = []with open(file_path, 'r', encoding='utf-8') as f:for line in f:# 查找包含 usbhid.data 的行并提取数据match = re.search(r'"usbhid\.data":\s*"([^"]+)"', line)if match:# 提取 usbhid.data 后的数据data = match.group(1).strip()usbhid_data_list.append(data)return usbhid_data_listdef write_to_file(data_list, output_file):with open(output_file, 'w', encoding='utf-8') as f:for data in data_list:f.write(data + '\n')  # 每条数据后加换行if __name__ == "__main__":input_file_path = r'C:\Users\24514\Desktop\atta.txt'  # 替换为你的输入文件路径output_file_path = r'C:\Users\24514\Desktop\usbdata.txt'  # 这个与下一个链接一起extracted_data = extract_usbhid_data(input_file_path)write_to_file(extracted_data, output_file_path)print(f"提取的数据已保存到 {output_file_path}")

这个是提取 HID Data的py

#!/usr/bin/env python
# -*- coding:utf-8 -*-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>"}
output = []
keys = open('C:\\Users\\24514\\Desktop\\usbdata.txt',encoding='utf-8')#提取出来的usbdata.txt文件
for line in keys:try:if line[0]!='0' or (line[1]!='0' and line[1]!='2') 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' or line[6:8]=="00":continueif line[6:8] in normalKeys.keys():output += [[normalKeys[line[6:8]]],[shiftKeys[line[6:8]]]][line[1]=='2']else:output += ['[unknown]']except:pass
keys.close()flag=0
print("".join(output))
for i in range(len(output)):try:a=output.index('<DEL>')del output[a]del output[a-1]except:pass
for i in range(len(output)):try:if output[i]=="<CAP>":flag+=1output.pop(i)if flag==2:flag=0if flag!=0:output[i]=output[i].upper()except:pass
print ('output :' + "".join(output))

这个是编译代码

然后更改路径,运行,就出来了

http://www.lryc.cn/news/474609.html

相关文章:

  • Java如何实现企业微信审批流程
  • GEE app:在地图上构建一个可以查看局部的小窗
  • leetcode71:简化路径
  • nodejs入门教程4:nodejs创建第一个应用
  • 启用 iPhone 原生的五笔输入
  • 这个工具让你轻松开发一个带AI功能的Notion
  • 光耦合器的关键作用和创新---腾恩科技
  • 穿越死锁的迷雾:pthread_mutex_lock的终极挑战与破解策略
  • Dockerfile制作Oracle19c镜像
  • 【时间之外】IT人求职和创业应知【23】
  • 后端:Spring-1
  • OTX系统架构分析
  • ASO如何低预算进行优化
  • 非线性数据结构之数
  • 个人开发三步走
  • qt QAction详解
  • 建立maven项目常见问题解决办法
  • Windows 10 安装使用Docker踩过的坑和解决-31/10/2024
  • 微服务之间的调用关系
  • Chinese Spelling Correction as Rephrasing Language Model(AAAI2024)
  • DirectShow过滤器开发-写MP3音频文件过滤器(再写 写MP3)
  • 文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于对等架构的虚拟电厂-配电网双层电碳协同调度模型》
  • 大数据-204 数据挖掘 机器学习理论 - 混淆矩阵 sklearn 决策树算法评价
  • Fsm1
  • C. Gorilla and Permutation
  • 从0开始学python-day17-数据结构2
  • (蓝桥杯C/C++)—— 编程基础
  • 企业物流管理数据仓库建设的全面指南
  • 数据采集-Kepware 安装证书异常处理
  • ubuntu禁止自动更新设置