凭证注入
在进入AD对象和枚举之前,让我们先了解凭据注入方法。从 活动目录的渗透中,会看到通常可以在不损害加入域的计算机的情况下找到凭据。特定的枚举技术可能需要特定的设置才能工作。
runas
如果有AD凭据无处可登录,那么Windows自带的 runas 命令将会很有用,我们可以使用合法的 Windows 二进制文件 Runas 将凭据注入内存。通常的 Runas 命令看起来像这样:
runas /netonly /user:<domain>\<username> cmd.exe
我们看一下参数:
- /netonly - 因为我们没有加入域,所以我们想要加载用于网络身份验证的凭据,而不是针对域控制器进行身份验证。它可以确保注入的凭据用于所有网络连接。
- /user - 在这里,选择登录的用户
- cmd.exe - 这是我们在注入凭据后要执行的程序。也可以改为可执行的命令,如whoami
DNS利用
提供密码后,将打开一个新的命令提示符窗口。现在我们仍然需要验证我们的凭据是否有效。最可靠的方法是列出 SYSVOL。任何AD帐户,无论权限有多低,都可以读取 SYSVOL 目录的内容。
SYSVOL
SYSVOL 是所有域控制器上都存在的文件夹。它是一个共享文件夹,存储组策略对象 (GPO) 和信息以及任何其他域相关的脚本。它是 Active Directory 的重要组件,因为它将这些 GPO 传递到域中的所有计算机。然后,加入域的计算机可以读取这些 GPO 并应用适用的 GPO,从而从中央位置进行域范围的配置更改。<br />在列出 SYSVOL 之前,我们需要配置DNS,对于 DNS 服务器来说,最安全的选择通常是域控制器。使用域控制器的IP,我们可以在PowerShell窗口中执行以下命令:
$dnsip = "<DC IP>"
$index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip
凭据测试
列出DC域控的共享文件
dir \\za.tryhackme.com\SYSVOL\
IP和主机名的区别
问题: dir \za.tryhackme.com\SYSVOL和dir \<DC IP>\SYSVOL之间有区别吗?<br /><br />差别在于所使用的身份验证方法。当我们使用主机名时,网络身份验证将首先尝试执行 Kerberos 身份验证。由于 Kerberos 身份验证使用嵌入在票证中的主机名,如果我们使用 IP,则强制身份验证类型为 NTLM。强制 NTLM 身份验证是一个好技巧,强制使用NTLM身份验证可以在某些情况下帮助避免被检测到:如安全监控等
使用 MMC 枚举
优点
- GUI 提供了一种获得AD环境整体视图的绝佳方法。
- 可以对不同的AD对象进行快速搜索。
- 它提供了一种直接的方法来查看AD对象的具体更新。
- 如果我们有足够的权限,我们可以直接更新现有的AD对象或添加新的AD对象。
缺点
- GUI 需要RDP访问执行它的计算机。
- 尽管搜索对象速度很快,但无法执行收集AD范围内的特性或属性。
微软管理控制台
这是唯一使用GUI界面的方法。使用 Win + R 快捷键输入 "MMC" <br />
枚举AD结构
如同进行选择<br /><br />
<br />
用户和计算机
我们主要关注AD用户和计算机,展开该管理单元并展开 za 域以查看初始组织单位 (OU) 结构:<br />
该组织的管理级别
可以看见一共有三个<br /><br />继续点击,可以查看该级别下的用户,可以看见该用户的详细描述等其他信息<br />
组织的部门划分
让我们看一下 People 目录。这里我们看到用户是按照部门OU来划分的。单击每个 OU 将显示属于该部门的用户。这里一共有7个部门<br /><br />单击这些用户中的任何一个都将允许我们查看他们的所有属性和属性。我们还可以查看他们属于哪些组:<br />
其他组织单位(OU)
还可以使用 MMC 来查找环境中的主机。如果我们单击“服务器”或“工作站”,将显示加入域的计算机的列表。<br />
使用 CMD 枚举
优点
- 不需要额外或外部工具,并且蓝队通常不会监控这些简单的命令。
- 我们不需要 GUI 来执行此枚举。
- VBScript 和其他常用于网络钓鱼有效负载的宏语言本身支持这些命令,因此它们可用于在制作更具体的有效负载之前枚举有关AD域的初始信息。
缺点
- 这些net命令必须从加入域的计算机执行。如果计算机未加入域,则它将默认为 WORKGROUP 域。
- 命令net可能不会显示所有信息。例如,如果用户是十多个组的成员,则并非所有这些组都会显示在输出中。
用户
列出当前域中的所有用户账户
net user /domain
查看域用户账户的详细信息
net user "Username" /domain
组
枚举当前域的组
net group /domain
查看域组的组名的详细信息
net group "Group name" /domain
枚举密码政策
net accounts /domain
<br />这将为我们提供有用的信息,例如:
- 保留的密码历史记录长度。这意味着用户必须提供多少个唯一密码才能重新使用旧密码。
- 错误密码尝试的锁定阈值以及帐户将被锁定的时间。
- 密码的最小长度。
- 允许密码达到的最长期限,指示密码是否必须定期轮换。
如果我们想对我们现在列举的其他用户帐户进行额外的密码喷射攻击,那么这些信息可以使我们受益。它可以帮助我们更好地猜测在攻击中应该使用哪些单一密码,以及在锁定帐户的风险之前可以运行多少次攻击。<br />如果我们执行盲目密码喷射攻击,我们可能会锁定帐户,因为我们没有检查以确定特定帐户在被锁定之前还剩多少次尝试。
使用 PowerShell 枚举
优势
-
PowerShell cmdlet 可以枚举比命令提示符中的 net 命令更多的信息。
-
我们可以指定服务器和域来使用未加入域的计算机上的 runas 执行这些命令。
-
我们可以创建自己的 cmdlet 来枚举特定信息。
-
我们可以使用 AD-RSAT cmdlet 直接更改 AD 对象,例如重置密码或将用户添加到特定组。
缺点
- 与命令提示符相比,蓝队通常更多地监控 PowerShell。
- 我们必须安装 AD-RSAT 工具或使用其他可能可检测的脚本进行 PowerShell 枚举。
用户
枚举域用户
Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties *
这些参数用于以下用途:
- -Identity - 我们正在枚举的帐户名
- -Properties - 将显示与帐户关联的哪些属性,* 将显示所有属性
- -Server - 由于我们没有加入域,因此我们必须使用此参数将其指向我们的域控制器
查找名称以结尾的任何用户
Get-ADUser -Filter 'Name -like "*stevens"'
组
枚举域组详细信息
Get-ADGroup -Identity Administrators -Server za.tryhackme.com -Properties *
枚举组成员身份
Get-ADGroupMember 检索组的成员
Get-ADGroupMember -Identity Administrators -Server za.tryhackme.com
域对象
查找特定日期
$ChangeDate = New-Object DateTime(2022, 02, 28, 12, 00, 00) # 变量指定的日期和时间(2022年2月28日下午12点)
Get-ADObject -Filter 'whenChanged -gt $ChangeDate' -includeDeletedObjects -Server za.tryhackme.com
枚举 错误计数 大于 0 的帐户
避免这些帐户参与密码枚举
Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com
域名
检索有关特定域的附加信息
Get-ADDomain -Server 域名
更改域用户密码
$oldPass = Read-Host -AsSecureString -Prompt 'Enter the old password'
$newPass = Read-Host -AsSecureString -Prompt 'Enter the new password'
Set-ADAccountPassword -Identity user.name -OldPassword $oldpPass -NewPassword $newPass
使用 Bloodhound 枚举
Bloodhound 是迄今为止最强大的AD枚举工具,当它于 2016 年发布时,它永远改变了 AD 枚举格局。<br />如果问为什么要学会用,过多历史就不叙述了,可以看下面这一句:
防御者用列表思考,攻击者用图表思考。
工具下载:
https://github.com/BloodHoundAD/BloodHound
Sharphound
可能经常会听到用户将 Sharphound 和 Bloodhound 互换使用。然而它们并不相同。Sharphound是Bloodhound的枚举工具。它用于枚举AD信息,然后可以在 Bloodhound 中直观地显示这些信息。Bloodhound 是用于显示 AD 攻击图的实际 GUI。因此我们首先需要使用Sharphound来枚举AD,然后才能使用Bloodhound直观地看到结果。<br />共有三种不同的 Sharphound 执行方式:
- Sharphound.ps1 -用于运行 Sharphound 的PowerShell脚本。不过,最新版本的 Sharphound 已经停止发布 Powershell 脚本版本。该版本非常适合与 RAT 一起使用,因为脚本可以直接加载到内存中,从而逃避磁盘上的 AV 扫描。
- Sharphound.exe - 用于运行 Sharphound 的 Windows 可执行版本。
- AzureHound.ps1 -用于运行 Sharphound for Azure(Microsoft 云计算服务)实例的PowerShell脚本。Bloodhound 可以提取从 Azure 枚举的数据,以查找与 Azure 身份和访问管理配置相关的攻击路径。
注意:
Bloodhound 和 Sharphound 版本必须匹配才能获得最佳结果。
通常会对 Bloodhound 进行更新,这意味着旧的 Sharphound 结果无法被摄取。
关于参数以及使用方法,可以参考这个:
https://bloodhound.readthedocs.io/en/latest/data-collection/sharphound-all-flags.html
在评估中使用这些收集器脚本时,这些文件很可能被检测为恶意软件并向蓝队发出警报。这又是我们未加入域的 Windows 计算机可以提供帮助的地方。我们可以使用该runas命令注入AD凭据并将 Sharphound 指向域控制器。由于我们控制这台 Windows 计算机,因此我们可以禁用 防护软件或为特定文件
枚举
这里使用 SharpHound.exe 版本进行枚举进行演示
Sharphound.exe --CollectionMethods <Methods> --Domain za.tryhackme.com --ExcludeDCs
参数解释:
- --CollectionMethods - 确定 Sharphound 将收集哪种数据。最常见的选项是“Default”或“ALL”。另外,由于 Sharphound 会缓存信息,因此一旦第一次运行完成,只能使用 Session 收集方法来检索新的用户会话以加快该过程。
- --Domain - 在这里,我们指定要枚举的域。在某些情况下,你可能想要枚举与你的现有域信任的父域或其他域。我们可以通过更改此参数来告诉 Sharphound 应枚举哪个域。
- --ExcludeDCs - 这将指示 Sharphound 不要接触域控制器,从而降低 Sharphound 运行引发警报的可能性。
我们将使用 All 方法运行 Sharphound:<br /><br />Sharphound 执行枚举大约需要 1 分钟。在较大的组织中,第一次执行可能需要更长的时间,甚至几个小时。完成后,将在执行 Sharphound 的同一文件夹中获得一个带时间戳的 ZIP 文件<br />
<br />我们现在可以使用 Bloodhound 提取此 ZIP,以直观地向我们展示攻击路径。
Bloodhound
Boodhound 是一个 GUI,允许我们导入 Sharphound 捕获的数据并将其可视化到攻击路径中。Bloodhound 使用 Neo4j 作为其后端数据库和图形系统。Neo4j 是一个图形数据库管理系统。<br />在启动 Bloodhound 之前,我们需要加载 Neo4j:
neo4j console start
<br />在另一个终端选项卡中,运行以下命令, 这将显示身份验证 GUI:
bloodhound --no-sandbox
上传枚举的信息
首先我们需要上传 Sharphound 刚刚生成的zip压缩包<br /><br />导入所有 JSON 文件后,我们可以开始使用 Bloodhound 枚举该特定域的攻击路径。<br />点击这个选项<br />
<br />可以看见里面有许多枚举的信息<br />
Node Info
例如想枚举 域中的AD用户,要先在输入框输入,相关的名称<br /><br />最后要单击以下这个用户图标,结构信息才会改变<br />
<br />在 Node Info (节点信息)可以看见大量有关我们使用的情况。<br />
<br />每个类别都提供以下信息:
- 概述- 提供摘要信息,例如帐户拥有的活动会话数以及是否可以达到高价值目标。
- 节点属性- 显示有关 AD 帐户的信息,例如显示名称和标题。
- 额外属性- 提供更详细的 AD 信息,例如可分辨名称和创建帐户的时间。
- 组成员资格- 显示有关帐户所属组的信息。
- 本地管理员权限- 提供有关帐户具有管理权限的已加入域的主机的信息。
- 执行权限- 提供有关特殊权限的信息,例如通过 RDP 访问计算机的能力。
- 出站控制权限- 显示有关此帐户有权修改其属性的 AD 对象的信息。
- 入站控制权限- 提供有关可修改此帐户属性的 AD 对象的信息。
如果想了解每个类别的更多信息,可以按信息查询旁边的数字<br />
Analysis
这些是 Bloodhound 的创建者自己编写的查询,用于列举有用的信息。<br /><br />在 “Domain Information”下,我们可以单击运行选项,就会出现相关的图<br />
<br />图标称为节点,线称为边。这个图的意思是:<br />有一个用户名为T0_TINUS.GREEN的 AD 用户帐户,它是Tier 0 ADMINS组的成员。但是,该组是DOMAIN ADMINS组中的嵌套组,这意味着属于第 0 层 ADMINS组的所有用户实际上都是 DA。<br />此外,还有一个用户名为ADMINISTRATOR的附加 AD 帐户,该帐户是DOMAIN ADMINS组的一部分。因此,如果我们想获得 DA 权限,我们的攻击面中可能会尝试破坏两个帐户。由于管理员帐户是内置帐户,因此我们可能会关注用户帐户。
图标
过滤图标
如果我们想制定攻击路径,我们需要查看当前位置和我们拥有的特权与我们想要去的地方之间的可用边缘。Bloodhound 有各种可用的边缘,可以通过过滤器图标访问:<br />
制定枚举攻击路径
我们的起始节点将是我们的 AD 用户名,我们的结束节点将是第1 层 ADMINS组,因为该组对服务器具有管理权限。<br /><br />如果使用所选边缘过滤器没有可用的攻击路径,Bloodhound 将显示“NO DATA RETURNED FROM QUERY”。请注意,这也可能是由于 Bloodhound/Sharphound 不匹配造成的。
它显示T1 管理员 ACCOUNT之一通过使用其凭据对THMJMP1(工作站) 进行身份验证,破坏了分层模型。它还表明属于DOMAIN USERS组的任何用户(包括我们的 AD 帐户)都能够通过 RDP 连接到该主机。<br />我们可以执行如下操作来利用这条路径:
- 使用我们的 AD 凭据通过 RDP 进入THMJMP1。
- 在主机上寻找可为我们提供管理访问权限的权限升级向量。
- 通过管理访问,我们可以使用凭据收集技术和工具,例如 Mimikatz。
- 由于 T1 管理员在THMJMP1上有一个活动会话,因此我们的凭据收集将为我们提供关联帐户的 NTLM 哈希值。
一般情况下,攻击路径可能比较复杂,需要采取多次行动才能达到最终目标。如果要了解每个边缘相关的漏洞,可以参考这个:
https://bloodhound.readthedocs.io/en/latest/data-analysis/edges.html
更新会话数据
在大型组织中,AD 的结构不会经常改变。可能会有一些新员工,但 OU、组、用户和权限的整体结构将保持不变。<br />然而不断变化的一件事是活动会话和登录事件。由于 Sharphound 创建 AD 结构的时间点快照,因此活动会话数据并不总是准确的,因为某些用户可能已经注销了其会话,或者新用户可能已经建立了新会话。这是需要注意的重要事项,也是我们希望定期执行 Sharphound 的原因。
一个好的方法是在评估开始时使用“ALL”收集方法执行 Sharphound,然后使用“Session”收集方法每天至少执行两次 Sharphound。
Sharphound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs
Sharphound.exe --CollectionMethods session --Domain za.tryhackme.com --ExcludeDCs
# 每天两次
这将更新新的会话数据并确保这些运行速度更快,因为它们不会再次枚举整个 AD 结构。我们可以在用户上班之前,收集一次,比如喝咖啡的时候。然后再用户快下班的时候,再收集一次。
在从这些新的 Sharphound 运行中导入数据之前,可以通过单击“Clear Sessions”在“Database Info”选项卡上清除 Bloodhound 中的停滞会话数据。<br /><br />优点
- 提供用于 AD 枚举的 GUI。
- 能够显示枚举的AD信息的攻击路径。
- 提供对通常需要多次手动查询才能恢复的 AD 对象的更深刻见解。
缺点
- 需要执行 Sharphound,该程序噪音较大,通常可以被 AV(安全防护软件 )或 EDR (终端检测和响应)解决方案检测到。
其他的枚举技术
ldap枚举
https://book.hacktricks.xyz/pentesting/pentesting-ldap
PowerSploit项目
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
WMI
WMI 可用于枚举来自 Windows 主机的信息。它有一个名为“root\directory\ldap”的提供程序,可用于与 AD 交互。我们可以使用此提供程序和 PowerShell 中的 WMI 来执行 AD 枚举。
https://0xinfection.github.io/posts/wmi-ad-enum/
枚举防御
AD 枚举非常难以防御。其中许多技术模仿常规网络流量和行为,使得很难区分恶意流量和正常流量。但是,我们可以采取一些措施来检测潜在的恶意行为:
- 强大的 AD 枚举技术(例如 Sharphound)在枚举会话信息时会生成大量登录事件。由于它从单个 AD 帐户执行,因此这些登录事件将与该单个帐户关联。我们可以编写检测规则来检测用户帐户中发生的此类行为。
- 我们可以为特定 AD 枚举技术必须安装的工具编写签名检测规则,例如 SharpHound 二进制文件和 AD-RSAT 工具。
- 除非我们组织的员工使用,否则我们可以监控组织中命令提示符和 Powershell 的使用情况,以检测来自未经授权来源的潜在枚举尝试。
蓝队本身也可以定期使用这些枚举技术来识别 AD 域结构中的差距和错误配置。如果我们能够解决这些错误配置,即使攻击者枚举了我们的 AD,他们也无法找到可用于权限提升或横向移动的错误配置。
参考:
https://tryhackme.com/room/adenumeration
标签:Bloodhound,AD,Sharphound,常见,目录,枚举,我们,帐户
From: https://blog.51cto.com/u_16150072/6541251