2018工业信息安全技能大赛华东赛区初赛 第2题 writeup
【未经同意禁止转载】
2018工业信息安全技能大赛华东赛区初赛
第2题 解题思路
本题主要考察点是对常见工控协议的理解(modbus/tcp和s7comm),题目目标是寻找出报文中某条异常报文流量。很让人疑惑的是,题目中并没有给出“异常流量”特征的定义,所以需要从多个角度探索出题人的意思。
首先,观察整个抓包文件,其中包含了modbus/tcp、s7comm和极少的tcp周期性握手挥手报文。

之后,针对modbus/tcp和s7comm分别进行深入地分析。此外值得注意的是,一条工控协议报文中至关重要的字段是状态字/控制字/功能码,它直接指示着该条报文的具体作用。
对于modbus/tcp而言,本流量中包含的功能码是1:Read Coils、2:Read Discrete Inputs、3:Read Holding Registers 、4:Read Input Registers。这些功能码的作用是读取PLC中一些输入量、输出量和中间变量的值。
对于s7comm而言,本流量中包含的功能码是0xf0:Setup Communication,0x04:Read Var和0x05: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。
最后,总结一下这种异常网络流量分析题的套路:
- 以树形结构将此问题域划分为各个子问题域,依次排除子问题域的可能性,子问题域的划分可参照以下2、3、4点;
 - 首先,可依据不同的协议类型进行分类筛选,通常不同的工控协议之间没有任何逻辑关系,但某些应用层的工控协议和下层传输层协议是由依附关系的(如
s7comm和COTP之间); - 其次,可按工控协议控制字进行分类筛选;
 - 依据不同控制字的不同报文特征中不同的关键字段分类筛选;
 - 一点技巧:flag往往隐藏在较长的报文当中;
 - 二点技巧:准备一些盲目扫描报文的脚本,比如直接扫描报文hex的ascii码中是否出现过
flag字符串,比如报文hex的ascii是否出现连续的hex型数值; - 三点技巧:在以上树形筛选的过程中,做好历史筛选条件及其结果的记录。
 
参考资料:
2018年工业信息安全技能大赛(东北赛区)解题报告——工业网络数据分析
CTF WP – 工控业务流量分析
2018工业信息安全技能大赛华东赛区初赛 第2题 writeup的更多相关文章
- 2019全国大学生信息安全竞赛初赛pwn前四题writeup—栈部分
		
ret to libc技巧:https://blog.csdn.net/zh_explorer/article/details/80306965 如何leak出libc地址:基地址+函数在libc中的 ...
 - 【技能大赛笔记01】Zigbee点对点按键控制程序开发
		
[技能大赛笔记01]Zigbee点对点按键控制程序开发 --2017年"物联网物联网技术应用与维护"任务五题1(中职组) 1.题目要求 2.工程文件 在比赛中,提供了一个基于Bas ...
 - ACM-ICPC 2018 南京赛区网络预赛 E题
		
ACM-ICPC 2018 南京赛区网络预赛 E题 题目链接: https://nanti.jisuanke.com/t/30994 Dlsj is competing in a contest wi ...
 - 2018 CCPC 桂林站(upc复现赛)补题
		
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
 - 2018美团CodeM编程大赛初赛B轮 A题开关灯
		
题目描述 美团的办公室一共有n层,每层有m个会议室,可以看成是一个n*m的网格图.工程师们每天的工作需要协作的地方很多,经常要到会议室开会解决各种问题.公司是提倡勤俭节约的,因此每次会议室只在使用时才 ...
 - 第三届“传智杯”全国大学生IT技能大赛(初赛A组)题解
		
留念 C - 志愿者 排序..按照题目规则说的排就可以.wa了两发我太菜了qwq #include<bits/stdc++.h> using namespace std; const in ...
 - 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 ...
 - 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 ...
 - 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 ...
 
随机推荐
- Python3学习笔记----生成器
			
生成器的作用 生成器可以在循环的过程中推算出后续的元素,不必创建完整的list,从而节省大量空间. 生成器的创建 1.把一个列表生成式的 [ ] 改写为( ) # -*- coding: UTF-8 ...
 - ASP.NET MVC 访问静态文件
			
When use asp.net MVC, we can add a special route to access the image files. the code like below: 1. ...
 - Nginx 504 Gateway Time-out分析及解决方法
			
一.场景还原php程序在执行抓取远程图片库并保存至本地服务器的时候,出现了“504 Gateway Time-out”错误提示. 问题定位:由于图片巨多,所以下载时间很长(10分钟以上),引起网关超时 ...
 - curl的POST请求,封装方法
			
//POST请求//参数1是请求的url//参数2是发送的数据的数组//参数3是其他POST选项public static function POST($url, array $post = arra ...
 - 键盘坏了几个键位之后,linux上的remap方法
			
Use xev command to find the keycode xmodmap -pke |more To Change keymapping for this Laptop: 我是日文键盘, ...
 - idea在本地调试,spark创建hiveContext的时候报错
			
spark版本:1.6.1 scala版本:2.10 问题呢场景: 在idea调试本地程序的时候创建hiveContext报错,上午的时候是没有这个问题的,下午在项目中写了一个小deamon,出现了而 ...
 - Python自学:第三章  根据值删除元素
			
motorcycles = ["honda", "yamaha", "suzuki", "ducati"] print( ...
 - @mentions for Users with ActionText; 使用Tribute.js库
			
git clone从https://github.com/chentianwei411/at-mentions-with-action-text 先fork下来,然后拷贝https连接,最后在term ...
 - UML序列图参考资料
			
UML各个图的说明:http://www.uml.org.cn/oobject/201509015.asp?artid=16901 UML类图的说明:https://www.cnblogs.com/a ...
 - MS17-010漏洞复现
			
攻击机:192.168.148.132 kali linux2018.2 x64 靶机:192.168.1.129 win7 x64 首先用msfconsole的smb模块扫描,看看是 ...