红队视角下的微软Azure:通过Azure泄露Active Directory信息(第一部分)

本文详细探讨了在微软Azure环境中,攻击者如何利用合法凭证通过Azure门户泄露整个Active Directory结构,包括用户、组、应用程序和设备信息,并提供了防御建议。

红队视角下的微软Azure:第一部分 - 通过Azure泄露Active Directory信息

Mike Felch //

微软拥有众多技术、服务、集成、应用和配置,管理这一切已经非常困难。现在想象一下,如何保护一个远超出传统边界的环境。虽然将所有内容迁移到云提供商可以带来可扩展性、功能性和成本节约方面的巨大回报,但也会带来重大的盲点。在过去的一年里,我一直在研究如何针对使用微软作为云提供商的组织。我希望发布一系列技术,这些技术在揭示这些盲点方面非常有效,就像我和Beau Bullock(@dafthack)在研究谷歌时那样。

我不会误导你,我并不是微软专家。事实上,我读得越多,越感到迷茫。尽管在过去的一年里,我从红队的角度学会了如何操纵这些技术以更好地针对组织,但我仍在努力理解许多概念。默认配置是什么?这是默认提供的吗?这是否与所有内容同步?如果我在这里更改,它们是否会传播回去?为什么不会?问题层出不穷。当我私下分享这些技术时,问题总是接踵而至。虽然我认为只提问题而不提供解决方案是不负责任的,但有时解决方案并不非黑即白。我的建议是:了解你的环境,了解你的技术,如果不确定,请联系你的服务提供商以确保万无一失。

微软的生态系统

假设你多年来一直在本地运行微软Active Directory和Exchange,但现在想快速为员工部署Microsoft Office,同时为他们提供Webmail门户、Sharepoint和一些内部应用的SSO访问。于是你决定迁移到Office 365,一切运行良好!所有用户都可以使用他们的网络凭据进行身份验证,电子邮件也运行得很好!你认为自己是一个本地组织,还是已经进入了“臭名昭著”的云端?也许你采取了混合方法,两者兼而有之。微软提供了大量支持的集成,但你如何知道是否正确地管理了一切?

一个假设的复杂场景

对于本地用户管理,有传统的微软AD;对于云服务用户管理,你可以使用Azure AD。对于邮件,有本地Exchange,但你也可以将邮件迁移到Exchange Online。如果你想要完整的Microsoft Office套件,可以使用Office 365,但它实际上是通过微软多租户环境中的Exchange Online路由的,所以你可能会同时使用两者却只需支付一个的费用。由于你购买了Office 365 Business,你还获得了一些服务,如Skype和OneDrive,尽管你可能使用GDrive或Box进行企业文件共享。你注册了一个多因素认证解决方案,默认使用SMS令牌,但出于某种原因,你的用户仍然可以在不需要MFA的情况下通过Outlook进行身份验证……奇怪(感谢微软EWS)。总的来说,一切都能正常工作,这要归功于Azure AD Connect……或者Azure AD Synchronization Services……或者我们仍在运行老旧的DirSync与Forefront Identity Manager?无论如何,它在运行,这才是最重要的!

那么……问题出在哪里?

在上述场景中,会产生许多问题,蓝队几乎无法防御或应对从远程转储Active Directory到绕过甚至劫持用户多因素认证的各种攻击。在渗透测试的侦察阶段,通常通过LinkedIn或其他OSINT技术了解组织部门的人员结构。如果你在内网中,重新审视这一步至关重要,因为你需要深入了解组织的细节,比如配置了哪些组以及这些组的成员是谁。这对于成功转向相关机器并根据用户访问权限进行目标定位以实现权限提升至关重要。但如果你不在内网中,但仍需要确定目标呢?更妙的是,如果组织的关键目标托管在云端,而你根本不需要攻击内网呢?

对于微软来说,如果你在使用任何云服务(如Office 365、Exchange Online等)与Active Directory(本地或Azure)结合,那么攻击者只需一个凭据就可以通过Azure AD泄露整个Active Directory结构。

步骤1)登录你的Webmail门户(例如https://webmail.domain.com/)
步骤2)将浏览器URL更改为:https://azure.microsoft.com/
步骤3)从活动会话中选择账户
步骤4)选择Azure Active Directory并享受吧!

这会带来许多糟糕的情况。例如,如果我们能够导出所有用户和组,我们将获得一个非常漂亮的员工列表及其所属组。我们还可以了解需要进入哪些组才能访问VPN、域管理、数据库、云服务器或财务数据。Azure AD的另一个好处是它保存了每个用户的设备信息,因此我们可以看到他们使用的是Mac、Windows机器还是iPhone,以及版本信息(例如Windows 10.0.16299.0)。如果这还不够,我们还可以了解所有业务应用程序及其端点、服务主体名称、其他域名,甚至用户可能访问的虚拟资源(如虚拟机、网络、数据库)。

