2019工业信息安全技能大赛个人线上赛第二场一共十道题,本人对做出的五道题目进行分析。
第一场: https://xz.aliyun.com/u/21528

1.1.破解加密数据

题目:某工控厂商自行研发了一套加密系统,这样的话只要不是系统内部人员,即使数据被窃听没关系了。你截获了一段密文:109930883401687215730636522935643539707,请进行解密,flag形式为{}
题目附件连接:https://pan.baidu.com/s/1bKVpT_umaEt2fkqrlwmUKw (提取码:tseo)
解题步骤:

  1. 打开附件,是一个代码段,分析代码,明文使用了Rabin加密,Rabin加密
    m = "109930883401687215730636522935643539707"
    e = 2
    n = 0x6FBD096744B2B34B423D70C8FB19B541
    assert(int(m.encode('hex'), 16) < n)
    c = pow(int(m.encode('hex'), 16),e,n)
    print c
    #109930883401687215730636522935643539707
    
  2. 通过资料了解加密方式后,编写解密脚本,将n分解出p和q,解密脚本如下:
    import gmpy2
    c=109930883401687215730636522935643539707
    n=0x6fbd096744b2b34b423d70c8fb19b541
    p=10848126018911527523
    q=13691382465774455051
    #获得c^(1/2)modp,q的解
    r=pow(c,(p+1)/4,p)
    s=pow(c,(q+1)/4,q)
    #使用中国定理组合解
    pni=int(gmpy2.invert(p,q))
    qni=int(gmpy2.invert(q,p))
    a=(s*p*pni+r*q*qni)%n
    a1=n-a
    b=(s*p*pni-r*q*qni)%n
    b1=n-b
    print (['0',''][len(hex(a))%2]+hex(a)[2:-1]).decode("hex")
    print (['0',''][len(hex(a))%2]+hex(a1)[2:-1]).decode("hex")
    print (['0',''][len(hex(a))%2]+hex(b)[2:-1]).decode("hex")
    print (['0',''][len(hex(a))%2]+hex(b1)[2:-1]).decode("hex")
    
  3. 运行脚本得到Flag,Flag为flag_EnCryp1

1.2.工控安全取证

题目:有黑客入侵了工控设备后再内网发起大量扫描,而且扫描次数不止一次。分析日志指出第四次发起扫描时数据包的编号,flag形式为{}
题目附件连接:https://pan.baidu.com/s/1MEhe8A1htS0ew9Pav_JaUA (提取码:q73d)
解题步骤:

  1. 打开附件发现是一个.log文件,因为题目时流量分析题,于是想到将文件后缀改为.pacap,然后利用wireshark成功将文件打开,如图所示:

  2. 分析流量包发现存在ICMP、TCP、UDP协议的流量包,其中IP地址192.168.0.9向IP地址192.168.0.99发送大量的TCP请求,题目要求分析第四次发起扫描时的数据包,如果一个一个审计TCP的连接请求工作量太大,于是换一个思路,观察数据包发现,一开始,IP地址192.168.0.9向IP地址192.168.0.99发送了一个ICMP的Ping请求,之后才是大量的TCP请求数据。于是,猜测在每次发送TCP请求是,会先进行一次ICMP的Ping请求。于是,在wireshark中过滤出ICMP的数据包进行分析,然后分析其中ICMP的数据包编号,最终发现IP为192.168.0.199的ICMP的Ping请求对应的数据包编号155989为Flag,Flag为155989

1.3.恶意软件后门分析

题目:工程师的笔记本上发现了恶意软件,经排查是一款著名针对工业领域的病毒,溯源分析远控样本文件,确认远程C&C连接地址。flag形式为flag{}
题目附件连接:https://pan.baidu.com/s/1IbeUC0pwN3A5S6NnlfejaA (提取码:ted4)
解题步骤:

  1. 打开附件是一个文件,在linux中使用file指令查看文件是什么类型,发现文件是一个windows的PE文件。

  2. 将文件在IDA中进行分析,因为题目说是找远程C&C连接地址,所以应该和网络连接相关,于是可以尝试通过搜索关键字"HTTP",来寻找内容。当通过搜索关键字"HTTP",找到个"WinHttpWriteData",点击进去发现两个IP地址10.15.1.69:3128和5.39.218.152,尝试提交,最终IP地址5.39.218.152提交成功,因此Flag为5.39.218.152

