作者:浙江大学matrix战队

一、环境安装

# 创建虚拟环境
virtualenv venv --python=python3.*
# 国内更新安装源
pip3 install some_package --index http://pypi.mirrors.ustc.edu.cn/simple/
# 安装依赖
pip3 install -r requirements.txt
# 自己安装包后,生成requirements.txt
pip freeze > requirements.txt

二、题目

2.1 黑产网站分类

根据给出的域名和 URL,对网站域名进行黑产网站的分类,在提供的基础的黑产类别上,发现并识别更多种类的黑产网站

基础黑产类别:涉赌、涉黄、涉毒、涉枪、涉诈、传销、接码平台、账号买卖、个人信息买卖、黑客相关、发卡平台、空包、卡池猫池、网赚、游戏私服、流量劫持、政府仿冒、假证买卖、支付平台、跑分平台、IDC 服务商、CDN 服务商等

2.2 网站劫持判断

根据给出的域名和 URL,以及题目一得到的黑产分类,判断网站是自主行为还是被黑客劫持,劫持的话劫持的目标是哪里以及它的分类

2.3 黑产网站关联分析、团伙发现

根据给出的域名和 URL,以及题目一得到的黑产分类,题目二得到的劫持信息,对这些网站进行关联分析,试图找出其中存在的黑产团伙

三、解题思路

3.1 数据预处理思路

3.1.1 爬取页面内容

  1. 建立域名白名单(根据百度权重、Alexa Top100PR 值等建立白名单),目前白名单如下:
["baidu.com", "sohu.com", "qq.com", "sogou.com", "douban.com", "iqiyi.com", "so.com", "weibo.com","163.com", "zhihu.com", "bilibili.com", "chinaz.com", "youku.com", "huya.com", "1688.com", "sina.com","gov.cn", "edu.cn"]
  1. 爬取域名 80 端口和 443 端口对应的 html 页面源代码
  2. 捕获爬取过程中重定向的所有链接,保存在数据库的 redirect_info 字段中

3.1.2 提取纯文本

  • html 源代码使用 BeautifulSoup 库解析
  1. 提取源代码中的纯文本,保存在数据库的 pure_text_content 字段中

  2. 提取源代码中的 title 标签中的文本内容和 meta 标签中 name = keywords 的文本内容,保存在数据库的 page_title_and_keyword 字段中

3.1.3 处理 JavaScript 代码跳转页面

  • 理由: 有些 URL 中没有纯文本内容或者纯文本内容很少,访问时就通过 JavaScript 代码(例如: window.location)跳转到其他 URL,对于这类 URL,直接处理爬取到的 html 源代码意义不大,为了获取到最终显示的 html 源代码,我们策略如下:
  1. 筛选出提取的纯文本( pure_text_content )为空或有效字符数小于200 的 URL,使用 selenium 库模拟浏览器运行,获取 JavaScript 跳转和渲染后的 html 源代码

  2. 获取到的 html 源代码使用 BeautifulSoup 库解析, 提取 html 源代码中的纯文本、标题和关键字

  3. 记录 JavaScript 跳转和渲染后的最终 URL,保存在数据库的 url_after_render 字段中

3.1.4 爬取图片

  • 理由: 有些 html 页面纯文本字数很少或者几乎没有,主要是以图片为主
  1. 通过匹配,筛选中数据库中 html 源代码中的 image 标签对应的图片链接

  2. 利用腾讯的 ocr (文字识别)接口,提取图片中的文本内容

  3. 把提取的内容追加在数据库的 pure_text_content 字段中,

3.1.5 分词与归一化处理

  1. 使用 jieba 分词库对提取的纯文本进行分词,分词结果放入数据库的 page_words 字段
  2. 对所有的繁体变成简体
  3. 所有英语字母变为小写
  4. 利用 tf-idf 算法提取 page_words 中的关键词,根据 tf-idf 值排名取前 300 个词作为页面的关键词,存放在数据库的 key_words 字段中

3.2 黑产网站分类

3.2.1 设定种子关键词

  • 解释:种子关键词主要根据爬取到的页面中的 page_title_and_keyword 人工设定,种子关键词设定的四条原则如下:
  1. 种子关键词的数量应该足够少

  2. 不同类别之间的种子关键词相似性很低

  3. 对于该类别,种子关键词非常具有代表性

  4. 考虑到分词的不确定,种子关键词不一定是一个词语,例如”查通话记录”这个种子关键词,并不是一个词语,在分类的时候会判断待分类文本是否同时包含”查”, “通话”, “记录”这几个词,如果是,则对待分类文本追加”查通话记录”这个短语

在对模型进行分类后,根据分类结果,对种子关键词进行迭代,形成更优的种子关键词,目前种子关键词如下:

