Active Directory域枚举技术

拓扑图

在示例中使用的拓扑图如下:

image-20250415125341978

前言

为什么需要枚举

在进行渗透攻击时,通过枚举可以让攻击者在最初的超低权限获取到有关AD的设置和结构的各种细节,让后续能够执行某种形式的提权或横向移动以获取更多的权限,直到拥有足够的权限来执行并达到目标。

在大多数情况下,枚举和利用是紧密相连的。一旦枚举阶段显示的攻击路径被利用,就会从这个新的特权位置再次进行枚举,如图所示。

image-20250414205917852

枚举方法

有很多枚举AD的方法,比如以下方法:

  • 微软管理控制台中的 AD 插件。
  • 命令提示符中的 net 命令。
  • Windows 活动目录的 AD-RSAT PowerShell 命令。
  • Bloodhound

凭证注入

在渗透测试中,攻击者常通过钓鱼、漏洞利用或信息泄露获取AD凭证,但面临以下挑战:

  • 非域环境限制:未加入目标域的机器无法直接使用域账户登录。
  • 权限不足:无法创建新域成员设备时,需在现有控制设备上利用凭证。
  • 隐蔽性要求:需避免直接与域控制器交互引发告警。

此时,凭证注入技术成为关键突破口。

Runas

Windows内置的runas.exe允许在非域环境中加载域账户凭证,实现网络身份模拟。

命令语法

runas.exe /netonly /user:<域名>\<用户名> <程序>

参数解析:

  • /netonly:仅网络通信(所有网络连接)使用注入凭证,本地仍以当前用户权限运行。
  • /user:指定域账户(推荐使用FQDN(完全合规域名)格式,如za.tryhackme.com\admin)。
  • <程序>:启动的程序(常用cmd.exe以开启带凭证的命令行,会创建新的shell)。

操作步骤

执行命令:

runas.exe /netonly /user:za.tryhackme.com\svcMDT cmd.exe

执行后会要求输入密码,但即使密码错误也会接受(因设置 /netonly 参数未对DC验证),但后续网络操作会失败。

验证后会弹出新CMD窗口,其本地身份不变,但所有网络请求使用注入的域账户凭证。

DNS配置

非域设备需手动配置DNS以解析内部域名,否则无法通过主机名访问域资源。

配置方法(PowerShell)

# 设置DNS服务器为域控制器IP
$dnsip = "<DC IP>"
$index = Get-NetAdapter -Name 'Ethernet' | Select-Object -ExpandProperty 'ifIndex'
Set-DnsClientServerAddress -InterfaceIndex $index -ServerAddresses $dnsip

验证示例DNS

nslookup za.tryhackme.com  # 应解析为域控制器IP

访问SYSVOL验证凭证

SYSVOL是域控制器上的共享目录,存储GPO等关键数据,所有域账户均有读取权限,通过访问该目录内容,可以验证获得的凭据有效性。

dir \\za.tryhackme.com\SYSVOL\  # 使用主机名访问(触发Kerberos认证)
dir \\<DC IP>\SYSVOL\        # 使用IP访问(强制NTLM认证)

认证方式差异:

  • 主机名:优先使用Kerberos(需DNS解析正常)。
  • IP地址:强制使用NTLM,可能规避某些安全监控。

通过微软管理控制台枚举

使用微软管理控制台(MMC)和远程服务器管理工具(RSAT)的AD插件实现枚举。

使用命令连接示例目标主机:

  • 通过 SSH 连接:ssh user.name@za.tryhackme.com@thmjmp1.za.tryhackme.com

  • 通过 RDP 连接:xfreerdp /d:za.tryhackme.com /u:'user.name' /p:'password' /v:thmjmp1.za.tryhackme.com /drive:.,kali-share +clipboard

安装插件

通过以下步骤安装插件:

  1. 点击“开始”
  2. 搜索“应用和功能”并按回车键
  3. 点击管理可选功能
  4. 点击添加功能
  5. 搜索 "RSAT"
  6. 选择 "RSAT:Active Directory 域服务与轻量级目录工具" 并点击安装

