Active Directory域枚举技术
拓扑图
在示例中使用的拓扑图如下:
前言
为什么需要枚举
在进行渗透攻击时,通过枚举可以让攻击者在最初的超低权限获取到有关AD的设置和结构的各种细节,让后续能够执行某种形式的提权或横向移动以获取更多的权限,直到拥有足够的权限来执行并达到目标。
在大多数情况下,枚举和利用是紧密相连的。一旦枚举阶段显示的攻击路径被利用,就会从这个新的特权位置再次进行枚举,如图所示。

枚举方法
有很多枚举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
安装插件
通过以下步骤安装插件:
- 点击“开始”
- 搜索“应用和功能”并按回车键
- 点击管理可选功能
- 点击添加功能
- 搜索 "RSAT"
- 选择 "RSAT:Active Directory 域服务与轻量级目录工具" 并点击安装
在运行中输入MMC可以启动它,但这样并不能运行,因为没有加入域,本地账户无法对域进行身份验证:
添加插件
在 MMC 中附加 AD RSAT 插件:
- 点击文件 -> 添加/删除插件
- 选择并添加所有三个 Active Directory 插件
- 点击通过任何错误和警告
- 右键单击“Active Directory 域和信任”并选择“更改森林”
- 输入 za.tryhackme.com 作为根域并点击确定
- 在 Active Directory 站点和服务上右键单击并选择更改森林
- 输入 za.tryhackme.com 作为根域名并点击确定
- 在 Active Directory 用户和计算机上右键单击并选择更改域
- 输入 za.tryhackme.com 作为域名并点击确定
- 在左侧窗格中右键单击 Active Directory 用户和计算机
- 点击查看 -> 高级功能
如果到目前为止一切正常,MMC 现在应该已指向并验证了目标域:
那么现在就可以开始枚举AD结构的信息了。
用户和计算机
查看AD结构,展开za域以查看初始组织单元OU的结构:
在人员目录中可以看到用户是根据OU来划分的,点击任意一个OU都会显示属于该部门的用户:
点击其中任意一个用户,可以查看它们的所有属性和特性,还能看到它们所属的组:
也可以使用 MMC 来查找环境中的主机。如果点击服务器或工作站,将显示已加入域的计算机列表。
如果由相关权限,也可以使用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 GUIGUI界面:

-
认证与数据加载:
使用默认凭证neo4j:neo4j登录,通过SCP将Sharphound生成的ZIP文件下载,拖入bloodhound开始导入:
攻击路径
bloodhound可以显示多个攻击路径,“搜索节点”旁边的三个横杠将显示选项。
database info标签
此标签显示了关于当前导入的信息:
node info标签
此标签显示了指定节点多个类别的信息,搜索AD账户,再点击旁边出来的节点,以刷新标签内容,如图:
每个类别分别提供了以下信息:
- 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,旁边的画布上就会显示关联图:

PS:
图标被称为节点,线条被称为边
按 LeftCtrl 键更改标签显示设置,如图:
![]()
analysis 标签
此标签通过内置的功能,以枚举有用的信息,如图:
在 Domain Information 部分可以运行 Find all Domain Admins:
在上图中可以看到管理员组的成员情况。
那么如果要获得DA权限,就要尝试攻击这两个账户,但 ADMINISTRATOR 是内置账户,我们更应该关注的是用户账户。
通过分析当前拥有的权限、位置和可用边,在过滤器中设置,以制定攻击路线:
制定攻击路径
使用默认的基本攻击路径,在工具中通过设置起始点,自动规划路径:

可以看到,所有域用户被授予 THMJMP1 的 RDP 权限,允许远程登录,那么登录到 THMJMP1,使用 Mimikatz 工具等方式提取该站点中 T1_HENRY.MILLER 的明文密码或 NTLM 哈希,以成为管理员。
该路径具体利用方式参考:
- 使用当前 AD 凭证远程桌面到 THMJMP1。
- 在主机上寻找提供管理员访问权限的提权向量。
- 使用管理权限,使用 Mimikatz 等凭证收集技术和工具。
- 由于 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 枚举。
防御方法
- 检测异常登录事件
- 场景:如Sharphound等工具会触发大量同一账户的登录事件(LogOn Events)。
- 规则:监控短时间内单一账户的密集登录行为,结合SIEM工具告警。
- 工具签名检测
- 目标:识别Sharphound二进制文件、AD-RSAT工具等已知工具的安装与执行。
- 方法:基于文件哈希、内存特征或进程行为编写检测规则。
- 限制命令行工具使用
- 策略:监控非授权来源的CMD/PowerShell活动,尤其是敏感操作(如AD查询)。
- 实施:通过AppLocker或设备控制策略限制执行权限。
- 蓝队主动防御
- 自检:定期使用相同技术扫描AD环境,修复配置漏洞(如特权组嵌套、服务账户权限过宽)。
- 效果:即使攻击者枚举AD,也难以找到可利用的弱点。

浙公网安备 33010602011771号