freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

老题新招 | 再解工控CTF流量分析题
2018-07-18 09:00:38

前言

最近有个工控安全大赛,老板让我们参加。虽然参赛的经验少,但谁叫我们是研究流量分析的呢,硬着头皮也得上。于是乎开始找题刷,然而互联网上工控CTF的题不多,只能是有一道就狠劲儿地啃一道。“工匠安全实验室”(ID:icsmaster)在今年年初解析了一道工控业务流量分析题(见传送门),遂啃之。

正文

我们先来理一理他的解题思路,总结如下:

先过滤出属于工控业务的流量包,在wireshark中直接进行端口过滤,命令为tcp.port in {102 502};

数据包中存在大量重传的包,怀疑有中间人攻击的可能,编写脚本,判断是否存在中间人攻击行为;

排除S7comm中存在flag的可能;

根据modbus协议数据包中出现的非常见功能码,判断并找出异常数据包;

对异常数据包的data字段进行解密。

本人所做的工作主要集中在第二、四、五点。一是进一步将解题思路进行脚本话;二是提出了新的检索异常数据包的方法;三是对data字段的解密做了更进一步的解读。

在第二点中,原文利用scapy库来排查中间人攻击的数据包,代码如下:

image.png

可以看到,通过检测重复seq和ack号来查找重放的数据包。本人重敲了这段代码,在运行的过程中,发现这段代码的运行时间很长,甚至会出现报错,因此换了一个库,利用dpkt库重写了这个代码,见脚本midder_check.py,如下:

运行方式:python ./check_middler.py  pcapfile

image.png

同样的功能,但这段代码的执行效率快得多。

在第四点,本人提出了新的找异常数据包的思路。根据工控业务流量的特点,只要工业生产的模式固定,数据包按照一定地规律出现,那么其中传送的数据包种类和数据包载荷数据一定是固定的。可以从最简单的数据包长度的类型着手,本人刚好在此有所积淀,可以访问这篇文章,拿来小改一下,即可使用。见脚本ics_packets_analysis.py运行该程序:

运行方式:python ./ics_packet_analysis.py --pcapfile=./ics.pcapng -i

image.png

可以看到,这里有很特殊的一个数据包出现,输入这个长度,对该数据包进行进一步排查,有:

image.png直接打印出了这个数据包载荷内容且将这个数据包以pcap的形式存储下来,用wireshark打开,刚好是原文中找出的异常数据包,如下图所示。
image.png直接打印出了这个数据包且将这个数据包以pcap的形式存储下来,用wireshark打开,刚好是原文中找出的异常数据包,如下图所示。

image.png

下次要再出这类题,用这个脚本一下就跑出来了,是不是很爽。下面就是对data数据的解密了。

第五点,要对这个陌生的字符串解密,一开始确实没啥思路,好在原文给出了解密脚本,见脚本format_transfer.py。

image.png

其中的关键代码是:chr(int('{:08b}'.format(ord(data))[::-1], 2))。这句话代表将data中每一个16进制数转换成二进制并将二进制序列倒序排列并得出倒序的数值,最后将这个数值转换成字符串(其实倒序的这个数值即是ASCII表中的值了)。

本人试着总结了一下对字符串解密的解题思路,由于flag一般是一串可读的字符串。要将一串不可读的16进制数,转换成可读的一串数,大概率从bit位的顺序做文章,更难一点,解密出的字符串有可能是编码的字符串,再解一次码就行了。如何解码呢?在github上我找到了一份较全的解码脚本,该脚   本支持如下所示有这几种解码方式:

image.png运行方式:python3 ./try_decodings.py ZmVuZ3poZW5nMTIzNTY=

image.png

下次如遇到需要解码的字符串,即可用此脚本自动完成了。

本人所有的脚本程序,见github:https://github.com/scu-igroup/ctf_ics_traffic

总结

最后,稍作总结一下,由于工业生产模式固定,其中传送的工控网络数据包类型是有规律可循的,因此要从工控业务流量中找出异常的数据包并不难。需要注意的是,flag可以藏在一个数据包中,也可以藏在几个数据包中,在几个数据包中的时候,做一次字符串拼接就行了。字符串解码这一块,笔者只能说,理清思路,多多尝试,相信做得多了,自然会有感觉。最后,师傅们如果有更多的套路,欢迎一起讨论。

*本文作者:scu-igroup,转载请注明来自FreeBuf.COM

# CTF # 工控
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者