异常的文件

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

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

image-20220829214656108

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

简单的Modbus协议分析

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

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

1
2
666c61677b44477377546667793147443233366673327366463264736b4c6e677d  十六进制
flag{DGswTfgy1GD236fs2sfF2dskLng} ASCII

Modbus协议分析

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

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

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

image-20220829221853387

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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功能码相关的流量,提取其中的数据,脚本和运行结果如下:

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

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

image-20220830171051129

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

image-20220830171430165