misc-流量分析

ZJ Lv100

通过分析流量数据包找出隐藏flag

前言

这里会提供一些来自buuctf的案例

这章的WP之后再写,先偷个懒(๑•́ ₃•̀๑)

工具介绍

提供的工具若未破解或链接已挂,请自行搜索破解版使用

wireshark 流量抓取工具

tshark可以用kali自带的,windows也可以进入wireshark目录里面找到tshark.exe用命令行操作

image-20240925004323525

gunplot 绘图工具

UsbMiceDataHacker 自动抓取鼠标流量并绘图(不太好用)(可能需要kali)

USB-Mouse-Pcap-Visualizer 生成.csv文件并在线绘图(强烈推荐)

UsbKeyboardDataHacker 自动抓取键盘流量并转换为字符 (需要kali)

Web流量分析

HTTP流量分析

由于http是明文传输数据,所以能够直接查找到数据报明文内容

有些数据可能是以图片或者压缩包的形式传递的,可以通过“导出流”提取出文件再进一步分析

image-20240923171605060

webshell流量分析

webshell是进行网站攻击的一种恶意攻击脚本环境,会识别webshell流量可以有效防止黑客攻击

攻击者一般会对自己的webshell进行变形,在保证其功能的前提下确保自己的webshell不会被查杀,从而达到流量混淆的目的

下面是一个案例的截取题目WP在这里

image-20240923182420367

image-20240923182450747

image-20240923185513305

image-20240923185450226

image-20240923185919625

TLS流量分析

TLS是HTTPS安全传输层采用的协议,TLS是HPPTS通信的基础部分

CTF中如果拿不到TLS握手过程中的加密方法、密钥、随机数等信息则无法加密出HTTPS数据

TLS握手过程

SSL : TLS 握手过程

在握手过程中如果拿到其中的预祝秘钥或则主密钥就相当于拿到了会话的秘钥,也就能对加密内容进行解密

拿到主密钥

在环境变量里面设置SSLKEYLOGFILE指向一个sslkey.log的文件路径

image-20240923211700933

然后在浏览器中访问HTTPS网址,同时开启wireshark抓包,就能抓到TLS流量了

image-20240923211911409

导入保存的log文件进行解密

image-20240923213905847

image-20240923213909476

USB流量分析

USB协议的数据部分在Leftover Capture Data域中

通常利用tshark命令将其中的USB流量数据单独提取出来

1
2
3
#有先后顺序
tshark -r atta.pcapng -T fields -e usb.capdata > usbdata.txt
tshark -r atta.pcapng -T fields -e usbhid.data > usbdata.txt

鼠标流量分析

鼠标数据报含义,一般为4/8字节

  • 第一个字节代表按键

    • 当取0x00时,代表没有按键
    • 为0x01时,代表按左按键
    • 为0x02时,代表当前按键为右键
  • 第二个字节可以成是一个signed byte类型,其最高位为符号位

    • 值为正时,代表鼠标水平右移动多少像素
    • 为负时,代表水平左移多少像素
  • 第三个字节与第二个字节类似,代表垂直上下移动的偏移。

    • 值为正时,代表鼠标垂直上移动多少像素

    • 为负时,代表垂直下移多少像素

  • 第四个字节表示滚轮数据,为拓展字节

    • 为0时,没有滚轮运动
    • 为1时,垂直向上滚动一下
    • 为2时,水平滚动右键一次
    • 为0xFE时,水平滚动左键单击一下
    • 为0xFF时,垂直向下滚动一下

每个操作系统数据区字节不一定相同

数据区为6字节时,第1字节表示按键指示左右键,第2个字节表示水平位移,第3个字节表示垂直位移

数据区为8字节时,第1字节表示按键指示左右键,第3个字节表示水平位移,第5个字节表示垂直位移

image-20240925004942699

HID Data 和 Leftover Capture Data 是一个意思

手动脚本

删除文件中空行