等等,还有更多!

以普通用户身份登录Azure门户的另一个好处是,你可以创建一个后门……呃……我是说“访客”账户。多么方便啊!
步骤1)点击“Azure Active Directory”
步骤2)在“管理”部分点击“用户”
步骤3)点击“新建访客用户”并邀请自己

根据配置,这可能会也可能不会同步回内网。实际上,虽然创建访客账户是默认开启的,但我只验证了一个客户,其Azure AD Connect是双向同步的,允许访客账户进行身份验证、注册多因素设备并在内部使用VPN。这是一个重要的配置组件,因为它可能会带来糟糕的一天。

红队视角下的Azure

通过浏览器访问Azure门户非常棒,有许多优势,但我还没有找到直接导出信息的方法。我开始编写一个工具来自动化完成这一过程,但感觉非常繁琐,而且我知道微软已经通过将这些技术结合在一起为我解决了这个问题。我遇到了几种解决方案,其中包括:

  • Azure CLI(AZ CLI)
    作为一个Linux用户,我自然倾向于使用AZ CLI。部分原因是我尽可能将数据通过管道传递到一行命令中,部分原因是我在.NET中过度设计工具。使用AZ CLI是一种快速简单的方法,可以通过OAUTH对Azure进行身份验证,同时快速导出原始数据。在本文中,我们将重点介绍这一解决方案。

  • Azure PowerShell
    随着PowerShell Empire和MailSniper等优秀PowerShell工具的兴起,我很惊讶Azure PowerShell尚未成为这些工具的一部分。有大量Active Directory Cmdlet可供交互。要开始使用,只需安装Azure RM PowerShell,然后运行:Connect-AzureRmAccount

  • Azure .NET
    我是一个奇怪的极客,成长于Linux,但在职业生涯中写了大量C#代码。因此,拥有一个用于与Active Directory交互的Azure .NET库令人鼓舞。我没有深入研究这些库,但从高层次来看,它们似乎是Active Directory Graph API的某种包装器。

深入探讨!

如前所述,我们将重点介绍使用AZ CLI与Azure交互。首先,我们需要与Azure建立一个活动会话。在涉及使用微软或谷歌服务的组织的红队行动中,我很少直接尝试获取内网的Shell。我通常会使用一个名为CredSniper的工具来钓鱼获取凭据和多因素令牌,然后以该用户身份进行身份验证,以获取敏感邮件、文件、访问权限和信息以及VPN。

基于这一假设,我们假设已经通过某种方式获得了有效的凭据。

安装AZ CLI

你需要将微软源添加到apt(假设是Linux),安装微软签名密钥,然后安装Azure CLI:

1
2
3
4
5
6
7
AZ_REPO=$(lsb_release -cs) echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | sudo tee /etc/apt/sources.list.d/azure-cli.list

curl -L https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -

sudo apt-get install apt-transport-https

sudo apt-get update && sudo apt-get install azure-cli

通过Web会话进行身份验证

正确安装所有内容后,你需要使用已获得的凭据创建一个Azure会话。最简单的方法是在普通浏览器中通过ADFS或OWA进行身份验证,然后:

1
az login

这将生成本地OAUTH令牌,打开一个浏览器标签页到身份验证页面,并让你根据已经通过身份验证的账户选择一个账户。选择账户后,本地OAUTH令牌将由服务器验证,除非它们过期或被销毁,否则你无需再次操作。你也可以传递--use-device-code标志,这将生成一个令牌,你需要将其提供给https://microsoft.com/devicelogin

转储用户

现在进入我最喜欢的部分!之前已经研究了许多提取GAL的技术,例如在OWA中使用FindPeople和GetPeopleFilter Web服务方法。这些技术对红队来说是非常好的资源,但它们在可用数据、枚举用户所需时间、由于需要大量Web请求而导致的噪音以及偶尔中断方面存在局限性。使用AZ CLI,提取每个用户的目录信息非常简单。在下面的示例中,我应用了一个JMESPath过滤器来提取我关心的数据。我还可以以表格、JSON或TSV格式导出!

  • 所有用户

    1
    
    az ad user list --output=table --query='[].{Created:createdDateTime,UPN:userPrincipalName,Name:displayName,Title:jobTitle,Department:department,Email:mail,UserId:mailNickname,Phone:telephoneNumber,Mobile:mobile,Enabled:accountEnabled}'
    
  • 特定用户
    如果你知道目标账户的UPN,可以通过传递--upn标志检索特定账户。这在你想深入了解特定账户的Active Directory信息时非常方便。在下面的示例中,你会注意到我提供了JSON格式而不是表格输出。

    1
    
    az ad user list --output=json --query='[].{Created:createdDateTime,UPN:userPrincipalName,Name:displayName,Title:jobTitle,Department:department,Email:mail,UserId:mailNickname,Phone:telephoneNumber,Mobile:mobile,Enabled:accountEnabled}' --upn='<upn>'
    

