基于統計分析的ICMP隧道檢測方法與實現

2019-05-06 767076人圍觀 ,發現 12 個不明物體 網絡安全

*本文中涉及到的相關漏洞已報送廠商并得到修復,本文僅限技術研究與討論,嚴禁用于非法用途,否則產生的一切后果自行承擔。

一、概述

在企業內網環境中,ICMP協議是必不可少的網絡通信協議之一,被用于檢測網絡連通狀態,通常情況下,防火墻會默認放此協議。由于防火墻對ICMP協議開放,惡意攻擊者常會利用ICMP協議進行非法通信。例如,在黑客攻擊中經常出現一種情況是,黑客通過某一種方式取得了一臺主機的權限,得到了一些文件,比如域hash,密碼文件之類的東西,需要回傳至本地進行破解,但是防火墻阻斷了由內網發起的請求,只有icmp協議沒有被阻斷,而黑客又需要回傳文件,這個時候如果黑客可以ping通遠程計算機,就可以嘗試建立ICMP隧道,ICMP隧道是將流量封裝進 ping 數據包中,旨在利用 ping數據穿透防火墻的檢測。現在市面上已經有了很多類似的工具了,比如 icmptunnel、ptunnel、icmpsh等。

本文將為大家介紹一種簡單而有效的icmp隧道檢測技術。我們將利用Spark Streaming,來幫助我們檢測ICMP隧道。

二、ICMP隧道

2.1 工作機理

ICMP(Internet ControlMessages Protocol,網間控制報文協議)是TCP/IP協議族的子協議,是一種面向無連接的協議。ICMP協議的結構,如圖1所示:

圖片名稱

圖1

經常使用的ping命令就是基于ICMP協議,windows系統下ping默認傳輸的是: abcdefghijklmnopqrstuvwabcdefghi,共32bytes,如圖2所示:

圖片名稱

圖2

linux系統下,ping默認傳輸的是48bytes,前8bytes隨時間變化,后面的固定不變,內容為!”#$%&’()+,-./01234567,如圖3所示:

圖片名稱

圖3

此外,ping的包大小,也就是data大小是可以修改的,以windows為例,使用ping baidu.com -l 223,修改為223bytes,從包體內容來看,規律還是一樣,就是重復罷了,如圖4所示:

圖片名稱

圖4

那能否改變這些data填充我們自己的數據呢? 答案是當然可以!
這就是ICMP隱蔽隧道的原理,改變操作系統默認填充的Data,替換成我們自己的數據。
比如使用icmp隧道可以構造一個包含有www.facebook.com字符串的自定義data的包,如圖5所示:

圖片名稱

圖5

2.2 ICMP隧道數據包檢測

windows系統下ping默認傳輸的是:abcdefghijklmnopqrstuvwabcdefghi,16進制內容為:

6162636465666768696a6b6c6d6e6f7071727374757677616263646566676869

linux系統下ping默認傳輸的內容,去掉開頭可變的8bytes后是:!”#$%&’()+,-./01234567,16進制內容為:

101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637

對自定義長度的ping,在linux下使用ping -s 500 baidu.com產生了492位大小的data,去掉開頭可變的8bytes,16進制內容為:

101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3

windows下自定義長度的ping類似,16進制內容為:

6162636465666768696a6b6c6d6e6f70717273747576776162636465666768696a6b6c6d6e6f70717273747576776162636465666768696a6b6c6d6e6f707172737475

因此,正常操作系統下通過ping產生的data,轉換為16進制后為從00開始不斷遞增然后一直到ff的重復序列中的一段或幾段。

000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff

對于icmp隧道產生的自定義data數據包,轉換為16進制后內容是亂序沒有規律的,比如構造一個內容為R5*êíwwwfacebookcom字符串的自定義data的包,其16進制內容為:

4500003e377d400040119c2f0a0001020a0052019d800035002a1a14eacd01000001000000000000037777770866616365626f6f6b03636f6d0000010001

因此,可以根據ping產生的data數據包,轉換為16進制后的內容是否有規律來做區分。

在這里使用AC自動機 字符串匹配方法進行特征匹配,具體做法為:

(1) 將正常操作系統產生的不斷重復序列,如下:

000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff

每4位切分成特征數組,生成的特征數組如下:

"0001", "0203","0405", ...... "feff"

對ping產生的data數據,如以下linux產生的data:

e7cd0a0000000000101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3

每4位切分成特征數組,生成的特征數組如下:

"e7cd", "0a00", ......, "1011","1213","1415",......, "feff"

(2) 使用ac自動機算法,將生成的特征數組和正常操作系統生成的特征數組進行匹配,將匹配到的特征的個數*4/payload長度作為匹配度,進行計算得到匹配度0.987。

匹配度算法:

匹配度 = 匹配到的特征的個數*4 / payload的長度

對于正常的ping數據產生的data,計算得到的匹配度結果都在0.9以上,Icmp隧道產生的自定義data的數據包通常匹配度很低,可以根據匹配度來區分是否是正常操作系統產生的數據包。

三、基于統計分析的ICMP隧道檢測

對于正常的ping命令產生的數據,有以下特點:

