Phishing钓鱼邮件之所以难以根除,是因为攻击者并不需要攻破邮件系统,只需要让收件人相信一封伪造的邮件是真实的。邮件网关可以拦截大量已知恶意样本,但面对新注册域名、被盗用的合法邮箱、即时生成的钓鱼页面,过滤规则总有滞后。因此识别与处置必须前移到收件人侧和运维侧,形成检查、上报、隔离、溯源的闭环。本文从邮件头、链接附件、处置流程和长期防御四个层面展开。

一、从邮件头判断发件人是否可信
邮件客户端只显示发件人名称和邮箱地址,但这些字段可以被伪造。真正可靠的信息在原始邮件头中。点击查看原始邮件或显示邮件源,可以看到Return-Path、Received、From、Reply-To、Authentication-Results等字段。From是显示给收件人的发件人,Return-Path是实际退信地址,两者不一致时需警惕。Received链条显示邮件真实经过的服务器,如果发件域名与Received中的服务器域名不匹配,就可能被伪造。
SPF、DKIM和DMARC三种认证机制可以辅助判断。SPF验证发信服务器是否被域名授权;DKIM验证邮件内容签名;DMARC则规定当SPF和DKIM失败时收件方如何处理。通过Authentication-Results字段可以快速看到认证结果。例如spf=fail、dmarc=fail意味着邮件可能来自未授权服务器,即使From显示的是内部域名。需要结合实际场景:有些合法邮件可能由于转发导致SPF失败,所以不能仅凭一项失败就判定为钓鱼,但多项失败且与发件域不符时,风险极高。
下面是一封钓鱼邮件的原始邮件头片段,展示了发件人伪造与认证失败的情况:
Return-Path: <bounce@mail.ipipp.com>
Received: from mail.ipipp.com (mail.ipipp.com [203.0.113.25])
by mx.corp.local with ESMTP id 8f3a2b1c
for <user@corp.local>; Thu, 12 Mar 09:15:42 +0800
From: IT Support <it-support@corp.local>
Reply-To: it-support@corp.local
To: user@corp.local
Subject: Action required: Verify your mailbox
Authentication-Results: mx.corp.local; spf=fail smtp.mailfrom=mail.ipipp.com; dkim=pass header.d=ipipp.com; dmarc=fail
Return-Path显示发信域为mail.ipipp.com,与From的corp.local不一致,且spf=fail、dmarc=fail,说明发信服务器并未被corp.local授权。即使DKIM通过,也不能证明发件人身份,因为DKIM签名域可以是攻击者自己的域名。需要训练用户关注这类不一致。
二、分析链接与附件的行为特征
钓鱼邮件的最终目的大多是诱导点击链接或打开附件。链接可能看起来像合法地址,但实际跳转地址藏在HTML源码中。用户可以将鼠标悬停在链接上查看真实URL,或者复制链接地址后用文本编辑器检查。攻击者常用手法包括:使用与真实域名相似的字符,如rnicrosoft.com中的rn看起来像m;使用短链接服务隐藏真实地址;在URL后附加大量参数干扰判断;使用重定向服务将用户带到钓鱼页面。
附件方面,Office文档中的宏、PDF中的脚本、压缩包中的可执行文件、ISO或IMG镜像文件都是常见载体。即使附件本身没有恶意代码,也可能包含二维码或链接引导用户离开邮件客户端。对于可疑附件,不应直接双击,而应在隔离环境或在线沙箱中打开。管理员可以提取附件哈希,与威胁情报平台比对。下面这段Python代码展示如何从邮件中提取全部链接并检查域名是否在允许列表中:
import re
from urllib.parse import urlparse
ALLOWED_DOMAINS = {"corp.local", "ipipp.com"}
def extract_urls(raw_html):
# 匹配常见href和src属性中的URL
pattern = r'href=["\'](.*?)["\']|src=["\'](.*?)["\']'
urls = []
for match in re.finditer(pattern, raw_html, re.IGNORECASE):
url = match.group(1) or match.group(2)
if url and url.startswith("http"):
urls.append(url)
return urls
def check_urls(raw_html):
suspicious = []
for url in extract_urls(raw_html):
domain = urlparse(url).netloc
if domain not in ALLOWED_DOMAINS:
suspicious.append((url, domain))
return suspicious
# 示例:分析一封邮件正文的HTML
email_html = '<a href="https://login.corp-local.ipipp.com/verify">Verify account</a>'
for url, domain in check_urls(email_html):
print(f"发现可疑链接: {url} -> {domain}")
分析链接时还要注意punycode域名。浏览器会将xn--开头的ASCII兼容编码显示为Unicode字符,攻击者利用外观相似的字符注册域名。管理员应在邮件网关启用URL重写和点击时扫描,同时要求用户将重要业务系统加入书签,不在邮件中点击登录链接。附件检测则需要开启宏阻断、文件类型过滤和沙箱预执行。
三、钓鱼邮件的标准化处置流程
处置钓鱼邮件要区分用户和管理员两条线。用户发现可疑邮件后,第一步是不要点击任何链接或下载附件,第二步是通过企业预置的“报告钓鱼”按钮或邮件客户端插件上报,第三步如果已经点击并输入了凭据,应立即修改密码并通知IT。管理员收到报告后,需要快速定位同类邮件是否发送给其他用户,隔离整个会话中的邮件,并阻断发件人地址或域名。
在Exchange Online环境中,管理员可以使用PowerShell进行批量隔离和封禁。下面是一组常用命令,从定位邮件到将发件人加入阻止列表:
Connect-ExchangeOnline
# 查询最近24小时内来自特定发件人的所有邮件
$messages = Get-MessageTrace -SenderAddress attacker@ipipp.com -StartDate (Get-Date).AddHours(-24) -EndDate (Get-Date)
$messages | Select-Object Received, SenderAddress, RecipientAddress, Subject, Status
# 将邮件进行软删除,使其从收件箱中消失
foreach ($msg in $messages) {
Get-MessageTraceDetail -MessageTraceId $msg.MessageTraceId | Out-Null
Search-Mailbox -Identity $msg.RecipientAddress -SearchQuery "from:attacker@ipipp.com" -DeleteContent -Force
}
# 将发件人地址加入租户阻止列表
New-BlockedSender -SenderAddress attacker@ipipp.com -ExpirationDate (Get-Date).AddDays(30)
实际处置过程中,Search-Mailbox需要谨慎使用,因为删除操作不可逆,应先进行搜索预览,确认范围后再执行。更推荐的做法是先使用Get-QuarantineMessage查看隔离区,或通过邮件安全网关的追溯功能将同类邮件批量拉入隔离区。如果邮件已发给大量用户,运维人员需要同时提取邮件中的URL和附件哈希,生成IOC,写入SIEM或威胁情报平台。例如域名、URL、文件SHA256、发信IP等,都可以作为后续检测规则。
处置完成后还要进行复盘,确认邮件为何绕过防护。可能是发件人域名未被有效认证,可能是员工使用个人邮箱注册了外部服务导致数据泄露,也可能是供应商邮箱被盗用。根据根因调整SPF、DKIM、DMARC策略或邮件流规则,才能降低同类事件再次发生的概率。
四、构建长期防御和员工演练机制
技术措施永远存在窗口期,因此需要将识别能力下沉到每一位员工。企业可以定期开展模拟钓鱼测试,使用安全平台向员工发送仿真的钓鱼邮件,统计点击率和上报率。对于及时上报的员工给予正向激励,而不是单纯处罚点击者。培训内容应聚焦实际操作:如何查看发件人完整地址、如何判断链接真实域名、如何上报可疑邮件、如何识别紧急语气和威胁话术。
在邮件网关层面,应启用多层防护:发件人信誉过滤、SPF/DKIM/DMARC验证、URL重写与点击保护、附件沙箱、异常登录检测。还可以为高价值目标配置邮件加密和标记外部发件人提示。例如来自外部域名的邮件在标题前自动添加[外部]标签,这样员工看到内部技术支持邮件却没有外部标记时,可以更快警觉。
DNS层面的认证记录也需要持续维护。以下是一条典型SPF记录示例,它只允许指定的邮件服务商和IP段发送本域邮件:
v=spf1 include:spf.ipipp.com ip4:203.0.113.10 -all
同时应配置DKIM签名和DMARC策略,并将DMARC设置为quarantine或reject,而不是none。只有让收件方对验证失败的邮件采取隔离或拒绝动作,伪造发件人攻击才会被显著压缩。结合用户演练和邮件网关日志,安全团队可以形成完整的钓鱼邮件生命周期管理。