流量解密

Kerberos 流量解密可以看到更多细节的同时也便于解决渗透过程中的报错问题。

keytab

解密不是使用 administrator 管理员用户的hash,重点是申请票据用户的 hash 以及 krbtgt 用户的 hash,还有所请求的服务的 hash

使用 administrator NTLM hash 生成 keytab 文件。

这里可以指定多次。

ktutil

ktutil
# 这里域名需要大写
ktutil:  add_entry -key -p administrator@FLIGHT.HTB -k 1 -e rc4-hmac
Key for administrator@FLIGHT.HTB (hex): 43bbfc530bab76141b12c8446e30c17c
ktutil:  wkt administrator.keytab
ktutil:  exit
ktutil
ktutil:  add_entry -key -p krbtgt@FREELANCER.HTB -k 1 aes256-cts-hmac-sha1-96
enctype must be specified if not using -f
ktutil:  add_entry -key -p krbtgt@FREELANCER.HTB -k 1 -e aes256-cts-hmac-sha1-96
Key for krbtgt@FREELANCER.HTB (hex): 4e33b02ee45738a0db98c0747d8d41b7205f4f583c8f0591e20d67178b20511d
ktutil:  add_entry -key -p DC$@FREELANCER.HTB -k 1 -e aes256-cts-hmac-sha1-96
Key for DC$@FREELANCER.HTB (hex): 561edbca437df7878b890f544efd54ed5a86443cf658ddd313ffb33464c537fe
ktutil:  add_entry -key -p DC3$@FREELANCER.HTB -k 1 -e aes256-cts-hmac-sha1-96
Key for DC3$@FREELANCER.HTB (hex): b92a6afd91db36e1fb7bd1a6111835990aa1a525f47797150549a95c8fa79b99
ktutil:  wkt aes256dcdc3krb.keytab
ktutil:  exit

加密类型

-e 参数,三种 hash 类型,一个流量可能需要多个类型,重点就是 23 和 18。

  • aes256-cts-hmac-sha1-96,18
  • aes128-cts-hmac-sha1-96,17
  • rc4-hmac, 23

https://web.mit.edu/kerberos/krb5-latest/doc/admin/enctypes.html#enctype-compatibility “Encryption types — MIT Kerberos Documentation”

https://web.mit.edu/kerberos/krb5-latest/doc/admin/conf_files/kdc_conf.html#encryption-types “kdc.conf — MIT Kerberos Documentation” 这里显示的类型更多

keytab认证

认证是写入的域名也需要大写

kinit 区分大小写,需要使用 klist 限制的主体名称。在这种情况下,用户名是小写的,域名是大写的。

kinit -V -k -t administrator.keytab -f administrator@FLIGHT.HTB
Using default cache: /tmp/krb5cc_1000
Using principal: administrator@FLIGHT.HTB
Using keytab: administrator.keytab
Authenticated to Kerberos v5

keytab.py

wget https://raw.githubusercontent.com/dirkjanm/forest-trust-tools/master/keytab.py
impacket-secretsdump flight.htb/administrator@10.10.11.187 -hashes :43bbfc530bab76141b12c8446e30c17c -just-dc-user krbtgt -dc-ip 10.10.11.187
Impacket v0.11.0 - Copyright 2023 Fortra

