前言
最近有个工控安全大赛,老板让我们参加。虽然参赛的经验少,但谁叫我们是研究流量分析的呢,硬着头皮也得上。于是乎开始找题刷,然而互联网上工控CTF的题不多,只能是有一道就狠劲儿地啃一道。“工匠安全实验室”(ID:icsmaster)在今年年初解析了一道工控业务流量分析题(见传送门),遂啃之。
正文
我们先来理一理他的解题思路,总结如下:
先过滤出属于工控业务的流量包,在wireshark中直接进行端口过滤,命令为tcp.port in {102 502};
数据包中存在大量重传的包,怀疑有中间人攻击的可能,编写脚本,判断是否存在中间人攻击行为;
排除S7comm中存在flag的可能;
根据modbus协议数据包中出现的非常见功能码,判断并找出异常数据包;
对异常数据包的data字段进行解密。
本人所做的工作主要集中在第二、四、五点。一是进一步将解题思路进行脚本话;二是提出了新的检索异常数据包的方法;三是对data字段的解密做了更进一步的解读。
在第二点中,原文利用scapy库来排查中间人攻击的数据包,代码如下:
可以看到,通过检测重复seq和ack号来查找重放的数据包。本人重敲了这段代码,在运行的过程中,发现这段代码的运行时间很长,甚至会出现报错,因此换了一个库,利用dpkt库重写了这个代码,见脚本midder_check.py,如下:
运行方式:python ./check_middler.py pcapfile
同样的功能,但这段代码的执行效率快得多。
在第四点,本人提出了新的找异常数据包的思路。根据工控业务流量的特点,只要工业生产的模式固定,数据包按照一定地规律出现,那么其中传送的数据包种类和数据包载荷数据一定是固定的。可以从最简单的数据包长度的类型着手,本人刚好在此有所积淀,可以访问这篇文章,拿来小改一下,即可使用。见脚本ics_packets_analysis.py运行该程序:
运行方式:python ./ics_packet_analysis.py –pcapfile=./ics.pcapng -i
可以看到,这里有很特殊的一个数据包出现,输入这个长度,对该数据包进行进一步排查,有:
直接打印出了这个数据包载荷内容且将这个数据包以pcap的形式存储下来,用wireshark打开,刚好是原文中找出的异常数据包,如下图所示。
直接打印出了这个数据包且将这个数据包以pcap的形式存储下来,用wireshark打开,刚好是原文中找出的异常数据包,如下图所示。
下次要再出这类题,用这个脚本一下就跑出来了,是不是很爽。下面就是对data数据的解密了。
第五点,要对这个陌生的字符串解密,一开始确实没啥思路,好在原文给出了解密脚本,见脚本format_transfer.py。
其中的关键代码是:chr(int(‘{:08b}’.format(ord(data))[::-1], 2))。这句话代表将data中每一个16进制数转换成二进制并将二进制序列倒序排列并得出倒序的数值,最后将这个数值转换成字符串(其实倒序的这个数值即是ASCII表中的值了)。
本人试着总结了一下对字符串解密的解题思路,由于flag一般是一串可读的字符串。要将一串不可读的16进制数,转换成可读的一串数,大概率从bit位的顺序做文章,更难一点,解密出的字符串有可能是编码的字符串,再解一次码就行了。如何解码呢?在github上我找到了一份较全的解码脚本,该脚 本支持如下所示有这几种解码方式:
运行方式:python3 ./try_decodings.py ZmVuZ3poZW5nMTIzNTY=
下次如遇到需要解码的字符串,即可用此脚本自动完成了。
本人所有的脚本程序,见github:https://github.com/scu-igroup/ctf_ics_traffic
总结
最后,稍作总结一下,由于工业生产模式固定,其中传送的工控网络数据包类型是有规律可循的,因此要从工控业务流量中找出异常的数据包并不难。需要注意的是,flag可以藏在一个数据包中,也可以藏在几个数据包中,在几个数据包中的时候,做一次字符串拼接就行了。字符串解码这一块,笔者只能说,理清思路,多多尝试,相信做得多了,自然会有感觉。最后,师傅们如果有更多的套路,欢迎一起讨论。
*本文作者:scu-igroup,转载请注明来自FreeBuf.COM
来源:freebuf.com 2018-07-18 09:00:38 by: scu-igroup
请登录后发表评论
注册