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