Kerberos认证基础

在内网渗透中,Kerberos认证协议是基于票据的一种认证方式,由美国麻省理工学院发明,简单理解可以分为三部分:用户(Client)、服务器(Server)和 KDC(Key Distribution Center,密钥分发中心)。KDC包含AS(Authentication Server,认证服务器)和TGS(Ticket Granting Server,票据授权服务器)。

Kerberos基础认证流程

其流程图如下:

image-20240421115735137

解释如下:

  1. AS_REQ。CIient向AS发起AS_REQ,请求内容为通过Client的哈希加密的时间戳、ClientID 等内容。
  2. AS_REP。AS使用Client密码哈希值进行解密,如果解密正确,就返回用krbtgt的 NTLM-hash 加密的 TGT(Ticket Granting Ticket,票据授权凭证)票据。TGT 包含 PAC(Privilege Attribute Certificate,特权属证书),PAC包含 Client的相关权限信息,如 SID及所在的组。简单理解,PAC就是用于验证用户权限,只有KDC能制作和查看PAC。
  3. TGS_REQ。Client 凭借 TGT向TGS 发起针对需要访问服务的 TGS_REQ 请求。
  4. TGS_REP。TGS 使用 krbtgt的 NTLM-hash对TGT 进行解密,如果结果正确,就返回用服务 NTLM-hash加密的TGS票据(简称 ST),并带上PAC。注意,在Kerberos认证过程中,不论用户有没有访问服务的权限,只要TGT正确,就会返回ST。
  5. AP_REQ。Client利用ST去请求服务。
  6. AP_REP。服务使用自己的 NTLM-hash 解密 ST。如果解密正确,就会将其中的PAC 给KDC 解密,KDC由此判断Client是否有访问服务的权限。当然,如果没有设置PAC,就不会去KDC求证,这也是白银票据成功的原因。

Kerberos攻击分类

Kerberos攻击其实可以归结为两个字:票据,即常说的票据传递攻击(Pass The Ticket,PTT)。

这里有一张攻击分类图

image-20240421120946839

AS_REQ&AS_REP阶段攻击

域内用户枚举

当机器不在域中时,可以通过Kerberos的ASREQ工作原理来进行枚举域内账号,由于用户名存在跟不存在的报错不一致,导致可以进行用户名相关枚举。

密码喷洒攻击

密码喷洒攻击是指对其他用户进行密码爆破,类似暴力破解。

AS_REP Roasting攻击

当被攻击账号设置“不需要Kerberos预身份验证”后,在ASREP过程中就可以任意伪造用户名请求票据,随后 AS 会将伪造请求的用户名 NTLMHash 加密后返回,然后便可以进行爆破。

黄金票据攻击

在Kerberos 认证中,每个用户的票据都是由 krbtgt的 NTLM 哈希值加密生成的,获得 krbtgt 的哈希值,便可以伪造任意用户的票据,这种攻击方式被称为黄金票据(GoldenTicket)。

image-20240421123213561

攻击需要这些信息:域名,域sid,krbtgt哈希值,伪造的用户。

域sid:

查询自己的SID可以通过:whoami /user

查询其他用户的SID可以通过WMI查询:wmic useraccount where name=%username% get sid

SID的形式:S-1-5-21-<域标识>-<相对标识>

  • “S-1”表示该标识是一个SID。
  • “5”表示这是一个Windows服务器或域的标识。
  • “21”是一个固定值,用于指示该SID是一个域SID。
  • “<域标识>”是一个唯一的域标识符,用于标识特定的域。
  • “<相对标识>”是一个相对于域的唯一的标识符,用于唯一标识域中的安全主体。

常见的SID列表:

  • S-1-5-18 (LocalSystem)
  • S-1-5-19 (LocalService)
  • S-1-5-20 (NetworkService)
  • S-1-5-32-544 (Administrators)
  • S-1-5-32-545 (Users)
  • S-1-5-32-550 (PrintOperators)
  1. 在DC用mimikatz执行下面命令

    mimikatz.exe "Log" "Privilege::Debug" "lsadump::lsa /patch" "exit"

    image-20240421122849443

  2. 得到krbtgt的哈希值后,先在win2008上访问DC的CIFS服务,发现不可访问,再利用mimikatz生成的黄金票据导入

    kerberos::golden /admin:Administrator /domain:hack-my.com /sid:S-1-5-21-752537975-3696201862-1060544381 /krbtgt:1fd539dboac55db506018c72586bb3a6 /ticket:ticket.kirbi
    Kerberos::ptt ticket.kirbi
  3. 再次访问就会成功

    image-20240421123805145

