工控协议 | 西门子S7协议学习分享

2017-11-28 317481人围观 ,发现 3 个不明物体 工控安全

 *本文作者:gongmo,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

0×1前言

随着网络安全的发展,工控安全也越发的走进信息安全人员的工作当中。由于工控安全的文章较少,所以写一篇工控协议的分析文章,抛砖引玉,欢迎各位大神共同交流。,而且西门子的plc在工控行业也算是比较流行的设备了,所以这是一篇关于西门子的s7协议的分析文章(适用于s7-300,s7-400,s7-1200)。

0×2关于组态

学习西门子s7协议,首先得明白西门子plc的大概构造。虽然我们不必像专门编写PLC程序员那样……

下图就是一个组态完毕的西门子s7300的模型

西门子S7协议学习分享

根据标号,我们可以看出:

1    电源模块,供电专用

2    CPU模块,负责处理信息。

4    通信模块,也就是我们经常用网线接入fuzz通信的地方

5    数字量输入模块(DI)

6    数字量输出模块 (DO)(直观上讲,如果编写PLC较好的话,这一排会有小灯再闪,可以像流水灯一样)

7    模拟量输入模块(AI)

8    模拟量输出模块(AO)

如下是一个helloworld级别的程序,表示电源接通状态,地址%Q0.1、0.2、0.3的3个灯会亮起。

西门子S7协议学习分享
程序的意思左侧的表示为:接通电源则连接通过。

右侧为:数据量输出模块对应的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协议学习分享

在进行报文分析前,我们首先把s7的大概分析如下:

西门子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 };

截图如下:

西门子S7协议学习分享

接着plc返回连接确认,如果我们要接受判断:就判断第6个字节是:0xd0即可。(不要看wireshark写着0x0d- -,还有不判断返回值也是可以的…不推荐而已)

西门子S7协议学习分享

返回的连接码

西门子S7协议学习分享

第二步:确定正式连接

这次发送的就包括了TPKT和COTP以及S7的报文。如下图,这样就可以保证连接正确了。需要注意的项已经红框画出。

西门子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的格式正确,其次还有字节长度正确。否则数据包不能经过验证,也到达不了想要的目的。

 *本文作者:gongmo,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

发表评论

已有 3 条评论

取消
Loading...
css.php