本文介绍如何使用机器学习技术检测一个URL是否是钓鱼网站,内容 包括数据抓取、特征选择和模型训练等。
我有一个客户的邮箱最近差点被钓鱼网站骗掉。他的供应商的邮件 被攻击了,然后黑客使用这个供应商的邮箱给他发了一封催款邮件, 要求他支付到另一个银行账号。幸运的是,我的客户给那个供应商 打电话进行了确认因此发现了骗局。这使我意识到钓鱼攻击到处 都在,我们不应当低估它的危害。
下面是一些钓鱼网站的例子,基本上他们的目的就是骗到你的登录账号 和密码。这是一个仿冒Paypal的钓鱼站:
这是一个仿冒的游戏站:
1、初步分析
学编程,上汇智网,在线编程环境,一对一助教指导。
在Kaggle上有一些钓鱼数据集,但是为此项目我希望生成自己的数据库。 我使用了两种数据源来构建钓鱼URL清单:
- 合法URL:Ebubekir Büber (github.com/ebubekirbbr)
- 钓鱼URL:phishtank.com
利用一点领域知识对这些合法和钓鱼URL进行分析,我将可以从URL中 得到的信息分为以下5个类别:
- URL:包含了一些线索。有些钓鱼URL是使用bit.ly等工具生成的短网址,
还有一些则是包含了额外的参数,例如:
- https://services.runescape.com-u.cz/m=weblogin/loginform.wa725,200,119,49827406,1
- https://bit.ly/2Kni3xl?facebook
- 域名:二级域名可能存在钓鱼风险。例如:
- http://paypal-verify.com/customer_center/customer-IDPP00C227/myaccount/signin
- http://recoveryourpaypalacc.globalengg-mep.com/login/customer_center/customer-IDPP00C52
- 网络:HTTP相应头中可能包含有用的信息
- 页面:总体来说,钓鱼网站总是使用一些表单试图让你输入账号、邮件、密码等信息
- Whois:域名往往是通过GoDaddy等注册商注册的
通过分析我还有以下的发现:
- 钓鱼攻击者通常会黑进合法的网站来插入钓鱼网页,而不是搭建一个独立域名进行 钓鱼攻击。虽然这会让从域名来识别钓鱼网站更困难,我理解注册商和托管商一旦 发现钓鱼网页都会迅速通知站长移除以避免对其排名的影响。这意味着我们可能会 看到被攻击的域名的注册商为空。
- 有些钓鱼网站可能包含恶意代码而不是直接在浏览器中载入URL。我这样操作:
- 使用https://web-capture.net这样的工具查看这些页面的截图
- 使用文本编辑器分析HTML代码
2、数据获取
我的数据抓取器的概念模型大致如下:
基本的思路是尽可能保持代码的模块化,这样我就可以在需要的时候添加新的分类。 我抓取的每个页面都在本地文件存储,以便这些页面在将来不可用时有个参考依据。
我使用BeautifulSoup来提取页面信息,通过设置随机的user-agent,可以减少 请求被当作bot拒绝的可能。
为了保证一致性,我也对URL进行了基本的预处理,例如移除www和结尾的斜杠。
3、探索式数据分析
由于抓取数据非常耗时,我决定开始我的探索式数据分析来找点感觉。在分析了 1817个URL(其中包括930个钓鱼URL和887个合法URL)的特征之后,我选择使用 以下15个特征:
1 | URL Domain Network Page Whois |
4、特征选择
我是用LASSO正则化来识别重要的特征。即使只用了一个小alpha值,我已经发现 了5个重要的特征:
1 | [('len', 0.0006821926601753635), |
坦白说,对于w_score没起作用我有点惊讶。最终我决定使用这5个特征。
1 | URL Domain Network Page Whois |
然后我使用KNN搭了一个简单的分类器作为基线。K选择3并得到了还算可以的 准确率0.793:
5、模型
通过抓取我得到6906 个url,3501合法, 3455 钓鱼。不出意外的是许多钓鱼 页面不可访问了:
1 | Type #URL processed #Pages available |
利用这6906个样本我再次进行特征选择,筛选出同样的5个特征。最优的K还是3,很好!
下面是模型的参数:
1 | Model Accuracy |
原文链接:Supervised Learning to detect Phishing URLs
汇智网翻译,转载请标明出处