内网渗透体系建设——Kerberos攻击专题
Kerberos攻击专题
Kerberos认证基础
在内网渗透中,Kerberos认证协议是基于票据的一种认证方式,简单理解可以分为三部分:用户(Client)、服务器(Server)和KDC(Key Distribution Center, 密钥分发中心)。KDC包含AS(Authentication Server, 认证服务器)和TGS(Ticket Granting Server, 票据授权服务器)
Kerberos基础认证流程
①AS_REQ。Client向AS发起AS_REQ,请求内容为通过Client的哈希加密的时间戳、ClientID等内容
②AS_REP。AS使用Client密码哈希值进行解密,如果解密正确,就返回用krbtgt的NTLM-hash加密的TGT(Ticket Granting Ticket, 票据授权凭证)票据。TGT包含PAC(Privilege Attribute Certificate, 特权属证书),PAC包含Client的相关权限信息,如SID
及所在的组。简单理解,PAC就是用于验证用户权限,只有KDC能制作和查看PAC
③TGS_REQ。Client凭借TGT向TGS发起针对需要访问服务的TGS REQ请求
④TGS_REP。TGS使用krbtgt的NTLM-hash对TGT进行解密,如果结果正确,就返回用服务NTLM-hash加密的TGS票据(简称ST),并带上PAC。注意,在Kerberos认证过程中,不论用户有没有访问服务的权限,只要TGT正确,就会返回ST
⑤AP_REQ。Client利用ST去请求服务
⑥AP_REP。服务使用自己的NTLM-hash解密ST。如果解密正确,就会将其中的PAC给KDC解密,KDC由此判断Client是否访问服务的权限。如果没有设置PAC,就不会去KDC求证,这也是后文中白银票据成功的原因
Kerberos攻击分类
Kerberos攻击其实可以归结为两个字:票据,即常说的票据传递攻击(Pass The Ticket, PTT)
AS_REQ&AS_REP阶段攻击
1.域内用户枚举
当机器不在域中时,可以通过Kerberos的AS_REQ工作原理来进行枚举域内账号,由于用户名存在跟不存在的报错不一致,导致可以进行用户名相关枚举
2.密码喷洒攻击
密码喷洒攻击是指对其他用户进行密码爆破,类似暴力破解
3.AS_REP Roasting攻击
当被攻击账号设置“不需要Kerberos预身份验证”后,在AS REP过程中就可以任意伪造用户名请求票据,随后AS会将伪造请求的用户名NTLM Hash加密后返回,然后便可以进行爆破。由于该攻击方式的首要条件默认是不勾选的,这里不再赘述
4.黄金票据攻击
在Kerberos认证中,每个用户的票据都是由krbtgt的NTLM哈希值加密生成的,获得krbtgt的哈希值,便可以伪造任意用户的票据,这种攻击方式被称为黄金票据(GoldenTicket),有了黄金票据后,就跳过AS验证,不用验证账户和密码,所以也不用担心域管密码修改
攻击需要以下信息:域名、域sid、krbtgt哈希值、伪造的用户
①在DC上用mimikatz执行如下命令
1 | mimikatz.exe "Log" "Privilege::Debug" "lsadump::lsa /patch" "exit" |
②得到krbtgt的哈希值后,先在win2008上访问DC的CIFS服务,发现不可访问,再利用mimikarz生成黄金票据并导入
1 | kerberos::golden /admin:Administrator /domain:hack-my.com /sid:S-1-5-21-752537975-3696201862- |
黄金票据防御
- 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机(不要让其他管理员登录到这些服务器)将所有其他权限委派给自定义管理员组。这大大降低了攻击者访问域控制器的Active Directory的ntds.dit。如果攻击者无法访问AD数据库(ntds.dit文件),则无法获取到KRBTGT帐户密码
- 禁用KRBTGT帐户,并保存当前的密码以及以前的密码。KRBTGT密码哈希用于在Kerberos票据上签署PAC并对TGT(身份验证票据)进行加密。如果使用不同的密钥(密码)对证书进行签名和加密,则DC(KDC)通过检查KRBTGT以前的密码来验证
TGS_REQ&TGS_REP阶段攻击
Kerberosast攻击
在介绍Kerberosast攻击方式前,先来了解SPN。SPN(Service Principal Name, 服务器主体名称)是服务器所运行服务的唯一标识,每个使用Kerberos认证的服务都必须正确配置相应的SPN,一个账户下可以有多个SPN。根据权限,SPN有两种注册方式,分别为:机器账户computers、域用户账户users。KDC查询SPN也按照账户方式进行查找
Kerberosast攻击主要利用了TGS_REP阶段使用服务的NTLM Hash返回的加密数据,对于域内的任何主机,都可以通过查询SPN,向域内的所有服务请求ST(因为KDC不会验证权限),然后进行暴力破解,但只有域用户的SPN是可以利用的(这是因为机器账户的SPN每30天会更改随机128个字符密码导致无法被破解),所以在实际过程中要注意攻击的是域用户。当然,如果该SPN没有注册在域用户下,就可以尝试进行注册再利用hashcat破解即可。实际上Kerberosast攻击方式的成功与否与密码字典直接相关,这里不再进行赘述
白银票据攻击
在Kerberos认证的第三步,Client带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只能访问特定服务器上的部分服务
黄金票据和白银票据的区别
获取的权限不同
金票:伪造的TGT,可以获取任意Kerberos的访问权限
银票:伪造的ST,只能访问指定的服务,如CIFS认证流程不同
金票:同KDC交互,但不同AS交互,需要访问域控
银票:不同KDC交互,直接访问Server,不需要访问域控加密方式不同
金票:由krbtgt NTLM Hash 加密
银票:由服务账号 NTLM Hash 加密
委派攻击
在现实情况下,往往多个服务不可能在一台机器中,那么如果用户在使用服务A时,这时候需要服务B上属于自已的数据,最简单的方式就是A代用户去请求B返回相应的信息,这个过程就是委派
委派攻击分为非约束委派、约束委派、基于资源的约束委派三种
1.非约束委派攻击
非约束委派的请求过程如图所示。当service1的服务账户开启了非约束委派后,user访问service1时,servicel会将user的TGT保存在内存中,然后service1就可以利用TGT以user的身份去访问域中的任何user可以访问的服务。如果域管理员访问了某个开启了非约束委派的服务,那么该服务所在计算机会将域管理员的TGT保存至内存,那么获得其特权便可以获取域控权限
2.约束委派攻击
由于非约束委派的不安全性,微软在Windows Server2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U协议:S4U2Self和S4U2proxy。S4U2self用于生成本身服务TGS票据,S4U2porxy用于”代理”相关用户申请其他服务票据。约束委派
的请求过程如图所示。其中前4步是S4U2Self,后6步是S4U2proxy
简单总结:S4U2self是service1代表用户请求的自身可转发ST,但是不能以该用户身份请求另外服务,意味着S4U2Self必须是在具有SPN的账户上操作,S4U2proxy则是service1以S4U2self阶段的可转发ST(其中包含用户的相关身份信息)代表用户去申请
请求service2的ST,而在S4U2proxy过程会通过判断msds-allowedtodelegateto里的SPN值来确定是否可以申请到service2的ST,所以这也是约束委派与非约束委派的最大区别,即只能访问特定的服务。注意,约束委派的前置条件服务自身需要通过KDC认证的TGT
3.基于资源的约束委派
基于资源的约束委派(Resource Based Constrained Delegation,RBCD)是在WindowsServer 2012中加入的功能,与传统约束委派相比,不需要域管理员权限去设置相关属性,而是将设置委派的权限交给了服务机器。服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派。可以将其理解为传统约束委派的反向过程。以A、B两个服务为例,前者通过需要在DC上设置A的msDS-AllowedToDelegateTo属性,后者则设置B的msDS-AllowedToActOnBehalfOf-OtherIdentity属性,即设置A的SID。注意,基于资源的约束委派的S4U2self阶段的ST是不可转发的
可以发现,基于资源的约束委派的重点是msDS-AllowedToActOnBehalfOfOtherIdentity属性的设置,所以可以分为以下方式:
- 如果可以修改服务B的该属性, 将其更新为可控制的SPN账户SD, 就可以伪造任意用户获得服务B的相关权限,实现变相提权
- 利用realy攻击,首要条件是relay攻击
PAC攻击
1.MS14-068
MS14-068漏洞的原因是KDC无法正确检查PAC中的有效签名,由于其实现签名的加密允许所有的签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证,因此可以利用不需要相关密钥的算法,如MD5,实现内容的任意更改,导致用户可以自己构造一张PAC,伪造用户的SID和所在的组。那么,可以通过伪造PAC,加入域管相关信息,访问域控服务,KDC会认为当前用户有权限,从而把这个用户当作域管组的成员,进而达到提升为域管理员的效果
2.CVE-2021-42278&CVE-2021-42287(NoPac)
CVE-2021-42278是一个安全绕过漏洞,允许通过修改机器账户的sAMAccountName属性来冒充域控制器。与标准用户账户相比,机器账户的名称末尾附加了“$”符号,但实际中,AD并没有验证域内机器账户中是否具有“$”,导致机器账户可以被假冒
CVE-2021-42287是影响Kerberos特权属性证书(PAC)的安全绕过漏洞,允许通过假冒域控制器,使密钥分发中心(KDC)创建高权限票据
根据认证Kerberos协议,在请求服务票证前需要先签发TGT(票据授权凭证)。但是,当为活动目录中不存在的账户请求服务票证时,密钥分发中心(KDC)将在该账户名上附加“$”符号进行搜索。将这一行为与CVE-2021-42278结合,测试人员可以实现域内权限提升,大致流程如下:
①创建一个机器账户,假设为HACKME$
②清除机器账户HACKME$的servicePrincipalName属性
③修改机器账户HACKME$的sAMAccountName属性,使其指向不带“$”符号的域控制器账户
④利用账户DC-1请求TGT
⑤将新建的机器账户的sAMAccountName属性恢复为其原始值(HACKME$)或其他任何值
⑥利用S4U代表域管理员请求对应服务的服务票据(ST)
⑦伪造域管理员账户获得相应服务的ST