每秒發送的數據包個數比較少,通常每秒最多只會發送兩個數據包;

請求數據包與對應的響應數據包內容一樣;

數據包中payload的大小固定,windows下為32bytes,linux下為48bytes;

數據包中payload的內容固定,windows下為abcdefghijklmnopqrstuvwabcdefghi,linux下為!”#$%&’()+,-./01234567,如果指定ping發送的長度,則為不斷重復的固定字符串;

type類型只有2種,0和8。0為請求數據,8為響應數據。

對于ICMP隧道產生的數據,有以下特點:

每秒發送的數據包個數比較多,在同一時間會產生成百上千個 ICMP 數據包;

請求數據包與對應的響應數據包內容不一樣;

數據包中 payload的大小可以是任意大小;

存在一些type為13/15/17的帶payload的畸形數據包;

個別ICMP隧道工具產生的數據包內容前面會增加 ‘TUNL’ 標記以用于識別隧道。

因此,根據正常ping和ICMP隧道產生的數據包的特點,可以通過以下幾點特征檢測ICMP隧道:

檢測同一來源數據包的數量。正常ping每秒只會發送2個數據包,而ICMP隧道可以每秒發送很多個;

檢測數據包中 payload 的大小。正常ping產生的數據包payload的大小為固定,而ICMP隧道數據包大小可以任意;

檢測響應數據包中 payload 跟請求數據包是否不一致。正常ping產生的數據包請求響應內容一致,而ICMP隧道請求響應數據包可以一致,也可以不一致;

檢測數據包中 payload 的內容。正常ping產生的payload為固定字符串,ICMP隧道的payload可以為任意;

檢測 ICMP 數據包的type是否為0和8。正常ping產生的帶payload的數據包,type只有0和8,ICMP隧道的type可以為13/15/17。

四、具體實施

4.1 技術選型

將基于統計的ICMP隧道檢測部署到生產環境中,需要考慮大數據規模對模型的時效性、吞吐量等性能指標的影響。經多方考量,最終選用Spark Streaming進行在線檢測。

Spark Streaming 是Spark核心API的一個擴展,可以實現高吞吐量、具備容錯機制的實時流數據處理。支持從多種數據源獲取數據,包括Kafka、Flume、Twitter、ZeroMQ、Kinesis 以及TCP sockets,從數據源獲取數據之后,可以使用諸如map、reduce、join和window等高級函數進行復雜算法的處理。最后還可以將處理結果存儲到文件系統,數據庫和現場儀表盤。在“One Stack rule them all”的基礎上,還可以使用Spark的其他子框架,如集群學習、圖計算等,對流數據進行處理。

4.2 檢測流程

整個過程主要分3個階段:

數據收集 => 匯總統計 => 檢出過濾,具體檢測邏輯,見圖6所示:

圖片名稱

圖6

4.2.1 數據收集

Spark Streaming中讀入實時流量數據,設置15秒處理一次數據,根據數據包的源ip、目的ip大小排序拼接后進行分組,將同一個ip向目的ip發送的請求/響應數據包分到一個組中,分組字段time_sort_sip_dip 加上時間戳timestamp,為了過濾掉上一次15秒內該源ip、目的ip之間的數據包,保證每個15秒內只處理當前15秒內的同一ip、目的ip的數據。

4.2.2 匯總統計

根據分組后的數據,分別統計以下特征指標,作為最終是否檢出的依據:

1. 在一個時間窗內,ICMP請求響應的數據包數量;

2. 捕獲到的ICMP請求響應中,其payload部分是否是操作系統的正常長度;

3. 序號相同的ICMP數據包應當屬于一對ICMP請求響應消息,他們的payload是否一致;

4. ICMP請求響應的payload內容是否正常(多模匹配);

5. ICMP請求是否是畸形Ping報文(Type是否異常);

對1/2/5直接使用統計組內的payload個數、payload_len長度值、是否有type不為0/8的數據包,直接得出。

對與3的判斷,需要根據正常ping和異常數據的不同點,依據組內統計得到的id_seq集合和payload集合去重后,做大小比較得出:

對于正常ping,源ip向目的ip發送的一系列數據包中id_seq全部不一樣,其中identify為當次請求隨機生成的序號不重復,同一批次identify一樣,seq是根據數據包個數,從1開始一次遞增1的數字,同一個請求和響應數據包的id_seq一樣,payload內容也一樣。例:ping baidu.com產生了10個數據包,包括5次請求、5次響應,則id_seq去重后為5,payload去重后win下為1,linux下為5。

對于Icmp隧道,源ip向目的ip發送的一系列數據包中id_seq,可以一樣,也可以不一樣。同一個請求和響應數據包的id_seq可以一樣,也可以不一樣,payload內容不一樣。例:隧道產生了10個數據包,則id_seq去重后為5(seq依次遞增)或1(seq固定不遞增),payload去重后為10,極端情況下只有發送包,沒有響應包,則id_seq去重后為10。

可見不考慮一些極端情況,可以簡單通過 payloads_num > id_seq_num 即可認為請求響應內容不同,對與極端情況,可以根據別的條件進行檢出。

