工控安全入门之Ethernet/IP

摘要:
CIP是ODVA支持的开放工业协议。它用于串行通信协议,如DeviceNet、ControlNet和EtherNet/IP。尽管EtherNet/IP比Modbus更现代,但在协议层面仍然存在安全问题。使用此端口的原因是EtherNet/IP实现了隐式和显式消息传递。EtherNet/IP被封装用于EtherNet中的CIP协议。CIP规范对数据包结构有许多规定,这意味着使用EtherNet/IP的每个设备都必须执行符合规范的命令。信息和培训公司Kenexis发布了一个针对Ethernet/IP的中间人攻击演示。

这一篇依然是协议层面的,协议层面会翻译三篇,下一篇是电力系统中用的比较多的DNP3。这一篇中大部分引用的资料都可以访问到,只有一篇reversemode.com上的writeup(http://reversemode.com/downloads/logix_report_basecamp.pdf)需要身份认证才能下载,如果有朋友能下载求分享。

Ethernet/IP

与Modbus相比,EtherNet/IP 是一个更现代化的标准协议。由工作组ControlNetInternational与ODVA在20世纪90年代合作设计。EtherNet/IP是基于通用工业协议(Common Industrial Protocol,CIP)的。CIP是一种由ODVA支持的开放工业协议,它被使用在诸如DeviceNet和ControlNet以及EtherNet/IP等串行通信协议中。美国的工控设备制造商Rockwell/Allen-Bradley已经围绕EtherNet/IP进行了标准化,其他厂商如Omron也在其设备上支持了EtherNet/IP。EtherNet/IP已经变得越来越受欢迎,特别是在美国。尽管EtherNet/IP比Modbus更现代化,但仍然存在协议层面的安全问题。EtherNet/IP通常通过TCP/UDP端口44818运行。此外,EtherNet/IP还有另一个端口TCP/UDP端口2222。使用这个端口的原因是EtherNet/IP实现了隐式和显示两种消息传递方式。显式消息被称为客户端/服务器消息,而隐式消息通常被称为I/O消息。

工控安全入门之Ethernet/IP第1张

EtherNet/IP是为了在以太网中使用CIP协议而进行的封装。EtherNet/IP的CIP帧封装了命令、数据点和消息等信息。CIP帧包括CIP设备配置文件层、应用层、表示层和会话层四层。数据包的其余部分是EtherNet/IP帧,CIP帧通过它们在以太网上传输。EtherNet/IP分组结构如图5‑12所示。

CIP规范对数据包结构有很多的规定,这意味着每个使用EtherNet/IP的设备必须实现符合规范的命令。下面是EtherNet/IP首部中封装的CIP帧字段:

工控安全入门之Ethernet/IP第2张

  • Command

    两字节整数,对应一个CIP命令。CPI标准要求,设备必须能接收无法识别的命令字段,并处理这种异常。

  • Length

    两字节整数,代表数据包中数据部分的长度。对于没有数据部分的请求报文,该字段为0。

  • Session Handle

    会话句柄(session handle)由目标设备生成,并返回给会话的发起者。该句柄将用于后续与目标设备的通信。

  • Status

    Status字段存储了目标设备执行命令返回的状态码。状态码“0”代表命令执行成功。所有的请求报文中,状态码被置为“0”。其它的状态码还包括:

- 0x0001无效或不受支持的命令

- 0x0002目标设备资源不足,无法处理命令

- 0x0003数据格式不正确或数据不正确

- 0x0065接收到无效的数据长度

  • Sender Context

    命令的发送者生成这六字节值,接收方将原封不动的返回该值。

  • Options

    该值必须始终为0,如果不为零,数据包将被丢弃。

  • Command-specific data

    该字段根据接收/发送的命令进行修改。

如果请求发送方是工程师站,大多数会话中执行的第一条命令是“List Identity”命令。如下所示的数据包,命令字段是0x63,代表“List Identity”命令,上下文是“0x00006a0ebe64”。这个命令与Modbus功能码43非常相似,可以查询设备信息,如供应商、产品、序列号、产品代码、设备类型和版本号等。使用在Github项目pyenip中找到的Python脚本ethernetip.py(https://github.com/paperwork/pyenip/blob/master/ethernetip.py),你可以查询Ethernrt/IP设备的信息。默认情况下,这个脚本不会解析一些响应,你需要取消脚本底部的testENIP()函数的注释后,它才会发送和接收“ListIdentity”命令。在执行脚本的。

工控安全入门之Ethernet/IP第3张

同时,你可以使用Wireshark查看请求和响应的数据包。

我们在这个例子中没有提供脚本代码,因为它大约有1000行代码。你可以通过访问下面这个GitHub链接来获取脚本(https://github.com/paperwork/pyenip/blob/605ad6d026865e3378542d4428ec975e7c26d2e4/ethernetip.py)。

设备信息泄露

  • 流行程度:10

  • 利用难度:8

  • 影响面:3

  • 威胁评分:7

Digital Bond在项目Redpoint中实现了一个和pyenip很像的脚本,可以用来从远程设备中获取信息。Redpoint脚本使用了上一节提到的“ListIdentity”命令字,并使用NES脚本来解析请求。这个脚本有一个有意思的地方,它的“Conmmand Specific Data”部分包含了一个套接字地址(ip地址和端口号)。这是暴露的远程设备的真实ip地址和端口号,即使它位于NAT设备之后。

工控安全入门之Ethernet/IP第4张

通过Shodan搜索(https://www.shodan.io/search?query=port%3A44818),我们发现大量的设备暴露的IP字段和实际扫描的IP地址不同。所以我们得出结论,大多数的Ethernet/IP设备部署在内部网络中,而不是直接暴露在互联网上。如下图5‑15所示的是使用nmap扫描CompactLogix控制系统的扫描结果,可以看到暴露的设备ip和扫描ip不匹配,说明目标系统位于路由器或防火墙之后。

上图显示了一些信息,包括设备的制造商“Rockwell”。设备的制造商在响应中是一个两字节的制造商ID,它映射了一组支持Ethernet/IP的厂商名单。但是,这个厂商名单不是公开的。我们在深入研究Wireshark捕获的数据包后,发现数据包被Wireshark解析后,制造商ID被替换成了制造商名称。这说明Wireshark拥有如何映射制造商ID和名称的信息。通过对Github上Wireshark源代码的一些搜索,我们发现了如下代码片段,它告诉我们该如何解析制造商ID。在解析工控协议的时候,Wireshark常常是一个强大而好用的资源。

工控安全入门之Ethernet/IP第5张

工控安全入门之Ethernet/IP第6张

使用像“List Identity”这样的命令,你可以简单的重放数据包,几乎不用修改数据包。会话句柄将被设置为0,意味着没有会话生成,因为该命令只是简单的发送命令和接收系统响应。为了进一步与设备进行通信,需要发送注册会话命令(0x65)。这个命令会设置会话句柄ID,这个ID将用于后续会话的通信。如下图5‑16所示,注册会话的请求使用标准ID“0x00000000”,目标设备返回了它生成的会话句柄“0x03A566BB”。

Ethernet/IP中间人攻击

  • 流行程度:5

  • 利用难度:8

  • 影响面:8

  • 威胁评分:7

Ethernet/IP具有和大多数工控协议相似的问题。资讯和培训公司Kenexis发布了针对Ethernet/IP的中间人攻击示例演示。这些示例可以在它们的Github项目主页上找到(https://github.com/kenexis/PortableICS-MITM)。与Modbus不同,简单的数据包重放对Ethernet/IP的某些指令无效。这使得攻击变得稍微复杂了一些。然而,对于大多数攻击者而言,只要对Ethernet/IP的协议稍有了解,这点困难将是微不足道的。一旦会话句柄通过协商被确定,只要通过手动改变序列号,就可以实现像之前Modbus-vcr工具那样的中间人攻击。

Ethernet/IP高危命令字

  • 流行程度:5

  • 利用难度:8

  • 影响面:8

  • 威胁评分:7

就像Modicon利用功能码90来终止CPU,一些Ethernet/IP设备也支持类似的命令字。Digital Bind的Basecamp项目中,发布了一个Metasploit模块(https://www.rapid7.com/db/modules/auxiliary/admin/scada/multi_cip_command),可以被用来终止一个Allen-Bradley ControlLogix控制系统中的大量PLC,以及其它的一些坏坏的事情,比如使以太网卡崩溃。

Digital Bond的Ruben Santamarta在撰写Basecamp项目的Writeup“Attacking ControlLogix”(http://reversemode.com/downloads/logix_report_basecamp.pdf)时写道“我们发送的每个数据包必须包含会话句柄。这就是全部,然后我们Hack了控制器。在协议层面没有更多的安全机制了。”[译者注:reversemode.com上的文档我下载不下来,有能够下载的朋友求分享]。Ruben指出,只要了解Session Handle即可轻松攻击Ethernet/IP。是这个攻击奏效的另一个关键是Allen-Bradley实现的一个命令字。Allen-Bradley在NOP(0x00)命令中实现了终止CPU的功能。

这个命令在CPI或Ethernet/IP的规范中没有记录,是Allen-Bradley/Rockwell控制器的私有实现。通过对大量设备的测试,我们发现,在一些旧的固件中,不仅ControlLogix CPU被终止,而且设备崩溃,需要重新启动硬盘。对于当前的型号,PLC必须拔下并重新插入才能再次运行。极少数情况下,PLC需要重新编程。

我们还是坚持一贯的建议,如果你想测试你的Ethernet/ip设备,请只对非生产设备执行这些测试,并确保你已经被授予对设备执行exploit的许可,因为在设备上执行这些测试的后果是不可测的。

免责声明:文章转载自《工控安全入门之Ethernet/IP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇关于向HashMap存放数据出现顺序混乱的问题PADS Layout VX.2.3 灌铜之后只显示灌铜外框,没有显示整块铜皮下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

2016.7.7 计算机网络复习要点第四章之网际协议IP

1.与IP协议配套使用的还有三个协议: **地址解析协议ARP; **网际控制报文协议ICMP; **网际组管理协议IGMP; 2.虚拟互连网络: **没有一种单一的网络能够适应所有用户的需求; **将网络互连起来要使用一些中间设备: (1)物理层使用的中间设备叫做转发器; (2)数据链路层使用的中间设备叫做网桥或者桥接器; (3)网络层使用的中间设备叫做...

使用wireshark抓包分析SOCKS5协议

目录 编写SOCKS5服务器运行代码(参考自Python编写socks5服务器) 使用SOCKS5服务器脚本和curl命令 分析抓取到的数据包理解SOCKS5协议的工作过程(感谢socks5代理服务器协议的说明让我预先知道SOCKS5协议数据消息传递的机理) 通信软件课选择了分析SOCKS5协议,想看一下这个协议在网络通信中是如何进行的,遂抓包...

分布式系统(二) --SOA 以及一些网络通信协议TCP/UDP SYN攻击

SOA(面向服务的架构):Service Oriented Architecture面向服务的架构。也就是把工程拆分成服务层、表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。这样做的好处就是,系统之间的调用很方便,A系统要用到B系统,直接调用B系统的服务层就可以了。 集群就是多...

JS解析XML文件和XML字符串

详细内容请点击 JS解析XML文件 复制代码<script type='text/javascript'>loadXML = function(xmlFile){var xmlDoc=null;//判断浏览器的类型//支持IE浏览器if(!window.DOMParser && window.ActiveXObject){var...

wireshark 抓包过滤器使用

wireshark 抓包过滤器 过滤器分为抓包过滤器和显示过滤器,抓包过滤器会将不满足过滤条件的包丢弃,只保留满足条件的包,而显示过滤器则是对已抓取的包做过滤,过滤出满足条件的包。 显示过滤器可以保留全部的报数据,方便后期做流量分析,而抓包过滤器保留的数据有限,后期分析有局限性。 一、抓包过滤器 wireshark抓包是基于其内部的libpcap/wi...

WireShark抓包分析(二)

简述:本文介绍了抓包数据含义,有TCP报文、Http报文、DNS报文。如有错误,欢迎指正。 1、TCP报文 TCP:(TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP 是面向连接的所以只能用于点对点的通讯)源IP地址:发送包的IP地址;目的IP地址:接收包的IP地址;源端口:源系统上的连接的端口;目的端口:目的系统上的连...