记一次域渗透实战:Entra SSO功能的滥用

华盟原创文章投稿奖励计划

Microsoft Entra 无缝单一登录(Seamless Single Sign-On)是微软推出的一种高级身份验证和访问管理功能。通过无缝单一登录,用户在受支持的企业网络环境中登录过一次后,无须再次输入相关凭据,即可自动访问相关的云应用、SaaS 应用,并且无需任何其他本地组件。

Microsoft Entra 无缝单一登录使用 Windows 网络标准 Kerberos 协议来实现。在配置 Microsoft Entra Connect 以将本地 AD 与 Microsoft Entra ID 同步的过程中,可勾选启用单一登录来开启该功能,如图 1 所示。

自动草稿

图 1 勾选“启用单一登录”

在此配置过程中,Microsoft Entra Connect 会在本地 Active Directory 中创建一个名为 AZUREADSSOACC 的机器账户,如图 2 所示。

自动草稿

图 2 查看本地 AZUREADSSOACC 机器账户

并且,为该 AZUREADSSOACC 账户创建多个 Kerberos SPN,以在 Microsoft Entra ID 登录过程中使用,如图 3 所示。

自动草稿

图 3 AZUREADSSOACC 账户 SPN

在默认情况下,会通过 usernamemixe 终结点 CURL 为 https://autologon.microsoftazuread-sso.com/<Primarydomain>/winauth/trust/2005/usernamemixed,对开启无缝单一登录功能的计算机进行单因素身份验证,如图 4 所示。

自动草稿

图 4 usernamemixed 终结点

如图 5 所示,如果用户输入的登录凭据无效,那么 Autologon 终结点将使用包含身份验证尝试的特定错误代码的 XML 文件来直接进行响应。

自动草稿

图 5 包含特定错误代码的 XML 文件

常见的错误代码如表 1 所示。

表 1 常见错误代码

错误代码 错误代码描述
AADSTS50126 用户存在,但输入了错误的密码
AADSTS50056 用户存在,但在 Azure AD 中没有密码
AADSTS50076 用户凭据正确,开启 MFA
AADSTS50014 用户不存在
AADSTS50053 用户存在且输入了正确的用户名和密码,但账户被锁定

由于 Autologon 终结点会针对用户输入的无效登录凭据直接返回特定的错误代码,这也就导致通过 Autologon 终结点进行的身份登录验证并不会被 Microsoft Entra ID 登录日志所记录。

攻击者可以利用此特性绕过安全措施,对 Microsoft Entra ID 账户实施密码喷洒攻击,而不会触发任何检测告警。

利用步骤

如果目标 Microsoft Entra ID 开启了无缝单一登录功能,则可以通过如下两种方式滥用 Microsoft Entra 的无缝单一登录功能,以对 Microsoft Entra ID 上的用户密码进行密码喷洒。

通过 azuread_autologon_brute.py 滥用 Microsoft Entra ID 的无缝单一登录功能执行密码喷洒

1)首先,需要在本地安装并配置好相关 Python 环境,并通过如下命令来安装 requests 依赖:

  pip install requests 

命令执行结果如图 6 所示。

自动草稿

图 6 安装 requests 依赖

2)随后执行如下命令来查看可用的参数,具体执行结果如图 7 所示。

自动草稿

图 7 查看可用参数

参数含义如表 2 所示。

  python .\azuread_autologon_brute.py -h 

表 2 azuread_autologon_brute.py 脚本参数含义

参数 参数含义
-d DOMAIN 指定要进行操作的目标的主要域,如 abc.
onmicrosoft.com
-u USERNAME 指定特定的用户名
-U USERFILE 指定一个存在的用户名字典,也就是通过用户枚举攻击获取 Azure AD 租户
-p PASSWORD 指定用于喷洒的 Azure AD 租户密码
-o OUTPUT 指定结果输出的文件,如不指定,则默认文件名为“BRUTE_OUTPUT.txt”
-v 在脚本运行时提供更详尽的信息
-t THREADS 指定线程数

3)通过执行如下命令来对 Microsoft Entra ID 租户进行喷洒密码攻击:

  python azuread_autologon_brute.py -d Domain -U users.txt -p S3U9t6n7 

从执行结果可以看到,admin、mem、jason 用户的密码均为S3U9t6n7,如图 8 所示,且每个通过 azuread_autologon_brute.py  脚本成功喷洒出密码的用户,在当前命令行都会获取其账户所使用的 DesktopSsoToken。

自动草稿

图 8 密码喷洒结果

4)访问 Azure 门户地址—portal.azure.com,如图 9 所示,使用已喷洒出的密码,即可成功登录 Azure 管理控制台。

自动草稿

图 9 通过已喷洒出的账号密码登录 Azure 管理控制台

通过 aad-sso-enum-brute-spray.ps1 滥用 Microsoft Entra ID 的无缝单一登录功能执行密码喷洒

使用 aad-sso-enum-brute-spray.ps1 脚本也可以滥用 Microsoft Entra ID 的无缝单一登录功能执行密码喷洒,使用命令如下:

  fore ach($linein Get-Content .\users.txt) {.\aad-sso-enum-brute-spray.ps1 $line S3U9t6n7 |Out-File -FilePath .\results.txt -Append } 

aad-sso-enum-brute-spray.ps1 脚本的执行结果如图 10 所示,可以看到已喷洒出的有效 Microsoft Entra ID 用户为 admin、adtest 和 mec。

自动草稿

图 10 执行 aad-sso-enum-brute-spray.ps1 脚本的密码喷洒结果

如果在前期信息枚举阶段查询出目标 Microsoft Entra ID 没有配置身份验证以及密码保护的策略,则可通过如下 PowerShell 命令来对单个用户进行密码字典爆破:

  fore ach($linein Get-Content .\passwd.txt) {.\aad-sso-enum-brute-spray.ps1  root@ad.xx.xx.cn $line } 

如图 11 所示,可以看到已成功爆破出名为root@xxx.xx.cn的用户密码。

自动草稿

图 11 利用 aad-sso-enum-brute-spray 脚本进行密码爆破

若想将上述爆破的输出结果导出成一个文件,则可执行如下命令来将爆破输出结果追加到当前目录下的 passwd-results.txt 中:

  fore ach($linein Get-Content .\passwd.txt) {.\aad-sso-enum-brute-spray.ps1  root@ad.xx.xx.cn $line |Out-File -FilePath .\passwd-results.txt -Append} 

执行结果如图 12 所示。

自动草稿

图 12 将密码爆破结果导出到 passwd-results.txt

防御方法

Microsoft Entra ID 无缝单一登录的使用的协议存在一定的缺陷,可使恶意攻击者不断地暴力破解密码,且在 Microsoft Entra ID 默认目录下的租户日志上不会生成任何事件记录。

那么,对于防守方或者蓝队来讲,如何检测和防御基于 Microsoft Entra ID 无缝单一登录功能的密码喷洒攻击呢?

对此,有如下方法可以解决:

  1. 通过设置强密码策略来确保 Microsoft Entra ID 租户使用强密码。
  2. 在所有可能使用 Microsoft Entra ID 凭据的服务应用上启动 MFA,如图 13 所示。
  3. 监控 Microsoft Entra ID 登录日志,以监控异常用户的登录,如图 14 所示。

自动草稿

图 13 启用 MFA

自动草稿

图 14 通过 Microsoft Entra ID 登录日志来监控异常用户的登录行为


文章来源:亿人安全


黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文


END

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容