在运行中输入MMC可以启动它,但这样并不能运行,因为没有加入域,本地账户无法对域进行身份验证:

image-20250415144138489

添加插件

在 MMC 中附加 AD RSAT 插件:

  1. 点击文件 -> 添加/删除插件
  2. 选择并添加所有三个 Active Directory 插件
  3. 点击通过任何错误和警告
  4. 右键单击“Active Directory 域和信任”并选择“更改森林”
  5. 输入 za.tryhackme.com 作为根域并点击确定
  6. 在 Active Directory 站点和服务上右键单击并选择更改森林
  7. 输入 za.tryhackme.com 作为根域名并点击确定
  8. 在 Active Directory 用户和计算机上右键单击并选择更改域
  9. 输入 za.tryhackme.com 作为域名并点击确定
  10. 在左侧窗格中右键单击 Active Directory 用户和计算机
  11. 点击查看 -> 高级功能

如果到目前为止一切正常,MMC 现在应该已指向并验证了目标域:

image-20250415151443478

那么现在就可以开始枚举AD结构的信息了。

用户和计算机

查看AD结构,展开za域以查看初始组织单元OU的结构:

image-20250415153413984

在人员目录中可以看到用户是根据OU来划分的,点击任意一个OU都会显示属于该部门的用户:

image-20250415153535533

点击其中任意一个用户,可以查看它们的所有属性和特性,还能看到它们所属的组:

image-20250415153801120

也可以使用 MMC 来查找环境中的主机。如果点击服务器或工作站,将显示已加入域的计算机列表。

image-20250415153842836

如果由相关权限,也可以使用MMC直接对AD进行更改,例如:更改用户的密码或将账户添加到特定组。

此方法的优缺点

优点

  • 图形界面提供了一个获取 AD 环境整体视图的绝佳方法。
  • 可以快速搜索不同的 AD 对象。
  • 提供直接查看 AD 对象特定更新的方法。
  • 如果我们有足够的权限,可以直接更新现有的 AD 对象或添加新的对象。

缺点

  • 该 GUI 需要执行机器的 RDP 访问权限。
  • 虽然搜索对象速度快,但无法在整个 AD 中收集属性或属性。

通过命令提示符枚举

net 命令

  • net user /domain - 在加入域的主机上运行以枚举域用户
  • net user user.name /domain - 在加入域的主机上运行以获取特定域用户的信息
  • net group /domain - 在域加入的主机上运行以枚举域组
  • net group groupName /domain - 在加入域的主机上运行以获取域组成员
  • net accounts /domain - 在加入域的主机上运行以显示域密码和账户锁定策略

此方法的优缺点

优点

  • 不需要额外的或外部工具,这些简单的命令通常不会被蓝队监控。
  • 不需要图形用户界面来完成这项枚举。
  • VBScript 和其他常用于钓鱼载荷的宏语言原生支持这些命令,因此可以用来在构建更具体的载荷之前,枚举有关 AD 域的初始信息。

缺点

  • net 不显示嵌套组
  • net 仅显示最多 10 个组,即使用户在更多组中

通过powershell进行枚举

Users

  • Get-ADUser -Filter * – 返回所有域用户
  • Get-ADUser -Filter 'Name -like "*stevens"' – 查找以 ...stevens 结尾的任何用户
  • Get-ADUser -Identity john.doe -Properties * – 查找用户 john.doe 并返回所有属性
  • Get-ADUser -Identity gordon.stevens -Server za.tryhackme.com -Properties * – 枚举目标域 gordon.stevens 用户所有属性
  • Get-ADUser -Filter 'Name -like "*stevens"' -Server za.tryhackme.com | Format-Table Name,SamAccountName -A – 以更整洁的方式输出
  • Get-ADUser -Filter * -Properties * | select Name,SamAccountName,Description – 获取域用户的name、SamAccountName、Description的信息。

