AD域应急-LDAP枚举行为狩猎

AD域应急-LDAP枚举行为狩猎

在 Active Directory 域环境中,LDAP 是一个再正常不过的存在。无论是用户登录、计算机加入域,还是服务账户访问资源,底层几乎都绕不开 LDAP 查询。从运维视角看,这是“基础设施的必要操作”;但从攻击者视角看,LDAP 则是快速摸清整个域环境结构的捷径。

在多起真实的域渗透事件中,LDAP 枚举几乎都是攻击链的早期阶段。攻击者在拿到一个普通域用户权限后,第一件事往往不是横向,而是尽可能全面地理解域结构

  • 有哪些用户?
  • 有哪些计算机?
  • 哪些账号具备高权限?
  • 权限之间的依赖关系是什么?

而这正是 BloodHound 存在的意义。

BloodHound是什么?

BloodHound 是一个专门用于分析 Active Directory 权限关系的攻击路径分析工具


它的核心价值不在于“入侵”,而在于把域内复杂、隐蔽的权限关系用图的方式彻底摊开,让攻击者或防守方一眼看清:

从一个普通域用户,究竟能不能、以及如何一步步走到域管理员。

在真实的 AD 环境里,权限并不是简单的“是不是域管”。真正危险的,往往是下面这些隐性关系

  • 某个普通用户对某台服务器有 本地管理员权限
  • 某台服务器上跑着 域管理员登录过的会话
  • 某个账号对关键用户/组对象有 ACL 写权限
  • 某个服务账号配置了 不安全的委派(Delegation)

这些关系单独看都不致命,但一旦串起来,就可能形成一条完整的提权路径。BloodHound 的作用,就是把这些“可以被串起来的关系”全部找出来,并自动帮你算路径。

为什么攻击者需要 LDAP 枚举

BloodHound 本身并不“入侵”系统,它的价值在于情报整合。通过其采集器 SharpHound,攻击者可以在极短时间内对域内进行大规模 LDAP 查询,收集包括用户、计算机、组、ACL、委派关系等大量信息。

这些数据随后会被导入到 Neo4j 数据库中,生成一张逻辑关系图。攻击者不再需要凭经验去猜“谁可能是域管”,而是可以直接看到从当前账号到高权限目标的最短路径

从应急响应的角度来看,这一步往往意味着:
攻击者已经不再试探,而是在系统性规划下一步行动。

SharpHound 在域内的实际行为

在我的演示环境中,SharpHound 是在一个普通域用户 user001 的上下文中运行的。执行完成后,可以看到枚举过程非常迅速,几乎在几分钟内完成了大量查询。

这里我是在kali上部署bloodhound,和AD域在同一个环境,就直接通过bloodhound-python快速进行信息收集,代替使用 SharpHound.exe 和 SharpHound.ps1 在Windows域内主机上运行。

运行完成后再当前目前下会生成对应的压缩包,在bloodhound界面右侧点击上传数据,选择对应的压缩包上传,然后点击analysis就能看到分析结果。

也可以手动在目标机器上执行SharpHound.exe,。这类行为在终端上看起来既没有 Exploit,也没有权限提升,甚至没有明显的异常进程行为。但在域控侧,却已经留下了足够多的痕迹。

为什么 LDAP 枚举这么难检测?

我在刚接触 AD 安全时就思考过一个问题:
既然攻击者在疯狂查询 LDAP,为什么不能直接把所有 LDAP 查询都记录下来?

答案很现实:性能撑不住

LDAP 是 AD 的核心功能。如果对每一个对象访问都开启审计,一个普通用户登录都可能产生五六条事件。在一个成百上千用户的企业环境中,这样的日志量会直接拖垮域控。

正因为如此,对象访问审计在 AD 中默认是关闭的,而攻击者正是利用了这一点,在“合法流量”中完成枚举。

在默认情况下,执行SharpHound.exe进行大量ldap查询,在域控上筛选4662也只能看到非常少的日志,无法判断是否异常。

防守视角下的关键突破口:Canary 对象

既然不能全量审计,那就只能“有选择地监听”。

在实际防御中,一个非常有效的思路是使用 Canary 对象

  • 创建一些看起来完全正常,但实际上不会被任何业务使用的用户、计算机或组
  • 让它们自然地“混”在 AD 环境中
  • 只对这些对象开启对象访问审计

正常情况下,没有任何理由去频繁查询这些对象。一旦攻击者运行 BloodHound 这类自动化工具,这些 Canary 对象几乎一定会被一起枚举到,从而触发日志。

这种方式的优势在于:

  • 不影响域整体性能
  • 审计目标非常明确
  • 误报率极低

在大型环境中,Canary 对象的数量往往是“越多越好”,这样可以显著提升检测命中率。

批量创建 Canary 对象

我写了一个 Deploy-CanaryObjects.ps1 的脚本用于批量创建。

https://zgao.top/download/Deploy-CanaryObjects.ps1

  # 部署 Canary 对象(创建 + 配置审计)
  .\Deploy-CanaryObjects.ps1

  # 自定义密码
  .\Deploy-CanaryObjects.ps1 -Password "YourP@ssw0rd!"

  # 只创建对象,跳过 SACL 配置
  .\Deploy-CanaryObjects.ps1 -SkipSACL

  # 删除所有 Canary 对象
  .\Deploy-CanaryObjects.ps1 -RemoveAll

脚本功能如下:

功能说明
创建用户10个伪装成服务账户/管理员的用户
创建计算机8个伪装成工作站/服务器的计算机
创建组8个伪装成高权限组的安全组
SACL配置自动为所有对象配置 ReadProperty 审计
审计策略检查自动检测 DS Access 审计是否启用
一键清理-RemoveAll 参数快速清理所有对象

关键日志:Event ID 4662

配置完成后再次运行SharpHound.exe。

在 Windows 安全日志中,与 LDAP 对象访问直接相关的事件是 4662

在本文的演示环境中,可以清晰地看到:

  • 发起查询的用户是 User001
  • 被查询的对象是事先布置好的 Canary 用户(例如 “VPN_FullAccess”)
  • 同一个对象在极短时间内被执行了多种访问操作

随后,还能看到同一用户在几乎相同的时间点,枚举了多个 Canary 计算机对象 。

从时间维度来看,这些事件之间几乎没有间隔。这一点在应急响应中非常关键,因为人工操作几乎不可能在如此短时间内完成如此多的查询

如何在真实AD环境中判断攻击行为?

在分析 LDAP 相关日志时,可以重点关注以下几个维度:

  • 重点关注 Event ID 4662
  • 同一用户
  • 在极短时间内
  • 对多个对象发起访问

如果这三个条件同时成立,基本可以判定为一次自动化 LDAP 枚举行为。在真实企业环境中,如果部署了足够数量的 Canary 对象,这种行为会非常“显眼”。

LDAP 枚举防御思路

从应急响应的角度来看,LDAP 枚举并不意味着“已经失陷”,但它几乎总是高危攻击链的前奏

一旦确认存在此类行为,建议立刻:

  • 评估该账号是否存在权限滥用风险
  • 排查是否有后续横向、提权或凭据窃取行为
  • 结合终端日志、网络流量进一步还原攻击路径

在防御层面,核心思路并不是“阻止 LDAP”,而是:

  • 限制低权限账号的枚举能力
  • 通过 Canary 对象提升可见性
  • 在攻击者真正动手前感知威胁
赞赏

微信赞赏支付宝赞赏

Zgao

愿有一日,安全圈的师傅们都能用上Zgao写的工具。

发表评论