内网渗透 | 多种票据攻击详解

2024-08-23 15:22:59 浏览数 (2)

简介:

Golden Ticket(下面称为金票)是通过伪造的TGT(TicketGranting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。

每个用户的Ticket都是由krbtgt的密码Hash来生成的,那么,我们如果拿到了krbtgt的密码Hash,其实就可以伪造任意用户的TICKET,

对于攻击者来说,实际上只要拿到了域控权限,就可以直接导出krbtgt的Hash值,,再通过mimikatz即可生成任意用户任何权限的Ticket,也就是Golden Ticket。

原理:

在AS_REQ & AS_REP中,用户使用自身hash加密时间戳发送给KDC,KDC验证成功后返回用krbtgt hash加密的TGT票据。如果我们有krbtgt的hash,就可以自己给自己签发任意用户的tgt票据。

利用前提:

  • 拿到域控(没错就是拿到域控QAQ),适合做权限维持
  • 有krbtgt用户的hash值(aeshash ntlmhash等都可以,后面指定一下算法就行了)

条件要求:

  • 域名
  • 域的SID 值
  • 域的KRBTGT账户NTLM密码哈希
  • 伪造用户名

伪造金票

制作金票的条件:

代码语言:javascript复制
1、域名称            
2、域的SID值
3、域的KRBTGT账户密码HASH
4、伪造用户名,可以是任意的

实战中,通常使用Mimikatz来提取krbtgt的NTLM-Hash。

1.获取域名称

代码语言:javascript复制
net view /domain

2.Mimikatz获取krbtgt的HTLM-Hash及域SID

代码语言:javascript复制
mimikatz "lsadump::dcsync /domain:test666.com /user:krbtgt"

3..Mimikatz生成黄金票据

代码语言:javascript复制
mimikatz "kerberos::golden /domain:admin.com /sid:S-1-5-21-1497092113-2272191533-193330055 /krbtgt:cac9c793eb3ba2c6abbcc9c14f18a41f /user:test666 /ticket:golden.kirbi"

利用步骤:

1.导出krbtgt的Hash

金票的生成需要用到krbtgt的密码HASH值,可以通过mimikatz中的

登录aaa域管用户,执行whoami可以看到是aaa用户:

使用一下命令导出用户krbtgt的hash:

代码语言:javascript复制
mimikatz(commandline) # privilege::debug
mimikatz(commandline) # lsadump::dcsync /domain:cyberpeace.com /all /csv
mimikatz(commandline) # lsadump::dcsync /domain:cyberpeace.com /user:krbtgt

再执行以下命令可以看到krbtgt用户的SID:

利用mimikatz生成金票生成.kirbi文件并保存:

代码语言:javascript复制
mimikatz.exe "kerberos::golden /admin:system /domain:cyberpeace.com /sid:S-1-5-21-97341123-1865264218-933115267 /krbtgt:95972cdf7b8dde854e74c1871f6d80a0 /ticket:ticket.kirbi" exit

/admin:伪造的用户名
/domain:域名称
/sid:SID值,注意是去掉最后一个-后面的值
/krbtgt:krbtgt的HASH值
/ticket:生成的票据名称    //不是写入内存中的命令!

二、金票的使用

登录域内普通用户,通过mimikatz中的kerberos::ptt功能将ticket.kirbi导入内存中。

代码语言:javascript复制
mimikatz # kerberos::purge         
mimikatz # kerberos::ptt ticket.kirbi

此时尝试创建一个abcc的域管账号,命令执行成功:

防御手段:

防御措施如下:

  • 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机(不要让其他管理员登录到这些服务器)将所有其他权限委派给自定义管理员组。这大大降低了攻击者访问域控制器的Active Directory的ntds.dit。如果攻击者无法访问AD数据库(ntds.dit文件),则无法获取到KRBTGT帐户密码
  • 禁用KRBTGT帐户,并保存当前的密码以及以前的密码。KRBTGT密码哈希用于在Kerberos票据上签署PAC并对TGT(身份验证票据)进行加密。如果使用不同的密钥(密码)对证书进行签名和加密,则DC(KDC)通过检查KRBTGT以前的密码来验证
  • 建议定期更改KRBTGT密码(毕竟这是一个管理员帐户)。更改一次,然后让AD备份,并在12到24小时后再次更改它。这个过程应该对系统环境没有影响。这个过程应该是确保KRBTGT密码每年至少更改一次的标准方法
  • 一旦攻击者获得了KRBTGT帐号密码哈希的访问权限,就可以随意创建黄金票据。通过快速更改KRBTGT密码两次,使任何现有的黄金票据(以及所有活动的Kerberos票据)失效。这将使所有Kerberos票据无效,并消除攻击者使用其KRBTGT创建有效金票的能力

三、SILVER TICKET

原理

如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。在Kerberos认证的第三部,Client带着ST和Authenticator3向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的Master Key 解密ST,从而获得 Session Key。通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。 所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,从而更加隐蔽,但是伪造的门票只对部分服务起作用,如cifs(文件共享服务),mssql,winrm(windows远程管理),DNS等等

特点

1.不需要与KDC进行交互 2.需要server的NTLM hash

利用前提:

  • 拿到目标机器hash(是目标机,不一定是域控) 相当于server

条件要求:

  • 域名
  • 域sid
  • 目标服务器FQDN
  • 可利用的服务
  • 服务账号的NTML HASH
  • 需要伪造的用户名

伪造银票

先添加的域管账号 这里不一定就要域管 只是实验用的域管

代码语言:javascript复制
net user ccc Qwe1234/add /domain
net group "Domain Admins" cccc /add /domain

登录上面创建的域管用户,用管理员权限打开CMD,cd 到 mimikatz 存放的目录,去执行mimikatz的命令,得到SID和NTLM,

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">log.txt

把HASH文件保存到本地,在重新登录到域内机器的本地账户,将hash文件和mimikatz复制进去:先使用mimikatz清空票据,再导入伪造的票据,具体伪造票据的命令:

代码语言:javascript复制
kerberos::golden /domain:cyberpeace.com /sid:S-1-5-21-2718660907-658632824-2072795563 /target:scene.cyberpeace.com /service:cifs /rc4:9a68826fdc2811f20d1f73a471ad7b9a /user:test /ptt
使用方法:kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt

其中的用户名可以随便写

服务类型可以从以下内容中来进行选择,因为我们没有TGT去不断申请ticket,所以只能针对某一些服务来进行伪造

测试一下,成功执行dir //scene.cyberpeace.com/c$ ,并且可以创建域管账号:

Windows共享(CIFS)管理访问的银票

为 “cifs ”服务创建白银票据,以获得目标计算机上任何Windows共享的管理权限。

注入CIFS Silver Ticket后,我们现在可以访问目标计算机上的任何共享,包括

c $共享,我们能够将文件拷贝到共享文件中。

具有管理员权限的Windows计算机(HOST)白银票据

创建银票以获得目标计算机上所涵盖的任何Windows服务的管理员权限。这包括修改和创建计划任务的权限。

Silver Ticket连接到以Windows管理员权限计算机上的PowerShell远程执行

为“ http ”服务和“ wsman ”服务创建Silver Ticket,以获得目标系统上的WinRM和或PowerShell Remoting的管理权限。

注入两张HTTP&WSMAN白银票据后,我们可以使用PowerShell远程(或WinRM的)反弹出目标系统shell。首先New-PSSession使用PowerShell创建到远程系统的会话的PowerShell cmdlet,然后Enter-PSSession打开远程shell。

Windows计算机上的LDAP

为“ldap”服务创建Silver Ticket 以获得目标系统(包括Active Directory)上LDAP服务的管理权限。

利用LDAP Silver Ticket,我们可以远程访问LDAP服务来获得krbtgt的信息

代码语言:javascript复制
lsadump::dcsync

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

Windows计算机上的WMI

为“ HOST ”服务和“ rpcss ”服务创建白银票据以使用WMI在目标系统上远程执行命令。

注入这些白银票据之后,我们可以通过运行“klist”来确认Kerberos TGS票据在内存中注入白银票据后,我们可以通过“传票”来调用WMIC或Invoke-WmiMethod在目标系统上运行命令。

代码语言:javascript复制
Invoke-WmiMethod win32_process -ComputerName $ Computer -Credential $ Creds -name create -argumentlist“$ RunCommand”

访问域控上“cifs”服务实列

首先需要获得如下信息:

代码语言:javascript复制
domain
/sid
/target:目标服务器的域名全称,此处为域控的全称
/service:目标服务器上面的kerberos服务,此处为cifs
/rc4:计算机账户的NTLM hash,域控主机的计算机账户
/user:要伪造的用户名,此处可用silver测试

使用mimikatz执行如下命令导入Silver Ticket

代码语言:javascript复制
mimikatz "kerberos::golden /domain:test.local /sid:S-1-5-21-4155807533-921486164-2767329826 /target:WIN-8VVLRPIAJB0.test.local /service:cifs /rc4:d5304f9ea69523479560ca4ebb5a2155 /user:silver /ptt"

此时可以成功访问域控上的文件共享

四、钻石票据:

简介:

钻石票据是一种TGT,可用于以任何用户身份访问任何服务。 黄金票据完全是离线伪造的,使用该域的krbtgt哈希进行加密,然后传递到登录会话中供使用。 因为域控制器不会跟踪它(或它们)合法发行的TGT,所以它们会乐意接受用其自身krbtgt哈希加密的TGT。

检测黄金票据使用的两种常见技术:

  • 查找没有相应AS-REQ的TGS-REQ。
  • 查找具有荒谬值的TGT,例如Mimikatz的默认10年生存期。

钻石票据是通过修改由DC发行的合法TGT的字段而制作的。 这是通过请求一个TGT,使用域的krbtgt哈希解密它,修改票据的所需字段,然后重新加密它来实现的。 这克服了黄金票据的上述两个缺点,因为:

  • TGS-REQ将有一个先前的AS-REQ。
  • TGT是由DC发行的,这意味着它将具有来自域Kerberos策略的所有正确详细信息。 即使在黄金票据中可以准确伪造这些信息,但这更加复杂且容易出错。

制作条件:

代码语言:javascript复制
1、krbtgt账户的AES256密钥
2、域用户&密码

钻石票是通过修改 DC 发行的合法 TGT 的字段来制作的。这是通过请求TGT 、使用域的 krbtgt 哈希对其进行解密、修改票证的所需字段,然后重新加密来实现的。这克服了金票的上述两个缺点,因为:

  • TGS-REQ 将有一个前面的 AS-REQ。
  • TGT 由 DC 颁发,这意味着它将拥有域 Kerberos 策略中的所有正确详细信息。
代码语言:javascript复制
# Get user RID
powershell Get-DomainUser -Identity <username> -Properties objectsid

.Rubeus.exe diamond /tgtdeleg /ticketuser:<username> /ticketuserid:<RID of username> /groups:512

使用低权限用户 ( Loki)访问DC 上的C$文件共享 (CIFS)

为低权限用户Loki请求正常的 TGT (见图7)。然后该命令解密TGT,修改相关部分,重新计算签名,并重新加密TGT

生成的票据可以像任何其他 TGT 一样使用,但现在进行了修改

访问DC 上的C$共享

五、Sapphire Ticket

蓝宝石门票与钻石门票类似,门票不是伪造的,而是基于请求后获得的合法门票。区别在于 PAC 的修改方式。钻石票方法修改了合法的 PAC。在Sapphire Ticket方法中,另一个强大用户的PAC是通过S4U2self u2u技巧获得的。然后,该 PAC 会替换合法票证中的 PAC。生成的票据是合法元素的集合,并遵循标准票据请求,这使得它成为最难检测的银/金票据变体。

由于钻石票会动态修改 PAC 以包含任意组 ID,因此某些检测软件(或将)能够检测 PAC 值与实际 AD 关系之间的差异(例如 PAC 指示用户属于某些组)但事实上并非如此)。