[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:6a2b6ce4d7121e112aeacbc6bd499a7f:::
[*] Kerberos keys grabbed
krbtgt:aes256-cts-hmac-sha1-96:fb234268e90162081d11b7e9d5097091be02f42c25eec0d4bbf8a2442e9d40d0
krbtgt:aes128-cts-hmac-sha1-96:19d9549f8e011231c9a755e0b7d7695f
krbtgt:des-cbc-md5:9bf8155161a8e09e
[*] Cleaning up...
keys = [
    (23, '6a2b6ce4d7121e112aeacbc6bd499a7f'),
    (18, 'fb234268e90162081d11b7e9d5097091be02f42c25eec0d4bbf8a2442e9d40d0'),
    (17, '19d9549f8e011231c9a755e0b7d7695f'),
    (18, 'fb234268e90162081d11b7e9d5097091be02f42c25eec0d4bbf8a2442e9d40d0'),
    (23, '19d9549f8e011231c9a755e0b7d7695f')
]

这里密钥也可以写入多个,用户名以及域名并不影响解密。

python3 keytab.py krbtgt.keytab

但会影响显示的内容,例如下图,不区分就只会显示 krbtgt。

image-20240615140115788

hash

使用 rubeus 生成 hash 值,

.\Rubeus.exe hash /password:lab /user:IISSvc /domain:prod.corp1.com

[*] Action: Calculate Password Hash(es)

[*] Input password             : lab
[*] Input username             : IISSvc
[*] Input domain               : prod.corp1.com
[*] Salt                       : PROD.CORP1.COMIISSvc
[*]       rc4_hmac             : 2892D26CDF84D7A70E2EB3B9F05C425E
[*]       aes128_cts_hmac_sha1 : B17020910D7DCF50AF22EF197A3AAD46
[*]       aes256_cts_hmac_sha1 : 9728871CB5E66431961126CE4023E81E8106E5595B40C1CFB03F4DA1EEC3D47D
[*]       des_cbc_md5          : 98FEDFC1C81A2CEC

默认情况下,盐始终是

https://www.thehacker.recipes/ad/movement/kerberos/delegations/unconstrained

  • For users: 大写 FQDN + 区分大小写的用户名 = DOMAIN.LOCALuser
  • For computers: 大写 FQDN + 硬编码 host 文本 + 小写 FQDN 主机名,不带尾随 $ = DOMAIN.LOCALhostcomputer.domain.local (using DOMAIN.LOCAL\计算机$ account)

secretsdump

chudamax 改动的脚本 https://www.chudamax.com/posts/kerberos-102-overview/#renewable-tickets

wget https://raw.githubusercontent.com/chudamax/kerberos102/master/scripts/secretsdump2keytab.py
impacket-secretsdump hpbank.local/administrator:'P@ssw0rd2'@192.168.0.122 -just-dc -outputfile hpbank
python3 secretsdump2keytab.py -i hpbank.ntds.kerberos,dev.hpbank.ntds.kerberos,test.ntds.kerberos -o keytab.keytab

import wireshark

此种导入方法导入是累计的,但如果想只留一个 keytab 文件需要取消解密再选中,或者更改文件后重新打开 wireshark 就只会显示一个 keytab 解密的效果。

image-20240516013910619

导入 keytab 文件,流量已解密。

image-20240516014224320

Reference

利用**Wireshark 解密 Kerberos 的加密字段 **

Kerberos身份验证流程及Kerberos流量解密 - zpchcbd - 博客园 参考

Decrypt Kerberos/NTLM “encrypted stub data” in Wireshark | by Clément Notin [Tenable] | Tenable TechBlog | Medium 英文文档

https://wiki.wireshark.org/Kerberos Wireshark 官方文档列出了解密流量的几种方法

参考

微信公众号 中提取域用户 hash 的方法,但实际操作不用这么麻烦。

#域控导出ntds.dit和system.hive
vssadmin create shadow /for=C:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\NTDS.dit C:\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.hive
vssadmin delete shadows /all
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract/ && python -m pip install pycryptodome
#kali esedbexport ,ntds.dit和system.hive 同目录
esedbexport ntds.dit
python dskeytab.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.6 system.hive ./ 1.keytab
#获取到1.keytab后,把该文件导入到Wireshark的KRB5协议下,并勾选"Try to decrypt Kerberos blobs"
#加载完keytab文件后,wireshark会自动对当前的数据包进行解密尝试,如果解密成功,就会是显示蓝色,不成功就是黄色。

AS_REQ

用用户hash加密时间戳作为value发送给KDC的AS。

pre-authentication disable

域用户想要访问域内某个服务,或者登录域内机器,输入用户名密码,本机就会向KDC的AS(Authentication Service)发送一个AS-REQ请求,设置了Do not require Kerberos pre-authentication 属性的用户请求内容如下。

image-20231029130142545

  • pvno: 5,Kerberos版本号
  • msg-type: krb-as-req (10),类型,表示AS-REQ

image-20231029130458491

由于这里是设置了Do not require Kerberos pre-authentication的用户发起的AS-REQ,所以padata只有一部分。

image-20231029132353543

这是启用PAC支持的扩展。PAC(Privilege Attribute Certificate)并不在原生的kerberos里面,是微软引进的扩展。include-pac: True表示返回的票据中携带PAC。

req-body

  • kdc-options: 50800000,一些flag字段。

image-20231029134002605

  • cname:PrincipalName 类型。PrincipalName包含type和value。理解为登录用户名信息。

image-20231029134245921

cname请求的用户存在不存在返回包不同,可用于用户名枚举。

svc-alfres类型是kRB5-NT-PRINCIPAL,在AS-REQ中即使用户名是krbrgt,类型依然不变。

image-20231029150502010

TGS_REQ中的sname

cifs的name-type: kRB5-NT-SRV-INST (2)

image-20231029142517269

RFC 4120 - The Kerberos Network Authentication Service (V5) RFC412-文档对这些类型有解释

Name TypeValueMeaning
NT-UNKNOWN0Name type not known
NT-PRINCIPAL1Just the name of the principal as in DCE,or for users
NT-SRV-INST2Service and other unique instance (krbtgt) krbtgt,cifs
NT-SRV-HST3Service with host name as instance(telnet, rcommands)
NT-SRV-XHST4Service with host as remaining components
NT-UID5Unique ID
NT-X500-PRINCIPAL6Encoded X.509 Distinguished name [RFC2253]
NT-SMTP-NAME7Name in form of SMTP email name(e.g., user@example.com)
NT-ENTERPRISE10Enterprise name - may be mapped to principal name
  • realm: HTB.LOCAL,域名
  • sname:PrincipalName 类型,服务端身份,所在域名称

AS-REQ中sname始终为krbtgt。

image-20231029144854538

  • till: Oct 13, 2023 14:42:02.000000000,到期时间
  • rtime: Oct 13, 2023 14:42:02.000000000,绝对到期时间
  • nonce: 1307284136 随机生成数

image-20231029145344626

  • etype,加密类型,Kerbrtue工具用户名枚举会发送三种类型。

image-20231029145422903

共有以下类型。

des_cbc_crc = 1,
des_cbc_md4 = 2,
des_cbc_md5 = 3,
des3_cbc_md5 = 5,
des3_cbc_sha1 = 7,
dsaWithSHA1_CmsOID = 9,
md5WithRSAEncryption_CmsOID = 10,
sha1WithRSAEncryption_CmsOID = 11,
rc2CBC_EnvOID = 12,
rsaEncryption_EnvOID = 13,
rsaES_OAEP_ENV_OID = 14,
des_ede3_cbc_Env_OID = 15,
des3_cbc_sha1_kd = 16,
aes128_cts_hmac_sha1 = 17,
aes256_cts_hmac_sha1 = 18,
rc4_hmac = 23,
rc4_hmac_exp = 24,
subkey_keymaterial = 65

pre-authentication enable

未开启预认证的帐户AS-REQ请求会少一部分PAC的内容,这里补充上。

image-20231030233741174

  • pA-ENC-TIMESTAMP,按照etype的加密类型,使用用户hash加密时间戳,作为value发送给KDC的AS。然后KDC从活动目录中查询出用户的hash,使用用户hash解密,获得时间戳,如果能解密,且时间戳在一定的范围内,则证明认证通过返回 TGT票据和enc_part(里面包含有session-key)。

freelancer 靶机

pA-ENC-TIMESTAMP 解密后的内容:

image-20240619131255902

使用用户 hash 加密的时间戳。

patimestamp: Jun 14, 2024 08:08:47.000000000 EDT
pausec: 90331

AS_REP

AS收到客户端发送的AS-REQ请求后,使用用户hash解密。解密成功后发送AS-REP响应包,主要是TGT和enc-part这两部分。

image-20231029165131740

  • msg-type: krb-as-rep (11),AS-REP

  • crealm: HTB.LOCAL,域名

  • cname与AS-REQ相同,即用户名

  • ticket

    TGT的加密部分,是使用krbtgt的密码hash加密得到的。如果得到krbtgt的hash、sid可以伪造一个TGT,即黄金票据

    • tkt-vno: 5 票据格式版本号
    • realm: HTB.LOCAL
    • sname 票据所属服务端身份
    • enc-part 用KDC的密钥加密的票据部分
  • enc_part

这部分可以解密,解密的 key 是用户NTLMhash值,session key 就是用户 hash 加密的。解密后得到Encryptionkey,Encryptionkey里面最重要的字段是session key。

总结

  • TGT的加密部分enc_part使用kybtgt帐户的NTLM Hash加密,主要包含 Session Key、请求用户名cname、域名crealm、认证时间authtime、认证到期时间endtime、authorization-data等信息。

这部分内容在RFC4120称为EncTicketPart RFC4120

-- Encrypted part of ticket

   EncTicketPart   ::= [APPLICATION 3] SEQUENCE {
           flags                   [0] TicketFlags,
           key                     [1] EncryptionKey,
           crealm                  [2] Realm,
           cname                   [3] PrincipalName,
           transited               [4] TransitedEncoding,
           authtime                [5] KerberosTime,
           starttime               [6] KerberosTime OPTIONAL,
           endtime                 [7] KerberosTime,
           renew-till              [8] KerberosTime OPTIONAL,
           caddr                   [9] HostAddresses OPTIONAL,
           authorization-data      [10] AuthorizationData OPTIONAL
   }
  • 最外层的enc_part使用发起请求的用户的NTLM Hash加密 Logon Session Key 得到,主要包含认证时间authtime、认证到期时间endtime、域名screalm、请求服务名sname、协商标志flags、Logon Session Key以及 PAC等信息。TGT也存在Login Session Key(key)。

freelancer

查看解密后的 AS_REP 响应。

ticket

如下 ticket 解密后的内容

image-20240616010301874

KrbCredInfo     ::= SEQUENCE {
  key             [0] EncryptionKey,      sessionKey
  prealm          [1] Realm OPTIONAL,  //对应的是realm
  pname           [2] PrincipalName OPTIONAL, // 对应的是cname
  flags           [3] TicketFlags OPTIONAL, 
  authtime        [4] KerberosTime OPTIONAL, //not require
  starttime       [5] KerberosTime OPTIONAL, // 
  endtime         [6] KerberosTime OPTIONAL,
  renew-till      [7] KerberosTime OPTIONAL,
  srealm          [8] Realm OPTIONAL, //对应的是realm
  sname           [9] PrincipalName OPTIONAL, // 对应的是sname
  caddr           [10] HostAddresses OPTIONAL
}

enc-part

外部的 enc-part,其中可以看到 session key 就是 encASRepPart_key。enc_part 使用用户的 hash 加密。

image-20240616010501775

roasting

asreproasting

asreproasting 爆破的是什么字段。

AS_REP 中 enc_part 中的 session key,该字段使用用户 hash 加密。

kerberoasting

kerberoasting 爆破的是什么字段。

TGS_REP 中 ticket 的 enc_part

ST服务票据使用注册了所要求的 SPN 的帐户的NTLM哈希进行加密, 并使用攻击者和服务帐户共同商定的加密算法。然后返回ST

getST

借用 freelancer 靶机来学习 Kerberos 认证。

impacket-getST -spn 'HOST/dc.freelancer.htb' -impersonate Administrator -dc-ip '10.10.11.5' 'freelancer.htb/DC3:Summer@2024!'

在这个命令中:

  • 请求用户:DC3$,机器帐户。
  • 请求服务:cifs/dc.freelancer.htb,DC 主机的 SPN。
  • 模拟用户:Administrator

PrincipalsAllowedToDelegateToAccount

在 DC 机器帐户将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性设置已控制的服务帐户 DC3。这样允许 DC3 对 DC1上的服务进行委派。

操作上使用 Set-ADComputer cdmlet 配置 PrincipalsAllowedToDelegateToAccount 属性。

Get-ADComputer DC -Properties PrincipalsAllowedToDelegateToAccount | select PrincipalsAllowedToDelegateToAccount

PrincipalsAllowedToDelegateToAccount
------------------------------------
{CN=DC3,CN=Computers,DC=freelancer,DC=htb}
Get-ADComputer DC -Properties * | select -expand msDS-AllowedToActOnBehalfOfOtherIdentity | fl


Path   :
Owner  : BUILTIN\Administrators
Group  :
Access : FREELANCER\DC3$ Allow
Audit  :
Sddl   : O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3542429192-2036945976-3483670807-11601)

