Azure AD attack
Azure AD attack
author:Gr3yy
真常应物,真常得性,常应常静,常清静矣
真的鸽了好久了|- _-|,一直想写点东西,正好最近项目里遇到了Azure的环境,之前也没了解过,和本地的域环境还是有些区别和相同点,所以抽时间学习一下,就一点点写叭
本文主要参考文章为微软官方文档以及adsecurity.org文章,以及**AzureAD-Attack-Defense**
什么是Azure AD
开始之前当然要了解一下什么是AAD:
用微软自己的话来说:
1 |
|
因此:
- AAD是一种多租户云目录和身份验证服务
- 使用office365用于传统域内的帐户、组和角色
- 提供身份验证的同时也是身份提供者
Azure AD 与传统AD的区别
不要被AAD的名字误导,AAD不是简单的布在云上AD环境,我们还是先用微软的一句话来描述
1 |
|
OK ,那么下面来看看他们之间的区别,当然以下概念也只是简单的描述,各个概念的具体描述请参考官方文档。
AD | Azure AD | |
---|---|---|
创建用户 | 企业管理者手动创建或者使用自动配置系统和hr系统联动 | 现有 AD 组织使用Azure AD Connect将身份同步到云。可与云HR系统联动 |
权限管理 与 组 | 域管理者将用户分配进不同的组,应用与服务根据组可分配不同权限 | AAD也提供组,管理员也可通过组来授予不同权限。管理员可通过查询将用户动态包含进组。Azure可以使用 Entitlement management 机制,通过访问包来管理用户权限 |
域管理 | 企业通过域、组织和组的组合,委派管理权限来管理它控制的目录和资源。 | Azure AD使用Privileged Identity Management (PIM)来进基于角色的管理权限委派 |
凭证管理 | Active Directory 中的凭据基于密码、证书身份验证和智能卡身份验证。使用基于密码长度、到期时间和复杂性的密码策略来管理密码。 | Azure提供智能密码保护以及多因素身份认证 |
认证 | 大多数本地应用程序使用 LDAP、Windows 集成身份验证(NTLM 和 Kerberos)或基于标头的身份验证来控制对用户的访问。 | Azure AD 可以使用在本地运行的Azure AD 应用程序代理提供对这些类型的本地应用程序的访问。使用此方法 Azure AD 可以在迁移或需要与旧应用共存时使用 Kerberos 对本地 Active Directory 用户进行身份验证。 |
SaaS与外部应用 | 本地AD不支持saas,可通过联合ADFS | 作为oauth2身份认证方式与Saas联动 |
服务 | 在AD中运行的服务通常使用 AD 服务帐户或组托管服务帐户 (gMSA) 来运行。这些应用将继承服务帐户的权限 | Azure AD 提供托管标识以在云中运行其他工作负载。这些身份的生命周期由 Azure AD 管理并与资源提供者绑定,不能用于其他目的以获取后门访问权限。 |
移动设备 | Active Directory 本身不支持没有第三方解决方案的移动设备 | Microsoft 的移动设备管理解决方案 Microsoft Intune 与 Azure AD 集成。Microsoft Intune 向身份系统提供设备状态信息以在身份验证期间进行评估。 |
windows desktop | 可入域,通过域策略管理 | Windows 设备可以加入 Azure AD。条件访问可以检查设备是否已加入 Azure AD。Windows 设备也可以使用Microsoft Intune进行管理。在这种情况下,条件访问将在允许访问应用程序之前考虑设备是否合规(例如,最新的安全补丁和病毒签名)。 |
GUID 与 SID
不同于AD使用sid唯一标识用户,Azure AD使用自己独有的GUID表示用户
通过将 “S-1-12-1-” 与 GUID 的简单拆分处理后进行组合是可以将用户的GUID 转换成 SID 的:
1 |
|
例如:当GUID 为 6aa89ecb-1f8f-4d92–810d-b0dce30b6c82
时,转换后为 S-1–12–1–1789435595–1301421967–3702525313–2188119011
管理Azure AD
不同于传统AD的管理工具,Azure AD主要使用 https://portal.azure.com 控制台管理Azure AD
还可以与本地一样通过 powershell 管理AAD。
由于 Azure AD 没有 LDAP,因此与 涉及AAD 的接口一般通过 Graph API(或 PowerShell 模块)进行连接。
有 2 个主要的 PowerShell 模块用于与 Azure AD 交互:MSOnline和AzureAD,安装命令如下
1 |
|
使用文档:https://docs.microsoft.com/en-us/powershell/module/azuread/get-azureaddomain?view=azureadps-2.0
具体的cmdlet研究我们之后再写
角色与权限
https://docs.microsoft.com/en-us/azure/active-directory/roles/permissions-reference
Azure AD 用户可以查看有关用户和组的信息,但对可访问的内容有一些限制。在Azure AD中特权用户称为 “ Role “,可以将它理解为一个特权组,为o365应用提供特定管理权限。
以下是官方文档
1 |
|
角色很多,这里简单列几个:
认证管理员(Authentication Administrator)
顾名思义,负责管理用户认证的角色组。具有此角色的用户可以为非验证管理员和某些角色设置或重置任何身份验证方法(包括密码)。身份验证管理员也可以要求非验证管理员和某些角色根据现有的非密码凭据(例如 MFA 或 FIDO)重新注册。以下为可读取或修改认证的角色权限列表
Password can be reset | Password Admin | Helpdesk Admin | Authentication Admin | User Admin | Privileged Authentication Admin | Global Admin |
---|---|---|---|---|---|---|
Authentication Admin | ✔️ | ✔️ | ✔️ | |||
Directory Readers | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Global Admin | ✔️ | ✔️* | ||||
Groups Admin | ✔️ | ✔️ | ✔️ | |||
Guest Inviter | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Helpdesk Admin | ✔️ | ✔️ | ✔️ | ✔️ | ||
Message Center Reader | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | |
Password Admin | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Privileged Authentication Admin | ✔️ | ✔️ | ||||
Privileged Role Admin | ✔️ | ✔️ | ||||
Reports Reader | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | |
User (no admin role) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
User (no admin role, but member of a role-assignable group) | ✔️ | ✔️ | ||||
User Admin | ✔️ | ✔️ | ✔️ | |||
Usage Summary Reports Reader | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
具有此角色的用户可以更改部分有权访问 Azure AD 内部和外部的敏感信息或关键配置的用户的凭据。更改用户的凭据可能意味着能够获取该用户的身份和权限。例如:
- 应用程序注册和企业应用程序所有者,他们可以管理他们拥有的应用程序的凭据。这些应用程序可能在 Azure AD 和其他地方拥有身份认证管理员不拥有的特权。通过此方法,身份验证管理员可以获取应用程序所有者的身份,然后通过更新应用程序的凭据进一步滥用特权应用程序的身份。
- Azure 订阅所有者,他们可能有权访问 Azure 中的敏感或私有信息或关键配置。
- 可以管理组成员身份的安全组和 Microsoft 365 组所有者。这些组可能会授予对 Azure AD 和其他地方的敏感或私有信息或关键配置的访问权限。
- Azure AD 之外的其他服务(例如 Exchange Online、Office 安全与合规中心以及人力资源系统)中的管理员。
- 非管理员,例如可能有权访问敏感或私人信息的高管、法律顾问和人力资源员工。
关于身份认证的管理员有:认证管理员、特权验证管理员、验证策略管理员
角色 | 管理用户的身份验证方法 | 管理用户 MFA | 管理 MFA 设置 | 管理身份验证方法策略 | 管理密码保护策略 |
---|---|---|---|---|---|
认证管理员 | 对某些用户是(见上表) | 对某些用户是(见上表) | 否 | 否 | 否 |
特权认证管理员 | 适用于所有用户 | 适用于所有用户 | 否 | 否 | 否 |
身份验证策略管理员 | 否 | 否 | 是的 | 是的 | 是的 |
Exchange 管理员(Exchange Administrator)
具有此角色的用户在 Microsoft Exchange Online 中具有全局权限。还能够创建和管理所有 Microsoft 365 组、管理票据和监控服务运行状况。
Action | 描述 |
---|---|
microsoft.directory/groups/hiddenMembers/read | 读取安全组和 Microsoft 365 组的隐藏成员,包括可分配角色的组 |
microsoft.directory/groups.unified/create | 创建 Microsoft 365 组,不包括可分配角色的组 |
microsoft.directory/groups.unified/delete | 删除 Microsoft 365 组,不包括可分配角色的组 |
microsoft.directory/groups.unified/restore | 还原 Microsoft 365 组 |
microsoft.directory/groups.unified/basic/update | 更新 Microsoft 365 组的基本属性,不包括可分配角色的组 |
microsoft.directory/groups.unified/members/update | 更新 Microsoft 365 组的成员,不包括可分配角色的组 |
microsoft.directory/groups.unified/owners/update | 更新 Microsoft 365 组的所有者,不包括可分配角色的组 |
microsoft.azure.serviceHealth/allEntities/allTasks | 读取和配置 Azure 服务运行状况 |
microsoft.azure.supportTickets/allEntities/allTasks | 创建和管理 Azure 支持票据 |
microsoft.office365.exchange/allEntities/basic/allTasks | 管理 Exchange Online 的所有方面 |
microsoft.office365.network/performance/allProperties/read | 在 Microsoft 365 管理中心阅读所有网络性能属性 |
microsoft.office365.serviceHealth/allEntities/allTasks | 在 Microsoft 365 管理中心阅读和配置服务运行状况 |
microsoft.office365.supportTickets/allEntities/allTasks | 创建和管理 Microsoft 365 服务请求 |
microsoft.office365.usageReports/allEntities/allProperties/read | 阅读 Office 365 使用情况报告 |
microsoft.office365.webPortal/allEntities/standard/read | 在 Microsoft 365 管理中心阅读所有资源的基本属性 |
Exchange 收件人管理员(Exchange Recipient Administrator)
具有此角色的用户对 Exchange Online 中的收件人具有读取访问权限和属性写入的权限。
Action | 描述 |
---|---|
microsoft.office365.exchange/allRecipients/allProperties/allTasks | 在 Exchange Online 中创建和删除所有收件人,以及读取和更新收件人的所有属性 |
microsoft.office365.exchange/messageTracking/allProperties/allTasks | 在 Exchange Online 中管理邮件跟踪中的所有任务 |
microsoft.office365.exchange/migration/allProperties/allTasks | 管理与 Exchange Online 中的收件人迁移相关的所有任务 |
全局管理员(Global Administrator)
具有此角色的用户可以访问 Azure AD 中的所有管理功能,以及使用 Azure AD 标识的服务,例如 Microsoft 365 安全中心、Microsoft 365 合规中心、Exchange Online、SharePoint Online 和 Skype for Business Online。此外,全局管理员可以提升其管理所有 Azure 订阅和管理组的权限。这允许全局管理员使用相应的 Azure AD 租户获得对所有 Azure 资源的完全访问权限。注册 Azure AD 的用户将成为全局管理员。全局管理员可以为任何用户和所有其他管理员重置密码。(默认不超过五个)
可以理解为包含了传统AD的 Enterprise Admins、Domain Admins、Administrators组
特权身份管理(PIM)
PIM是Azure AD中的一项服务,可用于管理、控制和监视对组织中重要资源的访问。这些资源包括 Azure AD、Azure 和其他 Microsoft 在线服务(例如 Microsoft 365 或 Microsoft Intune)中的资源。当管理员需要管理员权限时,他们可以通过 PIM(可以发送以供批准或自动批准)请求和获得访问权限。Microsoft 建议角色中的所有帐户都由 PIM 管理。
安装用于PIM的powershell模块
1 |
|
攻击Azure AD
OK,介绍告一段落,下面我们可以开始正式的攻击探讨啦。
信息侦察
微软的门户列表 :https://msportals.io/
无论是打点还是内网渗透,信息收集永远都是最重要的一步。好的信息收集就是一次渗透成功的一半。
工具 \ 框架
1 |
|
有点像bloodhund的资产以及攻击路径绘制工具。
安装
1 |
|
使用
1 |
|
支持Azure CLI登录以及Client ID、Secret登录
列举子域
1 |
|
列举租户(Azure AD Powershell)
1 |
|
列举租户(az cli)
1 |
|
在线列举
联合Azure AD or O365
1
2https://login.microsoftonline.com/getuserrealm.srf?login=<USER>@<DOMAIN>&xml=1
https://login.microsoftonline.com/getuserrealm.srf?login=root@<TENANT NAME>.onmicrosoft.com&xml=1获取租户id
1
2https://login.microsoftonline.com/<DOMAIN>/.well-known/openid-configuration
https://login.microsoftonline.com/<TENANT NAME>.onmicrosoft.com/.well-known/openid-configuration
枚举与喷洒
在传统的AD环境中,枚举与喷洒就是非常常见的攻击方式。作为TOP1的攻击方式,枚举与喷洒是作为没有相应的较高的权限以及shell作为立足点的情况下,成本较低也比较容易有惊喜产出的选择。
喷洒即为使用少数可能密码对大量用户进行尝试的攻击。而作为喷洒的基础,需要获得用户作为基础。一般会使用通过各种公众平台获得的用户名,而当没有较多可用账户时,枚举用户就成为攻击第一步。
枚举
1 |
|
当你拥有有效凭据的时候,可通过该凭据获得凭据提取电子邮件列表
1 |
|
命令
1 |
|
喷洒
1 |
|
默认情况下,Azure账户在尝试10次后就会锁定用户
非法授权获取
攻击者创建一个 Azure 注册的应用程序,请求访问联系人、电子邮件或文档等数据。然后攻击者诱骗用户授权应用程序,以便攻击者可以访问目标用户有权访问的数据。
这种工具可以完美绕过MFA。
查看用户是否有权限授权应用
1
(GetAzureADMSAuthorizationPolicy).PermissionGrantPolicyIdsAssignedToDefaultUserRole # AzureADPreview
- 禁用用户同意:用户不能授予应用程序权限。
- 用户可以同意来自经过验证的发布者或您组织的应用程序,但仅限于您选择的权限:所有用户只能同意由经过验证的发布者发布的应用程序和在您的租户中注册的应用程序
- 用户可以同意所有应用程序:允许所有用户授权。
- 自定义应用同意政策
注册
- 登录https://portal.azure.com
- 点击应用注册>新注册
- 输入我们的应用程序的名称
- 在支持帐户类型下选择“任何组织目录中的帐户(任何 Azure AD 目录 - 多租户)”
- 输入重定向的URL。此 URL 应指向我们用于托管网络钓鱼页面的 365-Stealer 应用程序。确保端点是
https://<DOMAIN/IP>:<PORT>/login/authorized
. - 单击注册并保存应用程序 ID
配置
- 点击
Certificates & secrets
- 单击 ,
New client secret
然后输入说明并单击添加。 - 保存secret的值。
- 单击 API 权限 > 添加权限
- 单击 Microsoft Graph >委派权限
- 搜索并选择下面提到的权限,然后单击添加权限
- Contacts.Read
- Mail.Read / Mail.ReadWrite
- Mail.Send
- Notes.Read.All
- Mailboxsettings.ReadWrite
- Files.ReadWrite.All
- User.ReadBasic.All
- User.Read
365-stealer
默认端口是443
运行 XAMPP 并启动 Apache
将 365-Stealer 克隆到
1
C:\xampp\htdocs\
git clone https://github.com/AlteredSecurity/365-Stealer.git
条件
- python3
- PHP CLI 或 Xampp 服务器
pip install -r requirements.txt
启用 sqlite3 (Xampp > Apache config > php.ini) 并重启 Apache
可编辑 C:/xampp/htdocs/yourvictims/index.php 符合利用场景
- 禁用 IP 白名单
$enableIpWhiteList = false;
- 禁用 IP 白名单
转到 365-Stealer 管理门户 > 配置(
http://localhost:82/365-stealer/yourVictims
)
- Client Id (Mandatory):这将是我们注册的应用程序的 Application(Client) Id。
- Client Secret (Mandatory):我们创建的 Certificates & secrets 选项卡中的 Secret 值。
- 重定向 URL(必填):指定我们在注册应用程序时输入的重定向 URL,例如
https://<Domain/IP>/login/authorized
- 宏位置:我们要注入的宏文件的路径。
- OneDrive 中的扩展:我们可以提供要从受害者帐户下载的文件扩展名,或者提供
*
下载受害者 OneDrive 中存在的所有文件的扩展名。文件扩展名应该用逗号分隔,如 txt、pdf、docx 等。 - 延迟:通过在窃取时指定时间(以秒为单位)来延迟请求
创建自签名证书以使用 HTTPS
运行应用程序,单击按钮或运行以下命令:
1
python 365-Stealer.py --run-app
--no-ssl
: 禁用HTTPS--port
: 更改默认监听端口--token
: 提供一个特定的令牌--refresh-token XXX --client-id YYY --client-secret ZZZ
:使用刷新令牌
找到网络钓鱼 URL:转到
https://<IP/Domain>:<Port>
并单击“阅读更多”按钮。
关于Token
未完待续….(偷个懒别骂了555..)
关于混合部署
Azure AD Connect
参考文章:https://blog.xpnsec.com/azuread-connect-for-redteam
当需要同时部署本地AD与Azure AD时,我们就需要用到混合部署,Azure支持与本地AD实时同步,将本地AD的凭据应用于Azure AD。而一般本地AD与Azure AD进行连接的服务为 Azure AD Connect。
检查是否安装Azure Connect:
1 |
|
有多种方式将 Azure AD 配置为与现有的 Active Directory 部署集成。
密码哈希同步 (PHS)
它将用户帐户和密码哈希从 AD 上传到 Azure
直通身份验证 (PTA)
它允许 Azure 将身份验证请求转发到本地 AD,而不依赖于上传哈希
联合身份验证
通过ADFS
针对不同部署的攻击
- 对于PHS,我们可以提取凭据
- 对于PTA,我们可以安装代理
- 对于联合部署,我们可以使用 DA 从 ADFS 服务器中提取证书
1 |
|
检查PTA是否安装:Get-Command -Module PassthroughAuthPSModule
安装PTA后门:
1 |
|
密码提取
ADSync服务存储的凭据:
1 |
|
工具 | 需要在目标上执行代码 | DLL 依赖 | 本地需要 MSSQL | 本地需要python |
---|---|---|---|---|
ADSyncDecrypt | 是 | 是 | 否 | 否 |
ADSyncGather | 是 | 否 | 否 | 是 |
ADSyncQuery | 否(仅限网络 RPC 调用) | 否 | 是 | 是 |
fox-it/adconnectdump 该工具可以用于dump Azure AD Connect 上的凭据
MSOL Dcsync
安装Azure Connect 服务将会自动安装 MSOL_04tg03g043534(后面是随机hex)
用户,该用户需要在域管组内或具有对目录的可写权限,大部分情况具有 DCSync 权限。
当你控制了Azure Connect 服务器后,可通过mimikatz转储该用户明文。
或者使用 XPN 的脚本:https://gist.github.com/xpn/f12b145dba16c2eebdd1c6829267b90c
无缝SSO银票
- 如果没有 MFA的话,任何可以修改 AZUREADSSOACCS$ 帐户属性的人都可以使用 Kerberos 模拟 Azure AD 中的任何用户
- PHS 和 PTA 都支持无缝 SSO。如果启用了无缝 SSO,则会在本地 AD 中创建一个计算机帐户AZUREADSSOC$
注:AZUREADSSOACC 帐户的密码永远不会更改。
使用 https://autologon.microsoftazuread-sso.com/ 将 Kerberos 票证转换为 Office 365 和 Azure 的 SAML 和 JWT
使用mimikatz获取机器用户hash
1
mimikatz.exe " lsadump::dcsync /user:AZUREADSSOACC$ "
获取我们要模拟的用户的 AAD 登录名,例如
elrond@contoso.com
。这通常是他的 userPrincipalName 或来自本地 AD 的邮件属性获取我们要模拟的用户的 SID,可通过域信息查看,例如
S-1-5-21-2121516926-2695913149-3163778339-111
创建银票
1
2
3
4mimikatz.exe " kerberos::golden /user:elrond
/sid:S-1-5-21-2121516926-2695913149-3163778339 /id:111
/domain:contoso.local /rc4:
f9969e088b30dc7dc7dc7dc7dc7333333333 .nsatc.net /service:HTTP /ptt "启动 Mozilla Firefox
转到 about:config 并设置
network.negotiate-auth.trusted-uris preference
的值为https://aadg.windows.net.nsatc.net,https://autologon.microsoftazuread-sso.com
导航到与我们的 AAD 域集成的任何 Web 应用程序。填写用户名,同时将密码字段留空。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!