CS学习笔记 | 25、邮件防御
0x00 前言
Cobalt Strike 不是什么工作情况都能胜任的工具,因此就需要我们根据不同的情况去做一些辅助工作。
最后这几节将学习免杀部分的东西,这一节将主要介绍邮件防御方面的相关概念。
0x01 介绍
1、SPF、DKIM、DMARC
SPF、DKIM、DMARC 都是邮件用于帮助识别垃圾信息的附加组件,那么作为一个攻击者,在发送钓鱼邮件的时候,就需要使自己的邮件能够满足这些组件的标准,或者发送到未配置这些组件的域。
在理解这些防御标准前,需要先理解如何在因特网上通过 SMTP 发送邮件。
2、SMTP
发送一封邮件的过程大概是下面这个样子,这里以QQ邮箱为例。
> telnet smtp.qq.com 25
HELO teamssix
auth login
base64编码后的邮箱名
base64编码后的授权码
MAIL FROM: <evil_teamssix@qq.com>
RCPT TO: <target_teamssix@qq.com>
DATA
邮件内容
.
QUIT
0x02 防御策略
1、SPF
SPF Sender Policy Framework
发送人策略框架,SPF 主要用来防止随意伪造发件人。其做法就是设置一个 SPF 记录,SPF 记录实际上就是 DNS 的 TXT 记录。
如果邮件服务器收到一封来自 IP 不在 SPF 记录里的邮件则会退信或者标记为垃圾邮件。
我们可以使用以下命令查看目标的 SPF 记录。
dig +short TXT target.com
> dig +short TXT qq.com
"v=spf1 include:spf.mail.qq.com -all"
上面的 include:spf.mail.qq.com
表示引入spf.mail.qq.com
域名下的 SPF 记录。
> dig +short TXT spf-a.mail.qq.com
"v=spf1 ip4:203.205.251.0/24 ip4:103.7.29.0/24 ip4:59.36.129.0/24 ip4:113.108.23.0/24 ip4:113.108.11.0/24 ip4:119.147.193.0/24 ip4:119.147.194.0/24 ip4:59.78.209.0/24 ip4:113.96.223.0/24 ip4:183.3.226.0/24 ip4:183.3.255.0/24 ip4:59.36.132.0/24 -all"
上面的 ip4:203.205.251.0/24 ip4:103.7.29.0/24
表示只允许这个范围内的 IP 发送邮件。
2、DKIM
DKIM DomainKeys Identified Mail
域名密钥识别邮件,DKIM 是一种防范电子邮件欺诈的验证技术,通过消息加密认证的方式对邮件发送域名进行验证。
邮件接收方接收邮件时,会通过 DNS 查询获得公钥,验证邮件 DKIM 签名的有效性,从而判断邮件是否被篡改。
3、DMARC
DMARC Domain-based Message Authentication, Reporting & Conformance
基于域的消息认证,报告和一致性。
它用来检查一封电子邮件是否来自所声称的发送者。DMARC 建立在 SPF 和 DKIM 协议上, 并且添加了域名对齐检查和报告发送功能。这样可以改善域名免受钓鱼攻击的保护。
可以使用下面的命令查看目标的的 DMARC 记录。
dig +short TXT _dmarc.target.com
> dig +short TXT _dmarc.qq.com
"v=DMARC1; p=none; rua=mailto:mailauth-reports@qq.com"
也有一些在线网站支持检测 SPF、DKIM、DMARC 的记录,比如 https://dmarcly.com/tools/
关于这些记录查询返回结果的解释可参考文章末的参考链接。
0x03 发送钓鱼邮件的一些注意事项
1、检测目标是否有 SPF 记录,如果有则可能会被拦截
2、检测目标 DMARC 记录的 p 选项是否为 reject ,如果有则可能会被拒绝
3、模板中嵌入的 URL 地址,不要使用 IP 地址,要保证使用完整的 URL地址
4、邮件的附件中不能附上一些可执行文件,比如 exe 格式的文件,因为一些邮件过滤器可能会将这些可执行文件删除
原文链接:https://www.teamssix.com/year/200419-150719.html 参考链接: https://www.bilibili.com/video/BV16b411i7n5 https://segmentfault.com/a/1190000019290085 https://www.cnblogs.com/cthon/p/9151467.html https://www.renfei.org/blog/introduction-to-spf.html https://blog.csdn.net/qq_34101364/article/details/108062913
- 从React和angular看技术路线的分歧
- JDK容器学习之LinkedHashMap (一):底层存储结构分析
- Linux基础(day60)
- 16.5/16.6/16.7 配置Tomcat虚拟主机
- JDK容器学习之LinkedHashMap(二):迭代遍历的实现方式
- React Native 实现基于react-native-tab-navigator库Tab切换封装
- 16.4 配置Tomcat监听80端口
- JDK容器学习之Queue:LinkedBlockingQueue
- Linux基础(day59)
- 16.3 安装Tomcat
- 16.2 安装jdk
- UITabBarController实现Tab切换
- React Native库版本升级与降级
- Java并发学习之Volatile及内存模型探究
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 打卡群刷题总结0922——丑数 II
- 打卡群刷题总结0923——完全平方数
- 打卡群刷题总结0924——最长上升子序列
- VS2017中使用QT Chart图表
- C++核心准则T.81:不要混用继承层级和数组
- C++核心准则T.83:不要将成员函数定义为模板虚函数
- C++核心准则T.84:使用非模板核心实现提供稳定的ABI接口
- C++核心准则T.120:只在确实有需要时使用模板元编程
- C++核心准则T.121:模板元编程主要用于模仿概念
- C++核心准则T.122:使用模板在编译时计算类型
- C++核心准则T.123:使用常量表达式函数在编译时求值
- Java基础 【类之间的关系】
- MySql 学习之路-基础
- (有趣的)项目实战:Java实现计算机自动关机
- 猜生日 Java小游戏