注意,跨域下的黄金票据有一定限制,但利用SidHistory 便可解决

TGS_REQ&TGS_REP阶段攻击

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 破解即可

白银票据攻击

如果在未配置 PAC 的情况下,服务的哈希被泄露,就可以伪造任何人的身份进入而没有检查,这种攻击称为白银票据(Silver Ticket)。其原理是通过伪造 ST 来访问服务,但是只能访问特定服务器上的部分服务。

image-20240421142236322

假设已获得 DC 机器账户的哈希值,便可以使用银票访问其LDAP 服务执行DCSync也可以伪造其他服务造成其他危害,如对 CIFS 服务则可以实现完全的远程文件访问等等。攻击需要以下信息:域名,域sid,DC 机器账户的 hash,伪造的任意用户名。攻击流程如下:

  1. 在DC上以管理员权限用mimikatz执行下面命令:

    mimkatz.exe "log" "privilege::debug" "sekurlsa::logonpasswords"

    然后就可以获得DC机器名的哈希值。

  2. 分别执行下面命令,获得krbtgt用户的hash从而制作黄金票据

    kerberos::golden /domain:hack-my.com /sid:S-1-5-21-1431000434-12531824-1301847844 /target:dc.hack-my.com /service:ldap /rc4:c890a8745007ebe3c21afc1cb8cd0a91 /user:venenof /ptt
    lsadump:dcsync /domain:hack-my.com /user:krbtgt

    image-20240421143421648

委派攻击

在现实情况下,往往多个服务不可能在一台机器中,那么如果用户在使用服务A时,这时候需要服务B上属于自己的数据,最简单的方式就是A代用户去请求B返回相应的信息,这个过程就是委派。

委派攻击分为非约束委派、约束委派、基于资源的约束委派三种。

非约束委派攻击

非约束委派的请求过程如下,具体的可以去查看微软的手册

image-20240516175227543

大概就是当 service1 的服务账户开启了非约束委派后,user 访问 service1 时,service1 会将user 的 TGT 保存在内存中,然后 servicel 就可以利用 TGT以 user 的身份去访问域中的任何user 可以访问的服务

如果域管理员访问了开启非约束委派的服务,该服务所在的计算机就会保存域管理员的TGT在内存中,那么就可以获取其特权就可以获取域控权限。

攻击过程如下:

我们可以先将域内的一台主机比如win2008设置非约束委派

image-20240516180439225

  1. 当服务账号或主机被设置为非约束委派时,其userAccountControl属性包含TRUSTED_FOR_DELEGATION这个flag值,对应是0x80000。

    其中524288对应0x80000,而805306369对应0x30000000,即代表的是机器账户

    可以用adfind在域内查找非约束委派用户:

    AdFind.exe -b "DC=hack-my,DC=com" -f "(&(samAccountType =805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

    image-20240516181059560

  2. 我们可以利用mimikatz查看win2008内存中的票据

    mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

    当域管理员访问该主机的服务之后,就可以查看到域管理员的票据,比如访问CIFS服务后

    image-20240516181339603

不过该攻击方式过于被动,需要等待域管理员去访问才行,我们可以利用Spooler打印机服务让域控主动连接。

在 Spooler 服务默认开启的情况下,域用户可以利用 Windows 打印系统远程协议(MS-RPRN)强制任何运行了 Spooler 服务的域内计算机通过Kerberos 或 NTLM 对任何目标进行身份验证,这便是该攻击方式的原理。

攻击过程:

  1. DC的spooler开启,在win2008上利用Rubenus对域控机器账户的登陆监听(需要本地管理员权限)

  2. 利用SpoolSample工具强制DC对win2008进行认证

  3. 利用Rubenus导入TGT

    Rubenus.exe ptt /ticket:base64
  4. 利用mimikatz进行dcsync成功获取哈希值,制作黄金票据接管域控

注意,这里获取的 TGT 实际上是DC的机器账户,而机器账户是没有相应权限访问 cifs 服务的,但是在 LDAP 服务中,机器账户会被当做域控主机,从而可以dcsync。

约束委派攻击

由于非约束委派的不安全,微软在winserver2003引入了约束委派,对Kerberos协议进行了拓展,引入了S4U协议:S4U2Self和S4U2proxy。

S4U2Self用于生成本身服务 TGS 票据,S4U2porxy用于“代理”相关用户申请其他服务票据。请求过程如图:

image-20240516191222724

其中前4步为S4U2Self,后6步为S4U2proxy。

总结一下就是:S4U2self是service1代表用户请求的自身可转发ST,但是不能以该用户身份请求另外的服务,意味着S4U2Self必须在具有SPN的账户上操作;S4U2proxy则是service1以S4U2self阶段的可转发ST(其中包含用户相关的身份信息)代表用户去请求service2的ST。

而在 S4U2proxy 过程会通过判断 msds-allowedtodelegateto 里的 SPN值来确定是否可以申请到 service2的 ST,所以这也是约束委派与非约束委派的最大区别即只能访问特定的服务。注意,约束委派的前置条件服务自身需要通过 KDC 认证的 TGT。

根据上述过程,如果我们获取了service1的权限,既可以伪造S4U先请求service1本身的ST,然后就可以利用此ST便可以伪造任意用户请求获取service2的ST。

基于资源的约束委派

基于资源的约束委派(Resource Based Constrained Delegation,RBCD)是在 WindowsServer 2012 中加入的功能,与传统约束委派相比,不需要域管理员权限去设置相关属性,而是将设置委派的权限交给了服务机器。

服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派。可以将其理解为传统约束委派的反向过程。以A、B两个服务为例,前者通过需要在 DC上设置A的msDS-AllowedToDelegateTo属性,后者则设置B的msDS-AllowedToActOnBehalfOf-OtherIdentity 属性,即设置A的 SID。注意,基于资源的约束委派的S4U2self阶段的ST是不可转发的。

所以,基于资源的约束委派攻击的重点是上述属性的设置,可以分为下面两种方式:

  • 如果能够修改服务B的该属性,将其更新为可控制的SPN账户的SID,既可以伪造任意用户获得服务B的相关权限,从而实现变相提权。
  • 利用realy攻击,首要条件是relay攻击。

PAC攻击

MS14-068

MS14-068 漏洞的原因是 KDC 无法正确检查 PAC 中的有效签名,由于其实现签名的加密允许所有的签名算法,只要客户端指定任意签名算法,KDC服务器就会使用指定的算法进行签名验证,因此可以利用不需要相关密钥的算法,如MD5,实现内容的任意更改,导致用户可以自己构造一张 PAC,伪造用户的 SID 和所在的组。那么,可以通过伪造 PAC,加入域管相关信息,访问域控服务,KDC会认为当前用户有权限,从而把这个用户当作域管组的成员,进而达到提升为域管理员的效果。

利用kekeo执行如下命令便可以成功访问CIFS服务:

kekeo.exe "exploit::ms14068 /domain:hack-my.com /user:username /password:password /ptt" "exit"

image-20240516184624079

CVE-2021-4227&CVE-2021-42287(NoPac)

这两个CVE是活动目录域服务漏洞,这两个漏洞配合利用可以绕过安全限制进行权限提升。

CVE-2021-42278 是一个安全绕过漏洞,允许通过修改机器账户的sAMAccountName属性来冒充域控制器。与标准用户账户相比,机器账户的名称末尾附加了“$”符号,但实际中,AD并没有验证域内机器账户中是否具有“$”,导致机器账户可以被假冒。

CVE-2021-42287是影响Kerberos特权属性证书(PAC)的安全绕过漏洞,允许通过假冒域控制器,使密钥分发中心(KDC)创建高权限票据。

根据认证 Kerberos 协议,在请求服务票证前需要先签发 TGT(票据授权凭证)。但是,当为活动目录中不存在的账户请求服务票证时,密钥分发中心(KDC)将在该账户名上附加“$”符号进行搜索。将这一行为与 CVE-2021-42278 结合,测试人员可以实现域内权限提升,深入原理分析可以参考这篇文章:域内提权漏洞CVE-2021-42287与CVE-2021-42278原理分析 - FreeBuf网络安全行业门户

大致流程如下:

  1. 创建机器账户,假设为HACKME$
  2. 清除机器账户 HACKME$的 servicePrincipalName 属性
  3. 修改机器账户 HACKME$的 sAMAccountName属性,使其指向不带“$”符号的域控制器账户。
  4. 利用账户DC-1请求TGT
  5. 将新建的机器账户的 sAMAccountName 属性恢复为其原始值(HACKME$)或其他任何值。
  6. 利用S4U代表域管理员请求对应服务的服务票据(ST)。
  7. 伪造域管理员账户获得相应服务的ST

具体的等有机会再复现