本文翻译自Silverfort的高级研究员Dor Segal的文章 Bounce the Ticket and Silver Iodide Attacks on Azure AD kerberos
本人无论是英文水平还是技术水平均有限,难免译文有错漏之处,还请海涵并望不吝赐教。
微软最近官宣了Azure AD Kerberos的通用解决方案,一款基于云的kerberos实现。当我们重新审视Azure AD Kerbeors时,我们发现尽管其比尝试了很多期望其比传统的kerberos的实现更加安全,但Auzre AD Kerberos依然可以被类似的攻击技术攻击。在这片白皮书中,我们介绍了两种技术:反弹票据攻击和碘化银攻击,即云版本的票据传递攻击和银票攻击。
黑客帝国-墨菲斯:如果我告诉你云只是别人的电脑计算机呢?
Azure 活动目录(Azure AD)Kerberos 是kerberos身份验证协议的云版本,是专门为在Azure云平 台上工作而构建的。
在云计算之前的时代,Kerberos(以及之前的NTLM)是企业环境中大多数到所有身份验证的核心协议。然而,随着不断地向云化迁移,尤其是随着SaaS应用程序、云工作负荷和传统的基础设施的混合使用 ,改变了这一点。如今,SaaS应用程序的常见做法是向基于云的身份提供商进行身份验证,比如 Azure AD。而本地工作负载仍然对具有Kerberos等传统协议的AD进行身份验证。
因此,像Azure虚拟桌面和Azure文件等云基础设施的认证虽然本身不属于本地AD域,但依然依赖相关技术。
新的Azure AD Kerberos 认证协议设计旨在克服这种依赖性,将云工作负荷引流到Azure AD云原生认证基础设施,因此在云Azure资源和本地Windows协议以及应用(例如SMB、RDP、RPC等等)之间引入一个光滑的集成。 通过这种方式,组织可以整合所有的云资源的身份认证,无论是SaaS应用还是Azure Ad中的基础设施的工作负荷。
然而,Azure AD Kerberos仍然与它的前辈本地Kerberos有很多相似之处。在这篇白皮书中,我们分享已经进行的研究,来判断现有的针对传统kerberos协议的攻击技术是否适用于新的修改后的Azure AD Kerberos。研究结论是存在两种新的攻击技术。第一种是调整后的臭名昭著的PTT攻击,我们称之为反弹票据。第二种是调整后的银票攻击,我们称之为银碘化攻击。这篇白皮书详细介绍了两种攻击细节和缓解措施。
本着负责的态度,我们在披露前已经与微软MSRC团队沟通了这两种技术,非常感谢其花费时间精力来确认和审批允许我们公开。
Kerberos是一种现代的值得推荐的企业认证协议,它包括三个独立的保护过程(就像三头狗 Cerberus),它们共同提供一个安全通道来传输身份验证消息。该协议基于票据交换,每个过程都为确认身份验证不同阶段提供了保证。密钥分发中心(KDC)管理身份验证过程,监督给认证客户票据的分发、用户口令的验证和服务票据的分发。一般情况下,KDC基于对称密钥密码体制完成其加解密过程,但也可以选择使用非对称密体制 。
下面是Kerberos的三个过程实现:
这是Kerberos认证的第一阶段,客户端需要提供一个有效的口令来接受一个可以验证其完整性的票据(TGT)。这个TGT (Ticket granting ticket) 是由由认证服务加密的,并且是唯一可以验证一张给定的TGT票据完整性的验证者。在TGT票据还附加了一个Session Key,Session Key是TGS服务加密过程中使用的。该Session Key经用户口令加密,因此用户可以解密消息获得Session Key,进行下一步TGS请求的验证。
在Kerberos身份验证的第二阶段中,用户向KDC请求TGS服务。这类型的票据将用于特定的服务。在活动目录中,已注册的服务称为服务主体名称(SPN),其约定惯例格式为:服务类/主机。要验证一个ST,需要一个共享的密钥——服务器的私钥。在Windows机器中,此密钥被保存在注册表中的Security Hive中。在其他平台和第三方应用程序中,微软提供导出一对(SPN和服务器的私钥)称之为Keytab。TGS 票据用服务器的私钥加密并包含一个保存着关于客户端的授权数据这特权属性证书(PAC)。这个信息无法被编辑或修改,因为只有服务器知道其自己的私钥。
身份认证的最后一个阶段是Application Request(AP)阶段。客户端通过预定协议(例如HTTP、SMB、RPC、RDP等)直接发送AP-REQ到服务器,这里面包含ST,在服务侧,ST经过KDC分发的服务端私钥解密。通过这种方式,服务端可以验证客户端票据来自于正确的KDC。解密成功后,服务器通过审核PAC来确定客户端是否被授权访问服务并做出应答。
Kerberos 认证过程
Kerbeos通过两个服务完成其身份认证过程:
黑客帝国-墨菲斯:选择你的命运? 红色药丸(云) 蓝色药丸(本地)
在Azure AD Kerberos中,KDC(包括AS和TGS)转到了云上,因此,客户端无法通过明文信道与KDC交互。因此,Azure AD 利用 KDC Proxy Kerberos Extension(MS-KKDCP)在一个TLS隧道中传输Kerberos Message。
当你注册到了Azure AD, Windows 划定一个域(windows.net)到KERBEROS.MICROSOFTONLINE.COM 中,基于这种划分,当用户尝试访问资源时,就需要windows.net域中的Kerberos认证。KDC Proxy协议就是Azure-Based KDC用来提供在KERBEROS.MICROSOFTONLINE.COM中的ST的协议。
KerbTopLevelNames字段用于在云资源到云KDC之间进行映射
微软拆分了AS服务和TGS服务,所以现下,云TGT可以与在登录到Azure AD时获得的主刷新令牌(the Primary Refresh Token,PRT)一起检索。当到 login.microsoonline.com/
使用Kerberos Proxy的TGS 请求
最后,Azure Files等兼容资源接受Kerberos 的AP-REQ(Application request)发送已取得的ST。
看起来,Azure AD Kerberos在安全性上投入了大量的思考和努力。第一个安全增强是AS和TGS端点的分离,通过一个更强大的安全机制来保护krbtgt密钥,避免金票攻击。第二个安全增强是使用KDC代理和基于TLS的加密通信层在web上传输认证信息。然而,Azure AD Kerberos 相比于本地版本是否对常见的漏洞和攻击技术做了更好的防护呢?让我们进一步探索。
我们介绍两种我们发现的新的攻击技术,这两种技术利用了这些修改中的弱点,我们称之为反弹票据攻击和碘化银攻击。
Kerberos的一个主要的安全问题是其在lsass进程中缓存的票据( in-memory ticket caching),这个机制在Azure AD Kerberos中并没有得到修复。一旦对手获取了Windows机器的控制权,他们可以从内存中得到TGT,然后使用这个TGT来请求任意他们希望获得的Kerberos ST。这种攻击被称为PTT。
PTT攻击
我们称Azure AD Kerberos中的PTT攻击为Bounce the Ticket攻击,他们确实非常相似。首先我们从内存中提取TGT用来访问云上TGS而非本地TGS。我们获得的票据可以用来访问云上的依赖于Azure AD Kerberos的资源。
在混合环境中,本地AD和Azure AD Kerberos domain 均被使用着,一个攻击者可以利用反弹票据攻击来从本地环境跨到Azure AD管理的云环境中。
尽管该攻击非常像本地PTT攻击,但依然略有不同,需要改变现有的攻击工具来使得攻击更加容易。我们选择Rubeus,一个由GhostPack编写用来进行Kerberos交互和滥用的工具。下面的改动使得Rubeus更适应Azure AD Kerberos:
...
}
kvi.LogonServer = new Ndr._RPC_UNICODE_STRING("login.microsoftonline.com");
if (!String.IsNullOrEmpty(displayName))
{
...
LogonServer 修改
幸运的事,Rubeus 已经支持KDC Proxy扩展了,因为其本身也不是一个新的扩展,而且经常用来服务应用通过WEB查询Kerberos这一过程。
尝试使用Rubeus进行攻击:
mimikatz# Privilege::debug
mimikatz# sekurlsa::ticket /export
mimikatz 使用
Rubeus.exe asktgs /ticket:ticket.kirbi /service:cifs/AzFilesShare.file.core.windows.net
/proxyurl:https:/ /login.microsoonline.com/tenantID/kerberos /enctype:AES256 /ptt
反弹票据(Bounce-the-Ticket BTT)攻击
我们继续介绍一种攻击技术:本地白银票据攻击允许攻击者利用一个窃取的服务器Key来伪造票据,该票据可以以任意权限访问服务器。
在经典的本地银票攻击中,攻击者首先获取一个服务器的Kerberos Key(机器账户的Hash)这个Key可以通过很多技术方式获取,例如Kerberoasting. 一旦攻击者获得了这个Key,就可以伪造ST。因为在Kerberos中ST是由Server Key加密的,所以攻击者可以利用该Key伪造该服务器的ST。举例,一个攻击者可以生成一个攻击者压根没有改username的认证信息的身份或一个提升了攻击者控制的账号的初始权限的身份所对应的票据,这就导致了攻击者可以以管理员身份访问目标服务。
银票攻击
碘化银攻击技术与本地银票攻击类似,但也有一些不同。这种技术适应云化的主要挑战是在Azure AD Kerberos中,服务器的密钥是由Azure使用加密强随机数生成器生成的。这意味我们不能依赖于过去的基于弱密钥的攻击,例如Kerberoasting攻击。我们必须通过其他方式获取Server Key。获取服务器密钥的特定方式因受到攻击的应用程序而有所不同。对于这个演示,我们分析了Azure文件中的一个安全缺陷。
为了使得本地银票攻击技术适应云环境,我们修改了Rubeus 的银票生成方法,且将所需领域到修改到匹配KERBEROS.MICROSOFTONLINE.COM,还有修改了LogonServer,还有就是使用获得的Key伪造我们自己的碘化银票据。
Azure Files 是一个基于云的serverless文件共享服务,相当于云化的SMB文件共享。该共享可以以不同的方式使用。在我们的上下文中,最感兴趣的是从Azure虚拟桌面访问Azure Files。因为这种访问可以使用SMB与Kerberos认证协议,通过Azure AD Kerberos来完成。
Azure文件共享被配置在Azure Portal中,在Azure AD Kerberos 的预览版中,用户被要求通过powershell命令配置一个存储账户Key,该Key扮演者着Kerberos 存储私钥的角色。
Azure AD Kerberos 预览版文档
在GA版本中,不再需要该命令,而是在配置Azure Files时自动完成配置。
该密钥也可以稍后使用以下powershell命令提取:
$kerbKey1 = Get-AzStorageAccountKey -ResourceGroupName $resourceGroupName -Name
$storageAccountName -ListKerbKey | Where-Object { $_.KeyName -like "kerb1" }
这两条命令同时适用于预览版和GA版本。
显然,攻击者并不一定需要拥有对该资源的权限来运行Get-azstorageAccountKey命令,只需要成为以下组之一的成员即可:
这些组也不一定与拥有访问资源本身中的数据的权限有关,比如DevTest Labs用户。
IAM截图
所以为了获得权限提升,我们需要做的是:
最后,我们将修改了Rubeus 的银票生成方法,且将所需领域到修改到匹配KERBEROS.MICROSOFTONLINE.COM,还有修改了LogonServer,还有就是使用获得的Key伪造我们自己的碘化银票据。
碘化银攻击
鉴于当前还没有补丁来修复导致这些攻击的问题,我们推荐下列环节措施: