Active Directory(AD)是 Microsoft Windows 网络环境中广泛使用的目录服务,用于集中管理用户、计算机、组和其他网络资源。在渗透测试或红队评估中,枚举 AD 用户是关键步骤之一。通过枚举用户,可以获取用户名、账户属性、组成员关系等信息,为后续权限提升、横向移动或攻击路径规划提供基础。本文将详细介绍 AD 用户枚举的常用命令和工具,帮助渗透测试人员和安全从业者全面理解 AD 用户枚举技术。
一、AD 用户枚举概述
用户枚举是 AD 渗透测试中的核心环节,旨在收集域内用户账户信息,包括:
- 用户名(sAMAccountName):用户的登录标识。
- 显示名称(displayName):用户的全名或描述。
- 组成员关系:用户所属的组(如 Domain Admins、Enterprise Admins)。
- 账户属性:如 SID、密码最后设置时间(pwdLastSet)、账户状态(启用/禁用)。
- 角色信息:用户是否具有管理员权限、是否为服务账户等。
- 其他元数据:如登录时间、描述字段(可能包含敏感信息)。
1.1 为什么需要用户枚举?
用户枚举为渗透测试提供了以下价值:
- 发现高权限账户:识别 Domain Admins、Enterprise Admins 等关键用户。
- 弱密码攻击:通过用户名列表进行密码喷洒(Password Spraying)或 ASREPRoast 攻击。
- 社会工程学:利用用户名和描述字段推测组织结构或敏感信息。
- 横向移动:结合组成员关系和会话信息,寻找可利用的账户。
- 攻击路径规划:为工具如 BloodHound 提供输入,绘制域内权限关系图。
1.2 枚举角色与权限要求
- 匿名用户:某些 AD 配置允许匿名绑定(Null Session),可枚举部分用户和组信息。
- 普通域用户:标准域用户默认可查询 AD 中的大部分对象(如用户、组、计算机),无需管理员权限。
- 本地管理员:某些命令(如查询本地组成员)需要目标主机的本地管理员权限。
- 域管理员:高权限账户可访问更多敏感信息(如受保护的 AdminSDHolder 对象)。
1.3 常用协议
AD 用户枚举通常依赖以下协议:
- LDAP(端口 389/636):轻量级目录访问协议,查询 AD 数据库。
- SMB(端口 445):用于 RPC 调用、共享枚举等。
- RPC(端口 135):通过 MS-RPC 协议访问域控制器。
- Kerberos(端口 88):用于认证和票据枚举。
- DNS(端口 53):定位域控制器。
二、AD 用户枚举命令与工具
以下是 AD 用户枚举的常用命令和工具,按协议和功能分类,包含详细描述、输出格式、角色要求及优化建议。
2.1 使用 LDAP 协议的枚举
LDAP 是 AD 的核心访问协议,适合精确查询用户属性。以下是基于 LDAP 的常用工具和命令。
2.1.1 ldapsearch
- 命令示例:
ldapsearch -x -H ldap://10.10.10.182 -b "dc=cascade,dc=local" "(objectClass=user)" sAMAccountName | grep "sAMAccountName" | awk '{print $2}' - 功能:
- 使用 LDAP 协议查询 AD,提取用户对象的
sAMAccountName。 -x:简单认证(匿名绑定,或搭配-D和-w使用凭据)。-H:指定域控制器地址。-b:搜索基础 DN(域的根节点)。(objectClass=user):过滤用户对象。- 管道(grep 和 awk):提取用户名。
- 使用 LDAP 协议查询 AD,提取用户对象的
- 输出:
- 每行一个用户名,例如:
Administrator Guest user1
- 每行一个用户名,例如:
- 角色要求:
- 匿名绑定:需 AD 允许匿名访问(默认禁用,需测试)。
- 域用户:普通域用户可查询大部分用户属性。
- 优点:
- 跨平台(Linux/Unix/Windows)。
- 灵活的过滤器,支持查询特定属性(如 displayName、description)。
- 输出可定制,适合脚本化处理。
- 缺点:
- 需要 LDAP 端口(389/636)开放。
- 匿名绑定可能失败,需凭据。
- 输出为 LDIF 格式,需额外处理(如 grep/awk)。
- 优化建议:
- 使用
-LLL简化输出,去除冗余注释:ldapsearch -x -LLL -H ldap://10.10.10.182 -b "dc=cascade,dc=local" "(objectClass=user)" sAMAccountName - 添加凭据提高成功率:
ldapsearch -x -H ldap://10.10.10.182 -D "user@cascade.local" -w "password" -b "dc=cascade,dc=local" "(objectClass=user)" sAMAccountName - 查询更多属性(如 description、lastLogon):
ldapsearch -x -LLL -H ldap://10.10.10.182 -b "dc=cascade,dc=local" "(objectClass=user)" sAMAccountName displayName description
- 使用
2.1.2 windapsearch
- 命令示例:
windapsearch --dc 10.10.10.182 -u user@cascade.local -p Password1 -m users - 功能:
- 专门的 LDAP 枚举工具,提取用户、组、计算机等信息。
-m users:枚举所有用户对象。- 支持模块化查询(如 metadata、group-members)。
- 输出:
- JSON 或文本格式,包含用户名、SID、描述等。
- 示例:
{"sAMAccountName":"Administrator","displayName":"Administrator","objectSid":"S-1-5-21-...-500"}
- 角色要求:
- 需域用户凭据,或匿名绑定(若启用)。
- 优点:
- 比 ldapsearch 更易用,输出更友好。
- 支持复杂查询(如查找高权限账户)。
- 缺点:
- 需要安装工具(通常在 Linux 上使用)。
- 依赖 LDAP 协议,需开放端口。
- 优化建议:
- 查询元数据以获取域概况:
windapsearch --dc 10.10.10.182 -u user@cascade.local -p Password1 -m metadata - 结合 BloodHound 分析输出:
windapsearch --dc 10.10.10.182 -m users | bloodhound-python --collectionmethod All
- 查询元数据以获取域概况:
2.2 使用 SMB/RPC 协议的枚举
SMB 和 RPC 协议通过域控制器或主机的 NetBIOS/SMB 服务枚举用户,适合快速获取用户名和 RID。
2.2.1 rpcclient
- 命令示例:
rpcclient -U "" -N 10.10.10.182 -c enumdomusers - 功能:
- 使用 RPC 协议(通过 SMB,端口 135/445)枚举域用户。
-U "" -N:尝试匿名连接(无需密码)。-c enumdomusers:列出所有域用户。
- 输出:
- 用户名和 RID,例如:
user:[Administrator] rid:[0x1f4] user:[Guest] rid:[0x1f5] user:[user1] rid:[0x3e8]
- 用户名和 RID,例如:
- 角色要求:
- 匿名访问:需域控制器允许 Null Session(默认禁用)。
- 域用户:普通域用户可枚举用户。
- 优点:
- 快速,适合小型域。
- 不依赖 LDAP,SMB 端口通常开放。
- 缺点:
- 输出信息有限(仅用户名和 RID)。
- 匿名访问成功率低(需凭据)。
- 优化建议:
- 使用凭据提高成功率:
rpcclient -U "user%password" 10.10.10.182 -c enumdomusers - 查询组成员:
rpcclient -U "user%password" 10.10.10.182 -c enumdomgroups
- 使用凭据提高成功率:
2.2.2 netexec
- 命令示例:
netexec smb 10.10.10.182 -u '' -p '' --users --rid-brute - 功能:
- 多协议工具(支持 SMB、LDAP 等),用于枚举用户、组、会话等。
--users:列出所有用户。--rid-brute:通过 RID 爆破枚举用户(包括 SID 和用户名)。
- 输出:
- 详细用户信息,例如:
[SMB] 10.10.10.182:445 CASCADE\Administrator (Sid:S-1-5-21-...-500) [SMB] 10.10.10.182:445 CASCADE\Guest (Sid:S-1-5-21-...-501)
- 详细用户信息,例如:
- 角色要求:
- 匿名访问:支持 Null Session。
- 域用户:提供更完整信息。
- 优点:
- 现代化工具,输出清晰,易于解析。
- 支持多种协议(SMB、LDAP、Kerberos)。
- RID 爆破可发现隐藏用户。
- 缺点:
- 需安装 netexec(Python 工具)。
- RID 爆破可能较慢。
- 优化建议:
- 限制 RID 范围以提高效率:
netexec smb 10.10.10.182 -u '' -p '' --rid-brute 500-2000 - 使用 LDAP 协议(若 SMB 被阻止):
netexec ldap 10.10.10.182 -u '' -p '' --users - 导出结果为 JSON:
netexec smb 10.10.10.182 -u 'user' -p 'password' --users --rid-brute --output-format json
- 限制 RID 范围以提高效率:
2.3 使用 PowerShell 的枚举
PowerShell 是 Windows 环境的原生工具,结合 Active Directory 模块或第三方脚本(如 PowerView),可高效枚举用户。
2.3.1 Get-ADUser
- 命令示例:
Get-ADUser -Filter * -Properties sAMAccountName,displayName,description - 功能:
- 使用 Active Directory PowerShell 模块查询所有用户。
-Filter *:匹配所有用户。-Properties:指定返回属性(如 sAMAccountName、displayName)。
- 输出:
- 表格或列表格式,包含用户名、显示名称等:
sAMAccountName displayName description -------------- ----------- ----------- Administrator Administrator Built-in account user1 User One IT Department
- 表格或列表格式,包含用户名、显示名称等:
- 角色要求:
- 普通域用户:可查询大部分用户属性。
- 需安装 Active Directory 模块(RSAT)或导入 DLL。
- 优点:
- 原生工具,微软签名,检测率低。
- 支持复杂过滤(如启用账户、特定组成员)。
- 缺点:
- 需 PowerShell 环境,RSAT 安装可能受限。
- 需域用户凭据。
- 优化建议:
- 过滤活跃用户:
Get-ADUser -Filter 'Enabled -eq $True' -Properties sAMAccountName,displayName - 查询高权限用户:
Get-ADUser -Filter 'AdminCount -eq 1' -Properties sAMAccountName,displayName - 导出为 CSV:
Get-ADUser -Filter * -Properties sAMAccountName,displayName | Export-Csv -Path users.csv -NoTypeInformation
- 过滤活跃用户:
2.3.2 PowerView
- 命令示例:
Import-Module .\PowerView.ps1 Get-DomainUser -Properties sAMAccountName,displayName,memberOf - 功能:
- PowerView 是 PowerShell 脚本,专门用于 AD 枚举。
- 枚举用户、组、计算机,支持复杂查询。
- 输出:
- 详细用户属性,包括组成员关系:
sAMAccountName displayName memberOf -------------- ----------- -------- Administrator Administrator {Domain Admins, Enterprise Admins} user1 User One {IT Users}
- 详细用户属性,包括组成员关系:
- 角色要求:
- 普通域用户:可枚举大部分信息。
- 本地管理员:某些功能(如会话枚举)需高权限。
- 优点:
- 功能强大,支持细粒度查询。
- 跨域枚举(支持信任域)。
- 缺点:
- 需加载外部脚本,可能被 AV 检测。
- 执行策略需绕过(
-ep bypass)。
- 优化建议:
- 查询特定组成员:
Get-DomainGroupMember -Identity "Domain Admins" | Select-Object MemberName - 绕过执行策略:
powershell -ep bypass -c "Import-Module .\PowerView.ps1; Get-DomainUser"
- 查询特定组成员:
2.4 其他工具
以下是其他常用工具,补充用户枚举功能。
2.4.1 BloodHound
- 命令示例:
bloodhound-python -c All -u user -p password -d cascade.local -dc 10.10.10.182 - 功能:
- 收集 AD 数据(用户、组、会话等),生成关系图。
- 支持 LDAP 和 SMB 协议。
- 输出:
- JSON 文件,导入 BloodHound GUI 后可视化用户权限路径。
- 角色要求:
- 普通域用户:可收集大部分数据。
- 优点:
- 可视化攻击路径,识别高权限用户。
- 支持大规模域环境。
- 缺点:
- 需安装 Python 工具和 BloodHound GUI。
- 数据量大,分析需时间。
- 优化建议:
- 限制收集范围:
bloodhound-python -c Users,Groups -u user -p password -d cascade.local
- 限制收集范围:
2.4.2 CrackMapExec
- 命令示例:
crackmapexec smb 10.10.10.182 -u user -p password --users - 功能:
- 多功能工具,支持用户枚举、密码喷洒等。
--users:列出用户,类似 netexec。
- 输出:
- 类似 netexec,包含用户名、SID 等。
- 角色要求:
- 匿名或域用户凭据。
- 优点:
- 功能全面,易于集成。
- 缺点:
- 需安装,依赖 Python。
- 优化建议:
- 结合 RID 爆破:
crackmapexec smb 10.10.10.182 -u user -p password --rid-brute
- 结合 RID 爆破:
三、命令对比与选择
以下是上述命令的对比,基于协议、输出、权限要求和适用场景。
| 命令/工具 | 协议 | 输出信息 | 权限要求 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|---|
| ldapsearch | LDAP | 用户名、自定义属性 | 匿名/域用户 | 灵活,跨平台 | 需 LDAP 端口,输出需处理 | 精确查询,Linux 环境 |
| windapsearch | LDAP | 用户名、SID、属性 | 域用户 | 易用,输出友好 | 需安装,依赖 LDAP | 定制查询,渗透测试 |
| rpcclient | SMB/RPC | 用户名、RID | 匿名/域用户 | 快速,SMB 端口常见 | 信息有限,匿名失败率高 | 快速枚举,Windows 环境 |
| netexec | SMB/LDAP | 用户名、SID、RID | 匿名/域用户 | 现代化,输出详细 | 需安装,RID 爆破慢 | 全面枚举,渗透测试 |
| Get-ADUser | PowerShell | 用户名、属性、组 | 域用户 | 原生,检测率低 | 需 RSAT,Windows 环境 | Windows 域内枚举 |
| PowerView | PowerShell | 用户名、组、权限 | 域用户/本地管理员 | 功能强大 | 可能被 AV 检测 | 高级枚举,红队评估 |
| BloodHound | LDAP/SMB | 用户、组、关系图 | 域用户 | 可视化攻击路径 | 需 GUI,数据量大 | 攻击路径规划 |
| CrackMapExec | SMB/LDAP | 用户名、SID、属性 | 匿名/域用户 | 多功能,易用 | 需安装 | 快速枚举,自动化测试 |
选择依据
- 无凭据(匿名):优先
netexec --users --rid-brute或rpcclient -U "" -N,测试匿名访问。 - 域用户凭据:使用
ldapsearch或Get-ADUser进行精确查询,BloodHound规划攻击路径。 - 跨平台:
ldapsearch和netexec适合 Linux,PowerView和Get-ADUser适合 Windows。 - 快速枚举:
rpcclient和netexec效率高,适合初步扫描。 - 详细分析:
BloodHound和PowerView提供深入权限关系。
四、实际应用场景
以下是用户枚举在渗透测试中的典型应用场景。
4.1 密码喷洒(Password Spraying)
- 流程:
- 使用
ldapsearch或netexec获取用户名列表。 - 结合常见密码(如
Password123)进行喷洒:netexec smb 10.10.10.182 -u users.txt -p Password123
- 使用
- 注意:
- 检查密码策略(
Get-DomainPolicy),避免账户锁定。
- 检查密码策略(
4.2 ASREPRoast 攻击
- 流程:
- 枚举用户,查找无需 Kerberos 预认证的账户:
Get-DomainUser -PreauthNotRequired -Properties sAMAccountName - 使用 Impacket 的
GetNPUsers.py获取 TGT 哈希:GetNPUsers.py cascade.local/user:password -dc-ip 10.10.10.182 -request
- 枚举用户,查找无需 Kerberos 预认证的账户:
- 作用:获取可离线破解的 Kerberos 哈希。
4.3 识别高权限账户
- 流程:
- 查询
AdminCount=1的用户:Get-ADUser -Filter 'AdminCount -eq 1' -Properties sAMAccountName,memberOf - 或检查 Domain Admins 组成员:
Get-DomainGroupMember -Identity "Domain Admins"
- 查询
- 作用:定位域管理员,规划提权路径。
4.4 社会工程学
- 流程:
- 提取用户描述字段(可能包含敏感信息):
ldapsearch -x -H ldap://10.10.10.182 -b "dc=cascade,dc=local" "(objectClass=user)" sAMAccountName description
- 提取用户描述字段(可能包含敏感信息):
- 作用:利用描述字段中的信息(如临时密码、部门)进行钓鱼攻击。
五、注意事项与防御建议
5.1 注意事项
- 权限要求:确认目标是否允许匿名访问(如 Null Session),或准备有效凭据。
- 端口可达性:检查 389(LDAP)、445(SMB)、135(RPC)等端口是否开放。
- 执行策略:PowerShell 脚本可能需绕过执行策略(
-ep bypass)。 - 日志监控:枚举操作可能触发安全警报(如 Microsoft Defender for Identity),需低调操作。
- 法律合规:确保获得授权,遵守道德和法律规范。
5.2 防御建议
- 禁用匿名访问:关闭 LDAP 和 SMB 的匿名绑定(默认已禁用)。
- 限制用户查询:调整 AD 权限,限制普通用户对敏感组(如 Domain Admins)的查询。
- 监控日志:启用事件 ID 4688(进程创建)和 4104(PowerShell 脚本块日志)。
- 密码策略:强制复杂密码,防止密码喷洒。
- 工具检测:部署 EDR(如 Defender ATP)检测 Mimikatz、BloodHound 等工具。
六、总结
AD 用户枚举是渗透测试的关键步骤,通过 ldapsearch、rpcclient、netexec、Get-ADUser、PowerView 和 BloodHound 等工具,可高效收集用户名、组成员关系和账户属性。不同工具适用于不同场景:ldapsearch 适合跨平台精确查询,rpcclient 和 netexec 快速枚举,PowerView 和 BloodHound 提供深入分析。渗透测试人员应根据目标环境选择合适工具,结合密码喷洒、ASREPRoast 等技术推进攻击。同时,防御者需加强 AD 配置和监控,减少枚举风险。本文提供了全面的命令和优化建议,助力安全从业者在 AD 渗透测试中更高效地工作。
原文 https://blog.csdn.net/2301_79518550/article/details/146537168