【未经同意禁止转载】

2018工业信息安全技能大赛华东赛区初赛

第2题 解题思路

本题主要考察点是对常见工控协议的理解(modbus/tcps7comm),题目目标是寻找出报文中某条异常报文流量。很让人疑惑的是,题目中并没有给出“异常流量”特征的定义,所以需要从多个角度探索出题人的意思。

首先,观察整个抓包文件,其中包含了modbus/tcps7comm和极少的tcp周期性握手挥手报文。

之后,针对modbus/tcps7comm分别进行深入地分析。此外值得注意的是,一条工控协议报文中至关重要的字段是状态字/控制字/功能码,它直接指示着该条报文的具体作用。

对于modbus/tcp而言,本流量中包含的功能码是1:Read Coils2:Read Discrete Inputs3:Read Holding Registers 4:Read Input Registers。这些功能码的作用是读取PLC中一些输入量、输出量和中间变量的值。

对于s7comm而言,本流量中包含的功能码是0xf0:Setup Communication0x04:Read Var0x05:Write Var。这些功能码的作用分别是建立连接,读变量和写变量。

其中,最为敏感也是我们最关心的必然是0x05:Write Var,因为可以将一次写入异常地址/异常数据的行为当作是异常流量。

下面我们着重分析s7comm协议中0x05:Write Var控制字的相关报文,wireshark的筛选条件为:

s7comm&&s7comm.param.func==0x05

筛选结果如下图所示:

可以看出,这些0x05:Write Var命令是向PLC中数据块1(DB1)的0x00000起始地址连续写入50字节的数据。

接下来,笼统地排查是否有报文写地址或数据和其他报文不同?wireshark的筛选条件为:

(((s7comm) && (s7comm.param.func == 0x05)) && (s7comm.header.rosctr == 1)) && (frame[73:12] == 12:0a:10:02:00:32:00:01:84:00:00:00)

如下图所示,现在已经定位到了这条异常报文,下图显示了其异常之处表现在:

在所有控制字为写变量(write var)的s7comm报文中,这条报文写变量的地址(DB 7)与其他报文地址不同(DB 1)

虽然我们已经定位到了这条异常报文,但是还没摸清真正答案flag在表现方式上的套路。

按照第三题的套路,直接将报文的hex码转为ascii码就是flag的套路,在这里似乎不管用了,这是因为上图中wireshark在hex码右侧已经显示出了ascii码,它并没有实际的意义。

但是我观察到,这堆ascii码好像又是一串hex数据,因此我想到将这串hex再转换为ascii码试一试,编写转换函数如下:

def hex_to_ascii(payload):
data = payload.decode("hex")
flags = []
for d in data:
_ord = ord(d)
if (_ord > 0) and (_ord < 128):
flags.append(chr(_ord))
return ''.join(flags) if __name__ == '__main__':
res = hex_to_ascii("4943537365635363616e")
print res
res = hex_to_ascii("57696e")
print res

得到结果如下

ICSsecScan
Win

看到这一串有意义的字符串,才敢确定这就是最终的答案flag。

最后,总结一下这种异常网络流量分析题的套路:

  1. 以树形结构将此问题域划分为各个子问题域,依次排除子问题域的可能性,子问题域的划分可参照以下2、3、4点;
  2. 首先,可依据不同的协议类型进行分类筛选,通常不同的工控协议之间没有任何逻辑关系,但某些应用层的工控协议和下层传输层协议是由依附关系的(如s7commCOTP之间);
  3. 其次,可按工控协议控制字进行分类筛选;
  4. 依据不同控制字的不同报文特征中不同的关键字段分类筛选;
  5. 一点技巧:flag往往隐藏在较长的报文当中;
  6. 二点技巧:准备一些盲目扫描报文的脚本,比如直接扫描报文hex的ascii码中是否出现过flag字符串,比如报文hex的ascii是否出现连续的hex型数值;
  7. 三点技巧:在以上树形筛选的过程中,做好历史筛选条件及其结果的记录。

参考资料:

  1. 2018年工业信息安全技能大赛(东北赛区)解题报告——工业网络数据分析

    https://laucyun.com/a6ce133bc845d6a2eb3442b24fd7300a.html

  2. CTF WP – 工控业务流量分析

    http://www.icsmaster.org/archives/ics/741