PS:参数说明

  • -Identity - 正在枚举的账户名称
  • -Properties - 将显示与账户关联的哪些属性,*将显示所有属性
  • -Server - 由于没有加入域,所以必须使用此参数将其指向目标DC

Groups

  • Get-ADGroup -Filter * – 返回所有域组
  • Get-ADGroup -Identity Administrators | Get-ADGroupMember – 将 Administrators 组对象管道传输到 Get-ADGroupMember 以检索组成员
  • Get-ADGroup -Identity "Tier 2 Admins" -Server za.tryhackme.com -Properties * - 返回指定组指定域的所有属性

AD Object

  • 获取自指定日期和时间起修改过的任何域对象:

    # 查找指定日期之后更改的所有AD对象,比如2022/02/28之后的
    $modifiedDate = Get-Date '2022/02/28'
    Get-ADObject -Filter "whenChanged -ge $modifiedDate" -IncludeDeletedObjects
    
  • 希望进行密码喷洒攻击,但不锁定账户,那么可以使用类似以下命令枚举 badPwdCount 大于 0 的账户,避免使用它们:

    Get-ADObject -Filter 'badPwdCount -gt 0' -Server za.tryhackme.com
    

    如果网络中的某个用户连续几次输入密码错误,这之后显示结果而不锁定账户。

Domains

  • Get-ADDomain – 从域控制器获取指定域的信息

更改用户密码

$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

此方法的优缺点

优点

  • 相较于命令提示符中的 net 命令,PowerShell cmdlet 能够枚举的信息量要大得多。
  • 可以使用 runas 从非域成员机器上指定服务器和域来执行这些命令。
  • 可以创建自己的 cmdlet 来枚举特定的信息。
  • 可以使用 AD-RSAT 命令直接更改 AD 对象,例如重置密码或将用户添加到特定组。

缺点

  • PowerShell 通常比命令提示符更受蓝队监控。
  • 必须安装AD-RSAT工具或使用其他潜在可检测的脚本来进行PowerShell枚举。

通过 Bloodhound 工具枚举

Bloodhound 允许攻击者(现在也包括防御者)以图形格式可视化 AD 环境,其中节点相互连接。每个连接都是一个可能的路径,可能被利用以达到目标。

Bloodhound 是一种在攻击者机器上本地运行的软件。攻击者必须在目标上运行一个“收集器”,该收集器将枚举有关域的大量信息。收集器运行完成后,它将输出一系列 .json 文件,以便导入攻击者的 Bloodhound 界面。

Bloodhound

功能定位:基于图形化界面(GUI)的AD攻击路径可视化工具,通过Neo4j图数据库展示节点(用户、组、计算机)与关系(权限、隶属)。

Sharphound

sharphound是bloodhound中用于枚举的工具,bloodhound是用于显示AD攻击图的GUI,

它有三个不同的收集器:

  • Sharphound.exe:Windows原生可执行文件,稳定性高。
  • Sharphound.ps1:PowerShell脚本,支持内存加载规避磁盘检测(逐渐弃用)。
  • AzureHound.ps1:专用于Azure AD数据收集。

PS:Bloodhound 和 Sharphound 版本必须匹配才能获得最佳结果。通常 Bloodhound 会进行更新,这意味着旧的 Sharphound 结果无法被摄取。

使用未加入域的Windows主机(如THMJMP1)运行Sharphound,可降低日志告警频率。

通过runas /netonly加载域账户凭证,避免直接登录域控触发安全机制:

runas.exe /netonly /user:za.tryhackme.com\svcMDT cmd.exe

[!IMPORTANT]

如果目标主机没有.net或者版本过低,会导致无法使用

使用方法

使用下列命令启动sharp hound:

Sharphound.exe --CollectionMethods <Methods> --Domain za.tryhackme.com --ExcludeDCs

