工控協議解析:DNP3協議簡單介紹及協議識別方法

0x1 簡介

DNP(Distributed Network Protocol,分散式網路規約)是一種應用於自動化組件之間的通訊協議,常見於電力、水處理等行業。SCADA可以使用DNP協議與主站、RTU、及IED進行通訊。

DNP協議標準由IEEE提出,參考了IEC 870-5、以及其他一些IEC協議。主要為了解決SCADA行業中,協議混雜、沒有公認標準的問題。

DNP協議有一定的可靠性,這種可靠性可以用來對抗惡劣環境中產生的電磁干擾、元件老化等信號失真現象,但不保證在黑客的攻擊下、或者惡意破壞控制系統的情況下的可靠性。

DNP協議提供了對數據的分片、重組、數據校驗、鏈路控制、優先順序等一些列的服務,在協議中大量使用了CRC校驗來保證數據的準確性。以下是一些DNP協議的特點:

• DNP3.0規約是一種分散式網路協議,適用於要求高度安全、中等速率和中等吞吐量的數據通信領域。

• DNP3.0規約以IEC870-5標準為基礎,該規約非常靈活,滿足目前和未來發展的要求,且與硬體結構無關。

• DNP3.0規約採用網路通信方式。

• DNP3.0規約支持點對點、一點多址、多點多址和對等的通信方式。

• DNP3.0規約支持問答式和自動上報數據傳輸方式。

• DNP3.0規約支持通信衝突碰撞避免/檢測方式,能保證數據傳輸的可靠性。

• DNP3.0規約支持傳送帶時標的量,尤其有利於配電自動化系統採集分時電度值和分析事故原因。

• 靈活採取適當的掃描方式,DNP3.0規約可以在一定程度上實現實時優先順序。

0x2 協議格式

DNP3.0規約的文本共分4部分:數據鏈路層規約,傳輸功能,應用層規約及數據對象庫。

0x2.1 數據鏈路層規約

數據鏈路層規約文件規定了DNP3.0版的數據鏈路層,鏈路規約數據單元(LPDU)以及數據鏈路服務和傳輸規程。

數據鏈路層採用一種可變幀長格式:FT3。

一個FT3的幀被定義為一個固定長度的報頭,隨之以可選用的數據塊。每個數據塊附有一個16位的CRC校驗碼。固定的報頭含有2個位元組的起始字,1個位元組的長度,1個位元組的控制字,1個16位的目的址,1個16位的源地址和1個16位的CRC校驗碼。

0x2.2 傳輸功能

這部分定義對於DNP數據鏈路層充當偽傳輸層的傳輸層功能。偽傳輸層功能專門設計用於在原方站和副方站之間傳送超出鏈路規約數據單元(LPDU)定義長度的信息。

0x2.2.1 傳輸層報頭數據塊

其中:傳輸層報頭——傳輸控制字,1個位元組;數據塊——用戶數據,1~249個位元組。

0x2.3 應用規約

這部分定義了應用層報文(APDU)的格式。這裡,主站被定義為發送請求報文的站,而外站則為從屬設備。被請求回送報文的RTU或智能終端(IEDs)是事先規定了的。在DNP內,只有被指定的主站能夠發送應用層的請求報文,而外站則只能發送應用層的響應報文。

0x2.3.1 應用報文格式

其中:請求(響應)報頭——標識報文的目的,包含應用規約控制信息(APCI);對象標題——標識后隨的數據對象;數據——在對象標題內的指定類型的數據對象。

0x2.3.2 應用報文報頭欄位的定義

請求報頭分應用控制、功能碼兩個欄位。每個欄位為8位的位元組;響應報頭分應用控制、功能碼、內部信號字3個欄位。每個欄位也為8位的位元組。

0x2.3.3 對象標題

報文的對象標題制定包含在報文中的數據對象或是被用來響應此報文的數據對象。

應用報文中,對象、限定詞、變程的靈活使用,可以表示多種數據類型和數據表示格式,滿足用戶的不同需要。這也是DNP3.0規約的一大優點。

註:以上摘自網路

0x3 DNP設備識別方法

DNP3可通過TCP/UDP進行封裝,以便在乙太網上運行,支持DNP3協議的從設備默認會開放TCP的20000埠用於通信。DNP3協議在設計之初依然是沒有考慮到安全、認證等的一些因素,以致後來出現了Secure DNP3(主要加強了認證)。在DNP3目前的應用、傳輸上個人的觀點還是要比MODBUS可靠,DNP3在主站會話上需要約定目的地址、源地址,而從設備收到后需要驗證目標地址,然後再進行處理,如果目的地址不相同則會根據在協議棧實現的處理上來決定是否不響應和關閉連接,或者返回異常功能報文等。想要精準識別運行在tcp的20000埠的服務是否為DNP3,可以使用DNP鏈路層協議(協議格式如下圖),

將其封裝成需要發送的識別報文,這樣便可以枚舉出想要通信設備的目的地址,又能準確判斷該埠運行有DNP3服務,並且報文構造相對簡單。

在協議的控制字方面可以使用協議中的9號功能碼請求鏈路狀態,相應的設備如果響應回復一般則會返回11,如下圖為控制字格式:

如下圖為功能碼取值:

需要注意的是正因為設備對非法連接(目的地址)請求的處理方式不一樣,在應用到實際的全網掃描中不可能全部嘗試到所有的地址(目的地址長2個位元組,範圍在0-65535),另外還需要實現協議的CRC的演算法。這樣從實現到掃描整體的代價都會比較大。

那麼我們可以看一下Shodan在DNP協議的識別這塊是如何做的,如下圖是在公網監聽了tcp/20000埠后收到的包。

我們可以看到Shodan在針對DNP3協議在公網掃描識別上,也還是採用了枚舉的方式,並且看似有些暴力,再根據下圖你會發現Shodan總共嘗試了101個地址,

故你會在Shodan檢索port:20000時發現設備的源地址(Source address/對應主站的目的地址)都沒有超過100。

那我們實現針對DNP的掃描插件時也可參照Shodan的做法,在組包時定義一段範圍的地址來進行批量探測,並且探測1-100的目的地址組包大小有1010個位元組,在批量掃描探測時還要受網路收發延時影響。所以Shodan目前能檢索到的數據也不足1000,現在看來貌似也沒有相對好的做法。

根據Shodan的套路這個掃描規則還是很好制定的,我們可以定義一個探測包,再定義判斷返回報文的長度、包頭部是否為DNP的協議頭0x05,0x64,然後解析源、目的地址、功能碼,非常簡單就能實現一個與Shodan一模一樣的針對DNP3協議掃描的基於NMAP的NSE插件。

0x4 調試及工具分享

如下工具可以快速幫你熟悉、調試、模擬、測試DNP3協議:

opendnp3

opendnp3是automatak開源的基於IEEE-1815 (DNP3)的開源協議棧。

Aegis™

Aegis™是automatak開源的一個針對工控協議進行模糊測試(Fuzz)的框架,其中包含對DNP3協議模糊測試的模塊,官方的Project Robus項目曾經發布過多個應用在DNP3協議健壯性上的漏洞,官方在發布MODBUS模塊后貌似沒有再繼續開源了。

Protocol Test Harness

Protocol Test Harness是Triangle MicroWorks公司開發的一款協議模擬、調試軟體,軟體可以模擬多種工控協議包括DNP3,可以方便你完成調試、模擬。

你可能會喜歡