KerberosEncryptionType

freelancer 例子中添加DC3机器时未指定 KerberosEncryptionType ,导致请求 DC3 服务返回的 ticket 只有 rc4 加密类型。

Get-ADComputer DC -Properties * | select -expand KerberosEncryptionType
RC4, AES128, AES256

image-20240615204145720

getST debug

impacket 可以开启 debug 模式看到的细节更多

kali@kali:~/Documents/HTBox/Freelancer$ faketime -f '+5h' impacket-getST -spn 'HOST/dc.freelancer.htb' -impersonate Administrator -dc-ip '10.10.11.5' 'freelancer.htb/DC3:Summer@2024!' -debug
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[+] Impacket Library Installation Path: /usr/lib/python3/dist-packages/impacket
[-] CCache file is not found. Skipping...
[+] The specified path is not correct or the KRB5CCNAME environment variable is not defined
[*] Getting TGT for user
[+] Trying to connect to KDC at 10.10.11.5:88
[+] Trying to connect to KDC at 10.10.11.5:88
[+] TGT session key: bf837b85dbe53ce415f5b7925d24c5f6b9055674050581e30ad0606940949090
[*] Impersonating Administrator
[+] AUTHENTICATOR
Authenticator:
 authenticator-vno=5
 crealm=FREELANCER.HTB
 cname=PrincipalName:
  name-type=1
  name-string=SequenceOf:
   DC3

 cusec=628700
 ctime=20240614120847Z



[+] S4UByteArray
 0000   01 00 00 00 41 64 6D 69  6E 69 73 74 72 61 74 6F   ....Administrato
 0010   72 66 72 65 65 6C 61 6E  63 65 72 2E 68 74 62 4B   rfreelancer.htbK
 0020   65 72 62 65 72 6F 73                               erberos
[+] CheckSum
 0000   BB FC 43 0B F5 19 55 22  2F 19 06 FC 21 1F 65 B6   ..C...U"/...!.e.
[+] PA_FOR_USER_ENC
PA_FOR_USER_ENC:
 userName=PrincipalName:
  name-type=1
  name-string=SequenceOf:
   Administrator

 userRealm=freelancer.htb
 cksum=Checksum:
  cksumtype=-138
  checksum=0xbbfc430bf51955222f1906fc211f65b6

 auth-package=Kerberos

[+] Final TGS
TGS_REQ:
 pvno=5
 msg-type=12
 padata=SequenceOf:
  PA_DATA:
   padata-type=1
   padata-value=0x6e8204f7308204f3a003020105a10302010ea20703050000000000a382046c6182046830820464a003020105a1101b0e465245454c414e4345522e485442a2233021a003020101a11a30181b066b72627467741b0e465245454c414e4345522e485442a382042430820420a003020112a103020102a28204120482040e6dc4d42ee74efa8a6533cbb3935b81ba81ff19223b27e82c17b5e4817227cef67895d207fd813d672bdd57fc371380783d4f3e8af50869672fcd90461eac50cd66943dc66f757027e224040b3b55b16e586f79486073b8b1c57cbf0fca2dd97c85c1e17890b09d78228610fbe412026ce022b22284435aa359b27270ae35c3a52e2bf29f879f2d2ddeaf66f15fc81229622467162cb093205b2d11ca944c010cf597c6e43139e05e3dbc4f4d7ad5fa2811eeb78bee53a6f94b0a8b031517737c5a66193cb4af71fe066282e4a38cbbdffa5bc933f4557bdd14b25c7a39a3376cb2222e1cccdc58854d40c8f4266bf6d3894ec47efa4db3fa313498d19aec2ee183ec98356f0e051b7306e8e68a383ff9a613fc96d4e6b7c641f5fe845e18c960d606ae07253bff3c5d29f7e241c8df4193f75c6f2148e84c9c54bb4738ee771ed9c3556f6f64a561fdb2b2ecf26744ee116cd18cd7b95ec68b2508e4d1c71be9e5ada1e306b7a76ccf937db38a32881af503a54c422aa24df8ec9316e9c7ae0d060333bffaca4ac724a3364d27addcedaf120766431c03b97fe125c9a4ecbaf4c0b0de081418d640b93dc149cca0ca2806430bdedf96f0a046f0f00b62787ca4241790531e020ab33e4d64ecf8fe88a99eb964e1c486da1ab4f07cc5356f2e8b09f524b9260bfbe0d6c189d88e4dde39c6751681ee0575030e386b4fbe208767493768044ac1d894eadd85c941037cbfcba849704930f0d4a17ca10fb92c8f818ad8a8ff4f4e6312a4d6f191dc5c6e2e92840f61c1eb82a278d26a0fc21a3e73156898a665697903b92f2ab93d90824a1d5746f1aecf53be43a3e402688f25e5cbe7e87d69c3dfb0dedcaa2c83f3ddadedc44b0ec65fd0605fe989d67c03eac745dfee977a57c8e88eff688f257eaf8ed37023cc3e6c3149426d0d6159b6c5d15191f310716aa93650a8491d73ecc443a8a138c4ff73a75c4aac7a32f7ef2e5c4555f74feecdfb93b688cdda29fbf47de9ad2a0803b0aa671a2708f8c7f8ad21a9152e50351f20180458bde262bc72da05fa7712cbe3d9183b365151ecd73d9350125677eee8bdce97aaac6f632b1856090c5af9f92b558140962834429dd22ef8ad6fd25f7f51bfc14d575866d389f94aa04818fe49d6db9d52f39a915b93aed0a68298f26f7b0d02de67e6d77407d479709d25a3f7488b2678bdc2ba5901735d74f713603e1e17ee2b498f53ba987c5bfcdc68a53743b60a58175b5fd242d3a3e46c5d5c0454e6b6fbbd61b9b68a745ab5e4b89b8463972072229d0d33fa358560f17868c1df8580d0a5d4b3d59140b6a75941c2d66772e46a7810ed1e079f87c23adc2dece040490ded9cc98de9862a6a8fc1fe9d9f31cdc2b69878926f07c42173341ff18c2582d57c823623d8e4c96a2f81983db31192e88254d83db212d0cc1e03cd2dc1497a355c7cfd93a46e306ca003020112a26504632e1a2995d1eb6e05e11abdb10faeb1ba6737fb0eb2a9a57b6284ecd349c4bf923cea86dabed8e04772435fecab86ed4f9cd2a263a60b1469b5a6d8e81f87001ee8b002630c1f5c1aa250a6d9797a9fb88ec8c1c5e0a5e4b3c1eaab820af0a868b68765
  PA_DATA:
   padata-type=129
   padata-value=0x3058a01a3018a003020101a111300f1b0d41646d696e6973747261746f72a1101b0e667265656c616e6365722e687462a21c301aa0040202ff76a1120410bbfc430bf51955222f1906fc211f65b6a30a1b084b65726265726f73

 req-body=KDC_REQ_BODY:
  kdc-options=1082195968
  realm=FREELANCER.HTB
  sname=PrincipalName:
   name-type=0
   name-string=SequenceOf:
    DC3

  till=20240615120847Z
  nonce=301938604
  etype=SequenceOf:
   18   23