参数说明:

  • CollectionMethods - 决定 Sharphound 会收集哪种类型的数据。最常见的选择是默认或全部。由于 Sharphound 会缓存信息,一旦首次运行完成,就只能使用会话收集方法来检索新的用户会话,以加快处理速度。
  • Domain - 在这里指定要枚举的域。修改此参数可以指定要枚举的域,枚举与现有域有信任关系的父域或其他域。
  • ExcludeDCs - 这将指示 Sharphound 不要接触域控制器,这可以降低 Sharphound 运行时引发警报的可能性。
  • 其他参数

攻击步骤

投送工具

将Sharphound执行文件投送到目标AD用户主机,比如使用ssh投送。

运行工具

使用 All 和 Session 收集方法运行 Sharphound:

SharpHound.exe --CollectionMethods All --Domain za.tryhackme.com --ExcludeDCs

参数说明:

  • --CollectionMethods
    • All:全量收集(组策略、本地管理员、会话等)。
    • Session:仅进行用户会话收集、恢复会话信息,而不接触域控制器,适用于后续快速更新信息。
  • --ExcludeDCs:跳过域控制器枚举,减少异常日志生成。

数据采集策略

  • 首次全量扫描
    初始阶段使用All参数建立完整AD拓扑。
  • 定期增量更新
    每日两次(10:00、14:00)使用Session参数捕获最新登录会话,通过Bloodhound清除旧会话数据保持时效性。

完成的时长由目标的大小决定,大型组织可能需要相当长的时间,执行完毕后在sharphound执行的同一文件夹中找到一个带时间戳的 ZIP 文件。

比如:

PS C:\Users\gordon.stevens\Documents> dir

    Directory: C:\Users\gordon.stevens\Documents

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        3/16/2022   7:12 PM         121027 20220316191229_BloodHound.zip
-a----        3/16/2022   5:19 PM         906752 SharpHound.exe
-a----        3/16/2022   7:12 PM         360355 YzE4MDdkYjAtYjc2MC00OTYyLTk1YTEtYjI0NjhiZmRiOWY1.bin 

后续将这个压缩包导入bloodhound即可。

Bloodhound-攻击路径分析

数据导入与可视化

  • Neo4j后台启动

    neo4j console start  # 启动图数据库服务
    bloodhound --no-sandbox  # 启动Bloodhound GUI
    

    GUI界面:image-20250415190524726

  • 认证与数据加载
    使用默认凭证neo4j:neo4j登录,通过SCP将Sharphound生成的ZIP文件下载,拖入bloodhound开始导入:

    image-20250415190640735

攻击路径

bloodhound可以显示多个攻击路径,“搜索节点”旁边的三个横杠将显示选项。

database info标签

此标签显示了关于当前导入的信息:

image-20250415190855640
node info标签

此标签显示了指定节点多个类别的信息,搜索AD账户,再点击旁边出来的节点,以刷新标签内容,如图:

image-20250415191507136

每个类别分别提供了以下信息:

  • Overview - 提供账户的摘要信息,例如账户的活跃会话数量以及是否可以访问高价值目标。
  • Node Properties - 显示有关 AD 账户的信息,例如显示名称和职位。
  • Extra Properties - 提供更详细的 AD 信息,例如唯一名称和账户创建时间。
  • Group Members - 显示组成员信息(节点是组)。
  • Group Membership - 显示账户所属的组的信息(节点是用户、计算机等非组)。
  • Local Admin Rights - 提供有关具有管理员权限的域加入主机的信息。
  • Execution Rights - 提供有关特殊权限的信息,例如能够远程桌面连接到机器的能力。
  • Outbound Control Rights - 显示有关此账户有权修改其属性的 AD 对象的信息。
  • Inbound Control Rights - 提供有关可以修改此账户属性的 AD 对象的信息。

通过点击具体类别的子项就能看到每个组别的更多信息,比如查看与当前搜索账户关联的组成员资格,点击 Group Membership -> First Degree Group Membership,旁边的画布上就会显示关联图:

