這一篇依然是協議層面的,協議層面會翻譯三篇,下一篇是電力系統中用的比較多的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是為了在以太網中使用CIP協議而進行的封裝。EtherNet/IP的CIP幀封裝了命令、數據點和消息等信息。CIP幀包括CIP設備配置文件層、應用層、表示層和會話層四層。數據包的其余部分是EtherNet/IP幀,CIP幀通過它們在以太網上傳輸。EtherNet/IP分組結構如圖5‑12所示。
CIP規范對數據包結構有很多的規定,這意味着每個使用EtherNet/IP的設備必須實現符合規范的命令。下面是EtherNet/IP首部中封裝的CIP幀字段:
-
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”命令。在執行腳本的。
同時,你可以使用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的許可,因為在設備上執行這些測試的后果是不可測的。