工控CTF刷题记录

CTF 工业信息安全大赛线上题目回顾

2019 工业信息安全大赛第二场题目主要包括,破解加密数据、工控安全取证、恶意软件后门分析、隐藏的黑客、简单的工控固件逆向、奇怪的文件、简单的流量分析、另一个隐藏的黑客、特殊的工控流量10到题目,以及工业网络渗透测试和scada系统渗透测试2道场景题。

1.破解加解密数据题目分析

题目描述:

image-20240614164516482

提供的加密算法文件如下:

1
2
3
4
5
6
7
m = "flag_is_flase"
e = 2
n = 0x6FBD096744B2B34B423D70C8FB19B541
assert(int(m.encode('hex'), 16) < n)
c = pow(int(m.encode('hex'), 16),e,n)
print(c)
#109930883401687215730636522935643539707

1)解密方法,获取flag方式如下,flag为flag_EnCryp1

题目总结与思考:

出题者刚开始只给了加密字符串,未提供加密算法,由于算法是自己写的,导致很多选手不能解出来,过了几个小时,出题方才提供了加密算法。

解密脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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")

2.工控安全取证题目分析

题目描述:

image-20240614164548018

提供文件:capture.log

1)首先利用linux file命令查看日志文件属性,发现capture.log被出题者故意篡改过,对解题人进行迷惑。从下图中可以看出该文件为tcpdump 抓包后的文件

img

2)将文件名修改为capture.pcap 利用wireshark工具查看内容,如下

image-20240614165549460

短时间内发送了大量syn端口扫描包,初步怀疑192.168.0.9主机发起syn端口扫描,找到第四次扫描包编号11,提交flag,平台提示答案不正确。

3)再次阅读题目理解出题人的意思,第四次发起扫描数据包编号,继续分析题目,发现数据报文有多个ip都对192.168.0.99目标机器进行扫描,分别为192.168.0.9、192.168.0.1、192.168.0.254、192.168.0.199,它们共同特点是每次发起端口扫描时候,先进行ping操作,尝试提交第四次发起扫描第一个报文编号155989,提交flag,显示成功。

image-20240614165726011

题目总结与思考:

1)一个黑客电脑为什么拥有多个源ip对目标机器进行端口扫描,第一种猜测可能是利用masscan等端口扫描工具时候,对源ip进行了隐藏与欺骗,防止触发IDS等系统告警。第二种可能是利用多个虚拟机分别进行扫描。可以利用masscan 192.168.0.99 -p–65535 –source-ip 192.168.0.199 –rate 2000进行自行验证。

2)黑客对工控网络攻击,首先会利用诸如nmap、masscan等工具利用syn、fin或者ack等方式进行快速端口扫描,识别出重要工业控制资产类型,比如西门子plc(默认102端口)、施耐得plc(默认502端口)等控制设备,接着在进行工控资产识别,识别出plc具体厂商、型号、固件版本等信息。最后结合cnvd等漏洞库对plc发起攻击,

3.恶意软件后门题目分析

题目描述:

image-20240614170002283

1)首先利用linux file命令查看文件类型,发现该恶意软件是windows平台下可执行文件,如下图所示

img

2)利用IDA查看工具对文件内容进行分析,关键内容如下所示

image-20240614170630872

image-20240614170643383

3)根据题目意思,寻找恶意样本发起远程连接的地址,可以推断,10.151.69.3.128主机通过http post方式往c&c远程地址5.39.218.152建立连接与通信,提交5.39.218.152 flag,提示成功。

题目总结与思考:

1)真实工业环境中,由于对工程师站、操作员站以及员工笔记本非法安装软件可能会引入捆绑的恶意软件,当工程师笔记本接入工业控制环境,工控网络、设备可能会被恶意软件发起信息收集、网络攻击等恶意行为,造成不可估量的后果。

2)此题目描述和恶意样本内容与2018年工业信息安全大赛-西部赛区第4题为同一题,属于原题重现,所以平时多做多分析工控CTF历年大赛真题才是王道,题目资源可以从底部CTF相关赛题参考连接获得。

4.特殊的工控流量题目分析

题目描述:

image-20240614170851412

首先利用wireshark打开数据包,初步流量数据报文,发现工控流量只有s7common,利用过滤条件过滤出工控流量如下图所示

image-20240614171125410

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()

一共存在三种功能码:0x04(读取值 Read Var)出现172683次、0xf0(建立通信 Setup communication)出现32次、0x05(写入值 Write Var)出现96次。

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

image-20240614171613669

题目总结与思考:

1)工控协议异常流量,大多数早期工控协议如S7、modbus、ehternetip等均无授权、无认证保护,无防重放攻击等安全机制、任何攻击者都可以直接向使用这些工控协议的设备发起连接,进行寄存器值修改或者写入非协议规约的值,导致压力、流量等控制参数超出正常值,或plc设备异常,引起工控环境遭受破坏,造成不可估量的后果。

2)异常工控协议流量出题规律一般为往下位机设备写入一个不符合规约的值,或上载、下载一个带有flag.txt的文件,找出文件内容;也可能黑客对返回上位机开关量0xff 修改为0×00,欺骗上位机未对某设备进行关闭操作的知识点进行出题。

5.简单流量分析

image-20240614171741832

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

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/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)))

工业网s络渗透测试及SCADA系统渗透测试场景题目