工控流量分析

异常的文件

现存在一份被黑客攻击修改了的工程文件,请应急工作人员找出黑客攻击的痕迹,flag格式为:flag{}。

下载得到压缩包,根据题目描述的提示我们可以得知,此题是需要我们对被修改后的文件,进行痕迹查找,通常在进行痕迹查找是我们用查找日志的方法比较多,这里我们理解出题的考点就是要在众多零碎的文件中找到,特定的痕迹(flag)。

image-20220829214656108

strings $(find | xargs) | grep flag
#“|”管道符,将标准输出流转换为标准输入流
#“xargs” 将是将标准输入转为命令行参数,一般搭配管道符“|”使用

简单的Modbus协议分析

由于操作员操作不当导致化工车间蒸馏塔控制器程序出错,请分析错误程序查找错误点并获得flag,flag格式为flag{}。

使用wireshark打开t3.pacp后过滤modbus协议,发现流量包中并未存在使用modbus进行流量传输,之后使用strings命令发现存在可疑16进制字符串,将16进制转ASCII得到flag

666c61677b44477377546667793147443233366673327366463264736b4c6e677d  十六进制
flag{DGswTfgy1GD236fs2sfF2dskLng}                                   ASCII

Modbus协议分析

黑客通过外网进入一家工厂的控制网络,之后对工控网络中的操作员站系统进行了攻击,最终通过工控协议破坏了正常的业务。我们得到了操作员站在攻击前后的网络流量数据包,我们需要分析流量中的蛛丝马迹,找到FLAG。格式为flag{}

看完上面那个简单题目后我们正式来一个modbus协议的题目,根据题目描述我们可以得知,我们要做的是将流量包中的恶意流量找出来,接下来我们详细讲讲

打开流量包后发现流量非常多,其中大比例是modbus协议流量,使用过滤器过滤出modbus协议流量。

image-20220829221853387

对modbus协议进行分析首先要对modbus的协议功能码记性分析,这里使用脚本分析协议功能码。

import pyshark
def get_code():
     captures = pyshark.FileCapture("Modbus.pcap")
     func_codes = {}
     for c in captures:
         for pkt in c:
             if pkt.layer_name == "modbus":
                 func_code = int(pkt.func_code)
                 if func_code in func_codes:
                     func_codes[func_code] += 1
                 else:
                     func_codes[func_code] = 1
     print(func_codes)
if __name__ == '__main__':
 get_code()

脚本使用中出现报错情况,首先是查看是否安装pyshark这个模块,如果安装后报错找不到tshark.exe,可以根据这篇文章进行修改

脚本运行结果,如图所示

image-20220829223420822

根据modbus常见功能码分析,分析结果我们可以知道

1(读取线圈状态)

2(读取输入内容)

3(读多个寄存器)

4(读输入寄存器)

四个功能码都出现了702次,唯独16(预置多个寄存器)功能码只出现了两次,所以猜测与16功能码相关的流量可能存在关键数据,于是运行脚本分析与16功能码相关的流量,提取其中的数据,脚本和运行结果如下:

import pyshark
def find_flag():
    cap = pyshark.FileCapture("modbus.pcap") #设置Modbus流量包路径
    idx = 1
    for c in cap:
        for pkt in c:
            if pkt.layer_name == "modbus":
                func_code = int(pkt.func_code)
                if func_code == 16: #查看对应功能码寄存器下写入的值
                    payload = str(c["TCP"].payload).replace(":", "")
                    print(hex_to_ascii(payload))
                    print("{0} *".format(idx))
        idx += 1
def hex_to_ascii(payload):
    data = payload
    flags = []
    for d in data:
        _ord = ord(d)
        if (_ord > 0) and (_ord < 128):
            flags.append(chr(_ord))
    return ''.join(flags)
if __name__ == '__main__':
    find_flag()

提出的数据存在一个16进制字符串00000000003901100001001932005400680065004d006f006400620075007300500072006f0074006f0063006f006c0049007300460075006e006e00790021,将16进制字符串在线转换对应的ASCII码,得到TheModbusProtocolIsFunny!,提交成功,Flag为TheModbusProtocolIsFunny!

S7协议恶意攻击分析

某天在硫化车间脱硫工艺所使用的的西门子PLC突然发生停机事件,经工厂人员调查发现该时间段PLC存在多次异常行为,请协助调查人员找出PLC相关行为,flag为异常行为数据包的前四位加后四位,格式为flag{}。

使用wireshark过滤S7comm协议的数据包发现存在一处发现plc的stop包,经尝试为flag

image-20220830131827495

内存取证分析

某工厂遭到黑客攻击,但黑客留下了攻击痕迹,系统管理人员将内存保存了下来请应急人员分析注:提示请分析主机账号密码,flag格式化为flag{}。

使用vol内存取证软件对镜像进行分析,根据题目描述的提示我们需要对镜像取证从而得到主机账号密码,提交flag

python vol.py -f ../ADMIN-PC-20201213-080024.raw imageinfo 
#获取系统镜像版本

image-20220830171051129

python vol.py -f ../ADMIN-PC-20201213-080024.raw --profile=Win7SP1x64 hashdump
#使用hashdump插件获取账号密码的hash值

image-20220830171430165

© 版权声明
THE END
喜欢就支持一下吧!
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容