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 无缝单一登录功能的密码喷洒攻击呢?
对此,有如下方法可以解决:
- 通过设置强密码策略来确保 Microsoft Entra ID 租户使用强密码。
- 在所有可能使用 Microsoft Entra ID 凭据的服务应用上启动 MFA,如图 13 所示。
- 监控 Microsoft Entra ID 登录日志,以监控异常用户的登录,如图 14 所示。

图 13 启用 MFA

图 14 通过 Microsoft Entra ID 登录日志来监控异常用户的登录行为
文章来源:亿人安全
黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!
如侵权请私聊我们删文
END














暂无评论内容