工控CTF中常见题型介绍(上) 您所在的位置:网站首页 udp传输的最大值 工控CTF中常见题型介绍(上)

工控CTF中常见题型介绍(上)

2023-04-26 09:38| 来源: 网络整理| 查看: 265

前言

去年参加了几场工控CTF比赛,基本都在坐牢。闲暇之余对工控CTF中常见的题型进行学习。

赛事介绍

工控CTF题目主要以流量分析、无线电分析、组态分析、梯形图等方向为主,偶尔有逆向分析、日志分析等相关分析题目。相关赛事较少,赛事主办方以政府为主,常见的有每年的ICSC/IISC国赛及其各省的选拔赛/省赛。线下赛有工业网络渗透实战、工业应急响应等赛制,主要考察渗透和运维能力。

工控协议分析

常见的工控协议有:Modbus、MMS、MQTT、COTP、IEC104、IEC61850、S7COMM、OMRON等。由于工控技术起步较早但是统一的协议规范制定较晚,所以许多工业设备都有自己的协议。题目考点主要以工控流量和恶意流量为主,主要考察Wireshark使用和找规律,部分难度较高的题目主要考察协议定义和特征。

Modbus

Modbus协议是工控领域最常见的协议之一,也算是工控CTF中最常见题型。

Modbus/RTU

从机地址1B+功能码1B+数据字段xB+CRC值2B 最大长度256B,所以数据字段最大长度252B

Modbus/ASCII

由Modbus/RTU衍生,采用`0123456789ABCDEF`表示原本的从机地址、功能码、数据字段,并添加开始结束标记,所以长度翻倍 开始标记`:`1B+从机地址2B+功能码2B+数据字段xB+LRC值2B+结束标记`\r\n`2B 最大长度513B,因为数据字段在RTU中是最大252B,所以在ASCII中最大504B

Modbus/TCP

不再需要从机地址,改用UnitID;不再需要CRC/LRC,因为TCP自带校验 传输标识符2B+协议标识符2B+长度2B+从机ID 1B+功能码1B+数据字段xB

题目中最常见的是Modbus/TCP协议,主要原因是抓包方便。Modbus常见功能码:

1:读线圈 2:读离散输入 3:读保持 4:读输入 5:写单个线圈 6:写单个保持 15:写多个线圈 16:写多个保持 IISC河南省赛2022初赛《HNGK-Modbus协议分析》

题目要求:分析文件找出flag

首先依次筛选常见功能码,筛选到功能码为3的返回包:可以选择筛选返回包中的来源ip地址,来筛选出response包

((modbus) && (modbus.func_code == 3)) && (ip.src == 192.168.161.2)

-w1391

因为功能码显示read,所以判断看返回包,发现有报错的数据包。通过筛选byte count字段,筛选出有数据的响应包

(((modbus) && (modbus.func_code == 3)) && (ip.src == 192.168.161.2)) && (modbus.byte_cnt)

-w1431

查看响应包数据,发现响应包每条会增加一些字符

-w1179

将值复制出来

#=$@%&$=!!%!!$! "=$&$!""#!"@$@!'% $$#

但是发现复制的值中间有欠缺,所以复制hex16进制,然后找过字符的开头和结尾进行去除,然后转码

0023003d0024004000250026002400260023003d00210021002500210021001f0024001f002100200022003d0024002600240021002200220023001f0021001e00220040002400400021002700250020002400240023

以下步骤目的是为了将00去除第一步:将hex转换

-w1443第二步:将值转换成hex,并设置一行2个bytes-w1426第三步:使用take bytes将字节取不是00的第二位 并设置为一行2个-w1428第四步:然后再转换为hex,得出完整的字符串

#=$@%&$=!!%!!.$.! "=$&$!""#.!."@$@!'% $$#

-w1409第五步:将字符串转换为10进制,发现61 64-w1418第六步:转换为16进制得到5a6d78685a33733161324a68634451304d6d3972665-w1431第七步:得到的5a6d78685a33733161324a68634451304d6d3972665疑似16进制字符串,然后再进行hex解码得到ZmxhZ3s1a2JhcDQ0Mm9rf.-w1396第八步:base64解码获取flag-w1798

MMS

MMS主要有2种类型:

initiate(可以理解为握手)

initiate-RequestPDU initiate-ResponsePDU

confirmed(可以理解为交互)

confirmed-RequestPDU confirmed-ResponsePDU

通常情况为:

1轮initiate

即发送1个initiate-RequestPDU,接收1个initiate-ResponsePDU

n轮confirmed,直到会话主动关闭或被动断开

即confirmed-RequestPDU和confirmed-ResponsePDU交替发送和接收

交互时的指令称为confirmedService

对象操作

read (4) write (5) getVariableAccessAttributes (6) getNamedVariableListAttributes (12)

文件操作

fileOpen (72) fileRead (73) fileClose (74) fileDirectory (77) IISC河南省赛2022复赛《HNGK-MMS》

题目要求:分析文件找出flag

