文章总结: 本文讲解一道CTF工业协议流量分析题解。作者通过Wireshark识别IEC61850/MMS协议栈,发现flag.txt为诱饵后,利用grep命令对流量包进行二进制关键字扫描,定位Base64编码的PNG图片数据。最终通过Python解码还原图片获得Flag。文章涵盖MMS协议分析及grep搜索技巧,实战性强。 综合评分: 91 文章分类: CTF,IoT安全,实战经验,安全工具
其中针对 PNG 的搜索有重要发现。PNG 图片在经过 Base64 编码后,其数据固定以 iVBOR 开头(对应 PNG 文件魔数 \x89PNG\r\n 的 Base64 编码),因此也可以直接搜索:
grep -a "iVBOR" 0ebb974edd304dc79aac8339b14b877e.pcap
此命令输出中出现了一段完整的 Base64 编码图片数据,格式为:
data = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAdAAAABiCAYAAADgKILK..."
这是一段以 Data URL 格式内嵌的 PNG 图片,被编码进了 MMS 通信的某个数据帧中。
为什么会有 Base64 编码的图片?在工业控制系统场景中,MMS 协议除了传输结构化数据外,也可以传输任意二进制/文本内容。此处流量模拟了一次通过 MMS 协议传输包含 Base64 图片数据的通信,这是 CTF 题目有意设计的藏 Flag 方式。
第四步:提取 Base64 数据并解码还原图片
使用 grep 精确提取 Base64 内容:
grep -a -o 'data = "data:image/png;base64,[^"]*"' 0ebb974edd304dc79aac8339b14b877e.pcap
将提取到的 Base64 字符串(去掉前缀 data = "data:image/png;base64, 和末尾的 ")保存,然后用 Python 脚本进行解码:
# coding=utf-8
import base64
img_str = 'iVBORw0KGgoAAAANSUhEUgAAAdAAAABiCAYAAADgKILKAAAAAXNSR0IArs4c6QAAAA...'
# (完整的 Base64 字符串,长度约 9988 个字符)
img_data = base64.b64decode(img_str)
with open('flag_image.png', 'wb') as f:
f.write(img_data)
print('解码完成,文件大小:', len(img_data), '字节')
解码后得到一个有效的 PNG 图片文件,验证如下:
- 文件大小:7490 字节
- PNG 魔数:
89 50 4E 47 0D 0A 1A 0A(正确的 PNG 文件头) - 图片尺寸:464 x 98 像素,RGBA 模式
- 图片内容:白色背景上显示蓝色文字
第五步:读取图片中的 Flag
打开解码后的 PNG 图片,图片内容为写有 Flag 的文字图像:
flag{ICS-mm104}
Flag:flag{ICS-mm104}
Flag 中的 ICS 代表工业控制系统(Industrial Control System),mm104 是对 MMS 协议(也称 ISO/IEC 9506,即 MM 协议)及 IEC 61850 相关标准的组合引用,契合本题工业协议分析的主题。
完整解题脚本
# coding=utf-8
import subprocess
import base64
# 从 pcap 中提取 Base64 图片数据
result = subprocess.run(
['grep', '-a', '-o', 'data = "data:image/png;base64,[^"]*"',
'0ebb974edd304dc79aac8339b14b877e.pcap'],
capture_output=True, text=True
)
line = result.stdout.strip()
# 去除前缀 'data = "data:image/png;base64,' 和末尾的 '"'
b64_str = line.split(',', 1)[1].rstrip('"')
print(f'Base64 长度:{len(b64_str)} 个字符')
# Base64 解码
img_data = base64.b64decode(b64_str)
with open('flag_image.png', 'wb') as f:
f.write(img_data)
print(f'图片已保存,大小:{len(img_data)} 字节')
print('请打开 flag_image.png 查看 Flag')
技术要点总结
1. IEC 61850 / MMS 协议识别
端口 102 是 IEC 61850 工业控制协议的标志性端口,完整协议栈为 TPKT/COTP/SES/PRES/MMS。在 Wireshark 的协议分级统计中,这些协议会清晰呈现。遇到 TCP 102 端口的工业流量时,优先考虑 IEC 61850/MMS 协议。
2. MMS 文件操作分析
MMS 协议支持完整的文件系统操作,主要服务类型包括:
fileDirectory:列出设备上的文件目录fileOpen:打开文件(获取文件句柄)fileRead:读取文件内容(通过文件句柄)fileClose:关闭文件
分析 MMS 流量时,重点关注 fileDirectory 响应中列出的文件列表,以及 fileRead 响应中的具体数据内容。
3. grep -a 的二进制搜索技巧
-a 参数让 grep 将二进制文件当作文本文件处理,这是在 pcap 文件中搜索明文字符串的常用技巧。在 CTF 中,当 Wireshark 解析不出关键信息时,直接用 grep 搜索特定关键字(如文件格式魔数的 Base64 形式)往往能快速定位隐藏数据。
常见的 Base64 文件头:
- PNG:
iVBOR - JPEG:
/9j/4 - PDF:
JVBER - ZIP:
UEsDB - GIF:
R0lGOD
4. Data URL 格式
data:image/png;base64,... 是 RFC 2397 定义的 Data URL 格式,可以将文件内容以 Base64 编码直接内嵌在文本协议数据中,无需额外的文件传输。在 MMS 协议的数据帧中出现这种格式,说明有人将图片以文本形式嵌入了工业控制通信流量。
总结
本题的解题路径如下:
- 识别流量包中的 IEC 61850/MMS 工业协议,通信端口为 102
- 追踪 TCP 流,发现 MMS 文件目录中存在
flag.txt - 尝试读取
flag.txt内容,发现均为二进制可执行文件数据,并非 Flag - 对流量包进行全文二进制关键字扫描,使用
grep -a搜索 Base64 PNG 特征头iVBOR - 在 MMS 通信数据帧中发现完整的 Base64 编码 PNG 图片数据
- 提取 Base64 字符串,使用 Python 解码还原 PNG 图片
- 打开图片,读取其中的 Flag:
flag{ICS-mm104}
本题的核心考点是对工业控制系统协议(IEC 61850/MMS)的认知,以及在非常规流量中寻找隐藏数据的能力。Flag 并未直接存储在 flag.txt 文件中,而是以 Base64 编码 PNG 图片的形式隐藏在 MMS 协议的数据帧内,需要选手突破惯性思维,对整个流量包进行全方位的关键字扫描。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:破镜安全 破镜安全 破镜安全《CTF 工业协议流量分析实战:从 IEC 61850/MMS 数据包中提取隐藏 Flag》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论