釣魚網站檢測【機器學習】
本文介紹如何使用機器學習技術檢測一個URL是否是釣魚網站,內容包括資料抓取、特徵選擇和模型訓練等。
學程式設計,上匯智網,線上程式設計環境,一對一助教指導。
我有一個客戶的郵箱最近差點被釣魚網站騙掉。他的供應商的郵件被攻擊了,然後黑客使用這個供應商的郵箱給他發了一封催款郵件,要求他支付到另一個銀行賬號。幸運的是,我的客戶給那個供應商 打電話進行了確認因此發現了騙局。這使我意識到釣魚攻擊到處都在,我們不應當低估它的危害。
下面是一些釣魚網站的例子,基本上他們的目的就是騙到你的登入賬號和密碼。這是一個仿冒Paypal的釣魚站:
這是一個仿冒的遊戲站:
1、初步分析
學程式設計,上匯智網,線上程式設計環境,一對一助教指導。
在Kaggle上有一些釣魚資料集,但是為此專案我希望生成自己的資料庫。我使用了兩種資料來源來構建釣魚URL清單:
- 合法URL:Ebubekir Büber (github.com/ebubekirbbr)
- 釣魚URL:phishtank.com
利用一點領域知識對這些合法和釣魚URL進行分析,我將可以從URL中得到的資訊分為以下5個類別:
- URL:包含了一些線索。有些釣魚URL是使用bit.ly等工具生成的短網址, 還有一些則是包含了額外的引數,例如:
- 域名:二級域名可能存在釣魚風險。例如:
- 網路:HTTP相應頭中可能包含有用的資訊
- 頁面:總體來說,釣魚網站總是使用一些表單試圖讓你輸入賬號、郵件、密碼等資訊- Whois:域名往往是通過GoDaddy等註冊商註冊的
通過分析我還有以下的發現:
- 釣魚攻擊者通常會黑進合法的網站來插入釣魚網頁,而不是搭建一個獨立域名進行 釣魚攻擊。雖然這會讓從域名來識別釣魚網站更困難,我理解註冊商和託管商一旦 發現釣魚網頁都會迅速通知站長移除以避免對其排名的影響。這意味著我們可能會 看到被攻擊的域名的註冊商為空。
- 有些釣魚網站可能包含惡意程式碼而不是直接在瀏覽器中載入URL。我這樣操作:
- 使用https://web-capture.net這樣的工具檢視這些頁面的截圖
- 使用文字編輯器分析HTML程式碼
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
原文連結:用機器學習檢測釣魚網