[*] Requesting S4U2self
[+] Trying to connect to KDC at 10.10.11.5:88
[+] TGS_REP
TGS_REP:
 pvno=5
 msg-type=13
 crealm=freelancer.htb
 cname=PrincipalName:
  name-type=1
  name-string=SequenceOf:
   Administrator

 ticket=Ticket:
  tkt-vno=5
  realm=FREELANCER.HTB
  sname=PrincipalName:
   name-type=0
   name-string=SequenceOf:
    DC3

  enc-part=EncryptedData:
   etype=23
   kvno=2
   cipher=0x9cc9ca5361da00f5b7a6207260ab79c762291880d84390de6faa1577324b88c4a48db7fe64ddfaa46d834b9a183dc9891f47dfe2ca1778654761fcbe52cdc3b4a194c161d276d106293effbb073878ac58cf94140e0d3ce8a7b9266d19e38eedb3bfda2b5a2ca6d186a06a2d0db7450af54522f1d975f5e7a84e50881c5f22eac325c4b84881250bfc84ea7af8b187e498b8e83115d3714746142ffdf00af02475c841f7c3f51d92b575c021e8f25e86f680806b28828657905363e636d3b608d32cdf9b5e0a0f96d6400401630c35b817ba64a9ef6217077720624c90b01665e8d9e7c46206a3b52ef50a7bd6c28c217d8f9dc91e5eb7951c871bb0697af53321b4859f420b9e763e73cff25c718602a0cf008d1445208c6c2ecff4bf2c89297beb21df65481244b0ff46081f721f44f929f8f5825e3b2761a3c572f30445c5836ade9343263453ea77309824a66628718a25fe5add72ff9568c0981776d9dc697098b991a1491ea90cb11812905ef054293ab5460948d667f15fc63cea5df571d8052d64947839c71c1fee6b7b02fa0947a33d2f0b19fa8f79b9d4cfb8d172f6f92ad93e923ac067b45fc700e8844232e4d89bba7481f61c74fc7bafb44e5a13c6d1bb74b8c5bef2fec6d94e263750e742389977cdf0da6a82b6e9f1ecb846bd1cc5e4c044d85963f9a1d17452afb5d0e3020b0f6b8d691aeb2ad67fe043179814436e31e70e29279d0b639dc75ce5ce641d40f62b10b4735940af82b9958f3a8ad1c88fdd8581e486b9b2e7a0a803922a40780744537f34b36e02248ba7fd3e49ae4fe94d099a3fcaba7133cea289d159c5b0056adfc8f70af2e71edbad5d061dcd9f3a7ee4403f8394603776dc4e7b91e45fdb2448020b5e8530852d30c0a77dd0710cc83c26055d67bcc6ae68eb796013696f16e823f64b7967faccfff46a11cf35b7cb66287ff8cd2adb34528b16eedc130d3e905d91dcd760901b30e9a9b35e910dfb850552f9929129c0a03ec874aa26a3c6236bd9d1b413efd75b2674c813c54973d0f09b264a5fd7925f1ccda2e557e0c111a02090ee517a7318bf790391fbad3412991c5e9f4577cceb6cd46a8a00d96551f21c905aa1c66ff14baed534c3092ff3b990132df20a31787e6e4bb606d374412789149f083b75ffffbcd226965b375a48513711b88501b31360fd11bb99569a1554b02a82671a6116ded111d22dfe1da0378f07d691772f6cdcb4a7f01a23155ddd8073a9ae874164c637a94628ae49c4649610ced3414b37f9a9624af67fae0fae6ab2934dcfbf4679424477109116b87938e8c8dec6fba45c9d10ac966776108095cf0a47cb4780df5d52e18431bdc862bafa7f14e53da7797f9f83fbcfe8edb4b787263062e2548e36eeb87971b6ec210084423bc01fd6f16ae326371fbc2b5f6fe4d0a3734dd2bf09596b7f3d028bf14fb9daaf45d2d2cbe5eefc0dcb684224a403c20f45eeb593309caaa57f7072b3285ddd79c9c9a4a856cceb0abc8b811d895281a930553138a9b65b19b7e78f53366dc05c2b0155e0438d7556a7d5743f7785c17dd4d72bd9b1ded7f6e5840c649b1bc2c87c6dec6b3677cb978532e5e542822e1b70718ac88cda2b3cc5dda017ea3306dcb03f7e6916a91bc748534ea0621c239de75d99fa6eb196e8b9115548f743368f82a68879ffc4d7


 enc-part=EncryptedData:
  etype=18
  cipher=0xcd213be7927874dd8bd823fd7b65180b101512f737f4cdc8d8554b5cd6341f0b899f9650bced827ab91699c568330e4f83b96589c814aa4b2b96299ef0fc06a1c588e0f06915a866918054aba234bad0fa3a2fb12f54eeb41f0530a8071d72fccb0b3721c03e4ed7e654db0dc6d937f9bd69812a058175fd95297c592ac0da7356bb454fcb7492c86328ed106cb39932b3097427b087783b79eea9191a818401bd53a41b803215eaeae165bc64b581c7222a82528f4bb485fddd284193702c5a97658598bc3db629945fb2a49aba6ae285018c85239c912f6025b5e76e6c9822f247c1c65d6b1bd7ce17f0db4a42baff35991c239b68c810b7fd404077fd6fcb3131


