釣魚網站檢測【機器學習】
- 2019 年 10 月 4 日
- 筆記
本文介紹如何使用機器學習技術檢測一個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
原文鏈接:用機器學習檢測釣魚網站 — 匯智網