工控安全入門之Ethernet/IP

來源:互聯網
上載者:User

標籤:write   text   icon   世紀   strong   glib   toc   針對   培訓   

這一篇依然是協議層面的,協議層面會翻譯三篇,下一篇是電力系統中用的比較多的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的許可,因為在裝置上執行這些測試的後果是不可測的。

 

工控安全入門之Ethernet/IP

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.