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