1.4.特殊工控流量

题目:某10段工控网络中,工业协议中存在异常数据。请通过流量中的数据找寻flag
题目附件连接:https: (提取码:)
解题步骤:

  1. 打开流量包发现工控协议只有S7Comm西门子通信协议S7Comm

因为题目说工控协议存在异常数据,因此,重点分析S7Comm的流量。首先在wireshark的过滤器中输入S7Comm,过滤出S7Comm的数据,根据S7Comm的数据格式分析,S7Comm的PDU存在如下两个类型:

PDU类型 作用
ACK_DATA 确认数据响应 ,响应JOB的请求
JOB 作业请求,由主设备发送的请求(例如,读/写存储器,读/写块,启动/停止设备,设置通信)

PDU数据部分携带有功能码,通过脚本分析7Comm的数据使用了那种功能码,考虑不同的功能可能会产生异常的数据,代码如下。

import pyshark
def func_s7():
    try:
        captures = pyshark.FileCapture("ICS-2019-1.pcap")#这里为文件的路径
        func_codes = {}
        for c in captures:
            for pkt in c:
                if pkt.layer_name == "s7comm":
                    if hasattr(pkt, "param_func"):#param_func功能码字段
                        func_code = pkt.param_func
                        if func_code in func_codes:
                            func_codes[func_code] += 1
                        else:
                            func_codes[func_code] = 1
        print(func_codes)
    except Exception as e:
        print(e)
if __name__ == '__main__':
    func_s7()
  1. 执行后的如图所示,一共存在三种功能码:0x04(读取值 Read Var)出现172683次、0xf0(建立通信 Setup communication)出现32次、0x05(写入值 Write Var)出现96次。

  2. 因为异常数据很有可能被黑客写入设备,因此首先重点分析功能码为0x05的流量,在wireshark中过滤流量s7comm.param.func ==0x05,其中PDU为Job的数据包是有可能存在黑客写入的数据请求,于是人工审计PDU为Job的数据包,于是发现编号为88607的数据包在数据部分存在一串可以的16进制字符串69735f6e6f745f7265616c,通过在转换得到对应的ASCII码:is_not_real,提交正确,因此,flag为is_not_real


1.5.简单流量分析

题目:不久前,运维人员在日常安全检查的时候发现现场某设备会不时向某不知名加发甜非正常的ICMP PING包。这引起了运维人员的注意,他在过滤出ICMP包分析并马上开始做应急处理很可能已被攻击的设备。运维人员到底发现了什么?flag形式为flag}
题目附件连接:链接:https://pan.baidu.com/s/1IbD_AWnXLWiUH-RgbQqq5g 提取码:j63x

  1. 打开数据包发现存在大量的ICMP的请求包和响应数据包。

  2. 分析发现请求包和响应包的数据部分都存在着内容,内容是一串字符内容,尝试进行解密,但是失败。

  3. 在分析发现ICMP数据部分(data)的长度对应的ASCII码有可能是flag值,利用脚本将ICMP数据部分的长度提取出来,发现是一串base64编码的字符串,然后利用base64解码,得到flag,flag值为:FLAG{xx2b8a_6mm64c_fsociety}

    #!/usr/bin/python
    # coding=utf8
    import pyshark
    import base64
    L_flag= []
    packets = pyshark.FileCapture('fetus_pcap.pcap')
    for packet in packets:
     for pkt in packet:
         if pkt.layer_name == "icmp": 
             if int(pkt.type) != 0:
                 L_flag.append(int(pkt.data_len))
    c=len(L_flag)               
    for i in range(0,c):
     L_flag[i]=chr(L_flag[i])
    print(''.join(L_flag))
    print(base64.b64decode(''.join(L_flag)))
    

  1. 这道题真的是有一点脑洞,分析尝试了很多方法,没想到最后在ICMP数据长度上做了文章。
    # 参考连接
  2. 西门子通信协议S7Comm
  3. Rabin加密
  4. 计网实验笔记(一)

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