导语:本文的内容描述了一种方法,通过该方法,攻击者可以在拿到域管理级别的权限约5分钟后,就可持久的对Active Directory的管理进行访问。
本文的内容描述了一种方法,通过该方法,攻击者可以在拿到域管理级别的权限约5分钟后,就可持久的对Active Directory的管理进行访问。
这篇文章将探讨攻击者如何利用计算机帐户凭据来持久的访问和控制企业内网,以及企业如何缓解这类潜在的安全问题。
计算机帐号
加入Active Directory(AD)的每台计算机在AD中都有一个关联的计算机帐户。AD中的计算机帐户是一个安全主体(与用户帐户和安全组相同),因此它具有与用户帐户一样多的属性(包括安全标识符(SID),memberOf,lastlogondate,passwordlastset等。计算机帐户可以属于安全组,并且通常由于各种原因,最常见的是用于组策略过滤,以便某些组策略仅适用(或不适用)于特定的计算机组。
计算机帐户密码在计算机加入域时进初始设置,并以与用户密码大致相同的方式进行身份验证。不同的是,计算机的密码不必定期更改,以便计算机可以在域中进行身份验证(与用户帐户不同)。有一个设置可以配置计算机的帐户密码“应该”多久进行一次更改,域中的计算机通常会每隔30天更改其计算机帐户密码(默认情况下)。也就是说,这个门槛是可以改变的,用来改变计算机帐号密码的过程可以完全被禁用。
计算机帐户密码的更改更符合一些规则,我之前已经发表了关于如何使用计算机帐户密码在系统中提升权限。但是,在这篇博文中我没有涵盖本文中探讨的其他角度。
默认情况下,计算机帐户是“域计算机”AD组的成员,并且是为了组策略管理的目的,通常将其添加到了Active Directory组,尽管还有其他原因可能会将计算机帐户添加到AD组。
计算机组中计算机的常见示例:
域控制器是“域控制器”组的成员。
只读域控制器(RODC)是“只读域控制器”组的成员。
Exchange服务器通常是不同Exchange AD组的成员,例如“Exchange Server”。
把计算机作为管理员?
一个显而易见的问题是“管理员组中的计算机的影响会是什么?”
当计算机通过Kerberos在域中进行身份验证时,就会创建一个票证或令牌,其中包含计算机的SID和计算机所属的安全组的所有SID,就像用户登录时一样。这意味着经过身份验证的计算机对域或林中的资源具有与属于同一个组的成员的用户类似的权限。如果计算机帐户在管理员组中,则计算机帐户就具有了管理员权限,并且该计算机上的任何管理员都可以获得相同的权限。
计算机帐户可以拥有更高的资源权限,包括Active Directory的完整管理员权限。
计算机如何利用这些权限或访问权限?
计算机中的SYSTEM帐户“拥有”包含这些权限的SID具有的票证或令牌(从技术上来说“SYSTEM”并不是帐户,只是适用于此描述而已)。任何在计算机上具有(本地)管理权限的人都可以将其权限的上下文改为“SYSTEM” ,以便有效地掌握计算机帐户在AD中的权利。Mimikatz提供了在系统上抓取所有Kerberos票证和令牌的能力,因此重用这些票证最终利用这些权限将是一件微不足道的小事。
请注意,具有权限的计算机帐户与服务帐户之间的功能差异与存储在作为服务运行的系统上的凭据的权限无关。如果系统受到威胁,这两个都会导致凭据泄露。但是,服务帐户的管理方式与计算机帐户完全不同,在大多数情况下使用服务帐户更好一些。
特权升级
攻击者可以简单的将权限从计算机上的管理员权限提升到域中的权限,因为计算机的帐户已经加入到了管理员组中。
例如,如果管理服务器加入到具有域控制器的备份权限的组中,则所有攻击者都需要做的是入侵具有该管理服务器权限的管理员帐户,然后在该管理服务器上获取系统权限就拿下了整个域。
显然,这个工作必须有几个事情要做:
1.修改管理员权限的帐户到管理服务器。
2.管理服务器计算机帐户需要域控制器的权限。
根据我的个人经验以及别人的经验,我发现这是不仅仅是一个可能的情况,而且在许多企业组织的内网中确实可以做到。
请注意,还有其他几种方法可以利用与这种类似的场景,这并不是唯一的潜在攻击方式。
漏洞利用与权限持久化
域控制器白银票证
如果攻击者已经转储了Active Directory数据库或者是已经获得了域控制器计算机帐户密码的一些知识,那么攻击者就可以使用Silver Tickets(银票)针对域控制器的服务拿到管理员权限,并在Active Directory中拿到完整的管理员权限。
一旦攻击者获得域控制器计算机帐户的知识,这些信息就可以用于创建一个Silver Tickets(银票),从而在该DC中拿到长久的管理员权限。
计算机主机服务,最常见的一个是利用“cif”服务的Windows文件共享。由于计算机本身承载此服务,创建银票所需的密码数据是相关联的计算机帐户的密码哈希。当计算机加入Active Directory时,将创建一个新的计算机帐户对象并将其链接到计算机。密码和关联的哈希存储在拥有该帐户的计算机上,并且NTLM密码哈希存储在该域的域控制器上的Active Directory数据库中。
如果攻击者可以获得计算机的管理员权限(主要是为了获得调试访问权限)或者能够以本地SYSTEM权限运行代码,则攻击者可以使用Mimikatz从系统中转储AD计算机帐户密码哈希(NTLM密码哈希用于加密RC4 Kerberos票证):Mimikatz“privilege :: debug”“sekurlsa :: logonpasswords”exit
为DC创建一个Silver Ticket就可以通过PowerShell远程连接以管理员权限访问域控制器了
为“ http ”服务和“ wsman ”服务创建银票,以获得目标系统上的WinRM和或PowerShell Remoting的管理员权限。
注入两个Silver Tickets(http&wsman) 后,我们可以使用PowerShell Remoting(或WinRM)连接目标系统打开一个shell(假设配置了PowerShell Remoting和/或WinRM)。New-PSSession是PowerShell的一个 cmdlet,用于使用PowerShell创建一个远程系统的会话,Enter-PSSession可以进入远程shell。
创建DC的银票可以使用管理员访问权限连接到域控制器的LDAP并运行DCSYNC。
为“ ldap ”服务创建银票,以获得目标系统(包括Active Directory)上的LDAP服务的管理员权限。
凭借LDAP银票,我们可以使用Mimikatz并运行DCSync 从 DC “复制”凭据。
通过计算机帐户实现权限持久控制
假设一个攻击者能够拿下该域,一个保持域权限的方法是添加一个计算机帐户(或包含计算机的组),以便能有权限对Active Directory进行持久控制。
这种方法是双交叉的:
1. 在允许访问该系统的环境中拿下管理员或备份服务器上的计算机帐户密码(禁用计算机帐户密码更新以确保持续访问)。
2. 从该服务器的计算机帐户委派权限(或含有计算机账户的组)到重要的AD组件。
利用计算机帐户进行AD持续控制的另一种方法是将计算机帐户放在具有其他帐户的特权组中。这是一个常见的例子:有一个名为“AD备份”的组,其中有一个名为“svc-backup”的服务帐户。
当枚举域管理员组的组成员身份(其具有完整的AD管理员权限以及域中的域控制器的完整管理员权限)时,我们看到包含“AD备份”组。这是一个很常见的配置,尽管作为域管理员的成员会有些糟糕。理想情况下,备份组或服务帐户只能是域中的“备份操作组”的成员,以备份AD域的数据。
攻击者将拿到的计算机帐户添加到“AD备份”组中,不执行任何操作。ADSAP01计算机帐户现在为攻击者提供了域和所有域控制器的完整管理员权限,并可以随意运行Mimikatz的DCSync,以便能够抓取任何帐户的密码数据。
缓解措施
缓解此问题的最简单的方法是确保没有计算机帐户是属于管理组的成员。制定此策略并通过定期检查计算机帐户的管理员组来执行此策略。
使用PowerShell进行扫描是非常简单的,因为需要完成的所有操作都是使用名称(或类似于你的环境中定制的关键字)中的“admin”关键字搜索所有组,并标记objecttype ='computer'的任何成员。
这是一个快速实现的PowerShell脚本(需要Active Directory PowerShell模块),将查找“管理员”组,并将为具有计算机帐户成员的组做标记。
Import-Module ActiveDirectory $AdminGroupsWithComputersAsMembersCountHashTable = @{} [array]$DomAdminGroups = get-adgroup -filter {Name -like “*admin*”} [int]$DomAdminGroupsCount = $DomAdminGroups.Count Write-Output “Scanning the $DomAdminGroupsCount Admin Groups in $ForestDomainItem for computer accounts as members” ForEach ($DomAdminGroupsItem in $DomAdminGroups) { [array]$GroupContainsComputerMembers = Get-ADGroupMember $DomAdminGroupsItem.DistinguishedName -Recursive | Where {$_.objectClass -eq ‘computer’} $AdminGroupsWithComputersAsMembersCountHashTable.Set_Item($DomAdminGroupsItem.DistinguishedName,$GroupContainsComputerMembers.Count) [int]$DomainAdminGroupsWithComputersCount = $DomainAdminGroupsWithComputersCount + $GroupContainsComputerMembersCount } Write-Output “$DomainAdminGroupsWithComputersCount Forest Admin groups contain computer accounts” $AdminGroupsWithComputersAsMembersCountHashTable
PowerView现已集成到了PowerSploit中,包括帮助识别管理员组中的计算机账户的功能:
Get-NetGroup -AdminCount | Get-NetGroupMember -Recurse | ?{$_.MemberName -like ‘*$’}
另一个缓解措施是确保所有计算机帐户的密码每30 – 60天更改一次,特别是服务器(域控制器!)。
参考资源