在企業內(nèi)網環境中,ICMP協議是必不可(kě)少的網絡通信協議之一,被用於檢測網絡連通狀態,通常(cháng)情況下,防火牆會默認放此協議。由於防火牆對ICMP協議開放,惡意攻擊者常會利用ICMP協議進行非法通(tōng)信(xìn)。例(lì)如,在黑客攻擊中經常出現一種情況是,黑客通過某一種方(fāng)式取得了一台主機的權限(xiàn),得到了一些文件,比如域hash,密碼文件之類的東西,需要回傳至本地進行破解,但是防火牆(qiáng)阻斷了由內網發起的請求,隻(zhī)有icmp協議沒有被阻斷,而黑客又需要回傳文件,這個時候如果黑客可以ping通遠程(chéng)計算機,就可以嚐試建立ICMP隧(suì)道,ICMP隧道(dào)是將流量封裝進 ping 數據包中,旨在利用 ping數(shù)據穿透防火牆的檢(jiǎn)測。現在市麵上已經有了很多類似的工具了,比如 icmptunnel、ptunnel、icmpsh等(děng)。
本文將為大家介紹一種簡單而有效的icmp隧道檢測技術。我們將利用Spark Streaming,來幫助(zhù)我們檢(jiǎn)測ICMP隧道。
ICMP(Internet ControlMessages Protocol,網(wǎng)間控製報文協議)是(shì)TCP/IP協議族的子協議,是一種麵向無連(lián)接的協議。ICMP協議的結構,如圖1所示:
圖1
經常使用的ping命令就是基於ICMP協議,windows係統下ping默認傳輸的(de)是: abcdefghijklmnopqrstuvwabcdefghi,共(gòng)32bytes,如圖2所示:
圖2
linux係統下,ping默認傳輸(shū)的是48bytes,前8bytes隨時間變化,後麵的固定不變,內容(róng)為(wéi)!”#$%&’()+,-./01234567,如圖3所示:
圖3
此外,ping的包大小,也就是data大小是可(kě)以修改(gǎi)的,以(yǐ)windows為例(lì),使用ping baidu.com -l 223,修改為223bytes,從包體內容來(lái)看,規律還(hái)是一樣,就是重(chóng)複罷了,如圖4所示:
圖4
那能否改變這些(xiē)data填充我們自己的數據呢(ne)? 答案是當然可以(yǐ)!
這就是ICMP隱蔽隧道的原理,改(gǎi)變操作係統默認填充(chōng)的Data,替換成我們自己的數據。
比如使用icmp隧道(dào)可以構造一個包(bāo)含有www.facebook.com字符串的自定義data的包,如圖5所示:
圖5
windows係統下ping默認傳輸的是:abcdefghijklmnopqrstuvwabcdefghi,16進製內容為:
6162636465666768696a6b6c6d6e6f7071727374757677616263646566676869
linux係統下(xià)ping默認傳輸的內容,去掉開頭可變的8bytes後是:!”#$%&’()+,-./01234567,16進製內容為:
101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637
對自定義長度的ping,在linux下使用ping -s 500 baidu.com產生了492位(wèi)大小的data,去掉開頭可變的8bytes,16進製內容為:
101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3
windows下自定義長度的ping類似,16進製內容(róng)為:
6162636465666768696a6b6c6d6e6f70717273747576776162636465666768696a6b6c6d6e6f70717273747576776162636465666768696a6b6c6d6e6f707172737475
因此,正常(cháng)操作係統下通過ping產生的data,轉(zhuǎn)換為16進製後為從00開始不斷遞(dì)增然後一直到ff的重複序列中的一段或幾段。
000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
對於icmp隧道產生的自定義data數據包,轉換為(wéi)16進製後內容是亂序沒有規律的,比如構造一個內容為R5*êÍwwwfacebookcom字符串的自定義data的包,其16進製內容為:
4500003e377d400040119c2f0a0001020a0052019d800035002a1a14eacd01000001000000000000037777770866616365626f6f6b03636f6d0000010001
因此,可以根據ping產生的data數據包,轉換為16進製後的內容是否有規律來做區分。
在(zài)這裏使用AC自動機 字符串匹配方法進行特征匹配,具體做法為:
(1) 將正常操作係統產生的不斷重複序列,如下:
000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff
每4位切分成特征數(shù)組,生成的特征數組如下:
"0001", "0203","0405", ...... "feff"
對ping產生的data數據,如以下linux產生的data:
e7cd0a0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3
每4位(wèi)切分成特(tè)征(zhēng)數組,生(shēng)成的特征數組如下:
"e7cd", "0a00", ......, "1011","1213","1415",......, "feff"
(2) 使用ac自動(dòng)機算法,將(jiāng)生成的特征數組和正常(cháng)操作係統生成的特征數組進行(háng)匹配,將匹配到的特征的個數*4/payload長度作為匹配度,進行計算得到匹配(pèi)度0.987。
匹(pǐ)配(pèi)度(dù)算法:
匹配度 = 匹配到的特征的個數*4 / payload的長度
對於正常的ping數據產生的data,計算得到的匹配度結果都(dōu)在0.9以上(shàng),Icmp隧道產生的自定義data的數據包通常匹配度很低,可以根據(jù)匹配度來區分是否是正常操作係統產生的數據包。
對於正(zhèng)常的ping命令產生的數據,有以下特(tè)點:
每秒發送的數據包個數比較少,通常每(měi)秒最多隻會發送兩個數據包;
請求數據(jù)包與對應的響應數據包內容(róng)一(yī)樣(yàng);
數據包中payload的(de)大(dà)小固定,windows下為32bytes,linux下為48bytes;
數據包中payload的內容固定,windows下為abcdefghijklmnopqrstuvwabcdefghi,linux下為!”#$%&’()+,-./01234567,如果指定ping發(fā)送的長度,則為不斷重複(fù)的固定字符串;
type類型隻有(yǒu)2種,0和8。0為請求數據,8為響應數據。
對於ICMP隧道產生的數據,有(yǒu)以下特點:
每秒發送的數據包個數比較多,在同一時間會產生成百上千個 ICMP 數據包(bāo);
請求(qiú)數據包與對應的響應數據包(bāo)內容不一樣;
數據包中(zhōng) payload的大小可以是任意大小;
存在一些type為13/15/17的帶payload的畸形數據包;
個別ICMP隧道工具產生(shēng)的數據包內容前麵(miàn)會增加 ‘TUNL’ 標記以用於(yú)識別隧道。
因(yīn)此,根據正常ping和ICMP隧道產生(shēng)的數據包(bāo)的特點,可以通過以下幾點特(tè)征檢測ICMP隧道:
檢測同一來源數據包的數量。正常ping每秒隻會發(fā)送2個數據包,而ICMP隧道可以每秒發送很多(duō)個;
檢測數據包中 payload 的大小。正常ping產生的數據包(bāo)payload的大(dà)小為固(gù)定,而ICMP隧道數據包大(dà)小可以任意;
檢測響應數據包中(zhōng) payload 跟請求數據包是否不一致。正常ping產生的數據包請求響應內容(róng)一致,而ICMP隧道請求響應數(shù)據包可以一致,也可以不一(yī)致;
檢測數據包中 payload 的內容。正常ping產生的(de)payload為固定(dìng)字符串,ICMP隧道(dào)的payload可以為任意;
檢測 ICMP 數(shù)據(jù)包的type是否(fǒu)為0和8。正常ping產生的帶payload的數據包,type隻有0和8,ICMP隧道(dào)的type可以為13/15/17。
將基於統計的ICMP隧道檢測(cè)部署到生產環境中,需要考(kǎo)慮大數據規模對模型的時效性、吞吐量等性能指標的影響。經多方(fāng)考量(liàng),最終選用(yòng)Spark Streaming進行在(zài)線檢測。
Spark Streaming 是Spark核心API的一個擴展,可以實現高吞吐量、具備容(róng)錯機(jī)製的實時流數據處(chù)理。支持從多(duō)種數據源獲取數據,包括Kafka、Flume、Twitter、ZeroMQ、Kinesis 以(yǐ)及(jí)TCP sockets,從數(shù)據源獲取(qǔ)數據之(zhī)後,可以使用諸如map、reduce、join和window等高級函數進行複雜(zá)算法的處理(lǐ)。最後還可以將(jiāng)處理結果存儲到文件係統(tǒng),數據庫(kù)和現場(chǎng)儀表盤。在“One Stack rule them all”的基礎上,還可(kě)以使用Spark的其他子框架,如集群學習、圖計算等,對流(liú)數(shù)據進行處理(lǐ)。
整個過程主要分3個階段:
數據收集 => 匯總統計 => 檢出過濾,具體檢測邏(luó)輯,見圖6所示:
圖6
Spark Streaming中讀入實時流量數據(jù),設(shè)置15秒處理一次數據,根據數據包的源ip、目的ip大小排序拚接後進(jìn)行分組(zǔ),將同一個ip向目(mù)的ip發送的請求/響應數據包分到一個組中,分組字段time_sort_sip_dip 加上時間戳timestamp,為了(le)過濾掉上一(yī)次15秒內該源ip、目的ip之(zhī)間的數據包,保證每個15秒內隻處(chù)理(lǐ)當前15秒(miǎo)內的同一ip、目的ip的數據。
根據分組後的數據,分別統計以下特征指標,作為(wéi)最終(zhōng)是否檢出的依據:
1. 在一(yī)個(gè)時間窗內,ICMP請求響應的數據包數量;
2. 捕獲到的ICMP請求響應中,其payload部分是否是操作係統的正(zhèng)常長度;
3. 序號(hào)相同的ICMP數據包應當屬於一對(duì)ICMP請求響應消息,他們的payload是否一致;
4. ICMP請求響應(yīng)的payload內容是否正常(多模匹配);
5. ICMP請求是否是(shì)畸形Ping報文(Type是否異常);
對(duì)1/2/5直接使用統計組內的payload個數(shù)、payload_len長度值、是否有type不(bú)為0/8的數據包,直接得出。
對與3的判(pàn)斷,需要根據(jù)正常ping和異常數據的不(bú)同點,依(yī)據組(zǔ)內統計得到的id_seq集合和payload集合去重後,做(zuò)大小比較得出:
對於正常(cháng)ping,源ip向目的ip發送的一係列數據包中id_seq全(quán)部不一樣,其中identify為當(dāng)次請求隨機生成的序(xù)號不重複,同一批次identify一(yī)樣,seq是根據數據包個數,從1開始一次遞增1的數(shù)字,同一個請求和響(xiǎng)應(yīng)數據包的id_seq一樣,payload內容也一樣。例:ping baidu.com產生(shēng)了10個數(shù)據包,包括5次請求、5次響應,則id_seq去重後為5,payload去重(chóng)後win下為1,linux下為5。
對於Icmp隧(suì)道,源ip向目的ip發送的一係列數據(jù)包中id_seq,可(kě)以一樣(yàng),也可以不一樣。同一個請求和響應數(shù)據包的id_seq可以一樣,也可(kě)以不一樣,payload內容不一樣。例:隧道產生(shēng)了10個數據包,則(zé)id_seq去重(chóng)後為5(seq依次遞增(zēng))或1(seq固(gù)定(dìng)不遞(dì)增),payload去重後為10,極端情況(kuàng)下隻(zhī)有發送包,沒有響應包,則id_seq去重後為10。
可(kě)見不考慮一些極端情況,可以簡單通過 payloads_num > id_seq_num 即可認為請求響應內容(róng)不同,對(duì)與極(jí)端情況,可以根據別的條件進行(háng)檢(jiǎn)出。
對於4的判(pàn)斷,使用2.2中(zhōng)介紹的方(fāng)法進行判斷payload是否異(yì)常。
為(wéi)了減(jiǎn)少誤報,過濾掉一些正常的路由器發送的數據包,使用3種條(tiáo)件結合進行是否檢出判斷:
存在有非法type的payload且去重(chóng)後的payload的個數大於閾值(經內網測試,個別路由器會發送有畸形type的(de)payload內(nèi)容一樣的包,通過增加去重後(hòu)的payload的(de)個數大於閾(yù)值(zhí)來過濾);
請求響應數據包不一致;
15秒內的數據包個數、非正(zhèng)常長度數據包個數、異常(cháng)內容數據包個數、去重後的(de)payload的個數 大於自定義的閾值檢出(經內網測試(shì),個別路由(yóu)器隔幾個(gè)小時會發送有異常內(nèi)容的但是內容隻有幾個字(zì)符不一樣的payload心跳包,通(tōng)過增加去重(使(shǐ)用(yòng)漢明距(jù)離去重,差(chà)別不超過3個字符的認為一樣)後的payload的個數大於閾值來過濾)。
鑒於Icmp隧道特點的多樣性,隻要滿足3者之一,就(jiù)會檢出,對於一些極端異常的ICMP隧道產生(shēng)的包,比如隧道隻有請求(qiú)包沒有響應包即一直往外發數據,則id_seq去重後為10(10次全是請求(qiú)包,且seq遞增),payload去重後為10,無法單獨通過2檢出,但(dàn)是可以滿足3,一樣(yàng)會檢出,不會漏報。
目前測試過程中使(shǐ)用的已知負樣本有以下幾種:
icmpTunnel樣(yàng)本,使用icmpTunnel隧道工具(jù)造的樣本(běn);
icmptransmitter樣本,使用icmptransmitter隧(suì)道工具造的樣本;
icmpsh樣本,使用icmpsh隧(suì)道(dào)工具造的樣本;
badping樣本(běn),使用python腳本(běn)手動造的icmp的(de)異常數據(jù)包。
異常樣本(běn)檢測準確率如下:
目前測試過程中使用的(de)已知正樣本有(yǒu)以(yǐ)下幾種:
正常Ping數(shù)據(jù)包,Ping命令產生的數據包,平台包括linux/win/mac/solaris/androids/ioses,payload內容如下:abcdefg12345等。
網絡設備心跳包,路由器等網絡設備會(huì)定時發送的一些(xiē)心跳(tiào)包(bāo),payload內容如下:DataBuffer 0000001、DataBuffer 0000002等。
正常樣本誤報率如下,其中ioses平台偶爾有誤報:
本文介紹了基於統計的檢測ICMP隧道方法和落地實施中的一些技術細節。首先,基於(yú)統計的ICMP檢測重點是需要了解ICMP隧道(dào)的工作原理和一些特征指標,隻有較好的指標才能保證在真實環境中的檢出(chū)效果。其次,為了達到在線實時檢測,我們在文中介紹了結合Spark Streaming進行實時統(tǒng)計各種(zhǒng)指標,檢出超出閾(yù)值(zhí)的數據。最後,通過分別對正樣(yàng)本和負樣(yàng)本進行測試(shì),調整檢出閾值,提高(gāo)了檢測準確度。
作者(zhě):鬥象(xiàng)能(néng)力中心TCC-Chris