1. 程式人生 > >釣魚網站檢測【機器學習】

釣魚網站檢測【機器學習】

本文介紹如何使用機器學習技術檢測一個URL是否是釣魚網站,內容包括資料抓取、特徵選擇和模型訓練等。

學程式設計,上匯智網,線上程式設計環境,一對一助教指導。

我有一個客戶的郵箱最近差點被釣魚網站騙掉。他的供應商的郵件被攻擊了,然後黑客使用這個供應商的郵箱給他發了一封催款郵件,要求他支付到另一個銀行賬號。幸運的是,我的客戶給那個供應商 打電話進行了確認因此發現了騙局。這使我意識到釣魚攻擊到處都在,我們不應當低估它的危害。

下面是一些釣魚網站的例子,基本上他們的目的就是騙到你的登入賬號和密碼。這是一個仿冒Paypal的釣魚站:

在這裡插入圖片描述

這是一個仿冒的遊戲站:

在這裡插入圖片描述

1、初步分析

學程式設計,上匯智網,線上程式設計環境,一對一助教指導。

在Kaggle上有一些釣魚資料集,但是為此專案我希望生成自己的資料庫。我使用了兩種資料來源來構建釣魚URL清單:

  • 合法URL:Ebubekir Büber (github.com/ebubekirbbr)
  • 釣魚URL:phishtank.com

利用一點領域知識對這些合法和釣魚URL進行分析,我將可以從URL中得到的資訊分為以下5個類別:

通過分析我還有以下的發現:

  • 釣魚攻擊者通常會黑進合法的網站來插入釣魚網頁,而不是搭建一個獨立域名進行 釣魚攻擊。雖然這會讓從域名來識別釣魚網站更困難,我理解註冊商和託管商一旦 發現釣魚網頁都會迅速通知站長移除以避免對其排名的影響。這意味著我們可能會 看到被攻擊的域名的註冊商為空。
  • 有些釣魚網站可能包含惡意程式碼而不是直接在瀏覽器中載入URL。我這樣操作:

2、資料獲取

我的資料抓取器的概念模型大致如下:

在這裡插入圖片描述

基本的思路是儘可能保持程式碼的模組化,這樣我就可以在需要的時候新增新的分類。我抓取的每個頁面都在本地檔案儲存,以便這些頁面在將來不可用時有個參考依據。

我使用BeautifulSoup來提取頁面資訊,通過設定隨機的user-agent,可以減少請求被當作bot拒絕的可能。

為了保證一致性,我也對URL進行了基本的預處理,例如移除www和結尾的斜槓。

3、探索式資料分析

學程式設計,上匯智網,線上程式設計環境,一對一助教指導。

由於抓取資料非常耗時,我決定開始我的探索式資料分析來找點感覺。在分析了1817個URL(其中包括930個釣魚URL和887個合法URL)的特徵之後,我選擇使用以下15個特徵:

  URL            Domain          Network      Page       Whois    
 -------------- --------------- ------------ ---------- --------- 
  length         len_subdomain   len_cookie   length     w_score  
  special_char   is_https                     anchors             
  depth                                       form                
                                              email               
                                              password            
                                              signin              
                                              hidden              
                                              popup

4、特徵選擇

我是用LASSO正則化來識別重要的特徵。即使只用了一個小alpha值,我已經發現了5個重要的特徵:

[('len', 0.0006821926601753635),
('count_s', 0.0),
('depth', 0.0),
('len_subdomain', 0.0),
('is_https', 0.0),
('len_cookie', -0.0002472539769316538),
('page_length', -2.4074484401619206e-07),
('page_num_anchor', -0.0006943876695101922),
('page_num_form', -0.0),
('page_num_email', -0.0),
('page_num_password', 0.0),
('page_num_signin', 0.0),
('page_num_hidden', -0.00041105959874092535),
('page_num_popup', -0.0),
('w_score', -0.0)]

坦白說,對於w_score沒起作用我有點驚訝。最終我決定使用這5個特徵。

  URL      Domain   Network      Page      Whois  
 -------- -------- ------------ --------- ------- 
  length            len_cookie   length           
                                 anchors          
                                 hidden

然後我使用KNN搭了一個簡單的分類器作為基線。K選擇3並得到了還算可以的準確率0.793:

在這裡插入圖片描述

5、模型

通過抓取我得到6906 個url,3501合法, 3455 釣魚。不出意外的是許多釣魚頁面不可訪問了:

 Type    #URL processed   #Pages available  
------- ---------------- ------------------ 
 Legit            4,000              3,501  
 Phish            6,000              3,455

利用這6906個樣本我再次進行特徵選擇,篩選出同樣的5個特徵。最優的K還是3,很好!

下面是模型的引數:

Model               Accuracy  
------------------- ---------- 
Naive Bayes            0.757  
SVC                    0.760  
KNN (K=3)              0.791  
Log. Reg.              0.822  
Decision Tree          0.836  
KNN (K=3, scaled)      0.845  
Random Forest          0.885

原文連結:用機器學習檢測釣魚網