對于4的判斷,使用2.2中介紹的方法進行判斷payload是否異常。

4.2.3 檢出過濾

為了減少誤報,過濾掉一些正常的路由器發送的數據包,使用3種條件結合進行是否檢出判斷:

存在有非法type的payload且去重后的payload的個數大于閾值(經內網測試,個別路由器會發送有畸形type的payload內容一樣的包,通過增加去重后的payload的個數大于閾值來過濾);

請求響應數據包不一致;

15秒內的數據包個數、非正常長度數據包個數、異常內容數據包個數、去重后的payload的個數 大于自定義的閾值檢出(經內網測試,個別路由器隔幾個小時會發送有異常內容的但是內容只有幾個字符不一樣的payload心跳包,通過增加去重(使用漢明距離去重,差別不超過3個字符的認為一樣)后的payload的個數大于閾值來過濾)。

鑒于Icmp隧道特點的多樣性,只要滿足3者之一,就會檢出,對于一些極端異常的ICMP隧道產生的包,比如隧道只有請求包沒有響應包即一直往外發數據,則id_seq去重后為10(10次全是請求包,且seq遞增),payload去重后為10,無法單獨通過2檢出,但是可以滿足3,一樣會檢出,不會漏報。

五、模型效果

5.1 負樣本檢測效果

目前測試過程中使用的已知負樣本有以下幾種:

icmpTunnel樣本,使用icmpTunnel隧道工具造的樣本;

icmptransmitter樣本,使用icmptransmitter隧道工具造的樣本;

icmpsh樣本,使用icmpsh隧道工具造的樣本;

badping樣本,使用python腳本手動造的icmp的異常數據包。

異常樣本檢測準確率如下:

圖片名稱

5.2 正樣本檢測效果

目前測試過程中使用的已知正樣本有以下幾種:

正常Ping數據包,Ping命令產生的數據包,平臺包括linux/win/mac/solaris/android/ios,payload內容如下:abcdefg12345等。

網絡設備心跳包,路由器等網絡設備會定時發送的一些心跳包,payload內容如下:DataBuffer 0000001、DataBuffer 0000002等。

正常樣本誤報率如下,其中Ios平臺偶爾有誤報:

圖片名稱

六、總結

本文介紹了基于統計的檢測ICMP隧道方法和落地實施中的一些技術細節。首先,基于統計的ICMP檢測重點是需要了解ICMP隧道的工作原理和一些特征指標,只有較好的指標才能保證在真實環境中的檢出效果。其次,為了達到在線實時檢測,我們在文中介紹了結合Spark Streaming進行實時統計各種指標,檢出超出閾值的數據。最后,通過分別對正樣本和負樣本進行測試,調整檢出閾值,提高了檢測準確度。

作者:斗象能力中心TCC-Chris

TCC團隊長期招聘,包含各細分領域安全研究、機器學習、數據分析、大數據研發、安全研發等職位。感興趣不妨聯系我們。

Email: [email protected]

這些評論亮了

  • [email protected] 回復
    現實這種根本沒什么用的, 沒不是很現實的 ,這么水的文章,哎......
    感覺是翻譯的文吧, 不然就不會用facebook當例子了,
    難道老外用的標題,會叫 ....統計.....? 這算哪門子統計
    在系統中檢測這種, 是需要root權的沒話說, 但是發送icmp包也是要root權的,意味著安裝木馬的人是有root權的,
    他都的root權了, 你裝的東西就沒什么意義了,木馬先裝,你的后裝, 他都能進來,那必然有其它路子留著,或是原路還能進來
    icmp只是對于他來說,一個隱蔽方案而以,其它的方案不怎么隱蔽的還有
    如果是系統外,必須是硬件防火墻支持, 現在防火墻有這功能? ping的流量萬一大了,變DDOS, 普通防火墻就掛了,
    真要防止,還不如直接封掉, 一般場合又是需要的icmp的,不會隨意封掉
    就算防火墻支持icmp數據包的檢測, 你能保證人家用的就是windowx和linux兩種系統? 你能保證他的系統,肯定是發abcdef....這樣的包?
    我就見過好多系統,是發0x00的, 一般隨機數字較小, 但不能說絕對沒有, 有時用戶的程序也會發送ping包,需要判斷網絡是否通的
    這時數據包就看開發的心情了, 一般是要混亂的, 不能是全0x00這樣,保證多次ping后,icmp的CRC16能夠發現錯誤,發現丟包
    icmp包的類型總共有byte種, 一般1,0 是收/發的, 像樣的防火墻能夠防止外面ping進來, 但內部往外ping是通的 或者說,
    內部往外ping后,外部回復的ping包是通過的, 外網單獨發送一個回復包, 防火墻發現前面沒有主動往外, 所以丟棄這種回復包
    這樣,icmp木馬也就沒辦法用了
    但開數據流量分析功能, 總是不好的,容易DDOS攻擊, 最簡單的還是保護你的權限,root權永遠只有在自己一個人手里
    )11( 亮了
發表評論

已有 12 條評論

取消
Loading...

特別推薦

推薦關注

填寫個人信息

姓名
電話
郵箱
公司
行業
職位
css.php 重庆百变王牌走势图