一、概述

在企業內網環境中,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]
相關文章