工控安全入門之Ethernet/IP

這一篇依然是協議層面的,協議層面會翻譯三篇,下一篇是電力系統中用的比較多的DNP3。這一篇中大部分引用的資料均可以訪問到,只有一篇reversemode.com上的writeup(http://reversemode.com/downloads/logix_report_basecamp.pdf)須要身份認證才能下載,若是有朋友能下載求分享。git

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是爲了在以太網中使用CIP協議而進行的封裝。EtherNet/IP的CIP幀封裝了命令、數據點和消息等信息。CIP幀包括CIP設備配置文件層、應用層、表示層和會話層四層。數據包的其他部分是EtherNet/IP幀,CIP幀經過它們在以太網上傳輸。EtherNet/IP分組結構如圖5‑12所示。github

CIP規範對數據包結構有不少的規定,這意味着每一個使用EtherNet/IP的設備必須實現符合規範的命令。下面是EtherNet/IP首部中封裝的CIP幀字段:編程

 

  • Commandapi

    兩字節整數,對應一個CIP命令。CPI標準要求,設備必須能接收沒法識別的命令字段,並處理這種異常。安全

  • Length

    兩字節整數,表明數據包中數據部分的長度。對於沒有數據部分的請求報文,該字段爲0。服務器

  • Session Handle

    會話句柄(session handle)由目標設備生成,並返回給會話的發起者。該句柄將用於後續與目標設備的通訊。網絡

  • Status

    Status字段存儲了目標設備執行命令返回的狀態碼。狀態碼「0」表明命令執行成功。全部的請求報文中,狀態碼被置爲「0」。其它的狀態碼還包括:session

- 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」命令。在執行腳本的。

 

同時,你可使用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設備以後。

經過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經常是一個強大而好用的資源。

使用像「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的許可,由於在設備上執行這些測試的後果是不可測的。

相關文章
相關標籤/搜索