蓝宝石票证是通过在票证中包含合法强大用户的 PAC 来以更隐秘的方式获取类似票证的替代方案。

测试:

  • 对 TGT 進行解密, 所以也需要 krbtgt key, 並且強制需求要是 AES256 key
代码语言:javascript复制
ticketer.py -request -impersonate 'domainadmin' 
-domain 'DOMAIN.FQDN' -user 'domain_user' -password 'password' 
-nthash 'krbtgt NT hash' -aesKey 'krbtgt AES key' 
-user-id '1115' -domain-sid 'S-1-5-21-...' 
'baduser'

抓包查看:

申请蓝宝石票据:

查看该票证,我们可以看到我们有一张票证,其中包含模拟管理员请求的 PAC。

在域中使用用户emp.1进行了身份验证。

六、票据的区别

获取的权限不同

金票:伪造的TGT,可以获取任意Kerberos的访问权限 银票:伪造的ST,只能访问指定的服务,如CIFS

认证流程不同

金票:同KDC交互,但不同AS交互 银票:不同KDC交互,直接访问Server

加密方式不同

金票:由krbtgt NTLM Hash 加密 银票:由服务账号 NTLM Hash 加密

Golden Ticket 和Silver Ticket都会在日志,不同的是,Golden Ticket会在域控中留下日志,Silver Ticket 仅在目标系统留下日志,因为Silver Ticket 不与KDC产生交互

