找回密码
 会员注册
查看: 21|回复: 0

钓鱼邮件演练小记

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
64454
发表于 2024-10-10 23:24:36 | 显示全部楼层 |阅读模式
钓鱼邮件演练小记 RainbowCava 到家安全 到家安全 到家安全应急响应中心(DJSRC)官方公众号;旨在搭建与白帽子沟通桥梁以及安全分享 11篇内容 2024年09月26日 10:53 北京 “水到渠成,朴素”黑产猖獗目有睹,安全意识弱又苦,预算贫瘠响叮当,甲方安全终有阻。开源工具巧组合,演练效果亦不俗,成本低廉效果佳,跟着步骤走无误。超长文预警,但绝对干货满满!小白可以无门槛看懂,有过演练经验也可以自取所需看看有无新的收获!01.演练规划02.演练准备03.Gophish 的简单使用04.绕开发件限制05.邮件头伪造06.钓鱼附件和二维码07.结果统计08.结语01—演练规划:我要打谁?要怎么打? 邮件话术?伪装手法?钓鱼演练的全部路线,其最终就是两个问题:目标群体+演练场景,搞定这两个问题,合适的邮件话术和模拟的攻击手法就水到渠成的出来了。醒醒,我们是甲方安全。我知道你们很想在演练中像个黑客一样用各种花活去炫技,但我们最终的目的是加强员工的安全意识。因此我们必须确保演练的内容与公司的安全需求紧密关联,抓住演练的主要矛盾:我要打谁?要怎么打?也就是目标+场景。先有鸡还是先有蛋?其实先确定目标还是先确定场景,这还真不一定。有时候你可能觉得一线业务人员的安全意识有点太薄弱了,于是先选定他们为目标再根据他们的业务特点去针对性设计演练场景。有时候是近期出了类似的安全事件,像是某部门某人被黑产撅了,又或者是公司老板被黑产冒名顶替发钓鱼邮件了,你想模拟这样的场景去做演练,然后再去找适合这个场景的目标群体。至今我们已经开展了不少次钓鱼邮件演练,有时候是搭配着针对特定群体的安全培训来——这时候我们是先确定群体,有时候是受一些安全事件驱动,我们想将这些宝贵经验以演练的方式生动形象的分享给同事——这时候我们是先确定场景。我们不妨各举一例,为大伙讲解演练规划大概要怎么整。从目标群体到场景 每一家稍具规模的公司都会有许多分工明确的部门,这些部门隔行如隔山,信息安全意识也不尽相同。比如说一线业务人员可能电脑都用不利索,技术部门的同学有一定的安全意识但没见识过黑产团伙的新型攻击手法。对于这样的情况,一刀切式的安全培训与钓鱼演练,往往会由于众口难调收效不佳,最终浮于形式。因此我们在完成面向全员的通识类的安全培训之后,有必要分别针对这些不同的群体开展主题培训与配套的演练。比如这个季度我们来给业务人员做培训,讲讲业务人员关心的办公安全,下个季度我们面向技术部门,讲讲更进阶的攻防对抗手法。在每次培训后,来一次面向培训群体的钓鱼邮件演练,从中招率来看安全意识培训的收效。像这样,有明确的安排,去按部就班的推进针对每个部门的培训和演练,这就是预先设定目标群体再设计演练场景的路线。在已知目标群体的前提下,我们能估计出这部分群体目前的安全意识如何,攻击力度调整到多少比较合适,他们的业务场景都有哪些,什么样的邮件话术能更激起他们的兴趣。这样钓鱼演练的路线就水到渠成了。从场景到目标群体 有时候我们会觉得近期出现的某类安全事件多的有点过分了,或者想推进某些安全工作但是大伙不配合,比如业务人员用某度搜索搜办公软件然后成功的进广告页下了个病毒下来,比如安全人员吆五喝六的让大伙升级 WPS 但是大伙就没把那漏洞当个事的,比如最近发现好几个 url 跳转漏洞但是研发觉得是低危漏洞就不想修的。这时候我们希望用演练的重拳打醒他们,那其实就是预设了演练要模拟的场景,比如做个假的软件下载页,比如投递触发 WPS 低版本漏洞的钓鱼附件,比如用 url 跳转去伪装钓鱼链接,让他们直观的感受到这类安全事件的威胁。像这样,受到一些安全事件的驱动,我们会预先设定一些场景,然后去找这些场景的“易感人群”,最后再根据目标群体的业务特点给场景做微调,这样我们也可以完成一条钓鱼演练的路线。重中之重:去了解你的同事 无论是从场景到目标,还是从目标到场景,最本质的一点,是去了解你的同事。去了解他们的安全意识现状,去了解他们会遇到的网络威胁场景,去了解他们的业务特点,摸透他们的习惯,对他们安全意识中最薄弱的环节发起突袭,如此方能令钓鱼邮件演练获得最大收效。这也是甲方安全必备的素质,与各个业务部门磨合,想群众之所想急群众之所急,千万别是把各种安全工具堆砌完之后,还不如黑产团伙懂你的同事,懂你的公司。02—演练准备:话术,素材,工具,资源 规划完路线后,去确认每一个战术细节,估计下完成这些细节需要哪些资源,然后开始筹备。接下来我们从战略到战术,在已经确定了演练的目标和场景之后,该如何设计针对性的话术,需要准备哪些素材,做出来一些邮件模板。然后我们再去考虑该怎么把这些邮件模板做成钓鱼邮件派发给目标,为此我们需要什么工具,要准备多少资源。话术+素材=邮件模板 现在假设我们已经知道了目标群体以及希望模拟的攻击场景,我的需要根据目标群体的业务特点去设计话术,根据模拟的攻击场景去准备素材,由此我们就可以完成一份演练的邮件模板。先看话术,话术能成立需要两个人:说话的和听话的。目前我们只明确了目标群体,所以我们必须明确另一端:我们作为发件人应当扮演一个什么身份。这其实就是让我们去全面的代入发件人,去说符合发件人身份的话,做符合身份的事。比如说我们想给业务人员发钓鱼邮件,我们可以选择伪装成客户。但如果客户平时根本就不是用邮箱和业务人员联系,业务人员的工作邮箱地址也没有对客户公开,那我们这么做就肯定会穿帮。有时候,伪装成一些内部的职能部门是可行的。这其实就是假设黑产团伙已经搜集了足够信息,对我们内部已经有了一定了解。冒充内部人员投递邮件穿帮的概率会小很多,但冒充内部人员开展演练除了需要注意邮件措辞进一步避免穿帮之外,还需要注意一个问题。有可能收到邮件的同学会对邮件有所疑问,直接上门去找咱们冒充的同学,然后被找上门的同学就会一脸懵逼,严重情况甚至会造成恐慌。所以有必要的话,应当提前知会咱们要冒充的内部人员,大伙统一演练口径,避免演练影响大家的正常工作和项目推进。同时邮件的话术也要适当的“避嫌”,它应该是一种似是而非的诱骗,可以蹭一些公司近期的热点但不要过于具体。比如最近公司可能要搞一些大活动,我们部门老板觉得可以拿这个主题做一个钓鱼演练,但仔细斟酌一下,如果我们抢在活动开始之前做了这个事情,等到活动真的开始的时候,大伙可能就会出现不信任的心态,导致活动效果打折扣。所以我们没有明着说活动细节,只是说了句类似“感谢大伙努力奋斗,公司有大奖相送”的空泛话术。这样既可以在活动开始前强化大伙的安全意识,又不会为真正的活动推进带来额外阻力。 在想好如何“哄骗”演练目标之后,你还得把能用来追踪目标中招状态的东西放到邮件里边。它可能是个钓鱼 url ,指向一个钓鱼页面,也可以是个钓鱼附件,或者其他你想要的东西。这些就是演练用的“素材”。根据你演练的场景,画个假的 OA 登录页面,或者做一个可执行文件作为钓鱼附件,然后把它们放在邮件里合适的地方就可以。这样你就完成了一个“邮件模板”。具体怎么去做,后续我们会讲如何借助开源工具完成邮件模板。最后,你可以考虑根据目标群体当前的安全意识强度,给你的邮件加点“调料”,让它看起来没那么假,又或者故意在一些小地方卖点破绽。举个栗子:钓 鱼 演 练 危 机 合 约工具和资源 假设我们完成了以上的前期准备,要进行一次最基本的钓鱼链接邮件演练,现在看看我们还要做些什么:把邮件发出去(搭一个邮件服务器还是调用第三方邮件服务?)邮件里边放个钓鱼链接,指向我们做的钓鱼页面(画个HTML页面)目标点击链接填数据,把中招状态打给我们(钓鱼页是个公网服务)汇总结果(人肉整理 excel)其实这里面最关键的地方就是两点:把邮件发出去,然后能让目标访问到钓鱼页面。我们需要保证目标无论在哪都能访问到我们的钓鱼页面,这也就意味着我们需要一台公网服务器,视情况还可能需要一个 SSL 证书,这就需要再申请个域名(非公司的域名),还要涉及域名备案。然后再把我们的钓鱼页面放上去。它本身不再处理其他的逻辑,只负责记录钓鱼演练结果,最低配置的服务器就可以。在发送邮件的步骤,搭一个邮件服务器挺麻烦,第一次的话,我们可以注册几个第三方邮箱开启SMTP服务试试水,调用第三方的SMTP服务去批量的给多个目标发送钓鱼邮件。开源工具 Gophish 就可以做到这一点。下面看看我们如何用 Gophish 最朴素的原生功能完成一次钓鱼演练。03—演练执行:先从朴素的开源工具开始 没关系,第一次的话,能把邮件发出去就很厉害了。会用 Gophish 原生功能想看进阶操作的可以跳过这章,但如果只是会用的话,还是推荐看看里面有没有你感兴趣的原理和技术细节。现在我们来看 Gophish 这款开源工具,第一次我们先用它最朴素的原生功能来做演练。首先是部署,Gophish 工具依赖 Glibc >= 2.28,升级有风险,可能需要先打快照方便回滚。Glibc 升级参考:https://cloud.tencent.com/developer/article/2021784运行文件前需要检查配置文件 config.json。 升级完成并确认配置无误后运行可执行文件 gophish 即可启动服务。访问钓鱼管理地址,输入默认用户名和口令,进入管理页面。配置一个邮件模板 现在我们需要把之前筹备的内容塞到这个平台里边,首先看看邮件模板怎么弄。点击 Email Templates 进入邮件模板编辑页面。 (别被我的名字误导了,Gophish 原生并不支持钓鱼二维码,后面我们讲怎么弄钓鱼二维码,这次我们先只做钓鱼链接) Gophish 支持直接导入邮件原文,所以你完全可以先给自己手动发一封钓鱼邮件,然后查看邮件原文,全选,贴里边。勾选下边的选项的话,Gophish 会自动把钓鱼邮件里的跳转链接替换成钓鱼链接。有同学应该发现华点了,在配置邮件模板的时候,有两个看起来意义不明的选项,一个是添加追踪邮件打开状态用的图片,另一个是将跳转链接替换成钓鱼链接,下面我们展开讲这两点的细节和原理。首先我们看看它这个“追踪邮件打开状态用的图片”是怎么一回事。在创建模板的时候勾选这个选项,保存,再点开查看邮件模板的 html 源码,拉到最底下,你会发现它多了个这个: 搓过 flask 服务的同学应该立刻反应过来了,这是一个类似 Jinja2 的模板写法。当 Gophish 向目标派发邮件的时候,会识别这个{{.Tracker}} 标识,然后把它替换成一个图片元素。目标打开邮件加载邮件内容的时候,会对这个图片元素的来源发起请求,而 Gophish 收到请求后,就会把目标的状态置为“已打开邮件”,由此实现对用户是否打开邮件的追踪。(是的,这是一个网络信标)在这里有一个要点,如果你的钓鱼页地址没有合法的 SSL 证书,没有开启 HTTPS 的话,浏览器或者邮件客户端会很大概率拒绝加载这个图片元素导致难以追溯目标是否打开邮件。因此SSL 证书是很关键的一个前置资源。然后我们看看它是怎么把超链接换成钓鱼链接的,在导入邮件原文的时候,我们勾选那个“将跳转链接替换为钓鱼链接”的选项,然后看看邮件的 html 源码,发现链接的部分被替换成了这东西:同样是Jinja2 的模板写法,Gophish 向目标派发邮件的时候,会识别这个{{.URL}}标识,然后替换成指向钓鱼页的链接。邮件模板里还支持其他的变量,可以通过这样的语法写在模板里,具体支持哪些变量,可以看下 Gophish 的官方文档。记不下来其他的也没关系,反正这些很快就都用不上了。细心的同学可以留意到这里边有个名叫 rid 的东西,可以留个心眼,以后 rid 这个参数有大用处。配置一个SMTP服务 配置完邮件模板之后,我们还需要一个邮件服务去把邮件发出去。Gophish 本身并不会给你的服务器开启邮件服务,它是调用邮件服务发送邮件,需要你配置你在第三方邮件服务的登录凭证(或者你本地起一个邮件服务然后把它填到 Gophish 里边)。比如说我们注册个某易邮箱,在设置里开启 SMTP 服务,然后把账号密码写到里边。进入 Gophish 的 sending profiles,填入你在第三方邮件服务的登录凭证。在这里你可以添加一些邮件头,也可以尝试自定义 SMTP From,但是第三方邮件服务一般都有对应的安全策略,这些改动很可能导致第三方邮件服务拒绝将你的邮件派发出去。我们后面再讲如何起一个没有发件限制的本地邮件服务,现在先规规矩矩的把我们的登录凭证往里边填就行。完成配置后,可以往下拉给你的邮箱地址发一条测试消息,收到这条消息的话,就说明你的 SMTP 服务配置成功了。配置一个钓鱼页面 现在我们能把带着钓鱼链接的邮件发出去了,接下来我们看看如何把钓鱼页面放在 gophish 里边。点击 Landing Pages ,在这里可以把你提前写好的html页面贴进去。你也可以试试它那个导入站点的功能,虽然偶尔不好用。但是这个 html 页面怎么弄,其实很有讲究。有时候你从别的网站刨下来个静态资源,确实能画出来个一模一样的钓鱼页面,但是提交的表单数据却没办法被 Gophish 获取到。官方文档在 FAQ 里提到,你的 html 页面在提交表单的部分,需要遵循一些约定。但其实这不是问题的本质,Gophish 采集用户提交数据的原理是,Gophish 认为向钓鱼链接提交的 GET 请求是用户点击了链接,向钓鱼链接提交的 POST 请求是用户提交了数据。只要形如下图的 POST 数据包到了钓鱼链接,Gophish 就可以把数据记录下来。并不一定非要用形如那样的表单来提交,你用别的方式构造请求,只要最后的数据包长下边这样,并且确实打到了钓鱼链接,那就没问题。至于钓鱼链接在哪——还记得 {{.URL}} 吗?钓鱼页也支持这种模板,如果你想自己写一个提交 POST 请求的方法,就提交给{{.URL}} ,当然用官方推荐的那种表单格式,置空 action 是最方便的。那么现在我们配置好了邮件模板,配置好了 SMTP 服务,画好了钓鱼登录页,该配置目标群体了。配置目标群体 点击 Users & Groups,创建一个目标群体。Gophish 支持通过导入 csv 创建一个具有多个用户的目标群体,所以推荐先把目标名单填到 csv 里再一键导入。终于可以配置钓鱼任务了 现在,总算完成了全部的准备,进入 Campaigns ,把你配置好的东西填到钓鱼任务里就可以了。进入任务页可以看到目前的统计数据。细心的同学在点击列表里的演练目标时,会发现这个小东西:这是 Gophish 创建任务时,为每个任务目标设置的唯一标识:rid。Gophish 在进行模板渲染的时候,会将 {{.URL}} 渲染成带参数的钓鱼链接,这个参数就是 rid,用来标识是哪个目标中招了。无论是打开邮件加载的图片标识,还是点击钓鱼链接,还是提交数据,都带有这个参数。所以 Gophish 发送给每个目标的邮件内容都不是完全一样的,差别就在这个唯一标识上,每个人收到的钓鱼链接,都带有这个独一无二的 rid。04—演练执行 pro:绕开发件限制 Gophish 本身并不会提供邮件服务,它只是调用第三方邮件服务。这也就意味着你的邮件不仅会经受收件网关的安全审查,还要受到发件网关的限制——次数、流量、内容安全……到处是坑。但是,发送电子邮件报文这件事本身,根本不需要第三方邮件网关,有一款工具可以帮我们直接发送邮件报文—— swaks。如果你用开源工具的最朴素的功能,用第三方的邮箱账号试着打了一次演练,你会发现处处碰壁,最要命的地方就是发件网关对你的限制。当时我们第一次用开源工具做钓鱼演练,发现有个账号一天发了几百封邮件就发不出去了,到第二天 0 点的时候才恢复。另一个账号在发送带附件的钓鱼邮件,每天发个几十封就发不出去了,也是到 0 点才恢复。这意味着,即便你的邮件内容能通过发件网关的安全限制,你照样要受到发送数量和流量的制约。而且毕竟用的是外部的邮箱账号,看着一眼假,效果很难说好。一种解决方案是,自己搭一个邮件服务,开启 SMTP,然后把咱自己的邮件服务地址和登录凭证啥的填进去,让 Gophish 去调用它的 SMTP 服务,在网上能找到的大多数分享基本都在这么做,如果你打算做成那样就可以的话,那阅读就可以到此为止了。但如果想做的更深入的话,今天我们搞点不一样的。 搭建邮件服务的时候我们肯定会吐槽这东西有好多我们用不上但又不得不配置的麻烦事,毕竟我们就只是想把邮件发出去,至于其他的邮件管理功能我们根本就不 care。就没有一种贼轻量化的工具,直接把邮件报文塞收件网关嘴里吗?有的,它就是 swaks。就是这小子,一个贼轻量化的命令行工具。下载,可执行文件开箱即用,非常方便。先进,全面超越 相比于老式的各种邮件服务工具,swaks 的方便之处在于:基本没有依赖,完全的开箱即用(配过邮件服务器的同学应该开始流口水了)不用配置邮件服务(啊?)一般也不需要邮箱域名,不需要配置解析啥的(啊??)它的工作原理是,暂时在本地的 25 端口开启一个 SMTP 服务,然后把邮件报文塞给它,邮件服务根据收件人邮箱后缀和收件网关建立连接,把邮件报文派出去,然后就没有然后了。只要你的钓鱼服务器能把邮件报文派出去——也就是你的 25 端口能和其他的 SMTP 服务器建立连接就 OK,我试过腾讯云的服务器直接就能用,可能别家的服务器需要额外给自己开一下 25 端口确保能把邮件派出去。用 telnet 测试一下连通性就行:telnet smtp.qq.com 25没有任何其他的弯弯绕绕,就是一个最纯粹的把邮件报文塞到目标嘴里的工具,这是最符合我们需要的好东西!当然,轻量化到极致的它,有且只有发件功能。它没办法像正经的邮件服务那样,有很直观的管理页面,可以看到收发邮件的内容,尤其是拒信的通知。这是它对演练方来说最痛的地方,它没办法让你去统计真正有效发送的邮件有多少。但是好消息是,我们完全可以让几乎每一封邮件都能成功发送,所以这个小瑕疵不影响。后面我们会说,如何让有效投递率达到百分之百。用 swaks 发送一封邮件 先用最简单的功能,发送一个测试邮件吧。 ./swaks --to --from 嗯,就这么简单,试试把收件邮箱地址填成自己的,它会给你的邮箱地址发送一封测试邮件。发件邮箱地址随便填就行。但是先别急,一般情况下,你肯定收不到这封测试邮件。你肯定要问:这封邮件报文是从咱的服务器里出去的,咱的服务器压根就连个正经的邮箱域名都没有(假设你没配置),发件邮箱地址也是瞎写的,这咋发出去啊?直接说结论,首先,在你的收件邮箱设置里边,给 evil.com 过来的邮件加个白名单。然后,改一下发件邮箱地址: ./swaks --to --from 114514@evil.com然后你就可以收到测试邮件了,是不是很神奇?(如果你还没收到的话,可能是你的收件网关不喜欢 evil.com过来的邮件,不要慌,我们先看原理,看完了你就知道该怎么办了) 为什么填别的发件地址,填什么某Q邮箱,什么某易邮箱,通通不行,给他们加白名单也不顶用,但是填 evil.com 就能行?这邮箱域名是何方神圣?一脸懵逼的同学先别急,下面我们来详细解析这背后的原理——电子邮件投递与SPF电子邮件是怎么发出去的? 大伙用惯了各种邮件服务,平时都是拿账号密码去登录邮箱客户端收发邮件,但是,账号和密码,都是第三方邮件服务提供商加上的安全措施。而发送电子邮件这件事本身,根本不需要账号和密码。你在刚才执行 swaks 的时候,应该看到了这样的内容:这里边控制邮件流转的是两个 SMTP 命令:用于声明发件人的 MAIL FROM ,以及用于声明收件人地址的 RCPT TO。而邮件头中的 To 和 From,只是用来供客户端解析和展示收发人信息的内容,不参与邮件流转的控制。 swaks 在执行的时候,暂时给本地的 25 端口开了个邮件服务,然后把你命令行中的收件发件地址作为 SMTP 命令填给本地的邮件服务,再把报文打过去。本地的邮件服务根据 RCPT TO 命令中的收件人地址,把邮件报文派发给收件人邮件后缀的邮件服务器。经常挖漏洞的师傅应该已经发现华点了:这发件用的邮件服务器是咱本地自家开的,也没加任何额外的安全限制,所以 MAIL FROM 填的是什么,其实咱们发件服务器这一边并不关心,哪怕我们根本就没配置邮箱域名,哪怕我们填的是个鬼知道在哪的邮箱后缀,它都不会拒绝。随便胡诌八咧一个地址都没问题,我们自家的服务器并不会为难我们。我们的发件服务器会很忠实的根据 RCPT TO 的内容,和目标收件服务器建立连接,把邮件报文派出去。也就是说,发件这一块已经完全落入我们控制了。只要收件服务器没有拒信,就没什么拦得住我们发邮件了。拒信的可能性有很多,比如邮件来源信誉,比如收件网关配置的黑名单,比如邮件文本内容安全与合规,比如邮件附件安全等等。但我们先不考虑内容层面的安全绕过(这里边各家收件网关的检测模型都不一样),先搞定一个最重要的问题—— SPF。SPF 是啥? 敏锐的师傅们已经察觉到了一个问题:咱们自家起的邮件服务器根本不管MAIL FROM 身份上的合法性,只管派发邮件,那收件网关如果不做任何限制的话,垃圾邮件将没有半点成本,而且还可以随便假冒发件人。所以收件网关必须验证和他建立连接的发件方,到底有没有资格去代表 MAIL FROM 里的邮箱,SPF就是一个应运而生的解决方案,全称为“Sender Policy Framework”,即“发件人策略框架”。我们把自己代入收件网关的视角,看看如果我们想做校验的话,手头都能拿到什么数据?和收件网关建立连接的,发件服务器 IP 地址MAIL FROM 命令的内容,也就是发件邮箱地址,最关键的是它的后缀,也是域名我们拿到了 IP,我们拿到了域名,有什么东西能把这俩关联起来不?顺着这个思路,我们会得出一个很朴素的结论,这就是 SPF 的理论基础:它是一个基于 DNS 查询的邮件来源合法性校验。具体来说,SPF 涉及两个主体:配置 SPF 策略的邮箱域名持有者,以及通过 DNS 查询检查来源是否合法的收件网关。发件邮箱域名的持有者为了防止其他人仿冒自己的身份,会在 DNS 中配置 一些 DNS 记录(往往是 TXT 类型),声明有哪些 IP 地址可以声称自己是这个邮箱域名的发件人,这其实就是一个 IP 的白名单。收件网关则通过邮箱域名去查询 DNS,检查与自己建立连接的发件服务器是不是在名单里面。举个栗子,假如我们 MAIL FROM 中填了个某Q或者某易邮箱的地址,收件网关拿到邮件报文就会去发起 DNS 查询,去问一嘴:“这IP地址是他们家的不?”结果发现我们发件服务器的 IP 地址人家压根就不认,那收件网关肯定不会接收这条邮件。那么问题来了,为什么我们声称自己是来自 evil.com 的邮件就没问题?难不成人家认可我们的 IP 地址?我们不妨用 nslookup 查询一下,看看这个域名和某Q到底有什么不一样。试试下边的命令,比对这几个域名的区别:nslookup -q=txt evil.comnslookup -q=txt qq.com不用在意前面那一堆东西,反正咱们发件服务器的 IP 地址肯定不会在他们的白名单里。重点在最后面: 这里的all 代表所有不在白名单列表中的 IP 地址,而SPF 有四种机制:硬失败、软失败、中性和允许:硬失败 -:拒绝,往往和 all 搭配用来拒绝所有不在白名单的 IP 地址,也是最常用的一种配置。软失败~:不认可这个邮件来源,但是把决定权留给收件网关。可能不会被拒绝但是会被标记为可疑或垃圾邮件。中性 :不管不问,无论来源 IP 是谁都不置可否,对多数邮件网关来说,结果上类似于默认。一般不会因为 SPF 的结果被拒信,但可能因为域名信誉之类的其他原因被收件网关拒信或丢进垃圾箱,一个典型就是 evil.com。允许+:允许。这样一看,先前的所有疑问就都迎刃而解了。为什么 swaks 的发件邮箱填写成某Q邮箱半点水花没有,为什么填成 evil.com 多数收件网关不会拒信但很大概率进垃圾箱需要添加白名单,它就是这个原因。也就是说,如果我们使用 swaks 派发钓鱼邮件的话,我们甚至不需要一个邮箱域名,直接照搬 evil.com 就能用,跟 IT 说一声演练期间给 evil.com 开个白名单就能行。当然,最合乎周礼的方式还是自己搞一个邮件域名,然后配置一下解析确保发件服务器的 IP 在 SPF 的允许列表。(如果你的收件网关出于域名信誉之类的原因拒收了 evil.com 的邮件,也需要自己配一个邮件域名)Gophish + swaks(简单模式) 现在我们看看这东西如何和 Gophish 联动。我们刚才尝试了 swaks 发送测试邮件,知道了它的原理是在本地“临时”启动一个 SMTP 服务然后发送邮件。那我只要让这个服务一直“临时”下去,然后把这个服务配置给 Gophish 行不行?说干就干!直接后台运行 swaks,它就会启动 SMTP 服务。(记得丢弃掉它的输出,不然大量的 To: 写入到 nohup.out 文件会刷爆磁盘)nohup ./swaks > /dev/null 2>&1 &然后我们来配置 Gophish 的发件设置,显然的,这里的 host 是部署 swaks 的服务器,和 Gophish 挤一台服务器的话,那就是本地。如上文所说,SMTP From 填成一个后缀是 evil.com 的邮箱(如果你没有邮箱域名的话)。给我们自己发送测试邮件,成功!这样我们就把发件的主动权牢牢掌握在了自己手里,再也不用受第三方发件网关的安全限制制约了!如果你只打算做钓鱼链接类型的钓鱼邮件演练,做到这个“简单模式”就可以了。但如果你打算再做的深入一些,你肯定会在后文见到与之相对的“困难模式”。05—演练执行 ultra pro:邮件头伪造 Gophish 就可以直接配置邮件头,由此可以进行一系列伪装,在客户端层面哄骗目标。但想做的再深入一些的话,我们一起看看这块的原理,这也是为后续的“困难模式”做准备。如你所见,114514@evil.com 这个发件人过于一眼假,再蔡的目标也能看出来不对劲。为了解决这个问题,我们有两种选择:去申请一个域名,然后配置一个解析。域名是一个高仿域名,和正确的公司邮箱域名只差一点点,不仔细看看不出来。反正钓鱼链接也需要高仿域名,顺便给它配个 TXT 类型的解析保证 SPF 校验结果正确就行伪造邮件头,客户端展示的邮件地址就是真的,但其实来源根本就不是那个。让目标看去吧,不会看邮件原文的话,看十天十夜都看不出来问题 当然这两种选择完全可以“我全都要”,不过申请高仿域名配置解析不必细说,这一章我们主要来说说邮件头伪造的事。先说结论 我们先直接顺延上一章的“简单模式”,试试 Gophish 自带的邮件头伪造功能。举个栗子,假如我们要冒充某个 HR 姐姐,以通知的名义诱骗目标点击钓鱼链接。不失一般性,假设 HR 姐姐的工作邮箱是 hr@test.com。你大可以换成你们公司的邮箱后缀,甚至真实的员工邮箱地址,都没问题。然后在 Gophish 里面,配置邮件头的地方新增一个这样的键值对:然后给自己发个测试邮件,打开 outlook、foxmail 之类的邮件客户端瞅一眼,你会发现展示的内容完全就是你在邮件头里声明的内容。这就是邮件头伪造的威力,还要甚么高仿域名。你能看到的一切都是真的,偏偏这邮件就是假的,这谁防得住?再说原理 为什么我们可以肆意冒充其他邮箱账号?为什么收件网关不管不问?为什么邮件客户端展示的是伪造过的结果?我们再捋一遍邮件投递的全过程,答案就呼之欲出了。发件服务器接收命令,收到用于声明发件人的 MAIL FROM ,以及用于声明收件人地址的 RCPT TO,根据 RCPT TO 的信息连接收件服务器,将邮件报文和命令信息提交给收件服务器。邮件报文的 To 字段和 From 字段则记录收发人的信息收件服务器收到邮件,根据MAIL FROM 命令的值,进行 SPF 校验,校验通过,则将邮件报文进行保存邮件客户端从收件服务器获取邮件报文,根据邮件报文的To 字段和 From 字段展示收发人的信息仔细看这个流程,有什么重要的东西在这个过程中被丢掉了!没错,如果收件服务器没有把MAIL FROM 命令的值以某种方式编辑进邮件报文再保存入库的话,邮件客户端是根本不知道邮件的真实来源的!我们来看一下邮件原文,例如我们在使用某大厂提供的企业邮箱服务,看看我们收到的邮件原文是个什么样子,可以看到,我们的收件网关在邮件头记录了真实的邮件来源: 出于安全的考量,部分邮件服务商在收到邮件的时候,确实会把MAIL FROM 的值写到邮件头里面再入库。但是如何保存 MAIL FROM 的值,并没有一个统一的格式或者标准。不同的邮件服务商,他们的记录方式都可能千人千面。这也就意味着,普适性的邮件客户端产品,根本无法识别真实的邮件来源,即便这个来源已经以某种格式记录在了邮件头当中!举个栗子,和这个收件网关配套的邮件客户端,它认可自家产品写的真实来源,存在解析这个内容的逻辑,所以可以在页面展示真实来源:(当然这个来源其实也不真实,只是通过了 SPF 校验而已,其实也是我们仿冒的)但对于其他邮件客户端,他们又不认识友商搞的这些弯弯绕,他们不会解析这种独特的信息,于是用户就是两眼一抹黑。再 放 送那你可能会问了,既然存在这种仿冒的问题,为什么收件网关在做校验的时候,不去检验MAIL FROM 命令的值和邮件报文中的 From 字段是否一致呢?因为这个世界上真的存在代收发邮件的需求(作为协议,作为标准,作为推广使用的产品,人们照顾到了这种需求,于是恶意邮件和正常邮件的区分度就放在了别的地方。人们搞出了 SPF,人们搞出了基于邮件内容、来源信誉、还有各种维度的综合检测模型。但邮件头伪造是无解的,因为只要我们通过之前的步骤突破了 SPF,没有因为内容安全导致收件网关拒信的话,我们的所有行为就都是合法的。我就是代收发了一封邮件,你能说什么嘛?甚至说,如果我们伪造的邮件头 From 字段是企业内部邮箱,收件网关可能还会认为我们的信誉比较好,从而放宽对其他检测的限制(外部链接、邮件附件等)。这就是 SMTP 协议天赐给我们的突防手段,当我们从根源去看这件事情的时候,一切的对抗技术都成了水到渠成的朴素结论,都是那个时代的人们会自然而然做出的权衡和抉择。如果收件网关没有对来源做正确的记录,如果不是配套的收件网关和客户端,用户根本看不穿我们做的伪装。由此,我们就做到了钓鱼邮件投递的极致。06—演练执行 ultra pro plus:钓鱼附件和钓鱼二维码 现在发邮件这事我们已经做到极致了,看看我们能在邮件内容上再搞些什么事情。 仔细梳理我们的需求,结合我们之前做过的事情,“困难模式”也不过是一个水到渠成的朴素思路。每次演练都是钓鱼链接的话,未免过于索然无味,而且适用的场景也不全面。长此以往,同事看一眼邮件内容就能把咱们认出来,只会助长同事的迷之自信,反向培养安全意识。这一章我们来看看怎么用 Gophish 搞出来别的场景,什么钓鱼附件,什么钓鱼二维码之类的。然而走到这里的大伙,肯定已经对 Gophish 原生的能力有了认知。仅仅使用原生的能力,做个钓鱼附件场景都费劲,更不用说二维码之类的场景。我们将不得不面对“困难模式”,毫无疑问,这是一次直面 Gophish 原理的挑战。先从 Gophish 原生的邮件附件开始 尽管很拉,Gophish 原生还是自带了邮件附件功能的。(这个附件内容会写进返回的 HTTP 数据包,在加载邮件模板页的时候返回来,所以如果你上传的附件过大的话,页面会卡的要死)抛开页面卡死的问题不谈,单说这个附件。我们确实可以直接搞一个远控进去,但我们不是为了真的拿下大伙的电脑,我们最终的目的是要统计出多少人中招了,都是谁中招了。有什么办法能知道是哪个目标中招了吗?思维活络的同学准备开始八仙过海了,手头有啥数据就采集啥数据呗?比如说收集网卡 MAC 地址,看看能不能在自家的资产库里找到终端使用人。比如说故意触发 EDR 告警,然后看看 EDR 后台报毒终端的使用人是谁。这些思路都很不错,但问题就是都要关联到外部的数据源。这类数据源每家做的都不一样,不一定全也不一定准。而且这么一来,数据的统计就和 Gophish 割裂开了。Gophish 最多只能追溯到有多少人打开了邮件,至于附件的状态,Gophish 后台并不知情,导致最后的结果统计就必须两边的数据拼在一起看。就没有一种办法,能够让 Gophish 追溯到附件的状态吗?Gophish 眼中的用户状态 其实在之前的章节里面我们提到过 Gophish 如何去追溯用户的状态,我们整理一下,再看一遍整个流程:Gophish 创建钓鱼任务,对每个目标分配唯一的标识:ridGophish 渲染邮件模板,将 {{.URL}} 替换成带有 rid 参数的钓鱼链接,将{{.Tracker}} 替换成带有 rid 参数的图片元素地址,发送给目标目标打开邮件,加载图片元素,Gophish 收到请求中的 rid 参数,将目标标记为“打开邮件”目标点击钓鱼链接,Gophish 收到 GET 请求的 rid 参数,将目标标记为“点击链接”目标提交表单数据,Gophish 收到 POST 请求的 rid 参数和表单数据,将目标标记为“提交数据”现在,遮住上面这个流程中所有“钓鱼链接”的字眼,Gophish 并不关心用户是通过点击链接还是通过 Burp 发数据包还是别的什么方式向它提交了请求,Gophish 只要收到对应的请求,就会更改目标的状态。所以想要和 Gophish 进行联动的话,你的钓鱼附件只需要做一件事:向“钓鱼链接”提交一个带有目标 rid 的 GET 请求。这样一来,只要目标运行了附件,他在 Gophish 的状态就会变成“点击链接”,我们统计的时候把这个状态名字改成“运行附件”就行了。不需要什么远控,不需要什么免杀,随便用哪个语言写一个可执行文件都没问题,你只需要提交一个 GET请求。而且这东西确实不是病毒,收件网关也不会为难你,双喜临门。但先别高兴的太早,每个目标的 rid 显然是不一样的,所以派发给每个目标的附件其实也都是不一样的。我们必须在发件阶段根据目标的 rid 去编辑每封邮件里的附件内容,让目标收到带有正确 rid 的附件。而 Gophish 的模板渲染能力,显然不支持这个。该来的,终究还是来了。Gophish + swaks(困难模式) Gophish 的邮件模板渲染功能终究是有极限的,对于钓鱼附件这类场景,它已经开始力不从心了。我们必须自己动手,搭建一个可以支持钓鱼附件渲染的工具,和 Gophish 进行对接。各种可以触发网络请求的钓鱼附件都不尽相同,除了自己搓一个 .exe 文件,xlsx 表格、 PPT 甚至快捷方式都可以触发网络请求。它们具体的构造肯定有不一样的地方,但有一点是共通的:你得把钓鱼链接以字符串的形式写进去,硬编码是比较常见的一种方式。以 .exe 为例,就拿最简单的 python 来说,写一个调用 requests 库提交 get 请求到钓鱼链接的程序。我们先给自己创建一个钓鱼任务,让Gophish 给我们发一个钓鱼链接,把钓鱼链接写死在程序里边(带着我们的 rid),打个包。然后,用二进制文件查看器打开,看看效果:即便是打包成了六亲不认的二进制文件,硬编码的钓鱼链接其实也是完完整整的躺在里面的。只要你这个程序写的没问题,运行它 Gophish 就会收到向这个链接带着这个 rid 提交的 GET 请求,然后更改你的状态。所以对于带着不同 rid 的不同的目标,我们没必要挨个给他们打包可执行文件,只要以二进制的方式读取并修改文件中 rid 的部分就可以。好消息是,Gophish 的 rid 长度是固定的,这个修改并不会破坏程序的堆栈结构。这个过程完全可以搓个 python 脚本来做。这样,我们就完成了一个“附件模板”,原本写死的 rid 内容就相当于是占位符。我们的脚本读取附件模板之后,把占位符替换成目标的 rid 就可以了。这个附件模板也不用上传到 Gophish,反正它的处理是由你的 python 脚本执行的,丢在服务器上就行。完成附件渲染之后的我们又面临一个新的问题:我们渲染好了附件怎么把它塞回给 Gophish 呢?答案很简单粗暴:不塞。在“简单模式”里,我们让 swaks 启动了一个邮件服务,再让 Gophish 调用这个邮件服务。但别忘了,仅仅 swaks 本身,也可以直接发送邮件。swaks 支持我们编写好邮件报文写入到文件里,然后它读取文件再发送邮件。所以我们完全可以不管 Gophish,直接写好邮件丢给swaks。那么我们的逻辑就是这样的:Gophish 创建钓鱼任务,为每个目标生成 rid但是 Gophish 并不能胜任附件模板的渲染工作,所以我们不打算让它发邮件。我们给它配置了一个永远连不上的邮件服务器地址,Gophish 实际上一封邮件都没发出去。没错,我们用它创建任务,仅仅是为了它生成的 rid通过 Gophish API,读取任务信息,包括目标有哪些,邮件模板内容是什么对于每一个目标,根据 rid 的信息渲染邮件模板,把{{.Tracker}} 替换成带有 rid 参数的图片元素地址。然后读取你想要的附件模板(假设你把附件模板丢到了服务器的某个路径下边),将附件中的占位符替换成 rid把渲染好的模板连同渲染好的附件拼一块,写成邮件报文,保存成文件。python 的 email 库可以帮助你生成邮件报文文件,具体可询问大模型调用 swaks,读取文件,配置收发件人信息以及伪造的邮件头(因为没用 Gophish 发邮件,伪造的邮件头得在命令行里面写),然后发送邮件,命令如下:./swaks--to\--from\--h-From: \--data\考虑到发送邮件的时候会根据不同的主题伪造不同的邮件头,我们需要在一个地方配置好这次钓鱼任务伪造邮件头的内容,配置在哪里都没问题,只要你的脚本能拿到这个数据就行。为了直观的维护和配置这个逻辑,我们使用了某个开源的工作流框架。我们编写了针对钓鱼链接、钓鱼附件、钓鱼二维码三种邮件模板的渲染逻辑,这个流程图好像一杆鱼叉一样,甚是应景。但我们只是以此举一个例子,无论是用什么框架,什么技术栈,搓一个什么样的脚本或者服务,只要以上面的逻辑沟通 Gophish 和 swaks,就能突破 Gophish 邮件渲染能力的极限了。有细心的同学可能发现了一件事,我们处理的流程中,故意设置了“等待一段时间”的节点。这是因为一口气派发一大堆邮件容易被收件网关查水表,所以我们每封邮件直接会隔上几秒钟的时间。几秒钟?会不会太短了?对于同一个发件人来说是不是过于频繁和可疑了?你说的对,所以我们可以做成“不同的发件人”。我们让每封邮件的 MAIL FROM 都不一样,具体来说就是让每个发件邮箱都带上一串随机的字符串,这个字符串是现成的,就是 rid。这样在收件网关看来,就是业务高峰期,一个大型企业收到了另一个合作方的一大堆邮件,来源都不是同一个人。收件网关可能会感叹:“啊,合作真密切啊”,但这个行为是正常的,并且也是会真实存在的。毕竟我们已经通过了 SPF,我们的邮件内容也没有任何威胁性质(附件还真就不是病毒),来源还在白名单里面(演练前找 IT 小伙配的)。这就是我们确保百分百不会被退信的底气。这就是 Gophish + swaks 的困难模式,我们架空了 Gophish 处处掣肘的邮件处理能力,现在它只负责为每个目标分配 rid,以 API 的方式提供数据,然后跟踪记录目标状态。邮件是我们自己渲染的,发件是 swaks 完成的,SPF 和邮件头伪造的事咱们之前也说了。至此邮件从渲染到发送到状态追踪的全部流程纳入我们控制,管他甚么场景,甚么主题。现在能阻止我们发挥的,只有《刑法》(手动狗头)。钓鱼二维码 在吃透 Gophish + swaks 的困难模式之后,钓鱼二维码就是挥挥手就能搞定的事情。只需要从 Gophish API 拿到邮件模板,根据 rid 拼凑出完整的钓鱼链接,调库转成二维码,然后把{{.URL}} 替换成二维码就行了。富文本的邮件是 html 格式,所以就把二维码当成一个图片元素放进去就 OK 了,具体的处理代码让大模型帮着写就行。这样一来目标扫二维码就等同于“点击链接”,想让他们提交点数据的话,钓鱼页面按往常那么做就行。现在我们的邮件渲染分为了钓鱼链接、钓鱼附件、钓鱼二维码三个场景,而不同场景对邮件渲染的过程不太一样,所以我们做了区分:在创建任务的时候,任务名带上演练场景,由此我们的渲染脚本就知道该采用哪个场景的渲染过程。想要其他场景? 我们不妨再举两个例子,看看我们还能玩出来什么花样。这几个月经常有黑产买某搜索引擎推广挖水坑,仿冒某某软件,然后业务部门就有电脑小白进了水坑页下了个远控回来,搞的满城风雨。于是我们打算做一次软件下载页的钓鱼演练,假装某办公软件提供商给目标发律师函,说你用的是盗版,赶紧点链接下载正版,不然让你全家跟公司老板一块进去踩缝纫机。那么这时候如何界定中招就成了个问题,我们当然可以把钓鱼页面做成一个软件下载页,然后目标点击下载按钮下载一个钓鱼附件,然后运行附件 Gophish 后台收到中招消息。但这么做成本就比较大,毕竟这个和邮件渲染还不一样,它是把渲染好的附件放在服务器上让目标凭 rid 去下载,这就比较麻烦。但是一般情况下会点击按钮的同学离中招也不远了,所以我们决定让“点击立即下载按钮”作为是否中招的分界点,那我们该如何设计呢?我们有两种思路:邮件依然是普通的钓鱼链接场景的邮件,但是邮件中的链接指向一个静态页面,带着目标的 rid。点击立即下载按钮则把 rid 透传给“钓鱼链接”提交一个 GET 请求,这样 Gophish 中状态为“点击链接”的就是点击立即下载按钮的目标邮件中的链接指向 Gophish 配置好的钓鱼链接,目标点击链接会进入到假的软件下载页,此时目标状态会被更新为“点击链接”,点击立即下载按钮则向带有 rid 的钓鱼链接提交一个 POST 请求,这样 Gophish 中状态为“提交数据”的就是点击立即下载按钮的目标这两个思路都是完全可行的,并且我们可以做成点击按钮之后跳转到钓鱼教学页,告诉大伙防范这种假的软件下载页。这样我们不需要真的去做一个远控木马,也不会造成中招人员的恐慌,得知自己中招的同学估计还会邪魅一笑的尝试把隔壁工位的小伙伴拉下水,然后对中招的小伙伴进行雷厉风行的科普,这个效果就很不错了。点击按钮进入教学页:我们再看看钓鱼附件还能整什么花活,前几天在 freebuf 上看见一篇利用 Powershell 让快捷方式执行网络请求的文章:https://www.freebuf.com/articles/web/397007.html我感觉这个可以有啊,我们也做个快捷方式如何?做成一个 PDF 图标的快捷方式,双击快捷方式真的会打开一个 PDF,但其实已经通过 Powersherll 向 Gophish 的钓鱼链接提交了带有 rid 的 GET 请求,岂不美哉?细节看那篇文章就行,但我们这不需要做成远控啥的,做成向钓鱼链接提交 GET 请求就足够了,这样也简单了很多。双击钓鱼快捷方式,真的打开了一个 PDF,PDF 的内容就是告诉目标“你中招了!”就像这样:现在我们已经完全吃透了钓鱼邮件演练,想怎么玩就可以怎么玩了!07—演练复盘:结果统计与展示 技术层面上,我们已经做到了极致。现在我们需要让统计变得更方便,展示变得更大气,让老板觉得很行硬核的技术到上一章结束就没了,可以松口气了。结果统计和展示这个东西,其实也是为了自己方便。毕竟就算自己人肉导出、统计、画图,其实也不是不行。不过既然 Gophish 做了结果查询的 API 接口,为什么不试试呢?打通人事数据 在完成一次演练之后,我们肯定要根据部门中招率去跟业务部门的老板做深♂入♂交♂流的,这也就意味着在创建目标群体的过程,我们得带上目标人员的部门归属信息,不然到时候现查费时费力。我们在 Gophish 原生的任务创建功能外边包了一层,和人事的数据打通,这样我们在填写目标群体的时候,先走一下我们的处理,把目标完整的链式部门信息填补上,再提交给 Gophish 创建目标群体。这样我们后续处理就有了抓手,赋能安全运营团队,打出钓鱼演练组合拳。个性化展示和结果导出 安全老板表示 Gophish 自带的展示和结果导出功能不适合中国宝宝体质,做汇报的时候还得专门跟大老板解释页面里的那堆洋文是啥意思。好在 Gophish 提供了查询任务结果的 API 接口,自己搓个前端界面也不是不行。(关于 Gophish 的接口,与其看接口文档,我的建议是不如直接上 burp 抓包,一抓就看清楚了) 平台创建钓鱼任务展示页面:可视化数据展示界面:然后我们还做了个一件导出报表的功能,根据查询到的任务结果,按一、二、三级部门进行聚合,直观看出各个部门的安全意识概况。当然这些东西不是必须的,如前所说,钓鱼邮件演练的技术已经讲完了,数据处理这块哪怕用笨方法自己搓 excel 画 PPT 报给老板也没问题。但我们把展示和汇报的内容做成了可以自动生成的标准化内容,这样我们什么时候想做个演练,跟老板报一下,跟行政统一下演练口径,让 IT 开个白名单,然后演练完导出个报表丢给老板就行了。原本动辄大兴土木的演练,现在变得跟吃饭喝水一样。我们还把这个东西集成到了自研的 SOC 平台,后续就可以根据人事信息,每天定时向新入职的同学发送安全推送,同时借助上面的能力,去发送一些教学性质的钓鱼邮件,这样我们就把邮件安全融入到了企业文化当中,而不单单的是以演练的形式,定期的集中折腾大家一次。08—总结:这些是一次完美演练的全部所需一个最低配的公网钓鱼服务器,一年小几百一个高仿域名,备案和 SSL 证书,一年大几十开源工具 Gophish 用于任务管理开源工具 swaks 用于发送邮件搓一个邮件模板渲染的服务对接 Gophish 和 swaks,工期一人一周。如果“简单模式”就能满足需求的话,这个也不用搓搓一个查询 Gophish 数据接口做个性化展示以及结果导出的服务,不算必要,工期一人一周钓鱼附件模板,自己搓附件用一个上午钓鱼页面,自己搓钓鱼页用一个下午没了,是不是很便宜很轻松?你只需要投入几百块钱的成本去买个服务器和域名,然后投入点时间把这篇文章吃透就行了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 00:22 , Processed in 0.487812 second(s), 27 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表