工控安全EthernetIP協議分析

2019-11-07 89609人圍觀 ,發現 2 個不明物體 工控安全

前言

Ethernet/IP協議是由控制網國際有限公司(ControlNet International)的技術工作組聯合ODVA(Open DeviceNet Vendor Association)于二十世紀九十年代構建的,相較于Modbus協議它是一個很年輕的協議,制定這個協議的原因是在二十世紀九十年代隨著現場總線控制技術的成熟,PLC等智能設備更多的也更方便的接入,現場總線控制技術(FCS)就應運而生了,但是在當時的技術條件下,商業以太網有著較高的延遲性,商業以太網在工業應用中傳輸延滯在2~30ms之間,這是影響以太網進入工業領域的重要原因,從而開始了對工業以太網的研究。時至今日,隨著技術的發展工業以太網已經成功的應用到工業的生產當中,但是也出現了多種現場總線標準,現場總線國際標準IEC 61158承認的現在有10種類型總線的國際標準,其中就有著Modbus-IDA、Ethernet-IP等,本次我們就來介紹一下Ethernet/IP協議。

Ethernet/IP協議簡介

上文中我們也提到過Ethernet/IP協議是由ControlNet International和ODVA兩個組織推出的,所以它和DeviceNet和ControlNet一樣是基于CIP(Common Industrial Protocol通用工業協議)作為應用層協議基礎上開發的,這是一種面向對象的協議,可以提供一系列標準服務,包括通過隱式和顯示的方式對網絡設備進行控制,后文我們再對CIP進行詳細介紹。回到正題,Ethernet/IP協議的流行是因為主要的自動化系統制造商Rockwell公司和Allen-Bradley公司圍繞Ethernet/IP協議對設備進行了標準化,此后如Omron等公司也對設備添加了支持,自此Ethernet/IP協議開始流行(主要在美國)。

Ethernet/IP數據包的組成結構可以分成兩部分,CIP協議部分和Ethernet/IP協議部分

Ethernet/IP數據包結構

我們從CIP開始講起,Ethernet/IP協議中的CIP幀包括了命令、數據點和報文信息,CIP幀主要包括CIP設備概要信息層、應用層、表示層和會話層,這里多提幾句,CIP數據包在通過以太網發送前必須要經過封裝,而且要根據請求的不同給不同的報頭,報頭體現了數據的重要性,CIP數據包在以太網中傳輸的時候具有特殊以太網報頭(IP頭、TCP頭和封裝頭)這種方式使得CIP數據包通過TCP或UDP傳輸并能夠由接收方解包但是對比于DeviceNet和ControlNet協議,這種方法使得協議效率降低,報文頭長度可能比數據還要長,占用網絡負擔增大,所以Ethernet/IP更適合傳輸大的數據包。

這里我們先對上圖中的一些名詞做一下解釋,設備概要信息就不多說了,就是對象結構和行為的一個完整的說明,通過這個來實現設備的互操作性和互換性。主要來看一下這個CIP應用層對象庫,在CIP協議里定義了大量的對象**,一共定義了一系列46個對象,但之前提到的三個協議都存在部分不通用的對象,其中Ethernet/IP協議由一個,ControlNet有三個,DeviceNet有一個,CIP對象類可以分為三類,這種專有的叫做網絡特定對象,第二種是通用對象比如標識對象、報文路由對象都屬于這一類,最后一種是應用特定對象如寄存器對象。之后的CIP數據管理服務顯示報文、I/O報文(隱式報文)和后面的CIP報文路由管理可以合成報文協議和數據管理來講,報文協議就是在CIP和應用間連接建立后發送節點和接受節點通過雙方的連接標識符對連接和報文進行確認。而數據管理是對對象的數據結構和編址類型進行定義。最后我們再區分一下顯示報文和隱式報文

顯示報文:用于在傳輸時不追求實時性,對時間要求不嚴格內容,比如程序的上傳下載,設備配置信息等。

隱式報文:傳輸I/O數據。

Ethernet/IP協議

首先我們來看一下CIP協議封裝數據包的結構

那我們就從頭來看,

命令:兩字節整數,要求與通用工業協議規范中某條特定指令相關,在CIP協議中,即使設備不認識這個命令是什么也必須接收,而且異常處理時必須確保連接不中斷,這種設計很好的保證了協議的穩定性,降低了中斷連接的風險。CIP協議本身有著實時性、確定性、可重復性、可靠性等特點。

長度:兩字節整數,表示數據部分長度,不存在則為0,比如說請求數據包就不存在數據部分

會話句柄:由目標設備生成,返回至會話發起方,作為一種憑證,證明你可以和我進行對話,這個憑證在接下來的對話里還會用到。

狀態碼:反應了接收方對設備發送的命令的執行能力,0為成功執行,在請求數據包中永遠為0,下面列出其他幾種狀態碼。

0×0001無效或不支持的命令(這種命令異常處理時不中斷運行)

0×0002接收方處理命令資源不足(這里我沒找到相關資料描述,但根據CIP協議高穩定性原則推測應該會進行不中斷運行等待資源足的時候進行執行)