1
2
3
4
5
6
#使用脚本删除空行
with open('usbdata.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = filter(lambda x: x.strip(), lines)
with open('usbdata.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)

文件以冒号相隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#将上面的文件用脚本分隔,加上冒号;
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16:#键盘流量的话len为16鼠标为8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()

生成坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# -*- coding:utf-8 -*-
# 此脚本只处理鼠标数据区为8字节的,若数据区长度不一样请修改脚本内容
nums = []
keys = open('usbdata.txt', 'r')
result = open('result.txt', 'w')
posx = 0
posy = 0
for line in keys:
line = line.strip() # 去除空行
# 以下是处理形如“00000000ffff0000”8字节的内容
if len(line) == 16:
x = int(line[4:6], 16)
y = int(line[8:10], 16)
# 以下是处理形如“00:00:00:00:ff:ff:00:00”8字节的内容
elif len(line) == 24:
x = int(line[6:8], 16)
y = int(line[12:14], 16)
else:
continue
if x > 127: x -= 256
if y > 127: y -= 256
posx += x
posy += y
# 第一个字节为左右键,1为左键,2为右键,0无按键
btn_flag = int(line[0:2], 16)
if btn_flag == 1:
result.write(str(posx) + ' ' + str(posy) + '\n')
keys.close()
result.close()

image-20240925012733493

将坐标转化为图片

1
2
3
4
5
6
7
8
from PIL import Image
img = Image.new('RGB',(2000,2000),(255,255,255))#创建Image对象(尽量大)
f =open('result.txt')
for line in f.readlines():
point =line.split()
img.putpixel((int(point[0]),int(point[1])),(0,0,0))#读取文件中的每一行,并修改像素
f.close()
img.show()

image-20240925012720575

半自动工具

最后的绘图可以不用编程

gunplot 绘图工具

1
plot "路径" using 1:2

image-20240925013319152

全自动工具

UsbMiceDataHacker 自动抓取鼠标流量并绘图(可能不好用,反正我没试出来)(可能需要kali)

USB-Mouse-Pcap-Visualizer 生成.csv文件并在线绘图(强烈推荐)

很好用,但需要注意tshark文件必须要在C盘的默认下载位置,以及需要安装好些pip包

image-20240925015545199

键盘流量分析

USB协议的数据部分在Capture Data域中

数据包长度一般为8字节,几乎只有第3个字节不为00(可以当做判断流量包特征)(或者出现同时按键),第1个字节是判断是否按下shift键

image-20240925024248601

与鼠标流量一样通常利用tshark命令将其中的USB流量数据单独提取出来

1
2
3
#有先后顺序
tshark -r atta.pcapng -T fields -e usb.capdata > usbdata.txt
tshark -r atta.pcapng -T fields -e usbhid.data > usbdata.txt
手动脚本

删除文件中空行

1
2
3
4
5
6
#使用脚本删除空行
with open('usbdata.txt', 'r', encoding='utf-8') as f:
lines = f.readlines()
lines = filter(lambda x: x.strip(), lines)
with open('usbdata.txt', 'w', encoding='utf-8') as f:
f.writelines(lines)

文件以冒号相隔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#将上面的文件用脚本分隔,加上冒号;
f=open('usbdata.txt','r')
fi=open('out.txt','w')
while 1:
a=f.readline().strip()
if a:
if len(a)==16:#键盘流量的话len为16鼠标为8
out=''
for i in range(0,len(a),2):
if i+2 != len(a):
out+=a[i]+a[i+1]+":"
else:
out+=a[i]+a[i+1]
fi.write(out)
fi.write('\n')
else:
break
fi.close()

生成按键字符

该脚本只对“00:00:0b:00:00:00:00:00”类数据有效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/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('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":
continue
if 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+=1
output.pop(i)
if flag==2:
flag=0
if flag!=0:
output[i]=output[i].upper()
except:
pass
print ('output :' + "".join(output))

image-20240925021555636

全自动工具

UsbKeyboardDataHacker 自动抓取键盘流量并转换为字符 (需要kali)

这里就不演示了,需要的可以自己去试试

  • Title: misc-流量分析
  • Author: ZJ
  • Created at : 2024-09-23 00:00:00
  • Updated at : 2025-01-17 01:46:38
  • Link: https://blog.overlordzj.cn/2024/09/23/ctf/data/misc/流量分析/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments