本文通過使用機器學習算法來檢測HTTP的惡意外連流量,算法通過學習惡意樣本間的相似性將各個惡意家族的惡意流量聚類為不同的模板。並可以通過模板發現未知的惡意流量。實驗顯示算法有較好的檢測率和泛化能力。
0×00背景
攻擊者為控制遠程的受害主機,必定有一個和被控主機的連接過程,一般是通過在被控主機中植入后門等手段,由受控主機主動發出連接請求。該連接產生的流量就是惡意外連流量,如圖1.1所示。目前檢測惡意外連流量的主要方式有兩種,一種是基於黑名單過濾惡意域名,另一種是使用規則匹配惡意外連流量。這兩種方案都有一定的局限性,基於黑名單過濾的方案,只能識別連接已知惡意網站時的惡意外連流量,對於域名變化沒有任何感知。而基於特征檢測的方案,需要安全從業人員逐一分析樣本,會消耗較大的人力,並且難以檢測變種的惡意外連流量。
作為已有技術的補充,可以通過機器學習來檢測惡意流量。利用機器學習來發現惡意流量間的共性,並以此為依據檢測惡意流量,一個好的算法可以大大減少安全從業人員的工作量。
現在已經有不少關於采用機器學習檢測惡意流量的文獻資料,思路也各有千秋,如有根據流量內容進行檢測的,還有根據流量變化來進行檢測的。本文主要受ExecScent這篇論文的啟發。
圖1.1 惡意外連流量示意圖
0×01數據收集
實驗室目前積累了大量的惡意樣本,部分如圖2.1所示。通過在沙箱中運行惡意樣本收集產生的外連HTTP流量。這些外連流量中只有部分是惡意的,中間仍摻雜着不少白流量。通過人工分析確認,將產生的外連流量分為惡意流量和白流量。最后利用已積累的威脅情報信息將惡意流量打上惡意家族信息。最終用於訓練的數據如圖2.2所示。
圖2.1 惡意樣本示意圖
圖2.2 用於訓練的數據信息
0×02數據分析
通過分析采集到的惡意外連流量信息,發現來自同一家族的惡意外連流量間具有明顯的相似性。如圖3.1是通過兩個不同的惡意樣本產生的惡意外連信息,經過人工分析,判定兩個惡意流量均是來自LokiBot惡意家族。可以看到兩個流量間的相似性極高。圖3.2則是兩個來自Generic Trojan家族的惡意外連流量,同樣有極高的結構相似性。
分析同一家族惡意流量,發現同一家族的惡意流量有以下特點①其url路徑結構一致,具體路徑信息盡管不同,但是都具有相同的數據類型。比如圖3.1中url路徑中的bugs和job都是字符串,圖3.2url中1b50500dad和106042bd2e都是16進制小寫類型;②url的參數相似;③請求頭字段基本相同,且內容高度重合。
由於同一家族的惡意外連流量具有上述的相似性,因此可以使用聚類算法將同一家族的惡意流量聚為一類,提取它們的共性模板,最后利用模板檢測新的惡意外連流量。
圖3.1 LokiBot家族惡意外連流量
圖3.2 GenericTrojan家族惡意外連流量
0×03算法實現
算法主要包括惡意http外連流量模板生成和未知http流量檢測兩個部分,兩個部分的流程分別見圖4.1和圖4.6。下面分別介紹這兩個部分。
1 模板生成
模板生成流程包括請求頭字段提取,泛化,相似性計算,層次聚類,生成惡意外連流量模板5個步驟,如圖4.1所示。
圖4.1模板生成流程
1.1 提取請求頭字段
將http流量划分為url、url參數,user-agent、host、content-length等結構化字段。方便后續處理。
1.2 泛化
同一家族的惡意流量結構一致,但是有部分具體細節不同。將http流量中的數字部分、字母部分、字母數字混合部分、十六進制部分、base64部分分別用特殊字符替換,取消它們的差異性部分。比如對圖3.2中流量的url部分泛化,將字母轉換為*,十六進制部分轉換為@,數字部分轉換為$,泛化后的效果如圖4.2,可以看,通過泛化,兩個url的結構特征得以保留,而具體內容的差異則被忽略了。
圖4.2 泛化效果
1.3 相似度計算
為聚類惡意流量,需要計算流量間的相似度,便於后續提取惡意流量模板。在計算相似度的過程中,惡意流量中不同字段的重要性是不同的。如圖3.2中所示的惡意流量,明顯url部分更加特別,不易與白流量中的url重疊。而Accept, User-Agent等字段內容則是常見值,無論是否是惡意流量都有可能出現。因此,在計算圖3.2所示流量的相似度時,url應該有更大的權重,即url相似時表明它們更有可能來自同一惡意家族。而Accept,User-Agent等字段則應該分配較小的權重,因為難以通過這些字段內容區分惡意流量和白流量。
為了更好的決定各個字段在相似度中應該占有的權重,需評估每個字段的特異性,字段內容特異性越高,則其惡意特征越明顯,相應的就應該賦予更高權重。圖4.3給出了相似度計算的具體過程。
圖4.3 相似度計算
各個字段的特異性權重計算包括以下幾個方面:
l Url路徑特異性:根據url路徑復雜度定義,如圖4.4所示。惡意流量中的url路徑越復雜越難以與白流量重疊。
l Url參數特異性:根據參數數量定義,如圖4.4所示。惡意流量中的參數數量越多,特征越明顯。
l 其他常見請求字段特異性:如User-Agent,Connection, Cache-Control等字段。統計所有惡意流量和白流量中出現過的字段信息集合以及對應的出現次數。如果字段內容出現頻率低,則認為特異性高。
l 特殊字段特異性:如圖3.1流量中的Content-Key字段。統計所有流量中出現過的字段信息。將出現頻率低的字段標記為特殊字段。對於有特殊字段的流量,認為其特異性高。
圖4.4 Url路徑和參數特異性
1.4 層次聚類
根據步驟3計算的相似度矩陣,利用層次聚類算法將請求頭划分為若干類。每一類中的請求頭都具有相似的結構,用於后續生產惡意流量模板。圖4.5是采用10%的樣本用於訓練時生成的層次聚類圖。
圖4.5 惡意流量層次聚類圖
1.5 生成惡意流量模板
對聚類后的每一類,都是結構和內容相似的惡意流量。對其中的每一個請求頭字段,獲取聚類中該字段內容的並集作為該字段在模板中的值。相當於把訓練集中重復的部分做了去重處理。
2 未知流量檢測
圖4.6未知http流量檢測
如圖4.6所示,模板匹配過程主要包括包括待測流量請求頭字段提取,泛化,模板匹配,判別流量性質四個部分。
其中字段提取,泛化過程和4.1節中完全相同。模板匹配過程也是計算待檢測請求頭與惡意外連流量模板的相似度,最后加權平均的相似度即為待測流量與模板匹配的相似度。具體相似度的計算與模板生成過程中4.1.3基本一致,唯一的區別是,模板中同一個請求頭字段可以有多個值,在計算時取其中相似度最高的值。最終,如果未知流量與模板的相似度大於預設值,則認為未知流量為惡意外連流量。
0×04算法效果
采用80%的黑樣本作為訓練集,20%的黑樣本及全部白樣本作為測試集,測試算法效果,繪制匹配閾值的PRC曲線如圖5.1。可以看到隨着召回率的提升,算法一直保持着較高的精度。最終選擇了0.8作為匹配閾值,此時算法精度為93.56%,召回率為97.14%,F-值為0.9532。
圖5.1 PRC曲線
此外,分別用10%,20%,30%…, 90%的黑樣本作為訓練集,匹配閾值采用0.8測試其他樣本數據,分別統計檢測的惡意流量正確率,白流量正確率以及誤報率,結果如圖5.2。可以看到算法對白樣本的檢測正確率一直維持在99%以上。而對於黑樣本,其檢測正確率是建立在模型多樣性的基礎上的。在訓練集只有10%,模型數據不足的情況下,算法仍檢測出了77.65%的黑樣本,說明算法對於惡意流量的變種有較好的泛化能力。
圖5.2 訓練集占比對黑白測試樣本檢出率影響
表5.1給出了不同訓練集占比下,檢出率和誤報率的具體數值。可以看到,隨着訓練集占比的提高,檢出率大幅度上升,這是由於算法是建立在模型基礎上的。當訓練集少時,樣本的多樣性不足,獲取到的模板少,從而檢出率較低。隨着訓練樣本的增加,更多的模板特征被獲取,檢測率也逐漸提高。而誤報率隨着訓練集的擴大而略有上升,這是由於隨着模板的增多,白流量匹配到模板的概率也逐漸變大了。但整體誤報率的增加並不多,仍在可接受范圍。
訓練集占比 | 檢出率 | 誤報率 |
---|---|---|
10% | 77.650% | 0.392% |
20% | 84.856% | 0.500% |
30% | 87.980% | 0.567% |
40% | 89.234% | 0.648% |
50% | 90.069% | 0.662% |
60% | 92.644% | 0.710% |
70% | 93.410% | 0.729% |
80% | 95.172% | 0.756% |
90% | 95.402% | 0.783% |
表5.1 不同訓練集占比下的檢出率和誤報率
目前還實現了一個簡易的測試頁面,可以通過上傳pcap來檢測其中是否包含惡意流量,效果如圖5.3和5.4所示。該頁面后續將開放。
圖5.3 檢測惡意流量頁面
圖5.4檢測結果頁面