{
   "gamble": ["财神", "娱乐", "发牌", "bet", "bet365", "中奖", "开奖", "发财", "投注", "澳门", "赢球", "博彩", "体育", "葡京", "彩票", "电玩", "棋牌", "太阳城", "赌", "冰球", "金花", "赌场", "赌注", "赌城", "太阳城", "赌博", "彩金"],
   "yellow": ["约会", "亚洲", "牲交", "av", "欧美", "长腿", "肛交", "三级", "成人", "看片", "丝袜", "足浴", "偷拍", "调教", "骚", "阴毛",  "无码", "臀", "屁股", "性爱", "情欲", "巨乳", "吹箫", "美乳", "开档", "高潮", "熟女", "操", "啪啪", "偷情", "做爱", "出轨", "性", "少妇", "肥臀"],
   "drug": ["毒品", "兴奋剂", "摇头丸", "贩毒", "可卡因", "吗啡", "鸦片", "白粉", "镇静剂", "罂粟", "drug", "吸毒者", "海洛因", "大麻", "冰毒"],
   "gun": ["枪", "步枪", "狙击", "步枪", "汽怆", "气枪", "狙击枪"],
   "personal_info": ["查通话记录", "查微信记录", "聊天记录", "短信内容"],
   "fraud": ["股票", "理财", "算命", "贵金属", "贷款", "集资"],
   "get_code": ["验证码", "短信"],
   "transcate_account": ["回收", "买卖", "共享", "账号", "王者", "荣耀", "地下城", "勇士"],
   "hack": ["黑客"],
   "cdn": ["分发", "cdn"],
   "idc": ["idc"],
   "score": ["跑分"],
   "card": ["发卡", "发卡网", "发卡平台", "卡密"],
   "empty_package": ["空包", "物流", "代发", "快递", "单号", "刷单", "发货", "底单", "空包网"],
   "online_money": ["兼职", "在家", "打字", "赚钱", "网赚"],
   "game_private_server": ["私服", "稀有", "游戏"],
   "government": ["人民", "国情", "政府", "政务", "制度", "国家", "政策", "机关", "减税"],
   "payment_platform": ["第三方", "第四方", "四方", "聚合"],
   "fake_id": ["文凭", "学位证", "学历", "毕业证", "证书"],
   "card_pool": ["猫池", "池"],
   "personal_info": ["查通话记录", "查微信记录", "聊天记录", "短信内容"],
   "hijack_traffice": ["网吧", "增值", "TR"],
   "pyramid_sale": ["返佣"]
}

3.2.2 利用页面标题和关键词进行分类

  1. 对数据库中的 page_title_and_keyword 进行分词,然后和种子关键词进行比较,如果能够匹配成功,则属于该类别

  2. 如果匹配不成功,则利用词向量进行分类

3.2.3 利用词向量进行分类

  1. 使用开源中文维基百科训练的词向量模型,该词向量模型累计352217个词,每个词是 300 维向量,词向量模型如下: https://github[.]com/Embedding/Chinese-Word-Vectors

  2. 扩充种子关键词

    2.1. 把非词语的种子关键词变为词语

    2.2. 利用 word_vec 库对种子关键进行深度优先扩充和广度优先扩充(累计扩充5倍)

  3. 利用 word_vec 库计算 URL 中的关键词和种子关键词的相似性,如果相似性大于 0.7 ,则计数加一,如果累计数量占比高于总关键词个数的 0.63,则认为该 URL 属于对应关键词的类别

  4. 补充:使用 fastText 库,所有网页的关键词作为数据,训练属于黑产的词向量模型,每个词向量为 300

    4.1. 原因:很多黑产的词语在开源的中文维基百科词向量模型中找不到,对于找不到的可以采用自己训练的模型进行补充,而不是直接忽略

    4.2. 在本次实践中,虽然训练了一个词向量模型,但是没有使用,因为当时爬取的数据量太少了,当数据量比较多的时候,训练出来后再优化参数和分类,时间已经来不及了。

3.2.4 图片分类模型

  • 理由: 通过对爬取的图片使用 ocr 技术获取文本内容,发现有些文本内容也很少,准备采用图片分类模型,对其进行分类,但是由于时间和精力有限,暂时没有做这一块,目前的基本思路如下:
  1. 采取有监督学习
  2. 从已经分类好的网站中收集属于该类黑产的图片,作为数据的标签
  3. 通过有监督学习,实现对图片的分类
  4. 当网站高于一定比例的图片均被分类模型判定为某一黑产类别时,则判断该网站属于该类别

3.2.5 迭代优化

  1. 通过人工验证的方式判断模型的分类效果

  2. 优化种子关键词

  3. 优化跳转阈值(关键词的相似性 和 占据的比例)
  4. 优化图片分类模型的相关参数

3.2.6 分类结果

日期 所给数据量 爬取成功数据量 黑产数据量 黑产数据量(去重)
8月1日 214408 145472 45868 10170
8月2日 219760 60968 20860 5422
8月3日 211584 108924 47121 8408
8月4日 204471 62060 20857 5959
8月5日 195540 85250 24036 7279
8月6日 168535 59221 20178 5696
8月7日 155058 66873 24612 6249
8月8日 268709 126905 25711 8588
8月9日 207358 114664 27662 7688
8月10日 191588 112411 23558 6937
8月11日 219221 82887 19921 6027
8月12日 478543(处理149528) 124607 39320 12308
https单独处理 2405760 7125 252 273
合并结果 2405760 1164492 339956 59259