0×0003數據格式不正確或數據不正確

0×0065接收到無效數據長度

最大延遲:由于工業以太網對實時性要求高,這里的內容是這個包經歷的最大延遲。

發送方上下文:命令發送方會生成六個字節的值,接收方要原封不動的發回去,這個內容可以理解為回復的一種編號,發送方知道接收方收到了對應編號的報文,回復的是對相應報文的回復。

選項:始終為0,不為0的話包會被拋棄。

命令相關數據:這就和我們接受和發送的命令和自身情況有關了。

Ethernet/IP協議分析

這一部分我并沒有找到源碼,但是找到了一份用python3實現的模仿版本,就這份代碼簡單分析一Ethernet/IP的工作流程,下面進行重要部分的介紹。

先看一下初始變量。

首先出現的就是目標ip和端口,可以看到默認的設置中目的ip是空目的端口是44818,這就解釋了為什么Ethernet/IP協議一般運行在44818端口上,接著往下看,會話句柄session_handle,因為這個是在會話發生后目標設備生成,所以初始為空,后面是保持會話時間60s。第二部分就我們知道的來推斷應該是最大延遲部分,設置兩個列猜測是用來進行出入,上面內容是數據流和數據報。再看第三部分,分別設立ignoring_sender_context和internal_sender_context來進行上下文處理,下面開辟緩存區來用于接收數據。最后一部分是存在目標端口時候進行下一步。

這一部分就是將目標ip進行連接,不行就報錯。行就執行start函數。下面還有一部分是端口是2222情況下的處理,基本相似就不提了。

我們再來看一下連接管理

可以看到這一部分主要是控制連接時間和延遲,如果在連接狀態就開始發送內容,所有來自TCP流的數據的內容都將被封裝,然后封包發送到隊列里進行等待,在連接時如果沒完成將會延遲關閉時間好讓內容可以完成傳輸。下面看看發包。

簡單來介紹,這一部分就是對所有處理完內容的一個整合,按照順序將內容以協議規定的形式進行組合,填裝報頭,命令碼會話句柄和數據內容然后進行發送。還有一些注冊會話部分我們就不分析了,其中的內容只是根據是否為有會話句柄的來將內容加入包中。

簡單的總結一下,ENIP協議的工作流程就是先對目標進行判斷,然后開啟連接,生成包所需數據組合起來然后再將包發送出去。

Ethernet/IP數據包分析

下面我們來看看實際的數據包內容。

我們直接來看封裝頭的內容

Command:命令,list identify表示檢測到Ethernet/IP列表身份的命令。

Length:長度為0,因為這個是一個請求包,沒有數據長度。

Session Handle:記住這里為0,后續的返回包我們看看是不是一樣的。

Status: Success(0×00000000)和我們之前看到的一樣。

Max Response Delay:0,很好,這個包發送是實時的。

Sender Context:0000c1debed1,正好6個字節的內容,等看看是不是一樣的。

Options:0,上文也提到過這里為始終為0。

再來看看這個包的返回包。

由于內容都差不多,我們就看幾個點就好了。

Length:長度不是0了,因為后面有了數據內容。

Session Handle:還是0,和請求包是一樣的。

Sender Context:和請求包一樣,證明是對應的返回包。

Command Specific Data:數據內容,這部分不需要細看了,里面是一些設備信息,這些在工控滲透時可能會用到。

Ethernet/IP協議的常見攻擊方法

在文章最開始的時候我們提到過,Ethernet/IP協議是一個現代化程度很高的協議,但是現代化程度再高也會有安全隱患,Ethernet/IP協議一般運行在44818端口上,還有2222端口來傳送顯式報文和隱式報文,可以通過這兩個端口對相關設備進行掃描。

這里簡單介紹一下常見的攻擊方式

Ethernet/IP協議設備信息竊取

通過使用腳本進行掃描,再將掃描結果和nmap得到的內容進行對比,可以判斷出設備是否在防火墻內,之后就可以使用內置的命令進行會話句柄的構造,進行下一步的攻擊。

Ethernet/IP協議中間人攻擊

這一部分不細說了,中間人攻擊大家應該多少有些了解,在上面已經構建了會話句柄,可以直接更改序列號就行了。

Ethernet/IP協議終止CPU攻擊

Modbus協議有一個90功能碼可以終止CPU運行,Ethernet/IP協議中也可以通過軟件實現相同效果,通過使用相關軟件可以達到同樣的效果,甚至可以達到令以太網卡崩潰的效果。

總結

我知道的內容大概就是這些,如果文中有什么不對的地方希望能告訴我一下,大家一起學習。QQ:434483362

*本文原創作者:zhangshuo,本文屬于FreeBuf原創獎勵計劃,未經許可禁止轉載

相關推薦
發表評論

已有 2 條評論

取消
Loading...

這家伙太懶,還未填寫個人描述!

1 文章數 0 評論數 0 關注者

特別推薦

活動預告

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 什么app能玩二人麻将