七、Enhanced Golden Tickets

在 Golden Ticket 部分说明可利用 krbtgt 的密码 HASH 值生成金票,从而能够获取域控权 限同时能够访问域内其他主机的任何服务。但是普通的金票不能够跨域使用,也就是说金票 的权限被限制在当前域内。

普通金票的局限性

为什么普通金票会被限制只能在当前域内使用? 在上一篇文章中说到了域树和域林的概念,同时说到 YUNYING.LAB 为其他两个域 (NEWS.YUNYING.LAB 和 DEV.YUNYING.LAB)的根域,根域和其他域的最大的区别就是根域对 整个域林都有控制权。而域正是根据 Enterprise Admins 组(下文会说明)来实现这样的权限 划分。

实验环境

根域:YUNYING.LAB

域控:DC.YUNYING.LAB

子域:NEWS.YUNYING.LAB

域控:NEWSDC.NEWS.YUNYING.LAB

子域:DEV.YUNYING.LAB

域控:DEVDC.DEV.YUNYING.LAB

操作系统均为Windows Server 2008 R2 x64

使用工具:

Mimikatz

实验流程:

首先使用mimikatz在NEWSDC(NEWS.YUNYING.LAB的域控)上生成普通的金票,真实环境会是在域内的主机中,这里方便演示所以在域控中,原理和结果是一样的。