根据题目名称过滤出MMS数据包,发现前两个包为请求握手,观察第三个包发现read为4-w1100

过滤read不是4的包,发现没有。证明全是4

(mms) && (mms.confirmedServiceRequest != 4)

然后再找其他数据段发现itemId数据不一样,仔细观察都是LLN0开头-w1163

过滤LLN0开头的数据

选中过滤器

(mms) && mms.itemId contains "LLN0"

-w1222

然后过滤一下非FFNO的数据,发现三条数据

(mms) && mms.itemId &&!(mms.itemId contains "LLN0")

-w1216

通过观察比较发现数据疑似ascii码,因为ascii码中f为66、l为6citemId: LLN666i5250356j4249itemId: LLN616732557968356jitemId: LLAy7sxCA9wSYrVLCbr

将字符串中的字母部分转换,构建为666c为flag的fl开头

所以使用正则先将字母提取出来,然后进行减法,让i变为c发现减6变成c

然后使用merge合并,转成hex发现得到flRP5mBIag2Uyh5m-w1020

观察发现应该为2个字节换了下一段flRP5mBIag2Uyh5m

拼接后flag为:-w172

IEC60870

子协议

IEC 101(任务相关) IEC 102(电量相关) IEC 103(保护相关) IEC 104(101的网络版) IEC ASDU(基于101/104的应用服务数据单元传输)

主要技巧

筛选`iec60870_asdu` 关注IOA的值 可尝试用type进行分类 IISC河南省赛2022复赛《HNGK-IEC协议分析》

过滤协议发现有错误的数据包,并且随便点数据包,发现分组不同说明建立了很多不同的连接

-w904

过滤分组为0的数据包,这样得到的为同一个连接的数据包,数据也是连贯的

iec60870_asdu && tcp.stream == 0

然后筛选有IOA Value值的数据

再去筛选TypeId: M_ME_TD_1 (34)发现对应的ioa的值,无规则,并且右下角数据包过多

-w948

继续筛选除去TypeId: M_ME_TD_1 (34)后的包,发现TypeId: M_ME_TD_1 (9)也有100多数据包,然后除去34和9,之后发现只剩18条数据

(((iec60870_asdu && tcp.stream == 0) && (iec60870_asdu.normval)) && !(iec60870_asdu.typeid == 34)&& !(iec60870_asdu.typeid == 9))

-w1239

将值提取,base64解码后发现为乱码

Mzhx3ZKtTOTJ0VadnNYdVSnlUUBNQf==-w1031

分析发现两个字节组成一个数据,猜测为颠倒数据(两字节一数据有可能为颠倒的)

-w1272

调换位置获取flag

mZhx3ZKtTOTJ0VadnNYdVSnlUUBNQf==ZmxhZ3tKOTJTV0daNndYSVlnUUNBfQ==flag{J92SWGZ6wXIYgQCA}

MQTT

主要数据交互的消息类型为PUBLISH

筛选mqtt.msgtype == 3

服务端有若干个主题(topic)可供客户端订阅

客户端订阅后可以收到来自服务端关于这个主题的消息(message)

一个主题可以持续产生消息

ICSC济南站2020《工业物联网智能网关数据分析》

首先查看协议占比,大致判断为mqtt的题目1、筛选mqtt.msgtype == 3的时候有数据

(mqtt) && (mqtt.msgtype == 3)

-w10482、依次尝试复制出明文进行hex转码,发现为无用数据-w13993、直到发现504B0304的一段数据内容,hex之后为PK的头,504B0304一般为zip文件的头-w1057

放入010粘粘hex,然后保存为rar,解压发现文件损坏-w6294、猜测该rar不完整,然后发现该rar的数据是在f中的数据包-w10645、拼凑为flag,依次提取数据包的内容,然后粘贴到010保存为rar,发现需要密码6、尝试使用数据包中的字符串当作密码,发现成功解压出flag文件-w9886、发现flag图片损坏-w419使用其他工具,发现只显示了一半二维码,猜测需要更改高度-w389使用010更改高度为260-w713保存打开发现还是不全-w3177、使用Stegsolve打开浏览发现Red、Green、Blue 0的时候上方都有数据显示-w319然后使用数据提取,将RGB为0勾选然后点击preview-w695最后save bin保存出png图片,发现为后半段的二维码-w339拼接扫描二维码得到LSB_is_easy}最后拼接上半段flag最终得到flag{21png_LSB_is_easy}

COTP

COTP可以理解为基于TCP的工控TCP

COTP主要有五种类型:

CR Connect Request (0x0e) CC Connect Confirm (0x0d) DT Data (0x0f) UD User Data (0x04) ED Expedited Data (0x01)

CR和CC只在建立连接时由双方发送,发起方发送CR,被动方发送CC,后续数据主要走DT

因为协议类似于TCP,较为底层,所以没有其他比较有用的协议字段可供解题

ICSC济南站2020《COTP》

题目:找到黑客流量,flag为后90字节的16进制1、过滤cotp流量,发现第一个流量包没有请求握手流量,反而直接是数据传输-w1070

