本文介绍如何创建用作蜜罐(或蜜令牌)的帐户,这些帐户看起来像是提供了攻击者想要的东西(访问),但最终提供了防御者想要的东西(检测)。重点是使蜜罐帐户在 Active Directory 中看起来正常且“真实”,并且此前提应该在某种程度上可以移植到其他系统。
AD Recon 101 我之前曾在演示文稿中介绍过 AD 侦察( DEF CON 2016:超越 MCSE,Red-Teaming Active Directory),但在此处提供了更多关于特权 AD 帐户侦察的详细信息。 当攻击者对 Active Directory 进行侦察时,需要查看几个关键项目:
在大多数 Active Directory 环境中,我们可以作为普通 AD 用户(在某些情况下没有有效的 AD 凭据)扫描所有这些 AD 森林。
1. 识别特权账户
让我们从#1 开始。我们可以递归枚举 AD 森林中每个域中的管理员组,也可以扫描每个域中用户属性“AdminCount”设置为 1 的所有 AD 用户帐户。我介绍了 AdminCount 属性在 2015 年的用途(DerbyCon – “红色与蓝色 Active Directory 攻击与防御”)。
在添加到特权 AD 组(例如管理员、域管理员、企业管理员等)的任何 AD 帐户上,AdminCount 属性自动设置为 1。此技术有用性的限制因素是,我们还可能找到用于属于特权 AD 组,但不再是成员。这意味着扫描 AdminCount=1 的 AD 帐户会提供 潜在特权帐户的快速列表(没有组枚举)。
2.使用旧密码识别特权帐户
一旦我们有了特权帐户列表,我们就想检查旧密码。我通常将“旧密码”定义为超过 5 年,因为 Active Directory 安全性实际上只是在过去 5 年左右(大约从 2014/2015 年左右开始)成为大多数组织的关注点。任何密码超过 5 年的帐户都可能不是很好,任何超过 10 年的密码可能更糟。作为攻击者,我更有可能针对使用旧密码的帐户。
3. 使用 Kerberos 服务主体名称 (SPN) 识别特权帐户
我们还可以检查特权帐户列表以查看它们是否具有关联的 Kerberos 服务主体名称 (SPN)。对于任何具有至少一个 SPN 的帐户,我们可以使用一种称为“ Kerberoast ”的攻击” 可能会离线破解密码。攻击者需要做的就是为 SPN 请求一个 Kerberos 服务票证(通常使用 RC4,它使用 NTLM 密码哈希来加密票证)并将其保存到我们的密码破解系统。破解方法是遍历潜在密码(包括键盘映射/步行类型密码,这些密码只是基于字符在键盘上的位置的简单模式——在管理员中很流行),将它们转换为 NTLM,并尝试使用此打开服务票证NTLM 密码哈希。如果我们能打开票,我们就成功猜到了密码。所有这些都只有用户权限和企业网络上的最少活动。
4. 在常规工作站上识别具有网络会话的特权帐户
我将在此 AD 侦察速成课程中介绍的最后一项检查是检查常规工作站上特权帐户的网络会话。这是一项已执行多年的检查,Will (Harmj0y) 过去已广泛涵盖此内容 ( I Hunt SysAdmins )。有一个原始的 NT 方法(NetSessionEnum) 为任何经过身份验证的用户(“经过身份验证的”包括通过信任连接的帐户)提供从 Windows 服务器请求与其有会话的帐户的能力(包括帐户名称、帐户调用的计算机、会话时间等) )。此信息使攻击者能够收集网络会话信息并识别正在使用哪些计算机特权帐户。借助此信息,攻击者可以确定如何破坏单台计算机以获取对管理员凭据的访问权限并破坏 AD。这是管理系统对于保护管理帐户至关重要的原因之一。
特权账户——攻击者的视角
既然攻击者拥有特权 AD 帐户列表并确定了潜在目标,那么攻击者可以执行哪些检查来“验证”这些帐户以及防御者可以采取哪些措施来反击?
从攻击者的角度来看,如果 Domain Admins 中有一个密码为 15 年且具有关联 SPN 的 AD 帐户,那看起来就像是赢家。Kerberoast 该帐户,从那里获取密码和 pwn AD!
但是攻击者如何在攻击之前验证多汁的目标(可能存在漏洞的帐户)呢?
有一些关键的 AD 用户属性是通过帐户的正常使用而更新的。这包括帐户上次登录的时间、上次登录的位置、上次更改密码的时间等。攻击者希望检查以下内容:
攻击者尝试发现蜜罐帐户的一些简单方法是检查帐户的创建时间,并将该日期与上次密码更改和上次登录日期进行比较。如果这些都大致相同,则该帐户很可能是假的或不活跃的。
以下是我们可以用来检查 AD 帐户有效性的一些查询:
建立我们的蜜罐帐户
我们想要一个攻击者想要的目标(又名“诱饵”),并为防御者提供一种新的检测方法,攻击者与目标的交互可以识别正在发生的恶意活动。理想情况下,防御者会收到足够有用的详细信息,例如“2020 年 7 月 7 日下午 3:17 在 COMP01 计算机上检测到利用 ADMINM3 帐户的活动”。
作为后卫,我们有主场优势;我们可以配置环境,因为我们希望在检测潜在恶意活动时提供更好的保真度。
既然我们已经决定创建我们的蜜罐(或蜜令牌)帐户,那么是什么让 Active Directory (AD) 帐户看起来“真实”?
由于我们已经审查了攻击者对特权帐户的看法,因此我们对攻击者的兴趣有所了解。我们可以使用这些信息来使蜜罐帐户看起来更受欢迎和真实。
我们需要确保我们的蜜罐账户:
蜜罐帐户的最大挑战之一是使其成为一个明确的目标,一个攻击者情不自禁地追击的目标,但如果攻击者可以访问它,则限制该帐户可以做什么(或以某种方式限制它)它不提供攻击者利益)。
有几种方法:
注意:如果您决定使用 LogonWorkstations 来限制蜜罐帐户的登录能力,如果攻击者能够发现相关密码,并且 至少有 1 个计算机帐户在 AD 中不存在,则存在潜在的升级路径。Active Directory 的默认配置允许任何用户将 10 个计算机帐户添加到 AD 域(技术上更多,因为每个计算机帐户可以添加 10 个)。这意味着,如果没有与 LogonWorkstations 中的所有值相关联的计算机帐户,攻击者可能会使用受感染的用户帐户创建新的计算机帐户,并最终将其与未加入的计算机相关联,最终使用这台新加入域的计算机帐户以与蜜罐帐户交互登录。
Trimarc 建议
Trimarc 不建议将帐户置于域管理员等特权 AD 组中,并将此帐户的有效凭据保留在 AD 中。如果此帐户的保护不完善,您最终可能会因此配置而导致 AD 受到威胁。
在您的环境中创建多个蜜罐帐户以使攻击者绊倒。无论您决定部署什么,请确保这些帐户看起来像环境中的其他帐户。
Kerberoast 蜜罐帐户(服务帐户或管理员帐户):监视此帐户的 Kerberos 服务票证请求。
组策略首选项密码蜜罐(不一定是帐户):在每个域的 DC 上的 SYSVOL 共享中创建一个随机 GUID 文件夹名称,并在该文件夹上设置一个 SACL(审计条目)(确保域控制器审计配置为启用对象访问 - 高级审计策略配置中的审计文件系统)。如果有人试图阅读它,那可能是恶意的,因为它没有与真正的组策略对象相关联。
本文末尾提供了用于创建随机 GUID 的 PowerShell 代码。
我们还可以在这些包含凭据的 GUID 文件夹中放置一些 XML 文件,以查看是否有人尝试使用它们。组策略首选项密码在 XML 中存储为“cpassword”。这是一个示例“groups.xml”文件,可以调整它以放置在 SYSVOL GUID 文件夹结构中:
<?xml version="1.0" encoding="utf-8" ?>
<Groups clsid="{3125E937-EB16-4b4c-9934-544FC6D24D26}">
<User clsid="{DF5F1855-51E5-4d24-8B1A-D9BDE98BA1D1}" name="Administrator (built-in)" image="2" changed="2019-03-17 03:17:23" uid="{D5FE7352-81E1-42A2-B7DA-118402BE4C33}">
<Properties action="U" newName="TRDAdmin" fullName="" description="Standard Admin Account" cpassword="RI133B2Wl2CiIOCau1DtrtTe3wdFwzCiWB5PSAxXMDstchJt3bLOUie0BaZ/ 7rdQiuqTonF3ZWAKa1iRvd4JGQ" changelogon="0" noChange="0" neverExpires="0" acctDisabled="0" subAuthority="RID_ADMIN" userName="Administrator (built-in)" expires="2019-03-16" />
</User>
</Groups>
文本属性(信息或描述)中密码错误的服务帐户:监控身份验证尝试和错误密码尝试。
用于创建随机 GUID 的 PowerShell 代码
# GPO GUID Structure: 8-4-4-4-12
Function Get-HexString
{
Param
([int]$Length)
(1..$Length | %{ '{0:X}' -f (Get-Random -Max 16) }) -join ''
}
$HexLengthArray = @(
'8',
'4',
'4',
'4',
'12'
)
$RandomGUIDString = $NULL
ForEach ($HexLengthItem in $HexLengthArray)
{
[string]$RandomGUIDString += $(Get-HexString -Length $HexLengthItem) + '-'
[string]$RandomGUIDString2 += $(Get-HexString -Length $HexLengthItem) + '-'
}
$RandomGUID = $RandomGUIDString.Substring(0,$RandomGUIDString.Length-1)
$RandomGUID2 = $RandomGUIDString2.Substring(0,$RandomGUIDString2.Length-1)
# Ensure generated GUID doesn't match Microsoft defaults
# Default Domain Policy 31B2F340-016D-11D2-945F-00C04FB984F9
# Default Domain Controllers Policy 6AC1786C-016F-11D2-945F-00C04fB984F9
IF ( ($RandomGUID -eq '31B2F340-016D-11D2-945F-00C04FB984F9') -OR ($RandomGUID -eq '6AC1786C-016F-11D2-945F-00C04fB984F9') )
{ $RandomGUID2 }
ELSE
{ $RandomGUID }
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。