- A+
0×1前言
随着网络安全的发展,工控安全也越发的走进信息安全人员的工作当中。由于工控安全的文章较少,所以写一篇工控协议的分析文章,抛砖引玉,欢迎各位大神共同交流。,而且西门子的plc在工控行业也算是比较流行的设备了,所以这是一篇关于西门子的s7协议的分析文章(适用于s7-300,s7-400,s7-1200)。
0×2关于组态
学习西门子s7协议,首先得明白西门子plc的大概构造。虽然我们不必像专门编写PLC程序员那样……
下图就是一个组态完毕的西门子s7300的模型
根据标号,我们可以看出:
1 电源模块,供电专用
2 CPU模块,负责处理信息。
4 通信模块,也就是我们经常用网线接入fuzz通信的地方
5 数字量输入模块(DI)
6 数字量输出模块 (DO)(直观上讲,如果编写PLC较好的话,这一排会有小灯再闪,可以像流水灯一样)
7 模拟量输入模块(AI)
8 模拟量输出模块(AO)
如下是一个helloworld级别的程序,表示电源接通状态,地址%Q0.1、0.2、0.3的3个灯会亮起。
程序的意思左侧的表示为:接通电源则连接通过。
右侧为:数据量输出模块对应的IO地址,通俗讲,就是对应的小灯的地址。
0×3关于s7协议
西门子s7协议在网络上分析的已经很多,但好像都缺少点简单粗暴的方法,绕多了就感觉一头雾水……
其实很简单,想要用s7协议进行通信:只需要2步!
1. 发送COTP包请求连接。Plc回应一个COTP包,告诉客户端,确认连接。
2. 确认连接,完啦。
那么,我们该如何分析这两步操作呢?自问自答一下,肯定是用wireshark抓取包啦。肯定又有人说啦,我们没有s7的plc啊,怎么抓包?(然后用这个做过度,引出下文的……)
好啦,我们先解决这一步,其实很简单(类似把大象装冰箱里分几步…)
1) 下载snap7 1.4.2,连接:
https://sourceforge.net/projects/snap7/files/
2) 安装一个虚拟机,win7 即可。
3) 把snap7中rich-demos里的serverdemo.exe和snap7.dll复制到虚拟机中,然后打开serverdemo.exe,输入ip地址,点击start即可。
4) 实体机打开clientdemo.exe即可。
5) 利用wireshark进行抓包分析,捕获的网卡为:VMnet8。
捕获的数据如下截图:
在进行报文分析前,我们首先把s7的大概分析如下:
从报文中,我们也可以得出连接的方法如下:
第一步发送COTP申请连接,这一步主要是请求连接plc。
请求连接码:0xe0.
Bytebyte_cotp[22] = {
0x03,0x00,0x00,0x16,0x11, 0xE0, 0x00, 0x00, 0x00, 0x01, 0x00, 0xC0, 0x01, 0x0A, 0xC1, 0x02, 0x01,0x00, 0xC2, 0x02, 0x01, 0x02 };
截图如下:
接着plc返回连接确认,如果我们要接受判断:就判断第6个字节是:0xd0即可。(不要看wireshark写着0x0d- -,还有不判断返回值也是可以的…不推荐而已)
返回的连接码
第二步:确定正式连接
这次发送的就包括了TPKT和COTP以及S7的报文。如下图,这样就可以保证连接正确了。需要注意的项已经红框画出。
Byte conn[25] = {
0x03,0x00,0x00,0x19,0x02,0xf0,0x80,0x32,0x01,0x00,0x00,0x00,0x00, 0x00, 0x08, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x01, 0x00, 0x01,0x01, 0xE0 };
至此,连接正式确立。之后,就可以发送正常的功能包了,比如通过clientdemo.exe发送stop命令,start命令等。一切自由发挥啦。
但是如果想用一个命令控制DO输出模块上的灯亮的话,还是需要真实机器PLC的,这也是软件模拟的局限性了。
0×4关于s7协议FUZZ
Fuzz最常用的方法无非两种:盲fuzz和功能性fuzz。无论进行哪种fuzz,但是请注意保证tpkt和cotp的格式正确,其次还有字节长度正确。否则数据包不能经过验证,也到达不了想要的目的。