DNP3協議簡單介紹及協議識別方法


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_link
將其封裝成需要發送的識別報文,這樣便可以枚舉出想要通信設備的目的地址,又能准確判斷該端口運行有DNP3服務,並且報文構造相對簡單。
在協議的控制字方面可以使用協議中的9號功能碼請求鏈路狀態,相應的設備如果響應回復一般則會返回11,如下圖為控制字格式:
dnp3_control_code
如下圖為功能碼取值:
dnp3_control_function_code

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

那么我們可以看一下Shodan在DNP協議的識別這塊是如何做的,如下圖是在公網監聽了tcp/20000端口后收到的包。
shodan_dnp3_1
我們可以看到Shodan在針對DNP3協議在公網掃描識別上,也還是采用了枚舉的方式,並且看似有些暴力,再根據下圖你會發現Shodan總共嘗試了101個地址,
shodan_dnp3_enumerate
故你會在Shodan檢索port:20000時發現設備的源地址(Source address/對應主站的目的地址)都沒有超過100。

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

根據Shodan的套路這個掃描規則還是很好制定的,我們可以定義一個探測包,再定義判斷返回報文的長度、包頭部是否為DNP的協議頭0x05,0x64,然后解析源、目的地址、功能碼。

非常簡單就能實現一個與Shodan一模一樣的針對DNP3協議掃描的基於NMAP的NSE插件。

dnp3-enumerate

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,可以方便你完成調試、仿真。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM