这是作者2020年参加清华大学、Coremail、奇安信DataCon举办的比赛,主要是关于钓鱼和异常邮件识别研究。非常感谢举办方让我们学到了新知识,DataCon也是我比较喜欢和推荐的大数据安全比赛,这篇文章2020年10月就进了我的草稿箱,但由于小珞珞刚出生,所以今天才发表,希望对您有所帮助!感恩同行,不负青春。
微步情报局C&C资产进行拓线关联发现 “白象三代”组织在2019年期间用于钓鱼攻击的资产域名:ioa-cstnet.org。该域名在2019年3、4月期间曾被用于伪装成中国科学院计算机网路络信息中心管理员对该所人员发起鱼叉式攻击活动,试图窃取科研人员邮箱账密。钓鱼邮件如下所示,因此鱼叉式钓鱼攻击越来越多,其安全防御也非常重要。
作者作为网络安全的小白,分享一些自学基础教程给大家,主要是关于安全工具和实践操作的在线笔记,希望您们喜欢。同时,更希望您能与我一起操作和进步,后续将深入学习网络安全和系统安全知识并分享相关实验。总之,希望该系列文章对博友有所帮助,写文不易,大神们不喜勿喷,谢谢!如果文章对您有帮助,将是我创作的最大动力,点赞、评论、私聊均可,一起加油喔~
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。该安全系列原文github已开源,如果喜欢也可以支持作者,赚点奶粉钱,哈哈。
竞赛简介
在网络空间日趋激烈的对抗和渗透活动中,电子邮件作为工作和生活中常见的一类基础应用,是网络攻击“战役”中必须暴露在炮火之下的桥头堡。事实上,电子邮件一直是网络攻击者常用的攻击渠道,也常常成为许多高级持续威胁(APT)攻击的重要一环。钓鱼邮件、勒索邮件、病毒邮件等威胁始终是网络安全面临的主要挑战之一。与邮件安全相关的攻击与检测,两者之间的博弈将长期持续。
然而,与日趋复杂的邮件攻击技术相比,邮件安全防御技术相对滞后,在安全人才方面也存在巨大的缺口。清华大学网络研究院和邮件服务提供商Coremail论客、安全厂商奇安信集团一同合作,通过大数据安全分析竞赛DataCon平台,推出了国内首个邮件安全分析竞赛。
本次竞赛旨在通过提供大量贴近于企业生产环境下的真实数据和应用场景,鼓励参赛选手充分挖掘邮件数据的安全价值,灵活运用多样化的安全检测方法,对邮件数据中不同类型安全威胁进行检测分析。本次竞赛的目的是提升参赛选手的安全能力和实战经验,培养和选拔熟练掌握数据安全分析能力的人才。
主办单位
清华大学 | Coremail论客
协办单位
奇安信集团 | DataCon社区 | InForSec论坛
赛题说明
某家企业希望根据根据邮件内容类型的不同,采取差异化的邮件过滤策略。譬如在邮件服务器上直接拦截所有勒索欺诈类邮件,而对于一般的推广营销类邮件,则移入用户邮件的垃圾箱中。
为实现上述差异化的邮件过滤策略,请参赛选手分析邮件日志数据,设计分类模型,实现针对邮件类型的分类。注意:检测方法既可以是基于规则的,也可以是基于学习的。
数据说明
赛题数据目录为 /home/datacon/coremail/challenge_2 赛题二的数据为24000封真实生产环境下的邮件日志。每个邮件日志均有唯一的ID编号,并包含非常丰富的细粒度字段信息。部分数据字段的具体含义如下表所示。
数字字段 | 具体含义 | 数据字段 | 具体含义 |
---|---|---|---|
@timestamp | 时间戳 | mid | 邮件内投最终的mid |
attach | 邮件附件名列表 | rcpt | 收件人email列表 |
authuser | 是否为本站用户 | recviplist | 信头的Received:提取的IP地址列表 |
content | 邮件内容(前512字节) | regionip | 从信头提取的X-Orginal-IP之类的原始的发信人IP(而不是服务器IP) |
doccontent | Office类型邮件附件的文档信息 | sender | 发信人 |
dwlistcnt | 命中域名自动白名单的rcpt数量 | subject | 邮件的主题 |
from | 信头的from信息 | url | 邮件中包含的URL链接(可能包含手机号码/qq号码和其他一些非URL信息) |
fromname | 信头的fromname | wlistcnt | 命中自动白名单的rcpt数量 |
htmltag | 邮件包含的html tag | xmailer | 信头xmailer信息 |
ip | 连接到Coremail 服务器的IP | licenseid | 请求的客户端的licenseid |
region | regionip的地理位置 |
注意事项:
提交规则
请各参赛队伍自行设计算法,区分邮件日志的不同类型,将邮件的编号以及所属类型写入指定的文件中,即/home/jovyan/result2.csv。
选手应当提交CSV格式的文件,CSV的列名分别为:
文件之中每行均应包含两列,邮件日志编号和类型代码(用逗号进行连接),不同邮件编号按行进行分隔(分隔符为“\n”)。指定文件目录下已经内置一个提交示例(result2.demo.csv),供参赛队伍参考。 由于邮件日志中所含有具体类型,其规模并不确定。因此请参赛队使用从1开始递增的阿拉伯数字(1,2,3,…,10,…)来表示邮件日志的不同类型。使用其它代码进行表示不得分。
请注意:同一个邮件日志不会同时属于两个及以上的类型,参赛选手提交的文件中若某个邮件日志同时包含在多个类型之中,评分时将以文件中第一条出现的结果为准。 选手在本次竞赛的持续时间内,每日提交次数不限。主办方将不定期进行阶段性评分,将队伍本题的得分以及所处的排名信息反馈给参赛队伍。在答题渠道关闭之前,参赛队伍均可根据反馈结果进一步调整检测算法。本题最终得分为参赛队伍在答题截止前最后一次提交结果的得分。
评分规则
赛题二评分的主要依据为邮件日志类型识别的准确程度,计算公式如下,赛题二的最终得分,按照30%的比重,加权计入线上积分赛的总得分。
这道题目的writeup我会好好分享。一方面真诚感谢主办方举办这个比赛,这期间您们真的非常辛苦,付出很多;另一方面,自己之前一直从事NLP和大数据分析方向近八年,这是第一次应用到钓鱼邮件分析,而且这题的排名一直第一。通过这个比赛也学到很多知识,简单分享下我的方法。
此外,比赛之后,我也尝试了其他大数据分析(知识图谱)及机器学习的方法,真诚希望这个writeup能帮助到需要的人及恶意邮件黑产分析领域。当然如果没有帮助,也算是对您们付出的一种感谢。如果有错误之处,还请海涵。
首先,我给这次比赛的思路绘制了如下的流程图。
作为一个数据分析人员,我首先想到的就是邮件主题(subject)、邮件正文(content)和发件人名称(fromname)三个字段进行文本分类,然后再进行算法优化和结果改进。总体思路分为两个阶段:
主题规则学习过程
在第一阶段我们主要通过规则进行匹配,这里使用了之前DataCon黑产比赛的部分种子作为规则库,最早匹配出“涉H(中)”、“约会涉H(英)”、“论文培训”、“发票”、“广告”、“钓鱼”、“涉赌”等主题。
其核心相当于一个半监督学习的过程,初始标注之后,每次统计结果都会进一步中文分词,然后统计高频关键词,如果某个类别中没有出现过类似的关键词,则扩充规则库,并且融入专家知识进行校对,从而不断学习。
邮件分类消歧过程
在第二阶段我们主要进行优化过程,包括邮件消歧和结果优化,这里包括邮件火星文字“城人”“出兽”等,同时解决ByPass问题,这些火星文字实际上是一种对抗文本,可以尝试word2vec来识别,比如与它共现的词组通常能决定其含义,比如“出兽”和“AV”“私聊”等关键词同时出现,其很大程度就是火星文字。接着进行相关的计算解决火星文字,但这里时间关系未去实现。内容校验方法包括:
接下来我们通过社交网络或知识图谱在已经明确分类的邮件中提取邮件域名,同一个域名出现某种类别的概率大于某个阈值时,认为该域名下的邮件很可能都是某个类别,例如钓鱼邮件或涉黄邮件,这里相当于为我们的邮件建立一个黑白名单,从而进一步优化某些分类错误的邮件。
最后,我们仅仅将异常(邮箱停用、邮箱警报等)类型分为钓鱼邮件,但其实还可以通过HTML、链接点击进行深入划分,比如设置颜色背景的、下载附件exe或者引诱你点击的很大程度就是钓鱼邮件,这里可以结合另外两道题目的思路进行优化,由于时间关于,我们也未进行相关操作。
总之,作者的算法思想相当于一个半监督学习的过程,不断扩充规则库,同时解决火星文字歧义、邮箱校对,最终实验分类。
比较遗憾,作者的本意是想通过右边的三种方法 “机器学习”、“知识图谱”和“钓鱼邮件分析” 相关知识进行邮件分类,由于分数还不错,但第三题和第一题之前一直较低。所以作者放弃了其他方法,专心攻克后面的题目,但比赛结束之后我也都用机器学习和知识图谱进行了相关的实验,也算弥补自己的过失。比赛终究是比赛,但更希望能学到知识,并且今后会进一步深入研究鱼叉式钓鱼邮件攻击相关知识,加油!再次感谢主办方。
Python在处理文本数据时,也融入了一些经验,其关键点包括:
同时补充一句,作者花了很长时间去测试最终的类别,最后测试是五个类别。但比赛前居然公布了,哈哈!一方面批评下自己,感觉没有尝试突破新方法;另一方面也弱弱吐槽下主办方,因为有的队伍可能都花时间去提升第三题,透露五类结果还是有点影响。但整体这次比赛非常赞,学到很多知识,真诚的感谢您们,也希望多多举办更多类似比赛,后续也会深入研究鱼叉式钓鱼邮件知识。
做这部分实验时,比赛早已结束。其实在比赛过程中我一直很纠结,到底要不要用大数据、LDA聚类、机器学习或知识图谱(社交网络)的方法进行分析。但由于我们分数一直排在前面,所以就把更多精力放到了第三题上面。这是比赛的残酷性吧!但赛后我还是迫不及待的用这些方法进行了尝试。
首先,我们前面已经分析出整个数据集包括五个类别(涉H&暴力、广告&钓鱼、论文&培训、发票&开户、约会&涉H-英),它们对应的词云图如下所示。
每个类别的核心关键词如表1所示。
某些特殊的QQ号和电话对分类结果影响较大,这些特征也可以提取出来作为黑白名单。其中发现2个比较特殊的涉黄QQ号,比如“361xxxx70”和”127xxx73”。
同理电话“135xxx8291”为发票高频电话,共748封发票邮件;同时发现2个比较特殊的发票QQ号,“958xxxx20”共550封,这些均可以作为黑白名单。
邮箱域名相当于企业的可信分数或者黑白名单,一定程度能增加钓鱼邮件的识别度,提高分类的准确率。我们前面已经分析出整个数据集包括五个类别:
下面补充知识图谱分析的各个主体高频域名,这些域名很大程度能决定一封邮件的类别,尤其是某些域名可能就是常年用于钓鱼。其关系如图所示。连线较粗的同样可以为企业的黑白名单,与APT攻击溯源类似,这些常用IP地址、C&C服务对我们的防御均有一定效果。所以作者上面的方法中,通过域名进行一定程度的优化,从而提升了分数。
最后,作者尝试用机器学习方法对文本内容进行聚类分析,类别设置为5类。同时,可以对邮件主题、正文聚类,再结合规则匹配及钓鱼邮件识别可能效果更好。
代码首先定义各字段变量,然后提取对应的值,这里的特点是提取了邮箱的域名作为后续的提升优化。
接着进行关键词的匹配过程,如下图所示,通过定义最简单的关键词进行匹配,用列表可能效果更好,注意所有英文字母转换成小写对比。
同时统计已分类文本的高频关键词,进行相关的规则扩充,当关键词不在已有规则中时进行扩充。这里的代码写的太差,更好的方法是定义列表进行匹配和扩充。中文分词采用Jieba工具,对应的关键词统计代码如下:
大数据分析中可视化展示也非常直观,这里可以常用词云WordCloud库进行绘制。
最后是邮件匹配校正的过程,这里简单设置某些邮件白名单进行校对。比如约会类别等。
总之,再次感谢清华大学Datacon和Coremail论坛,学到很多,感谢感谢!!!
了解常见的邮件安全协议,熟悉常见的邮件数据头部字段。在此基础上,自行设计检测算法,识别数据集中所有包含“发件人伪造(Sender Spoofing)”攻击行为的邮件。
数据为5000封左右的邮件信息,经过主办方的匿名化处理,仅保留邮件的头部字段信息。每封邮件均有唯一的ID编号,其中仅有100封左右的邮件含有发件人伪造攻击。
引用北大ccgo大佬们的解析,推荐大家学习。
通过对常见邮件安全协议的学习,相关RFC【5321-SMTP、7208-SPF、6376-DKIM、7489-DMARC】的浏览,并结合文献[USENIX2020]的内容。更加了解了 DMARC,DKIM, SPF 等邮件安全协议,如 DKIM-Signature, Authentication-Results 等字段中各标志含义,总结出几条较为显著的识别发件人伪造的规则。
解题思路
看到这道题,最开始考虑的是spf字段的内容,通过遍历这五千多封邮件,判断邮件中是否包含“spf=pass”字段,找到了23封邮件。
根据usenix 2020(Composition Kills: A Case Study of Email Sender Authentication),重点检查“From:”和“smtp.from”字段。如果有多个From字段,则很有可能是伪造邮件;如果只有一个From字段,含有多个邮箱,也有可能是伪造邮件;如果只有一个From字段,并且From字段只有一个邮箱,但如果这个邮箱与smtp.mail的邮箱不相同,那么也可能是伪造邮件。
代码实现
判断spf=pass和多个From字段的代码很简单,不过多介绍,这里主要介绍一下From字段和smtp.mail字段邮箱判断的代码。首先通过python的email库将DKIM-Signature和From字段的内容给提取出来,这里需要注意一个点,提取出来的字段可能有换行制表符(\n\t)如下图。
使用replace将制表符替换掉,再利用正则r’smtp.mail=([\s\S]*?);'匹配smtp.mail。在匹配From字段的邮箱时,使用了两种不同的正则方法。
第一种方法是提取<>中的内容作为邮箱,进行去重、大写转小写处理后,与smtp.mail相比较。如果不相同,则认为其是伪造邮件。这个思路其实是有缺陷的,没有考虑到其他情况(可能<>不存在,<>内不止一个邮箱,<>前面存在邮箱等),不过结合spf=pass和多个From字段的结果,共找到86个邮件,提交后全部正确,下图为部分代码。
第二种方法,主要是修改了一下From字段邮箱正则匹配,正则为r’([A-Za-z0-9_-\u4e00-\u9fa5.+]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+)’,其他思路,与第一种方法相同。将两种正则的结果加上spf=pass和多个From字段的结果,得到91封邮件(正确88封,错误3封,86.5分)
参考文献
- https://www.anquanke.com/post/id/218889
- https://i.blackhat.com/USA-20/Thursday/us-20-Chen-You-Have-No-Idea-Who-Sent-That-Email-18-Attacks-On-Email-Sender-Authentication.pdf
- https://www.usenix.org/system/files/sec20fall_chen-jianjun_prepub_0.pdf
在真实的企业网络环境中,一些攻击者总能想方设法绕过邮件检测引擎,使攻击邮件抵达员工的收件箱,最终达到窃取用户登录凭证等目的。与此同时,企业网络安全管理团队的精力十分有限,不可能实现对企业的全部邮件进行逐一审查。
如果你是一家企业的邮件安全负责人,能否基于数据分析,利用长达三个月的企业邮件服务器日志摘要信息,设计检测模型,输出一批威胁程度较高的邮件,以便于后续的人工审查。请注意:检测模型不允许使用第三方威胁情报,检测系统必须能够离线运行。
本题我们主要根据实际经验,选取重要字段,基于规则来构造检测模型,筛选威胁邮件。本题数据共798803封邮件,威胁邮件量级在5000-20000封。
数据字段含义如下表所示:
fromname字段筛选
根据FreeBuf网站博文《CNCERT钓鱼邮件攻击防范指南》,发件人地址是识别钓鱼邮件的重要信息:“如果是公务邮件,发件人多数会使用工作邮箱,如果发现对方使用的是个人邮箱帐号或者邮箱账号拼写很奇怪,那么就需要提高警惕。钓鱼邮件的发件人地址经常会进行伪造,比如伪造成本单位域名的邮箱账号或者系统管理员账号。”
我们首先筛选“fromname”(发信人名称)字段里含有管理员相关键词的邮件,筛选使用的关键词如下表所示:
筛选的代码如下(函数返回值True代表是威胁邮件,False代表不是威胁邮件。后续过滤函数返回值含义与此相同,不再赘述)。共筛选出了21611封邮件。
url和sender字段筛选
在这21611封邮件的基础上,我们继续筛选威胁邮件。下一个我们认为较为重要的字段为“url”字段。根据经验,钓鱼类威胁邮件通常情况下在邮件正文等地方会有链接地址,这个字段是相对比较重要的。我们发现在这21611封邮件里,存在如下图所示的,“url”为空的邮件。
我们认为“url”为空的邮件,其威胁性较小,因为从技术角度出发,不加链接的邮件成功钓鱼的可能性较小(本题无邮件的附件信息,我们这里先不考虑邮件会通过附件来实施钓鱼等恶意行为)。
另外,我们发现有不少“url”中包含“ccb.com”(中国建设银行域名)和“alibaba”(阿里巴巴公司域名)的邮件,从中提取到的url数量较多(如下图所示),这些域名根据经验判断逻辑上是互相关联的,我们认为其是威胁邮件的可能性较小。
因此我们决定将“url”字段为空和“url”字段中包含“alibaba”和“ccb.com”的邮件从威胁邮件的集合中剔除(“fromname”字段包含“admin”关键词的邮件仍然保留),筛选的代码如下,筛选后共有13830封邮件。
类似地,我们将“sender”字段中包含“alibaba”和“ccb.com”的邮件从威胁邮件的集合中剔除。筛选后共有13828封邮件。
region字段筛选
最后,我们发现在邮件的“region”字段,有部分邮件存在“骨干网”和“�”字符,从数据中人工查看了几封这类邮件,我们认为其威胁性较低,故将其从威胁邮件集合中剔除。
以上规则综合,可以筛选得到我们最终提交的威胁邮件集合。共计13789封邮件。最终我们队的F1-score为0.4551671442。
其他尝试方法,但分数提高较低。
写到这里这篇文章就介绍介绍,希望对您有所帮助。本文主要介绍了DataCon Coremail邮件安全竞赛之钓鱼邮件识别及分类知识。
欢迎大家讨论,是否觉得这系列文章帮助到您!任何建议都可以评论告知读者,共勉。
(By:Eastmount 2021-10-26 夜于武汉 http://blog.csdn.net/eastmount/ )
推荐文章:
自学篇(链接直接跳转到正文):
提高篇: