CTF工业协议流量分析实战:从IEC61850/MMS数据包中提取隐藏Flag

admin 2026-03-09 02:11:09 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文讲解一道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 协议的数据帧中出现这种格式,说明有人将图片以文本形式嵌入了工业控制通信流量。


总结

本题的解题路径如下:

  1. 识别流量包中的 IEC 61850/MMS 工业协议,通信端口为 102
  2. 追踪 TCP 流,发现 MMS 文件目录中存在 flag.txt
  3. 尝试读取 flag.txt 内容,发现均为二进制可执行文件数据,并非 Flag
  4. 对流量包进行全文二进制关键字扫描,使用 grep -a 搜索 Base64 PNG 特征头 iVBOR
  5. 在 MMS 通信数据帧中发现完整的 Base64 编码 PNG 图片数据
  6. 提取 Base64 字符串,使用 Python 解码还原 PNG 图片
  7. 打开图片,读取其中的 Flag:flag{ICS-mm104}

本题的核心考点是对工业控制系统协议(IEC 61850/MMS)的认知,以及在非常规流量中寻找隐藏数据的能力。Flag 并未直接存储在 flag.txt 文件中,而是以 Base64 编码 PNG 图片的形式隐藏在 MMS 协议的数据帧内,需要选手突破惯性思维,对整个流量包进行全方位的关键字扫描。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:破镜安全 破镜安全 破镜安全《CTF 工业协议流量分析实战:从 IEC 61850/MMS 数据包中提取隐藏 Flag》

评论:0   参与:  0