2018工业信息安全技能大赛华东赛区初赛 第2题 writeup的更多相关文章

  1. 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分

    ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...

  2. 【技能大赛笔记01】Zigbee点对点按键控制程序开发

    [技能大赛笔记01]Zigbee点对点按键控制程序开发 --2017年"物联网物联网技术应用与维护"任务五题1(中职组) 1.题目要求 2.工程文件 在比赛中,提供了一个基于Bas ...

  3. ACM-ICPC 2018 南京赛区网络预赛 E题

    ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...

  4. 2018 CCPC 桂林站(upc复现赛)补题

    2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...

  5. 2018美团CodeM编程大赛初赛B轮 A题开关灯

    题目描述 美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图.工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题.公司是提倡勤俭节约的,因此每次会议室只在使用时才 ...

  6. 第三届“传智杯”全国大学生IT技能大赛(初赛A组)题解

    留念 C - 志愿者 排序..按照题目规则说的排就可以.wa了两发我太菜了qwq #include<bits/stdc++.h> using namespace std; const in ...

  7. ACM-ICPC 2018 焦作赛区网络预赛J题 Participate in E-sports

    Jessie and Justin want to participate in e-sports. E-sports contain many games, but they don't know ...

  8. ACM-ICPC 2018 焦作赛区网络预赛 K题 Transport Ship

    There are NN different kinds of transport ships on the port. The i^{th}ith kind of ship can carry th ...

  9. ACM-ICPC 2018 焦作赛区网络预赛 L 题 Poor God Water

    God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells him t ...

随机推荐

  1. python中模块的__all__详细使用

    python模块中的__all__,用于模块导入时限制,如:from module import * 此时被导入模块若定义了__all__属性,则只有__all__内指定的属性.方法.类可被导入:若没 ...

  2. Vue-admin工作整理(十九):从数字渐变组件谈第三方JS库Count-to的使用

    1.组件封装基础 npm install countup@latest 2.组件中使用id值 3.组件中获得dom 如何封装一个组件,在组件中用到需要传入HTML元素ID值的JS库时如何处理,如何获取 ...

  3. Vue-admin工作整理(十三):Vuex-严格模式

    严格模式:开发过程中对规范的要求,定义方式为在store实例初始化的时候将strict设置为true,这样的话就是开启了严格模式.在这种情况下,如果要直接修改state里面的值,那就会报问题.那么也可 ...

  4. 遗传算法(GA)

    来自:https://blog.csdn.net/u010451580/article/details/51178225 遗传算法是模仿生物进化机制的随机全局搜索和优化方法.借鉴达尔文进化论和孟德尔的 ...

  5. npm配置国内镜像资源+淘宝镜像

    将npm的注册表源设置为国内的镜像 1.国内用户,建议将npm的注册表源设置为国内的镜像,可以大幅提升安装速度 2.国内优秀npm镜像推荐及使用:http://riny.net/2014/cnpm/ ...

  6. js ++i和i++的区别

    ++i和i++的定义: 1.  如果用前缀运算符对一个变量增1(减1),则在将该变量增1(减1)后,用新值在表达式中进行其他的运算.    2. 如果用后缀运算符对一个变量增1(减1),则用该变量的原 ...

  7. 2018-2019-2 20175317 实验一《Java开发环境的熟悉》实验报告

    实验一<Java开发环境的熟悉> 一.实验内容及步骤 实验内容: (一)实验一Java开发环境的熟悉-1 参考实验要求 建立"自己学号exp1"的目录 在"自 ...

  8. gcc使用及动静态库制作

    一. GCC的使用 1. GCC的编译过程 (1)预处理(cpp)gcc -E(输出问价通常以 .i 结尾),将头文件展开,宏替换等操作: (2)编译器(gcc)gcc -S(输出问价以 .s 结尾) ...

  9. LeetCode--031--下一个排列(java)*

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  10. 区间DP经典 石子合并

    题目链接 题意:环形的一群石子,每次可以选择相邻的两堆合并,分数为新得到的一堆石子,求将这片石子合并成一堆的最大和最小分数 输入:第一行一个正整数n,其后n个数代表每堆石子的个数 分析:第一次写的时候 ...