1.工具:Wireshark、python、Stegsolve、CyberChef
2.解题:
我们先看题目,绝大部分都是某台被攻陷的摄像头在持续广播的垃圾组播流量,而真正的"攻击"并不在喧嚣之处、学会"三十六计"中的声东击西,或许在那些看似无意义的广播中,藏着打开真正宝藏的钥匙。我们知道了:流量里有大量无意义的组播广播包,"钥匙"又藏在广播流量中,也就是广播包本身并非完全没用。
我们先用Wireshark打开pcapng流量,然后我们在"统计"里面查看"协议分级",如下

我们发现几乎是UDP文件,少部分是tcp和其他流量包,我们先过滤tcp,如下

我们在里面发现了一个有"post"和"command"的流量包,我们打开,如下

我们发现了"command"和"note",说明"command"后面引号了的是真实的文件,我们观察应该是base64解码,我们打开CyberChef进行解码,如下

我们发现这是一个zip文件而且里面有一张图片,我们将它保存并解压,发现需要密码,如下

但是此时并没有密码的提示,这是我们想起了题目的提示,正如我们之前分析的"也就是广播包本身并非完全没用。"这句话,我们过滤UDP,如下

我们往下滑,发现一共有1509个流量包,如果我们一个一个去分析太慢了,因为之前就是base64解码,于是我写了一份python脚本进行自动base64解码,如下
python
from scapy.all import *
import base64
import re
def decode_all_base64_in_udp(pcap_file, output_file='decoded_results.txt'):
print(f'正在读取PCAP文件: {pcap_file}')
packets = rdpcap(pcap_file)
base64_pattern = re.compile(r'[A-Za-z0-9+/=]{20,}')
results = []
count = 0
print('正在扫描并解码UDP数据包中的Base64内容...')
for i, packet in enumerate(packets):
if UDP in packet:
payload = bytes(packet[UDP].payload)
try:
payload_str = payload.decode('utf-8', errors='ignore')
if base64_pattern.search(payload_str):
src_ip = packet[IP].src if IP in packet else 'N/A'
dst_ip = packet[IP].dst if IP in packet else 'N/A'
src_port = packet[UDP].sport
dst_port = packet[UDP].dport
try:
decoded = base64.b64decode(payload_str)
decoded_hex = decoded.hex()
decoded_len = len(decoded)
try:
decoded_text = decoded.decode('utf-8')
is_text = True
except:
decoded_text = '非UTF-8编码(二进制数据)'
is_text = False
result = {
'frame': i,
'src': f'{src_ip}:{src_port}',
'dst': f'{dst_ip}:{dst_port}',
'base64_len': len(payload_str),
'decoded_len': decoded_len,
'is_text': is_text,
'original': payload_str,
'decoded_hex': decoded_hex,
'decoded_text': decoded_text
}
results.append(result)
count += 1
if count % 50 == 0:
print(f'已处理 {count} 个数据包...')
except Exception as e:
pass
except:
pass
print(f'扫描完成!共找到 {count} 个包含Base64编码的UDP数据包')
with open(output_file, 'w', encoding='utf-8') as f:
for result in results:
f.write(f"帧号: {result['frame']}\n")
f.write(f"源地址: {result['src']}\n")
f.write(f"目标地址: {result['dst']}\n")
f.write(f"原始Base64长度: {result['base64_len']} 字节\n")
f.write(f"解码后长度: {result['decoded_len']} 字节\n")
f.write(f"是否文本: {'是' if result['is_text'] else '否'}\n")
f.write(f"原始Base64: {result['original']}\n")
f.write(f"解码后(十六进制): {result['decoded_hex']}\n")
if result['is_text']:
f.write(f"解码后(文本): {result['decoded_text']}\n")
f.write('-' * 80 + '\n\n')
print(f'结果已保存到: {output_file}')
return results
if __name__ == '__main__':
decode_all_base64_in_udp('attachment-17.pcapng')
运行后它会将解密情况自动保存到文本文件里(会自动生成),我们打开文本文件,发现很多解密结果,我们想到题目里的"学会'三十六计'中的声东击西"提示,我们搜索,得到如下

我们在里面找到了类似的语句:ShengDongJiXi@36-1-6,,我们尝试,发现这就是密码,解密后我们得到了一个图片,如下

我们用Stegsolve打开,一帧一帧查看,发现每个颜色的0号似乎都有字(除了alpha),如下



但是我们看不清有什么,这是我们想到了LSB隐写,我们打开"Data Extract",选择如下选项

然后点"Preview"并划到最上面,如下

我们找到了flag为ISCC{1d3f1c4t10n_14Xs_txh3_k93y_t0_vQ1ct0ryz}