钓鱼邮件发件人伪造技术剖析

简介

攻击者为了让恶意邮件能达到攻击目的,会精心设计邮件的标题、内容、图片,而针对性更强的恶意邮件还会对邮件发件人地址进行伪造,比如:[email protected]、admin@qq-
mail.com,这种发信人地址显然只能骗过少部分人。

但是如果伪造的发件人地址和官方完全一致呢?事实上,电子邮件是不安全的,恶意邮件完全有可能伪造成任何发信地址。

本文将会分析发件人地址是如何被伪造的,以及现有的防御策略又是如何被绕过的。

**01 **伪造原理浅析

邮件头:

HELO helo.sender.com   
Mail From:    
From: Secure Bank    
Sender:    
Received:from ...

HELO 表示谁发送了邮件(一般不显示)

Mail From 表示谁发送了邮件(一般不显示),未指定情况下会使用From字段内容代替

From 表示谁写的邮件,邮件客户端显示为发件人地址

Sender 定义为代发用户,不同的邮箱对Sender头的处理并不一样,有些会把Sender头作为代发,有些会直接显示出来,有时可以利用此来绕过代发显示

Received 表示路由信息,记录了邮件传递过程

通过邮件头可以发现,我们只要搭建一个邮件发送服务器,然后将from字段和Mail
From字段改为我们想要伪造的任意邮件地址就可以了。拿现实生活打比方,就是自己开了一家不正规邮局,from字段就是发件人姓名,修改from字段就是修改了邮件发件人姓名,mail
from字段类似邮局名称,修改mail from字段就是让邮件看起来正规。

事情当然不可能这么简单╮(╯▽╰)╭,于是为了防止伪造邮件满天飞,出现了检测伪造邮件的spf/dkim/dmarc记录。

**02 **防御机制

spf/dkim/dmarc记录

spf:

检查HELO、MAIL FROM的域名的spf ip记录,是否和发件服务器ip匹配

dkim:

请求dkim域名下的公钥,通过该公钥验证dkim签名

dmarc:

基于spf和dkim、不符合时怎么做,对应spf和dkim

检查是否spf和dmarc是否通过

检查from字段一致性,包括和spf域名一致性、和dkim域名一致性

配置举例

dkim记录:

公钥:  
k=rsa; p=MIGf...AQAB  
通过查询“选择器参数.\_domainkey.test.com”的txt记录获得  
签名:  
v=1; a=rsa-sha256; c=relaxed/simple; d=test.com; h=subject:subject:from:from:content-transfer-encoding:content-type:content-type; s=dkim; t=1612344789; x=1614936790; bh=whCdi8wMe31tExV/kY1u1K6C1IjBREx7llkl8PePKUU=; b=38b67jyXwMi00rGK78y9QVL39g0RnITLz7ysuwbgv/3yjMM8eYA+EDRRFGJohssAfD4fVi4VrhDgP+Bmnze9wxqqqH0ClwV7fpvMMlHT4cVHMP0eCzvVtfswu3RBhoK3vS3z7iFQbG/bLa650xRy1PNP1GF+DR5f7E4AErAw1Mg=  
d:dkim签名对应的域名  
s:选择器参数,公钥dns查询时使用,例子:dkim.\_domainkey.test.com  
bh:邮件正文的hash

spf记录:

"v=spf1 ip4:192.168.0.1/16 -all" //表示spf只接受192.168.0.1/16

dmarc记录:

v=DMARC1; p=reject; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1; pct=100

举个例子简单说明下这几种记录的作用:

比如你自己搭建了一个邮件发送服务器,域名是hack.com,然后将邮件from字段和Mail
From字段改为bank.com,想达到伪造邮件发件人的效果,但是spf记录会检测出你的发信ip和spf记录中的白名单ip不符,于是你伪造的邮件就被打上了spf不通过的标签,同样当dkim检测请求dkim域名下的公钥,通过该公钥验证dkim签名也会失败,于是又被搭上了dkim
不通过的标签。

这时,我们为了避免spf、dkim记录不通过,不修改mail
from字段、使用hack.com的dkim签名,但是dmarc会检测from字段和spf域名一致性、和dkim域名一致性,于是邮件会被打上dmarc不通过的标签。

**03 **伪造方法论

1. 利用不存在的子域,下面的例子在检查MAIL
FROM时,notexist.bank.com未设置spf,所以spf检测为none,spf检查helo通过,最终spf 通过,dmarc检查MAIL
FROM字段和From字段的域是否符合,主域相同所以dmarc通过

