// 红队渗透 · 2025-03-30

AD域渗透之用户枚举技术全解析

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):提取用户名。
  • 输出:
    • 每行一个用户名,例如:
      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]
  • 角色要求:
    • 匿名访问:需域控制器允许 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

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

三、命令对比与选择

以下是上述命令的对比,基于协议、输出、权限要求和适用场景。

命令/工具 协议 输出信息 权限要求 优点 缺点 适用场景
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 哈希。

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