转储组

下一个我最喜欢的功能是转储组的能力。了解组织内如何使用组可以提供关于业务领域、用户和管理员的特定洞察。AZ CLI提供了一些有用的命令来帮助完成这一任务。

  • 所有组
    我通常做的第一件事就是导出所有组。然后我可以搜索某些关键词:Admin、VPN、Finance、Amazon、Azure、Oracle、VDI、Developer等。虽然还有其他组元数据可用,但我通常只抓取名称和描述。

    1
    
    az ad group list --output=json --query='[].{Group:displayName,Description:description}'
    
  • 特定组成员
    一旦你审查了组并挑选出感兴趣的组,接下来导出组成员就非常有用。这将为你提供一个属于感兴趣组的优秀目标列表——鱼叉式网络钓鱼的主要目标!与普遍观点相反,我个人发现技术能力和头衔并不会降低目标用户交出凭据(甚至MFA令牌)的可能性。换句话说,每个人都容易受到攻击,因此我通常针对后端工程师和DevOps团队,因为他们通常拥有最多的访问权限,而且我通常可以保持在外网,同时仍然访问私有的GitHub/GitLab代码库以获取凭据、Jenkins构建服务器以获取Shell、OneDrive/GDrive文件共享以获取敏感数据、Slack团队以获取敏感文件以及一系列其他第三方服务。再说一次,如果不需要,为什么要进入内网呢?

    1
    
    az ad group member list --output=json --query='[].{Created:createdDateTime,UPN:userPrincipalName,Name:displayName,Title:jobTitle,Department:department,Email:mail,UserId:mailNickname,Phone:telephoneNumber,Mobile:mobile,Enabled:accountEnabled}' --group='<group name>'
    

转储应用程序和服务主体

微软提供的另一个不错的功能是能够注册使用SSO/ADFS或与其他技术集成的应用程序。许多公司利用这一点来开发内部应用程序。这对红队来说很好,因为与应用程序关联的元数据可以提供更深层次的攻击面洞察,这些攻击面可能在侦察阶段未被发现,比如URL。

  • 所有应用程序

    1
    
    az ad app list --output=table --query='[].{Name:displayName,URL:homepage}'
    
  • 特定应用程序
    在下面的截图中,我们看到通过检查Azure中注册应用程序的元数据,我们获得了Splunk实例的URL。

    1
    
    az ad app list --output=json --identifier-uri='<uri>'
    
  • 所有服务主体

    1
    
    az ad sp list --output=table --query='[].{Name:displayName,Enabled:accountEnabled,URL:homepage,Publisher:publisherName,MetadataURL:samlMetadataUrl}'
    
  • 特定服务主体

    1
    
    az ad sp list --output=table --display-name='<display name>'
    

使用JMESPath进行高级过滤

你可能已经注意到,在上述示例中,我试图限制返回的数据量。这主要是因为我试图抓取我需要的内容,而不是所有内容。AZ CLI通过使用--query标志和JMESPath查询来处理这一点。这是一种用于与JSON交互的标准查询语言。我确实注意到AZ CLI在将查询标志与“show”内置函数结合使用时存在一些错误。另一件需要注意的事情是,默认响应格式是JSON,这意味着如果你计划使用查询过滤器,你需要指定正确的大小写敏感的命名约定。不同格式的名称之间存在一些不一致。如果你使用表格格式,它可能会大写,而JSON是小写的。

禁用对Azure门户的访问

我花了一些时间试图弄清楚要禁用哪些内容、如何防止访问、如何限制、监控什么,甚至联系了Twitter上的人(感谢Josh Rickard!)。我很感激所有伸出援手帮助理解这一混乱局面的人。我想我应该更多地学习微软生态系统,以提供更好的建议。在此之前,我为你提供一种禁用用户访问Azure门户的方法。我还没有测试过这一点,不确定这是否包括AZ CLI、Azure RM PowerShell和Microsoft Graph API,但这绝对是一个开始。

步骤1)使用全局管理员账户登录Azure:https://portal.azure.com
步骤2)在左侧面板中选择“Azure Active Directory”
步骤3)选择“用户设置”
步骤4)选择“限制对Azure AD管理门户的访问”

另一种方法是研究条件访问策略:https://docs.microsoft.com/en-us/azure/active-directory/conditional-access/overview

即将推出!

有许多工具可用于测试AWS环境,甚至最近还出现了捕获云凭据的新工具,如SharpCloud。云环境似乎是一个常被忽视的攻击面。

我将发布一个(目前私有的)红队框架,用于与云环境交互,名为CloudBurst。这是一个可插拔的框架,使用户能够与不同的云提供商交互以捕获、入侵和窃取数据。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计