image-20250415193823478

PS:

  • 图标被称为节点,线条被称为边

  • 按 LeftCtrl 键更改标签显示设置,如图:

    image-20250415194428528
analysis 标签

此标签通过内置的功能,以枚举有用的信息,如图:

image-20250415194104227

在 Domain Information 部分可以运行 Find all Domain Admins:

image-20250415194445560

在上图中可以看到管理员组的成员情况。

那么如果要获得DA权限,就要尝试攻击这两个账户,但 ADMINISTRATOR 是内置账户,我们更应该关注的是用户账户。

通过分析当前拥有的权限、位置和可用边,在过滤器中设置,以制定攻击路线:

image-20250415195517041
制定攻击路径

使用默认的基本攻击路径,在工具中通过设置起始点,自动规划路径:

image-20250415200051434

可以看到,所有域用户被授予 THMJMP1 的 RDP 权限,允许远程登录,那么登录到 THMJMP1,使用 Mimikatz 工具等方式提取该站点中 T1_HENRY.MILLER 的明文密码或 NTLM 哈希,以成为管理员。

该路径具体利用方式参考:

  1. 使用当前 AD 凭证远程桌面到 THMJMP1。
  2. 在主机上寻找提供管理员访问权限的提权向量。
  3. 使用管理权限,使用 Mimikatz 等凭证收集技术和工具。
  4. 由于 T1 管理员在 THMJMP1 上有活跃会话,能够提供相关账户的 NTLM 哈希值。

session维持

一般情况下,AD结构不会发生大的变化,可能会出现几个新员工,但始终在变化的是活动会话和登录事件,不断会有用户创建或注销它们的会话,所以需要定期执行sharphound,这样就会保持新的会话数据的更新。

此方法的优缺点

优点

  • 提供 AD 枚举的 GUI。
  • 能够展示已枚举的 AD 信息的攻击路径。
  • 提供对通常需要多次手动查询才能恢复的 AD 对象的更深入见解。

缺点

  • 需要执行 Sharphound,这会产生噪音,并且通常会被 AV 或 EDR 解决方案检测到。

其他枚举方法

前面介绍了一部分常见的方法,下列是一些其他方法:

  • LDAP 枚举 - 任何有效的 AD 凭证对都应该能够绑定到域控制器的 LDAP 接口。这将允许你编写 LDAP 搜索查询来枚举有关域中 AD 对象的信息。
  • PowerView - PowerView 是 PowerSploit 项目的一部分,是一个侦察脚本。尽管该项目不再接收支持,但像 PowerView 这样的脚本在紧急情况下可以非常有助于执行 AD 对象的半手动枚举。
  • Windows Management Instrumentation (WMI) - WMI 可以用来从 Windows 主机枚举信息。它有一个名为"root\directory\ldap"的提供程序,可以用来与 AD 交互。攻击者可以使用这个提供程序和 WMI 在 PowerShell 中执行 AD 枚举。

防御方法

  1. 检测异常登录事件
    • 场景:如Sharphound等工具会触发大量同一账户的登录事件(LogOn Events)。
    • 规则:监控短时间内单一账户的密集登录行为,结合SIEM工具告警。
  2. 工具签名检测
    • 目标:识别Sharphound二进制文件、AD-RSAT工具等已知工具的安装与执行。
    • 方法:基于文件哈希、内存特征或进程行为编写检测规则。
  3. 限制命令行工具使用
    • 策略:监控非授权来源的CMD/PowerShell活动,尤其是敏感操作(如AD查询)。
    • 实施:通过AppLocker或设备控制策略限制执行权限。
  4. 蓝队主动防御
    • 自检:定期使用相同技术扫描AD环境,修复配置漏洞(如特权组嵌套、服务账户权限过宽)。
    • 效果:即使攻击者枚举AD,也难以找到可利用的弱点。
posted @ 2025-12-03 09:45  shinianyunyan  阅读(27)  评论(0)    收藏  举报