CTF工控工业互联网(ISC)复现总结WP(超详细)_工控ctf

Message Type: [1b]消息的一般类型(有时称为ROSCTR类型),消息的其余部分在很大程度上取决于Message Type和功能代码。

0x01- Job Request:主站发送的请求(例如读/写存储器,读/写块,启动/停止设备,通信设置)
0x02- Ack:从站发送的简单确认没有数据字段(从未见过它由S300 / S400设备发送)
x03- Ack-Data:带有可选数据字段的确认,包含对作业请求的回复
0x07- Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)

Reserved: [2b]始终设置为0x0000(但可能忽略)

PDU reference: [2b]由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)

  • Parameter Length: [2b]参数字段的长度,Big-Endian
  • Data Length: [2b]数据字段的长度,Big-Endian

在这里插入图片描述

其实这里就只用记住他的特征码就知道他干了什么(异常中,不一样的):

  • 0x01,硬件错误
  • 0x03,想访问的东西不让访问
  • 0x05,地址越界了
  • 0x06,你请求的数据类型和请求的”东西“的数据类型不一致

数据读取/与写入(0x04和0x05):

在这里插入图片描述
在这里插入图片描述
功能码:
在这里插入图片描述
区域类型:

在这里插入图片描述

ISC工业互联网比赛题目复现:

Modbus协议分析:

2019-工业信息安全技能大赛-深圳站-Modbus协议分析

黑客通过外网进入一家工厂的控制网络,之后对工控网络中的操作员站系统进行了攻击,最终通过工控协议破坏了正常的业务。我们得到了操作员站在攻击前后的网络流量数据包,我们需要分析流量中的蛛丝马迹,找到FLAG。格式为flag{}

一般这种题目就是使用脚本提取然后 查看常见协议的功能码 然后在进一步分析。

这里是Moudbus协议而且是Modbus/TCP的脚本提取

import pyshark
def get\_code():
     captures = pyshark.FileCapture("Modbus.pcap")
     func_codes = {}
     for c in captures:
         for pkt in c:
             if pkt.layer_name == "modbus":
                 func_code = int(pkt.func_code)
                 if func_code in func_codes:
                     func_codes[func_code] += 1
                 else:
                     func_codes[func_code] = 1
     print(func_codes)
if __name__ == '\_\_main\_\_':
 get_code()

在这里插入图片描述

四个功能码都出现了702次,唯独16(预置多个寄存器)功能码只出现了两次,所以猜测与16功能码相关的流量可能存在关键数据,于是运行脚本分析与16功能码相关的流量,提取其中的数据,脚本和运行结果如下:

import pyshark

def find\_flag():
    cap = pyshark.FileCapture("Modbus.pcap")
    idx = 1
    for c in cap:
        for pkt in c:
            func_code = int(pkt.func_code)
            if pkt.layer_name == "modbus" and if func_code == 16:
                payload = str(c["TCP"].payload).replace(":", "")
                print(hex_to_ascii(payload))
                print("{0} \*".format(idx))
        idx += 1
def hex\_to\_ascii(payload):
    data = payload
    flags = []
    for d in data:
        _ord = ord(d)
        if (_ord > 0) and (_ord < 128):
            flags.append(chr(_ord))
    return ''.join(flags)

if __name__ == '\_\_main\_\_':
    find_flag()

将16进制字符串在线转换对应的ASII码,得到TheModbusProtocolIsFunny!

flag{TheModbusProtocolIsFunny!}

组态软件安全分析:

2019-工业信息安全技能大赛-深圳站-组态软件安全分析

一些组态软件中进行会配置连接很多PLC设备信息。我们在SCADA 工程中写入了flag字段,请获取该工程flag,flag形式为 flag{}。

放入010 发现是PK 头修改zip后缀 因为文件比较多直接放入kali 使用 grep 进行过滤 找flag

grep -r "flag" ./

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

flag{D076-4D7E-92AC-A05ACB788292}

工业协议分析1:

2019-工业信息安全技能大赛-深圳站-工业协议分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值