[*] Requesting S4U2Proxy
[+] Trying to connect to KDC at 10.10.11.5:88
[*] Saving ticket in Administrator@HOST_dc.freelancer.htb@FREELANCER.HTB.ccache

正常的 TGS

impacket-getST -spn 'HOST/dc.freelancer.htb' -dc-ip '10.10.11.5' 'freelancer.htb/DC3:Summer@2024!' -debug                                                                                                 
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[+] Impacket Library Installation Path: /usr/lib/python3/dist-packages/impacket
[-] CCache file is not found. Skipping...
[+] The specified path is not correct or the KRB5CCNAME environment variable is not defined
[*] Getting TGT for user
[+] Trying to connect to KDC at 10.10.11.5:88
[+] Trying to connect to KDC at 10.10.11.5:88
[+] TGT session key: 0aa91d672a0e88205e38156447c99728e04c469ce481d6bcd45a05f95e11b0d5
[*] Getting ST for user
[+] Trying to connect to KDC at 10.10.11.5:88
[*] Saving ticket in DC3@HOST_dc.freelancer.htb@FREELANCER.HTB.ccache

TGS_REQ

image-20240614233646452

PA-DATA

  • AP_REQ

这部分会携带AS_REP里面获取到的TGT票据,KDC校验TGT票据,如果票据正确,就返回TGS票据。

