MISC基础篇-流量分析

本文用来记录我的流量分析学习之路,主要包括自己遇到的一些题目和学习大佬博客学到的一些东西,之前的流量分析一直都是零零碎碎的学的,这次准备做一个整合,以后也会在遇见新题型时实时更新(●⁰౪⁰●)
参考:
Misc-Network Traffic Analysis - ⚡Lunatic BLOG⚡

USB流量分析

键盘流量分析

在键盘流量分析中,最重要的就是8字节的usbhid数据,我们的目的就是提取出这些hid数据,然后我们便可以还原出按键记录。
需要注意的是,有些题目会用<DEL>按键,如果忽略该按键就会不知道出题人删除了哪些数据。

Webshell流量分析

冰蝎流量分析

冰蝎的默认密钥:e45e329feb5d925b(该密钥为默认连接密码rebeyond32位md5值的前16位)
在流量包中寻找木马时,可以使用下面语句进行过滤:

1
http.request.method=="POST"


找到最可疑的流量,然后右键追踪流,大概率能够看见加密代码

我们通过加密代码可疑确定,该木马进行了AES128+BASE64的加密,因此我们可以使用密码对数据包进行解密,一般是AES-CBC模式,IV是:

1
IV = \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00


再还原得到的BASE64数据一般就能得到想要的信息。

Cobalt Strike流量分析

参考: 浅析CobaltStrike流量解密
特征: CS会通过一个exe文件使用Http协议从指定服务器下载一个stage。最明显的特征就是Http的请求路径,它符合一个checksum8规则,即它的路径为四个字母或数字,并且其ASCII码之和模256等于92(对应32位Beacon)或93(对应64位Beacon)

思路:解密我们可以过滤出通信数据进行追踪,然后我们就能够找到加密数据


对于一般的题目,都能够从流量包中导出.cobaltstrike.beacon_keys文件,然后我们能够从该文件中直接提取出密钥,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import base64
import javaobj.v2 as javaobj

with open(".cobaltstrike.beacon_keys", "rb") as fd:
pobj = javaobj.load(fd)

def format_key(key_data, key_type):
key_data = bytes(map(lambda x: x & 0xFF, key_data))
formatted_key = f"-----BEGIN {key_type} KEY-----\n"
formatted_key += base64.encodebytes(key_data).decode()
formatted_key += f"-----END {key_type} KEY-----"
return formatted_key

privateKey = format_key(pobj.array.value.privateKey.encoded.data, "PRIVATE")
publicKey = format_key(pobj.array.value.publicKey.encoded.data, "PUBLIC")

print(privateKey)
print(publicKey)

获取到私钥之后,使用CS_Decrypt/Beacon_metadata_RSA_Decrypt.py at main · WBGlIl/CS_Decrypt进行提取
可以获得具体得AES key和HMAC key,之后再使用地址CS_Decrypt/Beacon_Task_return_AES_Decrypt.py at main · WBGlIl/CS_Decrypt进行解密,解密脚本:

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# -*- coding: utf-8 -*-

'''
Beacon任务执行结果解密
'''
import hmac
import binascii
import base64
import struct
import hexdump
from Crypto.Cipher import AES

def compare_mac(mac, mac_verif):
if mac == mac_verif:
return True
if len(mac) != len(mac_verif):
print
"invalid MAC size"
return False

result = 0

for x, y in zip(mac, mac_verif):
result |= x ^ y

return result == 0

def decrypt(encrypted_data, iv_bytes, signature, shared_key, hmac_key):
if not compare_mac(hmac.new(hmac_key, encrypted_data, digestmod="sha256").digest()[0:16], signature):
print("message authentication failed")
return

cypher = AES.new(shared_key, AES.MODE_CBC, iv_bytes)
data = cypher.decrypt(encrypted_data)
return data

#密钥
SHARED_KEY = binascii.unhexlify("a6f4a04f8a6aa5ff27a5bcdd5ef3b9a7")
HMAC_KEY = binascii.unhexlify("35d34ac8778482751682514436d71e09")

enc = "00000050350ca7f4379f30cc9d6d671db886d360691c74467156e60e8356725ae2f3b880b302ea8b5556df10324e86e53ecb84046646a1758e9cb8c7fca42d660617be467627abcc3c0ce3bd3e93c02fffcb4d3a"
encrypt_data=binascii.unhexlify(enc)


encrypt_data_length=encrypt_data[0:4]

encrypt_data_length=int.from_bytes(encrypt_data_length, byteorder='big', signed=False)

encrypt_data_l = encrypt_data[4:len(encrypt_data)]

data1=encrypt_data_l[0:encrypt_data_length-16]
signature=encrypt_data_l[encrypt_data_length-16:encrypt_data_length]
iv_bytes = bytes("abcdefghijklmnop",'utf-8')

dec=decrypt(data1,iv_bytes,signature,SHARED_KEY,HMAC_KEY)


counter = dec[0:4]
counter=int.from_bytes(counter, byteorder='big', signed=False)
print("counter:{}".format(counter))

dec_length = dec[4:8]
dec_length=int.from_bytes(dec_length, byteorder='big', signed=False)
print("任务返回长度:{}".format(dec_length))

de_data= dec[8:len(dec)]
Task_type=de_data[0:4]
Task_type=int.from_bytes(Task_type, byteorder='big', signed=False)
print("任务输出类型:{}".format(Task_type))

print(de_data[4:dec_length])
print(hexdump.hexdump(dec))

注意: 有些题目可以会不给出.cobaltstrike.beacon_keys,具体思路可以参考一道具体得题目NepCTF 2025 Writeup 客服小美- Ramoor


MISC基础篇-流量分析
http://ramoor.github.io/2025/08/05/MISC基础篇-流量分析/
作者
Ramoor
发布于
2025年8月5日
许可协议