3.3 网站劫持判断

对于这道题的思路,我们采用了逆向思维。劫持种类多种多样,无从下手,我们抓住一条核心思路:劫持一定发生了跨域,但是跨域不一定是劫持。利用这条核心思路,我们从跨域的网站中排除正常的网站,得到被劫持的网站。

3.3.1 选择跨域的 URL,构成跨域集合

  1. 根据输入的 URL、重定向的 URL 列表、模拟浏览器渲染后的最终 URL,判断是否有跨域跳转,如果则构成跨域集合。
  2. 这里的跨域只是域名的变化,并不考虑端口的变化,例如从 www[.]abc[.]comwww[.]123[.]com 认为是跨域,而对于www[.]abc[.]comwww[.]abc[.]com:443 则认为不是跨域

3.3.2 根据百度权重接口数据,构成百度权重的集合

  1. 利用百度的权重查询接口,获取网站的权重数据和预计流量数据,如果跳转后的 URL 的预计流量数值大于 50,或者比跳转前 URL 的预计流量值小于 50 以下,则认为不是网站劫持,构成百度权重集合

    1.1. 想要这个点主要是因为我们在了解如何判断网站劫持的时候,发现很多被劫持的网站都是拥有大流量,高权重的网站,例如知名企业,政府机构等等;而劫持目标是黑产的话,则它的权重和流量都非常低。

    1.2. 为了排除正常的跳转,或者友情链接这种情况,我们设定跳转后的预计流量值大于50则认为是正常网站。

3.3.3 根据跳转前后的域名,构成相同 IP 的集合

  1. 跳转前后的域名对应的 IP 地址一样构成集合,理由如下:

    1.1. 如果跳转前后的域名被解析到同一个 IP,则大概率是属于同一个主机,黑产为了宣传推广而做的。

    1.2. 如果多个域名解析到同一个 IP,从服务器层面来说也不是跨域,结合3.1可以该集合不在我们考虑的范围

3.3.4 根据题目3的统计结果,构成相同团伙的集合

根据题目3统计的团伙结果,跳转前后的域名属于同一个团伙构成相同团伙集合

最终被劫持的域名集合 = 跨域结合汇总 – 百度权重集合 – 相同 IP 集合 – 相同团伙集合

3.3.5 最终结果

日期 所给数据量 爬取成功数据量 黑产数据量 跨域劫持数据量(去重)
8月1日 214408 145472 45868 196
8月2日 219760 60968 20860 109
8月3日 211584 108924 47121 214
8月4日 204471 62060 20857 137
8月5日 195540 85250 24036 140
8月6日 168535 59221 20178 99
8月7日 155058 66873 24612 159
8月8日 268709 126905 25711 133
8月9日 207358 114664 27662 84
8月10日 191588 112411 23558 79

3.4 黑产网站关联分析

对于这道题,我们采用的是图模型,图的结点是域名,边是域名之间的关系,边的构成主要从以下4个方面展开。

3.4.1 根据 IP 地址

  • 如果两个结点域名对应的的 IP 地址一样,我们则在这两个结点之间构成一条边

3.4.2 利用 https 的CA证书

  • 获取提供 https 的网站的 CA 证书,如果两个结点之间的 CA 证书是同一个,我们则在这两个结点之间构成一条边

3.4.3 利用域名解析记录

  • 根据域名获取 IP 地址,获取 IP 地址最近一个月和那些域名有解析记录,如果两个域名结点之间一个月内有相同的域名解析记录,我们则在这两个结点之间构成一条边

3.4.4 根据统计链接

  • 很多页面中都有统计链接,主要用于黑产人员的考核,通过正则表达从 html 中提取其中的统计链接,根据链接中的 ID 来进行判断,如果两个结点之间的统计ID相同,我们则在这两个结点之间构成一条边

3.4.5 团伙判定

  • 上述 4 条定义边的关系,都是强关系(也就是说如果两个网站不是同一个团伙,那么他们就不会解析到同一个IP地址,也不会公用一个 https 证书,最近一个月也不会有相同的域名解析记录,统计链接中的 id 也不会一样)
  • 因此我们给团伙判定的依据是:只要两个结点有一条边,则认为他们属于同一个团伙
  • 如果所有结点构建一个大图,团伙划分效果会更好,但是考虑到服务器的瓶颈以及划分的时间,我们采用每 1000 个结点进行一次团伙判定,最后再对 1000个结点的判定结果进行汇总

3.5 总结

  • 题目很有意思,从真实数据中能够更加深入的了解网络黑产
  • 对于三个题目的解法并不一定非常好,但是通过人工随机抽样验证,效果表现非常好
  • 对于分类模型,接下来的思路:A、可以根据分类结果进行有监督的训练,形成一个分类模型;B、根据获取的黑产关键词,训练针对黑产的词向量模型。
  • 对于劫持判断,接下来的思路:核心思路仍然采用逆向思维,通过去发现更多正常跳转的共性进行排除
  • 对于黑产团伙,接下来的思路:可以考虑一些弱关联关系,通过对边进行加权,当边的权重到达一个阈值,则变为强关联关系

Categories:

Comments are closed