image-20240615160835344

authenticator 是由上一步 AS-REP 返回的 Logon Session Key 加密的时间戳

image-20240615161015950

  • PA_FOR_USER

image-20240614234030511

该值类型是S4U2SELF,是一个唯一的标识符,该标识符指示用户的身份。该唯一标识符由用户名和域名组成。

S4U2proxy 必须扩展PA_FOR_USER结构,指定服务代表某个用户(图片里面是Administrator)去请求针对服务自身的kerberos服务票据。

  • PA_PAC_OPTIONS

图中共有两次 TGS_REQ,这是第二次 TGS_REQ 请求

类型是 PA_PAC_OPTIONS。如下图显示正在资源委派: resource-based-constrained-delegation: True

image-20240614234126485

REQ_BODY

image-20240614234357363

  • sname

这个是要请求的服务,TGS_REP获得的ticket是用该服务用户的hash进行加密的。

如果指定的服务是krbtgt,那么拿到的TGS票据是可以当做TGT票据用的。

  • AddtionTicket

附加票据,在第二次 TGS_REQ 请求中

image-20240614234658240

在S4U2proxy请求里面,既需要正常的TGT,也需要S4U2self阶段获取到的TGS,那么这个TGS就添加到AddtionTicket里面。

导入 keytab 解密后内容如下图:

image-20240615112330457

此时查看第一个 TGS-REP 响应,与上图内容相同,正是 S4U2self 阶段获取到的TGS。

image-20240615112651183

跨域PAC

https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-pac/69e86ccc-85e3-41b9-b514-7d969cd0ed73

父域:corp1.com

fqdn:rdc01.corp1.com

impacket-ticketer -nthash "66ce131d84f65ca8cde8d3b2815e7c34" -domain-sid "S-1-5-21-634106289-3621871093-708134407" -domain "prod.corp1.com" -extra-sid "S-1-5-21-1587569303-1110564223-1586047116-519" -spn "krbtgt/corp1.com" "hax"
KRB5CCNAME=./hax.ccache impacket-getST -k -no-pass -debug -spn "CIFS/rdc01.corp1.com" "corp1.com/hax"

使用伪造的 trsut key 请求服务票据的流量。PAC 信息在 TGS_REQ 中的 ticket-> enc_part -> encTicketPart -> authorization-data -> Type: Logon Info (1)。PAC_LOGON_INFO:

