zoukankan      html  css  js  c++  java
  • 2018工业信息安全技能大赛华东赛区初赛 第2题 writeup

    【未经同意禁止转载】

    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

  • 相关阅读:
    [BZOJ2049] [SDOI2008] 洞穴勘测
    BZOJ2594: [Wc2006]水管局长数据加强版
    P4211[BZOJ 3626] [LNOI2014]LCA
    FindLetter 类——查找文件中特定的字符,每一行开头为某一个字符,则跳过
    SolrJ 的运用
    Golang
    注册免费试用12个月的亚马逊AWS云计算服务
    TensorFlow学习笔记(一)
    Hexo之旅(四):文章编写技巧
    高阶函数
  • 原文地址:https://www.cnblogs.com/bianmu-dadan/p/9414165.html
Copyright © 2011-2022 走看看