2、过滤掉分组0,查看其他分组cotp && tcp.stream != 0发现是一个完整的请求-w11943、然后尝试提取字节16进制,提交flag。最后发现该数据包为黑客流量-w1104

31312d31424535312d30584230203b56332e308240001505323b32383882410003000300a20000000072010000 S7comm

S7基于COTP

主要有3种类型(ROSCTR)

Job (1) - Ack_Data (3) / Ack (2)10种功能(Function)

Setup communication (0xf0)

Read Var (0x04)

Write Var (0x05)

下载

Request download (0x1a)

Download block (0x1b)

Download ended (0x1c)

上传

Start upload (0x1d)

Upload (0x1e)

End upload (0x1f)

PI-Service (0x28)

Userdata (7)6种功能组(Function group)

Mode-transition (0)

Programmer commands (1)

Block functions (3)

CPU functions (4)

Security (5)

Time functions (7)

ICSC湖州站2020《工控协议数据分析》

题目:通过协议分析获取flag1、查看协议占比发现该题考察点为s7comm,然后通过筛选发现read中data没有flag的痕迹-w11902、发现在write中data数据为01开头-w11163、提取hex并转换二进制,发现为f-w937依次提取write中的data转换为flag

011001100110110001100001011001110111101101100110011011000110000101100111010111110110100101110011010111110110100001100101011100100110010101111101

-w1262

OMRON FINS

Command CODE比较多,关注点主要在读写,如:

Memory Area Read (0x0101) Memory Area Write (0x0102) Multiple Memory Area Read (0x0104) Memory Area Transfer (0x0105) Parameter Area Read (0x0201) Parameter Area Write (0x0202) Data Link Table Read (0x0220) Data Link Table Write (0x0221) Program Area Read (0x0306) Program Area Write (0x0307) ICSC线上2021《Fins协议通讯》

打开压缩包发现key-w7771、打开数据包过滤command。发现全为read,没有write-w11492、然后再筛选response,发现数据包比较多-w11043、通过长度排序,然后发现了加密字符串数据-w1133得到U2FsdGVkX1/bWSZYUeFDeonQhK0AUHr9Tm7Ic20PRXxlPvlwG6a4fQ==4、观察发现开头为U2Fsd因U2Fsd疑似网站https://www.sojson.com的特征,并且压缩包里存在key:jnds因此使用aes算法解密,发现失败,尝试tripledes解密成功,获取flag-w968

特殊协议

基于各类数据传输协议的数据传输功能,实现的数据传输都可以称为隧道。如:基于TCP的隧道、基于UDP的隧道、基于ICMP的隧道。

CISC兰州站2021《DNS》

1、通过大致翻阅,发现查询了奇怪的域名-w14612、筛选出所有的流量

(dns) && (dns.resp.name contains ".in-addr.arpa")

-w14443、全选该数据,使用正则提取然后0x去掉,得到16进制然后转hex发现有flag痕迹-w1428然后猜测为shellcod,解码发现需改为32位,并且出现多处push-w1430将push数据提取出来from hex之后为X9RTM1QTMxkWYs9WYk1SZklmbtcmbplXLuFWdo1iZ0NWdz5WYnt3ZhxmZ将数据进行反转进行base64转码得到flag:-w1111

罕见协议

某行业特有的一些通信协议,比较少见。

ICSC济南站2020《司机的身份》

题目要求:找到卡车司机的身份信息下载文件附件t808_info,为交通运输行业标准和流量包-w649导入流量包发现wireshark筛选不到该t808协议,但t808基于tcp使用wireshark筛选带有数据的tcp数据包规则使用长度比0大(tcp.len > 0)-w1350通过查找数据包内容0702发现数据包-w622发现驾驶员身份信息采集上报的消息ID为0702,找到该数据包-w1391提取hex

7e070240eb010000000001777064121100720120062709485600b48af896b850e7964d543d8af89640646996b850e77f3d85a9985876a4802876a4773e52ab963f621176a46167963f4ea676a4621154c6515c964d56a47957610d76a48fe695cd773e76a496404ea6805e5ba354a48fe652ab85a956c9610d805e980876a4585e8fe676a48ae64ea652ab4ea676a495cd985876a454a44fee95cd85a956a45ba376a4621183e983e976a48fe6805e8ae65a464ea6805e76a4963f85a96240985859827a7a5982598256d176a456d131313031303131393939303530353132313500000cb9e3b6abcaa1bdbbcda8ccfc20300505131182198502039877a67e

-w695提取出姓名的16进制然后from hex发现乱码。使用magic功能尝试发现得到了类似与佛论禅的编码,因magic显示不全,所以使用具体的utf-168e进行解码-w1035-w669然后通过base64解码,发现全是大写的。再使用base32得到flag-w853

总结

本篇因freebuf存在图片数量限制,本篇只是总结了工控ctf中协议分析相关题目的解题方法。对于工控ctf中逆向分析、组态分析、梯形图相关题目放到下一章节进行讲解。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有