HELO attack.com  
MAIL FROM:   
From:   
To: 

2. 利用特殊字符截断,dkim使用‘attack.com.\x00.any._domainkey.bank.com’请求公钥,dns
把\x00视为截断,所以最终将在attack.com请求公钥,导致dkim检测通过

HELO attack.com  
MAIL FROM:   
DKIM-Signature: ...;d=bank.com;s=attack.com.\x00.any;...  
From:   
To: 

3. 利用多个From字段,下面类似的多个from字段,会导致有些接收方会显示第二个From字段为发件人

exmaple1  
From:   
From:   
To:   
  
exmaple2  
From\r\n:   
From:   
To:   
  
exmaple3  
_From:   
From :   
To:   
  
exmaple4  
From_:   
From :   
To: 

4. 利用解析错误,当From无法找到时会显示Sender为发件人

From  
:   
Sender:   
To: 

5. 利用From字段的复杂语法

如:

From: zhang([email protected]) san<@c.com, @d.com:[email protected] ([email protected]) > ([email protected])   
From: zhang([email protected]) san<@c.com, @d.com:[email protected] ([email protected]) > ([email protected])  
注释:[email protected] [email protected] [email protected]  
路由:@c.com, @d.com  
发件人地址:[email protected]

From字段语法特性利用例子如下:

//多个email地址  
From: ,  
//利用From语法  
From:   
//利用字段编码  
From: bs64(),  
//利用反斜杠  
From: \,  
//利用有无尖括号  
From: [email protected],  
From: [email protected]

6. 利用RLO字符

U+202E这个字符能让字符从右到左显示,而U+202D能让字符从左到右显示,如:\u202emoc.qq@\u202dadmin会被显示成[email protected]

7. 利用IDN域名

注册域名看起来比较像但实际上字母不一样的idn域名,如看起来和qq.com一样的ԛԛ.com

**04 **实战思考

下面是我在实际测试过程中的一些发现:

国内主流邮箱,在dkim、dmarc验证不通过的情况下邮件还是能够进发件箱,主要是由于这两种记录主要在于提高邮件可信度,所以发件人伪造主要是如何绕过spf记录

利用邮件头解析错误来进行伪造需要对目标邮件接收服务器进行针对性测试,每个邮件接收服务器的解析策略都有所差异

如果目标子域名没有设置spf记录,可以选择伪造成该子域名

有些目标邮件接受服务器在from字段和mail from字段不一致的时候不会显示代发,这时只需要修改from字段即可完成伪造

某些邮件发送中转服务商对发件人校验不严格,可以利用他们的高信誉邮件发送服务伪造任意发信人,不过无法修改mail from字段,无法避免代发显示

**05 **总结

本文介绍了邮件发件人地址是如何被伪造的,以及针对发件人地址伪造技术进行了较为详细的分析。在实战攻防中,结合邮件话术伪造的发件人地址,往往能骗过绝大多数人的眼睛,让恶意邮件达到意想不到的效果。

参考

[https://www.jianjunchen.com/p/composition-
kills.USESEC20.pdf](https://www.jianjunchen.com/p/composition-
kills.USESEC20.pdf)

接下来我将给各位同学划分一张学习计划表!

学习计划

那么问题又来了,作为萌新小白,我应该先学什么,再学什么?
既然你都问的这么直白了,我就告诉你,零基础应该从什么开始学起:

阶段一:初级网络安全工程师

接下来我将给大家安排一个为期1个月的网络安全初级计划,当你学完后,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web渗透、安全服务、安全分析等岗位;其中,如果你等保模块学的好,还可以从事等保工程师。

综合薪资区间6k~15k

1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(1周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(1周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(1周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)

那么,到此为止,已经耗时1个月左右。你已经成功成为了一名“脚本小子”。那么你还想接着往下探索吗?

阶段二:中级or高级网络安全工程师(看自己能力)

综合薪资区间15k~30k

7、脚本编程学习(4周)
在网络安全领域。是否具备编程能力是“脚本小子”和真正网络安全工程师的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力。

零基础入门的同学,我建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习
搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP,IDE强烈推荐Sublime;

Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,没必要看完

用Python编写漏洞的exp,然后写一个简单的网络爬虫

PHP基本语法学习并书写一个简单的博客系统

熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选)

了解Bootstrap的布局或者CSS。

阶段三:顶级网络安全工程师

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,这里给大家整理了一份【282G】的网络安全工程师从入门到精通的学习资料包,可点击下方二维码链接领取哦。

你可能感兴趣的:(数据库)