趙自強,李 強,郭 濤
(1.安徽建筑大學 電子信息學院,安徽 合肥 230022;2.西南交通大學深圳研究院,陜西 西安 710000)
近年來,隨著網絡隱蔽信道構建技術的發展,網絡隱蔽信道因其隱蔽通信的特性在網絡信息傳輸安全方面越來越被重視。在網絡隱蔽信道構建的研究過程中,學者對很多協議都有研究,例如IP、TCP、UDP、HTTP等協議,但是還有一些協議,對其研究較少,這些協議仍然不可忽視,有著研究價值。開放式最短路徑優先(Open Shortest Path First,OSPF)是被廣泛使用的一種動態路由協議,也是一種鏈路狀態協議,具有路由變化收斂速度快、無路由環路、支持變長子網掩碼(VLSM)和匯總、層次區域劃分等優點,被廣泛運用在教育、金融、運營商、企業、醫療等行業。
在對OSPF協議應用的同時也不能忽略其中隱藏的網絡安全問題,本文通過對OSPF協議進行理論分析,研究OSPF協議的隱蔽信道構建方法,分析出Hello報文下的三個可行字段并構建三個隱蔽信道,將三個隱蔽信道組合在一起構成更高傳輸效率的隱蔽信道。本研究實現了在不影響路由器網絡正常通信的前提下使通信雙方進行隱蔽通信,并且為完善隱蔽信道的種類多樣性提供了一定的理論支持和技術支撐。
在隱蔽信道的發展過程中,文獻[1]將存儲型隱蔽信道構建技術分為7個模式:調制大小模式、序列模式、增加冗余模式、PDU錯誤/丟失模式、隨機值模式、值調制模式、保留/未使元素模式。文獻[2]使用序列模式提出通過將HTTP協議特殊關鍵字的參數進行排序對隱蔽信息進行編碼,從而構建隱蔽信道。這種方法的優點是不會在HTTP包頭插入額外的字符,只是通過原有的多個參數的不同排序來隱藏信息。文獻[3]使用隨機值模式將加密后的信息填充在TCP協議的ISN低16位,同時為了保證序列的隨機性,在高16位填充隨機序列,從而構建隱蔽信道。文獻[4]使用序列模式FTP服務器文件的目錄進行構建隱蔽信道,發送方通過FTP的CWD命令訪問不同的目錄,每一個目錄代表不同的隱蔽信息。由于CWD命令格式固定,接收方可以很方便地解析出每次CWD命令代表的隱蔽信息,從而實現隱蔽信道的構建。文獻[5]使用序列模式將待發送的隱蔽消息分組編碼至傳輸過程中數據幀的流編號所組成的序列信息中,采用基于組合數學的序列編碼方法,將隱蔽信息轉換為排列組合問題進行編碼處理從而構建隱蔽信道。文獻[6]使用增加冗余模式提出在IP報文的后面以太網幀的前面有空間可以寫入隱蔽信息,只需要設置IP報文的總長度小于真實數據的長度,多出來的長度就可以用于隱蔽信道。
在信道優化方面通常使用微協議來提供可靠性、動態路由、代理功能、同步連接、段管理、自動適應網絡配置等功能[7],從而提高網絡隱蔽信道在真實網絡環境下的適應性和靈活性。文獻[8]在ICMP協議“expected sequence number”字段插入2 bit的序列號字段實現了收發確認功能,用“1”表示成功接收數據,用“2”表示等待下一條數據,從而提高了隱蔽信道的可靠性。文獻[9]設計出SC-TL (同步通信和隱密傳輸協議)來解決IPv4和IPv6協議下兩種隱蔽信道之間同步的問題。文獻[10]設計了一種FH-NCC(跳頻網絡隱蔽信道協議)解決同步中信道選擇、超時、數據包組合等問題。文獻[11]實現了CFTP(隱藏數據傳輸協議),利用IP協議的“record route”選項實現類似FTP協議的文件隱蔽傳輸協議在網絡流量上的優化。由于短時間內向接收方發送大量攜帶隱蔽信息的數據包可能會出現網絡流量異常的情況,文獻[12-14]認為正常流量數據包的時間間隔分布通常服從泊松分布,通過模擬正常流量的時間間隔來發送數據包,可以提高隱蔽信道的隱蔽性。
OSPF報文主要有5種:Hello報文、數據庫描述(Database Description,DD)報文、鏈路狀態請求(LinkState Request,LSR)報文、鏈路狀態更新(LinkState Update,LSU)報文和鏈路狀態應答(LinkState Acknowledgment,LSAck)報文。它們各自在OSPF路由更新中所擔當的用途不一樣,報文格式也存在比較大的差別。其中Hello報文用來建立和維護相鄰鄰居路由器之間的鏈接關系,每個路由器會周期性地向相鄰路由器發送Hello 報文,檢測其是否可達。如果鄰站給予應答,說明鏈路正常,否則說明鏈路出現故障。因此Hello報文也是OSPF協議里使用最多的報文類型。
5種OSPF報文使用相同的OSPF報頭格式,因此在發送Hello報文的時候也可以考慮使用OSPF報頭來構建隱蔽信息。OSPF報頭結構如圖1所示。
圖1 OSPF報頭結構
Version:版本字段,占1個字節,指出所采用的OSPF協議版本號,目前最高版本為OSPF v4,即值為4。
Type:報文類型字段,標識對應報文的類型。OSPF有5種報文,分別是Hello報文、DD報文、LSR報文、LSU報文和LSAck報文。
Packet Length:包長度字段,占2個字節。它是指整個報文(包括OSPF報頭部分和后面各報文內容部分)的字節長度。
Router ID:路由器ID字段,占4個字節,指定發送報文的源路由器ID。
Area ID:區域ID字段,占4個字節,指定發送報文的路由器所對應的OSPF區域號。
Checksum:校驗和字段,占2個字節,是對整個報文(包括OSPF報頭和各報文具體內容,但不包括下面的Authentication字段)的校驗和,用于對端路由器校驗報文的完整性和正確性。
AuType:認證類型字段,占2個字節,指定所采用的認證類型,0為不認證,1為進行簡單認證,2為采用MD5方式認證。
Authentication:認證字段,占8個字節,具體值根據不同認證類型而定。認證類型為不認證時,此字段沒有數據,認證類型為簡單認證時,此字段為認證密碼,認證類型為MD5認證時,此字段為MD5摘要消息。
在以上字段中可用來構建隱蔽信道的字段有:
(1)Type字段。該字段有1~5五個參數,可以使用值調制的方法使得每個參數對應一個隱蔽信息,使每個數據包攜帶不同的參數來構建隱蔽信道。
(2)Packet Length字段。該字段為數據包的字節長度,可以使用調制大小模式來構建不同長度的數據包從而改變該字段的值,選擇其中幾種常見長度來對應不同的二進制從而可以構建隱蔽信道。
(3)Authentication字段。當AuType為1或者2時,Authentication里可存放隱蔽信息來代替密碼。在AuType為1時,此字段為認證密碼,由于密碼具有一定隨機性,可以通過異或加密處理隱蔽信息,增加隱蔽信息的隨機性,減少被檢測的風險。當AuType為2時,此字段為MD5摘要消息,可以對隱蔽信息進行MD5處理后再嵌入該字段。
上述3種可用于隱蔽信道構建的字段中,在理論分析上Authentication字段相比其他字段具有容量大、難以被發現的優點,更適合作為OSPF報頭中嵌入隱蔽信息的字段。
Hello報文的報頭緊跟在OSPF報頭后面,Hello報文的字段也可以用來構建隱蔽信息。Hello包的報文結構如圖2所示。
圖2 Hello包結構
Network Mask:發送Hello報文接口所在的子網掩碼。
Hello Interval:指定發送Hello報文的時間間隔,默認為10 s。
Options:可選項。包括E:允許泛洪AS-external-LAS;MC:允許轉發IP組皤報文;N/P:允許處理Type 7 LSA;DC:允許處理按需鏈路。
Rtr Pri:指定DR優先級,默認為1。如果設為0,則表示本路由器不參與DR/BDR選舉。
Router Dead Interval:指定路由器失效時間,默認為40 s。如果在此時間內沒有收到鄰居路由器發來的Hello報文,則認為該鄰居路由器已失效。
Designated Router:指定DR的接口IP地址。
Backup Designated Router:指定BDR的接口IP地址。
Neighbor:指定鄰居路由器的RID。下面的省略號表示可以指定多個鄰居路由器RID。
在以上字段中可用來構建隱蔽信道的字段有:
(1)Hello Interval和Router Dead Interval都可以通過設置不同的時間進行編碼來構建隱蔽信道,但是Hello Interval的值通常固定不變,相比Router Dead Interval更容易引起懷疑,因此Router Dead Interval更適合構建隱蔽信道。
(2)Neighbor可以指定多個鄰居路由器的RID,可以使用增加冗余模式增加不存在的鄰居RID來嵌入隱蔽信息,也可以使用序列模式將現有的鄰居RID進行排列來構建隱蔽信道。
在Hello包的隱蔽信道構建上也可以同時使用以上2個字段,增加隱蔽信道的容量。
使用微協議來判斷當前數據包中是否含有隱蔽信息,確定信息的開始、信息的結束和數據包的順序。微協議使用兩個字節,其中Flag字段表示當前是否為隱蔽信道;Password字段用來傳遞本次隱蔽信息的密鑰;Seq字段表示當前數據包為本次消息的第幾個數據包,當Seq為0時表示隱蔽信息開始發送,當Seq為255時表示信息發送結束,若信息長度大于255則自動分段成下一條信息重新從0開始計數。微協議結構如圖3所示。
圖3 微協議結構
在隱蔽信道構建方法的選擇上:
(1)將AuType設置為1,從而使用OSPF協議頭的Authentication字段嵌入隱蔽信息來構建隱蔽信道。本文代稱信道A。
(2)使用調試模式對Router Dead Interval的值進行調制從而構建隱蔽信道。本文代稱信道B。
(3)使用序列模式對Neighbor ID進行全排列來構建隱蔽信道。本文代稱信道C。
完整的發送端流程如下:
(1)將Flag字段置為全1,生成4位的隨機密碼放入Password字段,把當前數據包的序列放入Seq字段組成微協議。
(2)使用隨機密碼對隱蔽信息進行加密。
(3)取一部分隱蔽信息采用信道A的構建方法和微協議組合嵌入Authentication字段。
(4)取一部分隱蔽信息構建信道B。
(5)取一部分隱蔽信息構建信道C和信道B一起組成完整的Hello包報頭。
(6)將Hello包報頭和OSPF報頭組裝成完整的數據包。
(7)數據包發送。
完整的接收端流程如下:
(1)捕獲數據包。
(2)判斷AuType字段是否為1,不為1正常處理。
(3)提取Authentication字段的前兩個字節,解析隱蔽信道微協議。判斷Flag字段是否全1,不為全1正常處理。
(4)提取Password和Seq。
(5)對Authentication字段的后面隱蔽信息進行解密,提出信道A的隱蔽信息。
(6)解析出信道B的隱蔽信息并解密。
(7)解析出信道C的隱蔽信息并解密。
(8)根據Seq字段將所有隱蔽信息組合成完整的信息。
隱蔽信道的實現需要實現以下幾個模塊:微協議的編解碼,信道A、信道B、信道C的編解碼,具體實現過程如下。
(1) 微協議編碼實現
① 定義微協議結構體
Struct Microprotocol
{
uint8_t:4 pwd;
//密鑰
uint8_t:4 flag;
//是否為隱蔽信道
uint8_t seq;
//當前包序號
}
② 隨機數生成密鑰:key= rand() % 255;
③ 序號增加:seq++;
(2)微協議解碼實現
① 取出Authentication字段的前兩個字節。提取Flag字段,根據Flag字段判斷是否為隱蔽信息。
② 如果是隱蔽信道,則提取Password和Seq字段備用。
(3)信道A編碼實現
① 取6個字節的隱蔽信息。
② 對隱蔽信息的每個字節都與密鑰進行異或加密:data = data ^ key;
③ 將微協議和加密后的隱蔽信息組合在一起,放入Authentication字段:
memcpy(&hdr_packet.authentication,cdata.data(),sizeof (hdr_packet.authentication));
(4)信道A解碼實現
① 取出Authentication的后6個字節。
② 使用密鑰進行解密。
(5)信道B編碼實現
① 在值調制的選擇上,選擇{30,40,50,60}四個值進行調制。
② 建立值與二進制對應的map。四個值最多可以對應2 bit的二進制,對應關系如表1所示。
表1 信道B二進制對應表
③ 取加密后的隱蔽信息,將隱蔽信息對應的值填充到Router Dead Interval字段。
(6)信道B解碼實現
① 根據表1的對應關系,得到加密后的二進制。
② 根據密鑰解密出真實的隱蔽信息。
(7)信道C編碼實現
① 信道C使用序列模式,通過改變所攜帶的鄰居ID來構建隱蔽信道,因此先從鄰居表里選出要使用的鄰居ID,這里的鄰居表為{2.2.2.2,3.3.3.3,4.4.4.4,5.5.5.5,6.6.6.6};
② 對鄰居ID進行全排列,可以得到120種排序,取出其中64個組合可以對應二進制為6 bit。生成二進制對應表的簡略信息如表2所示。表2用下標1來代替鄰居ID“2.2.2.2”,以此類推。
表2 信道C二進制對應表
③ 因為信道B的容量為2 bit,與信道C剛好組成1字節的容量,取出信道B剩余的6 bit,根據表2的對應關系,改變鄰居表的排序。
④ 與信道B一起組合成完整的Hello報文。
(8)信道C解碼實現
① 讀取出Hello報文攜帶的所有鄰居ID。
② 根據鄰居ID的順序和表2的對應關系得出加密后的6 bit隱蔽信息。
③ 與信道B解碼出的2 bit隱蔽信息組成一個字節。
④ 根據密鑰解密出原始的隱蔽信息。
隱蔽信道實現總流程如圖4所示。
圖4 隱蔽信道實現總流程
為驗證信道的可用性,使用winshark抓包軟件對偽造的OSPF的Hello報文進行抓包。為方便展示,抓包時的數據包不進行數據加密。發送數據為“hello word”。在第一次發包時信道A發送的6個字節分別是“h”“e”“l”“l”“o”“ ”,信道A抓包截圖如圖5所示。
圖5 信道A部分抓包截圖
根據圖5可以看出,Authentication字段總共8個字節,前2個字節為微協議,后6個字節在沒有加密的情況下可以清楚看到“hello ”,根據抓包分析可知隱蔽信道A構建正確。
信道B和信道C加起來為1個字節,發送內容為“w”。抓包截圖如圖6所示。
圖6 信道B和信道C部分抓包截圖
根據圖6可以看出Router Dead Interval字段為40,由表1可知40對應的二進制為01,由表2可以得知鄰居ID順序對應的二進制為110111,從而組成完整的一個字節“01110111”,根據ASCII碼得知對應的英文字母為“w”,抓包分析可知隱蔽信道B和隱蔽信道C構建正確。
信道的傳輸速率也叫傳輸容量,一般指單個數據包能攜帶的隱蔽信息的比特數,或是在單位時間內通過信道傳輸的比特數,前者為理論值,后者為實際值,受到硬件性能等因素影響。
下面計算單個數據包能攜帶的隱蔽信息的比特數,本文隱蔽信道的容量為三個隱蔽信道的容量之和。
(1)信道A的容量是固定的每包攜帶48 bit。
(2)信道B使用的是值調制模式,根據調制的不同值可以增加攜帶的容量,如果有n個值可以用來調制,那么信道B的容量為每包log2nbit,以實驗的4個值為例,容量為每包2 bit。
(3)信道C使用序列模式,根據選擇排序的個數可以改變信道的容量,假設可排序數量為n,則全排列之后有n!種排序可能,n!種排序的可能對應的二進制數量k=log2n!,再對k進行向下取整得到信道的容量。以實驗的可排序個數為5舉例,全排列的可能為5!=120種,可對應的二進制位數為6 bit,即在可排序個數為5的前提下信道容量為每包6 bit。
可以得出此時信道單個數據包的總容量為48+log2n1+log2n2!bit。
在計算單位時間內通過信道傳輸的比特數時,需要考慮λ、n1和n2的值。其中λ為期望數據包發送的時間間隔,n1為信道B的參數,n2為信道C的參數。在這三個參數中λ對傳輸速率的影響最大,n2受限于網絡環境中真實存在的路由器個數,不能隨便調整。
評估參數λ和n2對信道容量的影響,步驟如下:
(1)將n1設為常量4,動態調整λ和n2的值;
(2)傳輸1 KB的文本數據5次,統計平均傳輸時間;
(3)根據平均傳輸時間計算傳輸速率。
實驗結果如表3所示。
表3 隱蔽信道傳輸速率(bit/s)
在實際測試隱蔽信道的傳輸速率時,由于將隱蔽信息封裝到數據包需要時間,隱蔽信道的容量略小于理論值。
本文構建的隱蔽信道容量為三個字段之和,作為對比,文獻[3]構建的隱蔽信道容量為16 bit/包,文獻[12]構建的隱蔽信道容量平均為2.67 bit/包,可知本文構建的隱蔽信道傳輸速率大于一般的隱蔽信道。
隱蔽性作為隱蔽信道的基本要求,主要是指隱蔽信道不被發現的能力。為了驗證信道的隱蔽性,通過 Snort 入侵檢測系統、火絨安全軟件、360 安全衛士等安全防護軟件對信道的隱蔽性進行測試,結果如表4所示。
表4 隱蔽性測試結果
從測試結果來看,隱蔽信息在傳遞的過程中,Snort 入侵檢測系統等安全防護軟件均未發生報警攔截,說明在常用的殺毒軟件環境里,信道具有較好的隱蔽性。
本文針對OSPF協議下Hello報文中的多個字段來構建隱蔽信道,通過協同多個字段來大幅度增加單個數據包隱蔽信道的容量,相對于其他隱蔽信道有著更高的傳輸速率。但本研究仍有很多不足之處,一方面對隱蔽信道的構建仍有優化的空間,OSPF本身也未有類似TCP的重傳機制,可以使用糾錯碼來減少網絡環境對信道的影響;另一方面,OSPF本身有多種報文包,可以研究不同報文下的隱蔽信道,通過多種隱蔽信道之間的協同來增加信道的容量或者隱蔽性,在某一種報文下的隱蔽信道存在被檢測的風險后仍可以切換其他報文下的隱蔽信道來繼續傳輸消息。