2022年工业信息安全技能大赛 “江苏站”锦标赛
为提高工业信息安全防护水平,培养专业复合型技术人才,聚力打造国家级工业信息安全技术交流平台,国家工业信息安全发展研究中心将结合五年办赛经验,继续主办2022年第六届工业信息安全技能大赛。
以下,为本次比赛的解题思路分享:
○ 有趣的流量
○ 灯光的异常
○ 异常的 200smart
○ 突发的故障
○ AGV 小车异常失控
○ 恶意的攻击
○ 恶意响应
○ baby_llvm
○ 组态软件异常连接
○ 冗余数据的爆发
01
有趣的流量
某生产车间 PLC 遭受黑客恶意攻击,导致 PLC 执行了很多意外操作,请帮助安全人员分析流量。Flag 格式为:flag{}。
第 1 步: 使用过滤器
“(s7comm.param.func == 0x05) && (s7comm.header.rosctr == 1)”筛选出数据包的工控协议 s7comm 功能码为 05(写变量)的请求包,如下图所示:
第 2 步:
经分析可知,筛选出来的每个数据包都对内存地址写了一个字节的值,且写入的值相同,均为 0xFF,只是每次写入的地址不同。
第 3 步:
把被写值的地址按附件中图片的格式排列,并把所有被写入的地址(因数据包中的地址是 10 进制格式,附件图片中的地址是按 16 进制排列的,所以要将 10 进制的地址转换为 16 进制标记出来,如下图所示:
第 4 步:
根据附件图片中的提示,逐行把每个被标记的地址记录下来(16 进制表示,字母用大写,只记末位),可直接求得flag:
flag{54B76BD2F94BD158}
02
灯光的异常
技术员小明在操作灯光设备时,按下启动按钮其中一个灯光不亮,请帮助小明查找程序上的错误,并改正。
flag 格式:程序段号码-指令块名称-指令块引脚-更改后的点位。
第 1 步:
下载并解压附件,通过扩展名可知附件是 TIA Portal 组态的工程,使用 TIA Portal 软件打开,如下图所示:
第 2 步:
工程中只有 OB1 一个程序块,程序块中使用了%I0.0 和%I0.1 两个输入地址,%I0.1 只用来复位了%Q0.1 一个变量没有其它作用,所以启动按钮关联的一定是 I0.0。
第 3 步:
经分析,按启动按钮先是给%Q0.0 置位,%Q0.0 会给#a、#a_1 等中间变量赋值。同时又对这些值进行分组判断后控制%M0.0,%M0.1 和%M0.2 三个变量。
当%Q0.0 为 true 会进行一些判断(就是判断这些变量是否等于被赋的值)然后点亮%M0.0~%M0.2。
问题就出在进行判断时用到了#a_8,而赋值的时还没有给它赋值,而赋值的变量中又有#a_12 没用来判断,其它的都正好一一对应,且值也正确。如下图所示:
第 4 步:
将上图中的#a_12 改为#a_8 就可以解决问题。按题目的格式说明可得 flag:
Flag{7-MOVE-OUT1-#a_8}
如下图所示:
03
异常的 200smart
有一台 ip 为 192.168.2.1,端口为 502 的西门子 200smart 作为 modbus 服务器使用,现在使用 modbus tcp 无法进行采集请帮帮我flag 格式{指令名称 _端口引脚名称_端口号_最大 IO 引脚名称 _数量}
第 1 步:
用 200smart 专用的编程软件打开附件,第一个程序段就是用于作 modbus 服务器的功能块,如下图所示:可直接猜测到应该是编程人员把端口号和最大 IO 数量两个参数写混了,如下图所示:
第 2 步
将程序修改正确,并按格式要求提取 flag:
flag{MBUS_SERVER_IPPort_502_MaxIQ_256} 如下图所示:
04
突发的故障
小王为流水线操作工,某天设备突发故障导致生产线突然停了下来,经过维修确定故障已经排除,但是小王按下启动按钮 A 时设备运行指示灯 C 并没有运行,即 A=1 时 C≠1 请帮小王分析分析原因,说明怎样操作才能使设备重新运行起来。
举例:按下 X(按钮)持续 D(秒)以上得 F(点位)=G(数值)
则 flag 为 flag{X=1andX>=5S-F=G}
第 1 步:
下载并解压附件,通过扩展名可知附件是 TIA Portal 组态的工程,使用 TIA Portal 软件打开,如下图所示:
第 2 步:
经分析程序可知,A 不能点亮 C 唯一的可能就是 D 为 true,导致其常闭触点断开,使得 A 的信号无法传递给 C。要解决该问题就需要给 D 复位,使它为false,而程序中只有在 B 为 ture 且不少于 5 秒后 D 才会被复位。因此,按钮 flag要求的格式可求得:Flag{B=1andB>=5S-D=0}
05
AGV 小车异常失控
某运输行业的智慧展厅中的 agv 小车没有按照正常的轨迹运行并间接的导致失控,现场的运维人员在查看工业防护平台时发现 avg 小车失控是黑客攻击导致,请帮助运维人员找到该流量包中异常流量。Flag 为异常流量数据中的前 8 位。Flag 格式为 flag{}。
第 1 步:
过滤 COTP 得到,然后找到下面的流量
Flag 为 data 前八个数:flag{60123234}
06
恶意的攻击
检测人员小张发现现场的生产设备出现故障,并及时捕获流量,发现存在恶意攻击并留下了痕迹,你能找到恶意工具存在的证据吗。flag为flag{}
查看流量,
得到646c6b7979647321 hex转一下 得到dlkyyds!
07
恶意响应
某钢铁生产车间的PLC设备被恶意攻击,安全人员及时捕获了现场黑客攻击的流量,请帮助安全人员找到被攻击的流量编号。Flag格式为:flag{}。
查看流量发现协议为omron协议,根据题目着重关注一下响应部分,找到响应response code发现其他功能码的部分都是0x0000,代表正常完成有一个序号为6484的包响应码为0x0f0f
推测这个包为恶意相应的包
flag为flag{6484}
08
baby_llvm
bc是什么文件呢?
bc文件是llvm的中间语言IR,用clang编译成elf文件即可用ida静态分析
C++
程序逻辑很简单就是一个移位操作int __cdecl main(int argc, const char **argv, const char **envp)
{
unsigned int v3; // eax
char s[44]; // [rsp+10h] [rbp-30h] BYREF
int v6; // [rsp+3Ch] [rbp-4h]
v6 = 0;
__isoc99_scanf("%39s", s);
v3 = strlen(s);
if ( (unsigned int)ch4ck(s, v3) )
printf("Is not a correct flag!n");
else
printf("you get it! flag is: %sn", s);
return 0;
}
__int64 __fastcall ch4ck(__int64 a1, int a2)
{
int i; // [rsp+0h] [rbp-1Ch]
if ( a2 == 35 )
{
for ( i = 0; i < 35; ++i )
{
if ( ((unsigned __int8)(16 * *(_BYTE *)(a1 + i)) | (*(char *)(a1 + i) >> 4)) != enc[i] )
return (unsigned int)-1;
}
return 0;
}
else
{
return (unsigned int)-2;
}
}
就是一个简单的移位操作,Z3解之即可,脚本如下:
Python
data = [ 102,
198,
22,
118,
183,
54,
3,
230,
118,
39,
67,
71,
87,
19,
22,
71,
86,
245,
134,
67,
54,
182,
245,
71,
134,
86,
245,
196,
196,
101,
212,
245,
148,
37,
215]
from z3 import *
a = [z3.BitVec("p%d" % i, 8)for i in range(35)]
b = [0]*35
s=Solver()
for i in range(len(a)):
b[i] = a[i]*16|a[i]>>4
for i in range(len(a)):
s.add(b[i]==data[i])
s.check()==sat
answer=s.model()
flag = []
for i in range(len(answer)):
#print (input[i])
# flag.append(answer[a[i]].as_long())
flag.append(chr(answer[a[i]].as_long()))
# print (flag
print (''.join(flag)) # flag{c0ngr4tu1ate_h4ck_the_LLVM_IR}
09
组态软件异常连接
小张是工厂的运维人员,在某天的运维中,检测出了wincc组态软件无法连接S7-400,于是运维人员抓取流量,请根据抓取的流量,判断组态软件连接故障并找出隐藏的flag
strings一下,发现有一个很像16进制的字符串:656d75696d676f6b796c676d707764
解码后为这个emuimgokylgmpwd
找到在流量包里是1099 ,字符串分开了,所有猜测最后pwd为key
根据附件的文件名称可以确定加密方式
看到和工控的拼音大概有关系
所以flag为flag{gkongaqisfag}
10
冗余数据的爆发
某工控现场设备遭受到了恶意攻击,并及时捕获了流量,经发现在流量包中,存在被黑客攻击的流量。你能找到这些恶意攻击的流量吗。flag为恶意攻击流量的数据包总和。flag格式flag{}
里面含有两个协议,modbus和s7comm,先来看看s7comm协议
在 PDU reference出现异常,正常来说应在高字节+1,但是在8300,22556,25381三个包传输递增不正常,且两者的请求和响应不一致,例如8300:
所有攻击流量相加8300+22556+25381的和56237即为Flag
最终答案为flag{56237}
往期回顾
扫码关注我们
天虞实验室为赛宁网安旗下专业技术团队,重点攻关公司业务相关信息安全前沿技术。
原文始发于微信公众号(天虞实验室):WriteUp|2022年工业信息安全技能大赛 “江苏站”锦标赛解题思路分享~
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论