您的位置:首頁>正文

用機器學習玩轉惡意URL檢測

邀請函

全國千所高校大資料師資免費講習班【搭建通向大資料專業的捷徑。 報名人數限1500人, 先到先得】不容錯過的原因:➀.豪華講師陣容:清華大學博士劉鵬教授領銜的科技創新團隊;➁.重點講習《大資料》教材(中國電腦圖書被引用量第一的《雲計算》姊妹篇);➂.業界大咖對大資料應用的頂級分享;➃.《大資料》《大資料實驗手冊》限量送。 點擊“閱讀原文”報名

前段時間漏洞之王Struts2日常新爆了一批漏洞, 安全廠商們忙著配合甲方公司做資產掃描, 漏洞排查, 規則大牛迅速的給出”專殺”規則強化自家產品的規則庫。 這種基於規則庫的安全防禦總是處於被動的,

所以趁著小假期對機器學習應用於威脅檢測的這塊做了些研究整理了下筆記, 以方便大家日後交流學習。

本文參考了國外的一篇博文, 英語好的可以直接看下原文, 在這裡記錄了下研究檢測模型實現的過程, 因為也是最近才接觸機器學習這塊, 有啥問題請大牛們指出。

先說重點, 這篇文章使用邏輯回歸的方式建立檢測模型, 對未知的 URL 進行惡意檢測。

模型建立的整體思路如下:

1. 分別拿到正常請求和惡意請求的資料集。

2. 對無規律的資料集進行處理得到特徵矩陣。

3. 使用機器邏輯回歸方式使用特徵矩陣訓練檢測模型。

4. 最後計算模型的準確度, 並使用檢測模型判斷未知 URL 請求是惡意的還是正常的。

0×00 收集資料集

我們需要分別拿到惡意的資料集和正常的資料集用來後期處理, 在這裡惡意的資料集來自 https://github.com/foospidy/payloads中的一些 XSS SQL注入等攻擊的payload, 結合github上一些知名倉庫的payload, 一共整理出 50000 條惡意請求作為惡意的資料集;正常請求的資料集來自於http://secrepo.com/, 攻擊1000000條日誌請求(資源有限, 假定認為這些資料全部都是正常的請求, 有精力可以進行降噪處理, 去除異常的標籤資料)。

惡意請求部分樣如下:

/top.php?stuff='uname >q36497765 # /h21y8w52.nsf?/ca000001.pl?action=showcart&hop=">&path=acatalog/ /scripts/edit_image.php?dn=1&userfile=/etc/passwd&userfile_name= ;id; /javascript/mta.exe /examples/jsp/colors/kernel/loadkernel.php?installpath=/etc/passwd /examples/jsp/cal/feedsplitter.php?format=../../../../../../../../../../etc/passwd&debug=1 /phpwebfilemgr/index.php?f=../../../../../../../../../etc/passwd /cgi-bin/script/cat_for_gen.php?ad=1&ad_direct=../&m_for_racine=/examples/jsp/cal/search.php?allwords=
&cid=0&title=1&desc=1

正常請求部分樣本:

/rcanimal//458010b88d9ce//cclogovs//using-localization//121006_dakotacwpressconf//50393994//166636//labview_v2//javascript/nets.png/p25-03//javascript/minute.rb /javascript/weblogs.rss /javascript/util.rtf

0×01 計算特徵矩陣

無論是惡意請求資料集還是正常請求資料集, 都是不定長的字串清單, 很難直接用邏輯回歸演算法對這些不規律的資料進行處理, 所以, 需要找到這些文本的數位特徵, 用來訓練我們的檢測模型。

在這裡, 我們使用 TD-IDF 來作為文本的特徵, 並以數位矩陣的形式進行輸出。

TD-IDF 是一種用於資訊檢索與文本挖掘的常用加權技術, 被經常用於描述文本特徵。

實際上是:TF * IDF, TF 詞頻(Term Frequency), IDF 逆向檔頻率(Inverse Document Frequency)。

這裡簡單說下他們的概念, 感興趣的可以搜搜資料:

TF表示詞條在某文檔中出現的頻率。

IDF的主要思想是:如果包含詞條的文檔越少, 則 IDF越大, 說明該詞條具有很好的類別區分能力。

TF-IDF 傾向於過濾掉常見的詞語, 保留重要的詞語。

要計算 TD-IDF 之前首先需要對 每個文檔(URL請求)的內容進行分詞處理, 也就是需要定義文檔的詞條長度, 這裡我們選擇長度為3, 可以根據模型的準確度對這個參數進行調整。

比如:

// URL 請求

// 經過分詞後

['www','ww.','w.f','.fo','foo','oo.','o.c','.co','com','om/','m/1']