这里使用的是NEWS.YUNYING.LAB域的SID号,访问根域的DC共享文件夹被拒绝。

下面说明下具体原因。

Enterprise Admins组

Enterprise Admins组是域中用户的一个组,只存在于一个林中的根域中,这个组的成员,这里也就是YUNYING.LAB中的Administrator用户(不是本地的Administrator,是域中的Administrator)对域有完全管理控制权。

通过whoami命令在yunying.lab的域控上可以看到Enterprise Admins组的RID为519(最后三位)

Domain Admins组

可以看到在子域中是不存在Enterprise Admins组的,在一个子域中权限最高的组就是Domain Admins组。截图是news.yunying.lab这个子域中的Administrator用户,这个Administrator有当前域的最高权限。

通过whoami命令也可以看到在news.yunying.lab这个子域中没有Enterprise Admins组的SID号。

在子域中使用mimikatz创建的黄金票据不能跨域使用的原因也就在这里,通过whoami可以看到YUNYING.LAB中Enterprise Admins组的SID号是:

S-1-5-21-4249968736-1423802980-663233003-519

而NEWS.YUNYING.LAB域中的SID号是:

S-1-5-21-3641416521-285861825-2863956705-XXX

mimikatz通过/sid选项接收SID号然后在尾部拼接RID号(512,519等),拼接之后生成的Enterprise Admins组的完整SID是:

S-1-5-21-3641416521-285861825-2863956705-519

而这个SID在整个域林中都是不存在的,所以在子域中通过mimikatz生成的金票无法跨域或者是访问其他域的资源。在一个域林中,域控权限不是终点,根域的域控权限才是域渗透的终点。

突破限制

普通的黄金票据被限制在当前域内,在2015年Black Hat USA中国外的研究者提出了突破域限制的增强版的黄金票据。通过域内主机在迁移时SIDHistory属性中保存的上一个域的SID值制作可以跨域的金票。这里没有迁移,直接拿根域的SID号做演示。

如果知道根域的SID那么就可以通过子域的KRBTGT的HASH值,使用mimikatz创建具有 Enterprise Admins组权限(域林中的最高权限)的票据。环境与上文普通金票的生成相同。

首先我们通过klist purge删除当前保存的Kerberos票据,也可以在mimikatz里通过kerberos::purge来删除。

然后通过mimikatz重新生成包含根域SID的新的金票

注意这里是不知道根域YUNYING.LAB的krbtgt的密码HASH的,使用的是子域NEWS.YUNYING.LAB中的KRBTGT的密码HASH。

然后再通过dir访问DC. YUNYING.LAB的共享文件夹,发现已经可以成功访问。

此时的这个票据票是拥有整个域林的控制权的。我们知道制作增强金票的条件是通过SIDHistory那防御方法就是在域内主机迁移时进行SIDHistory过滤,它会擦除SIDHistory属性中的内容。

0 人点赞