image-20240717154020991

TGS_REP

image-20240614235042881

ticket

这个ticket用于AP_REQ的认证。其中里面的enc_part是加密的。在AS_REQ请求里面是,是使用krbtgt的hash进行加密的,而在TGS_REQ 里面是使用要请求的服务的hash加密的。服务的票据 ST service ticket。

如下图未导入包含此次所请求服务 DC hash 的 keytab,黄色代表解密失败。只在第二次 TGS-REP 中是请求服务加密的票据,第一次为 DC3 用户的 TGT。

image-20240615120016151

导入 DC 服务 hash keytab之后,解密成功。如下显示了解密所用的 keytab principal主体,也就是服务主体。

image-20240615143735639

enc_part

看 ticket 中的加密部分,其中有 Server Session Key、请求的用户名 cname Administrator、域名 cream、认证时间 authtime、认证到期时间 endtime、authorization_data。

image-20240615145309574

enc_part

与 ticket 中的 enc_part 不同,用于确保客户端和 KDC 下一阶段的通信安全,使用 AS_REP 中的 Logon Session Key 加密。

但是外层的 enc_part 内容与 ticket 中的 enc_part 大部分内容相同。key值也相同。

解密如下:

蓝字可以看到 Decrypted keytype 18 usage 8 using learnt encTicketPart_key in frame 16 (id=16.1 same=3) frame 16 就是 AS-REP,也就是使用其中的 session key 加密。

image-20240615145809396

该 session key 用来作为下一阶段的认证密钥。

keytype: 23
keyvalue: 722259b263be9aac9c72de93d9ce1d11

S4U2SELF

  • S4U2Self Service for User to Self

第一次 TGS-REQ 请求。

image-20240615150536138

如上图服务 DC3 使用 S4U2self 代表 Administrator 向服务 DC3 自身请求票据。该服务将填写 PA_FOR_USER 数据结构,类型为S4U2SELF,并将KRB_TGS_REQ消息发送到TGS。

作用

S4U2self协议允许服务可以代表任意用户请求服务自身的 Kerberos 服务票据。

服务可以获得用户的授权( 可转发的用户TGS票据),然后将其用于后期的认证(主要是后期的s4u2proxy)。这里面很重要的一点是服务代表用户获得针对服务自身的kerberos票据这个过程,服务是不需要用户的凭据的

S4U2Self(用用户的TGT向KDC请求用户的可转发的ST1,再用这张ST1去发起S4U2proxy请求。) 通过此扩展可以拿到一张标识任意用户身份的ST,它的作用其实是协议转换。有时用户会通过其他协议(例如NTLM或基于表单的身份验证)对服务进行身份验证,因此他们不会将TGS发送给服务。在这种情况下,服务可以调用S4U2Self来要求身份验证服务为其自身的任意用户生成TGS,然后可以在调用S4U2Proxy时将其用作依据。例如网站A服务器可以使用它去向KDC请求一张用户B身份的ST1,网站A服务器再用这张ST1去发起S4U2proxy请求。

forwardable

这里请求的票据都是可转发的。daiker文章中所说由于服务1未设置 TrustedToAuthForDelegation 和msDS-AllowedToDelegateTo,这个票据应当是不可转发。不过在基于资源的约束委派,不可转发的服务票据依然可以通过 S4U2Proxy 阶段对其他服务进行委派认证。

Get-ADComputer DC3 -Properties * | select TrustedToAuthForDelegation

TrustedToAuthForDelegation
--------------------------
                     False

image-20240615194210824

TGS-REP 返回 Ticket 也是可转发的

image-20240615201905660

S4u2Proxy

  • S4U2Proxy Service for User to Proxy

S4U2proxy协议允许服务使用 S4U2Self 获得ST服务票据,代表任意用户获取另一个服务的服务票据

第二次 TGS-REQ 请求。S4u2Proxy 的 TGS-REQ 包会增加一个 additional_tickets。该字段内容就是上一步利用 S4u2Self 请求的 ST。

image-20240615151200565

s4u2proxy 使得服务1可以使用 S4U2SELF 阶段获得的授权票据,然后用该TGS(放在AddtionTicket里面)向KDC请求访问服务2的TGS,并且代表用户访问服务2,而且只能访问服务2。

Reference

AS_REQ & AS_REP - windows protocol

Kerberos认证流程数据包分析 - Yangsir34 - 博客园

再谈Kerberos | Loong716

域渗透-Kerberos认证 - F0rmat’s Blog 比较全面还有 AP_REQ 和 AP_REP

谢公子域渗透攻防指南

Kerberos 102 - Overview | I understand 对协议浏览分析的英文文章,详细可看

Kerberos 认证过程详细分析(一) | MYZXCG