下面對所有 URL 請求計算出 TD-IDF 特徵矩陣,

輸出格式基本上是下面的樣子:

(0, 31445) 0.0739022819816 (0, 62475) 0.0629894240925 (0, 46832) 0.0589025342739 (0, 77623) 0.0717033170552 (0, 35908) 0.0882896248394 : 省略 : (1310503, 17869) 0.245096903287 (1310503, 7490) 0.350336780418 (1310504, 8283) 0.344234609884 (1310504, 72979) 0.265488228146 (1310504, 67485) 0.253863271567 (1310504, 37730) 0.328153786399

可以看出特徵矩陣的元素由[(i,j) weight] 三個元素組成,

在矩陣中:

i 對應于集合中的文檔編號, j對應於term編號(或者說是詞片編號)

矩陣元素[(i,j) weight] 表示編號 為 j 的詞片 在編號為 i 的文檔下的 fd-idf 值(weight)。

比如: (0, 31445) 0.0739022819816 表示詞片編號31445的在第0號文檔的權值是 0.0739022819816

0×02 訓練檢測模型

現在有了特徵矩陣作為訓練的資料集, 可以先從中取出一少部分資料(大約占總數據的5%, 可以自行指定)用來測試已經訓練好的模型的準確率。 至於如何取出測試資料, 可以直接使用scikit-learn提供的 train_test_split 方法對原始資料集進行分割。

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.05, random_state=42) // x 是原始的特徵矩陣 y 是 該條矩陣的分詞對應的結果輸出(正常是0 惡意是1)的列表 // random_state 是隨機說種子, test_size 是測試樣本所占比例 // x_train,x_test 分別是用於訓練模型和測試模型準確度的特徵矩陣 // y_train 和 y_test 是與 x_train,x_test 對應的結果輸出清單

有了訓練資料,

可以直接使用邏輯回歸的方法來訓練我們的模型, 這一步需要電腦花點時間對資料進行處理, 但是我們只需要調用 scikit-learn 定義一個邏輯模型實例, 然後調用訓練方法, 傳值訓練資料即可, 代碼如下:

lgs = LogisticRegression lgs.fit(x_train, y_train)

0×03 測試模型效果

經過訓練之後使用 lgs 實例的 score 方法 選擇一批測試資料來計算模型的準確度, 至於測試資料(x_test,y_test)我們已經在上一步中分割得到

lgs.score(x_test, y_test)

檢測模型的準確度:

同時,可以調用 lgs.predict 的方法對 新的 URL 是否是惡意的進行判定。

x_predict = ['待預測URL列表']x_predict = vectorizer.transform(x_predict)res = lgs.predict(x_predict)

在這裡隨機選取一些 URL 進行預測,判斷的結果如下:

0×04 總結

本文的目的是希望從代碼的角度上分析如何機器學習演算法來訓練URL惡意檢測模型,當然訓練檢測模型的方式有許多種,比如 SVM 或是其他機器學習演算法。

基於邏輯回歸的惡意 URL 檢測很依賴於訓練資料集,有必要保證原始資料集盡可能的減少噪點(異常資料),以及每條資料之間盡可能的減少關聯性。

若能拿到自身業務中確定正常或者威脅的請求資料作為訓練資料集訓練出的模型應該也更加適用於當前環境的檢測。

同時作為監督式學習,可以定期把檢測出確定威脅的請求放入原始資料集中,對檢測模型進行優化,效果會更好。

源碼地址:

參考:

✄------------------------------------------------

點擊“閱讀原文”報名

↓↓↓

同時,可以調用 lgs.predict 的方法對 新的 URL 是否是惡意的進行判定。

x_predict = ['待預測URL列表']x_predict = vectorizer.transform(x_predict)res = lgs.predict(x_predict)

在這裡隨機選取一些 URL 進行預測,判斷的結果如下:

0×04 總結

本文的目的是希望從代碼的角度上分析如何機器學習演算法來訓練URL惡意檢測模型,當然訓練檢測模型的方式有許多種,比如 SVM 或是其他機器學習演算法。

基於邏輯回歸的惡意 URL 檢測很依賴於訓練資料集,有必要保證原始資料集盡可能的減少噪點(異常資料),以及每條資料之間盡可能的減少關聯性。

若能拿到自身業務中確定正常或者威脅的請求資料作為訓練資料集訓練出的模型應該也更加適用於當前環境的檢測。

同時作為監督式學習,可以定期把檢測出確定威脅的請求放入原始資料集中,對檢測模型進行優化,效果會更好。

源碼地址:

參考:

✄------------------------------------------------

點擊“閱讀原文”報名

↓↓↓

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示