域渗透工具实战:BloodHound 攻击路径可视化

📅 2026/8/23 19:38:01
域渗透工具实战:BloodHound 攻击路径可视化
序言在黑暗迷宫中点亮火把对于攻击者而言拿下一个普通域用户权限只是开始。面对动辄上万用户、几千台机器、错综复杂的权限继承和组嵌套关系如何找到一条通往 Domain Admins 的道路早期我们只能靠BloodHound出现前的那些老古董一遍遍运行net user /domain、net group /domain手动在记事本里画关系图或者用 PowerSploit 的Invoke-ACLScanner漫无目的地扫描。这种方式不仅效率极低而且如同盲人摸象极容易错过隐藏在深层嵌套中的致命攻击路径。对于防守者而言同样痛苦。域管理员设置了层层权限自以为铜墙铁壁但往往一个几年前为了方便运维而配置的“普通用户可读取 GPO”策略就可能在逻辑上撕开一个致命的口子。这些逻辑上的漏洞传统的漏扫工具扫不出来杀软也不报毒。直到 2016 年一个名叫BloodHound的工具横空出世。它不是扫描器不是漏洞利用工具它是一个“关系图谱分析器”。它用图论的理念把 AD 中的人、机器、组、策略抽象成了节点把权限关系抽象成了边然后通过可视化的方式把整个迷宫的地下通道赤裸裸地展示在你面前。如果说前面的章节我们讲的是“如何打造利刃”那么今天我们要讲的是“如何获得上帝视角”。今天我们将深入实战看看 BloodHound 是如何彻底改变了内网渗透的游戏规则。第一章迷宫的骨架——BloodHound 的图论逻辑要驾驭 BloodHound必须先理解它的底层逻辑。它不关心你的密码有多长不关心你打了什么补丁它只关心“谁能对谁做什么”。1.1 节点迷宫中的实体在 BloodHound 的世界中AD 里的所有东西都是节点。主要分为四大类用户包括普通用户、服务账户、管理员。计算机域内的每一台机器包括工作站、服务器、域控。组安全组如 Domain Admins、HR 组等。GPO (组策略对象)应用于域内机器的策略。此外还有 OU (组织单位)、域等节点。每一个节点都有属性比如用户是否启用了 Kerberos 预认证、计算机是否开启了 LDAP 签名等。1.2 边隐秘的地下通道如果说节点是迷宫里的房间那么“边”就是连接房间的通道。BloodHound 的核心灵魂就在于它定义了上百种“边”即权限关系。最常见且致命的边包括MemberOf (属于)用户 A 属于组 B。AdminTo (管理员)用户 A 是计算机 C 的本地管理员。HasSession (会话)用户 A 当前登录在计算机 C 上。这是 BloodHound 最核心的情报。GenericAll (完全控制)用户 A 对用户 B 拥有完全控制权限可以重置密码。WriteDacl (写 DACL)用户 A 可以修改用户 B 的权限。GetChanges (复制变更)用户 A 拥有复制目录更改的权限可执行 DCSync。AllowedToDelegate (允许委派)用户 A 配置了 Kerberos 委派。1.3 攻击路径从 A 到 B 的图论推导BloodHound 使用的数据库是开源的 Neo4j 图形数据库。它通过收集到的 LDAP 数据和 SMB 会话数据构建出一张庞大的有向图。当攻击者在 BloodHound 界面选中一个普通用户起点并右键选择 “Shortest Path to Domain Admins” 时BloodHound 实际上是在执行一个复杂的图论算法如 Dijkstra 算法或广度优先搜索 BFS在几百万个节点和边中寻找一条从起点连通到目标组Domain Admins的最短路径。这条路径就是红队在内网中的“作战计划图”。第二章狩猎数据采集——SharpHound 的实战运用上帝视角不是凭空而来的需要有人去实地测绘。在 BloodHound 体系中负责采集数据的就是SharpHound。它是 BloodHound 收割器的 C# 重写版也是目前唯一推荐的采集工具。2.1 为什么是 SharpHound早期的 PowerShell 版本采集器由于无文件落地执行和 AMSI 的普及已经被各大 EDR 盯死。SharpHound 使用 C# 编写可以编译为 EXE 或 DLL甚至可以通过托管内存加载执行。它的查询效率极高且对网络流量的控制做得很好。2.2 采集策略不同场景下的兵器谱SharpHound 的采集并不是无脑的All。在实战中不同的采集方法对应着不同的动静大小和情报深度。# 最常用默认采集组成员、用户、计算机基础信息、本地管理员、会话 SharpHound.exe -c CollectionMethod Default # 只采集当前登录会话极其隐蔽只查会话适合快速定位 SharpHound.exe -c Session --sessionloop # 全量采集包含 ACL、GPO、Trust等动静最大时间最长 SharpHound.exe -c All实战场景一刚拿下立足点权限受限假设你通过钓鱼拿下一台普通办公电脑的本地普通用户权限没有域管权限。此时你无法直接查所有机器的会话。你应该先用Default方法拉取 LDAP 基础信息用户、计算机、组这在域内是任何域用户都可以做的。使用Session方法但只针对你当前能访问的网段或高价值目标进行循环探测。实战场景二拿到域管或高权限快速测绘如果你运气好一开始就拿到了一个域管账号的哈希你可以直接全量采集但要注意全量采集会向域内所有存活机器可能几千台发起 RPC 和 SMB 请求这会引发剧烈的网络流量和日志告警。红队老手的做法是分批、限速。使用--randomizemethod和--throttle参数控制采集节奏打时间差。2.3 会话采集的底层逻辑为什么它如此重要BloodHound 中最有价值的边是HasSession。为什么因为你可能拥有对某台高权限服务器的管理权限但如果上面没有高权限用户的凭证你也无法横向移动。反过来如果域管登录在某台普通工作站上只要你拿下了那台工作站就能抓到域管的凭证。SharpHound 获取会话的原理是通过调用 Windows 的NetSessionEnumAPI。它会询问域内的所有机器“现在有哪些用户登录在你上面”但这有一个坑NetSessionEnum返回的往往是网络会话如映射网络驱动器产生的会话而不是本地交互登录会话。为了更精准SharpHound 还会通过 RPC 调用远程注册表的HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters等手段或者直接查机器上的explorer.exe进程所有者来补全会话数据。2.4 避坑指南采集器常见问题DNS 解析失败内网机器如果不配 DNS 后缀可能导致 NetBIOS 名无法解析为 FQDNSharpHound 会报错。解决办法确保运行环境正确配置了域 DNS。防火墙拦截很多核心服务器只允许特定网段访问 445/RPC 端口。如果 SharpHound 连不上就拿不到会话。这时候需要通过跳板机进行内网代理采集。超大数据量域内几万节点时生成的 ZIP 文件可能上百 MB。直接导入 BloodHound 会导致浏览器崩溃。建议在导入前在 Neo4j 中增加内存配置。第三章图穷匕见——在 BloodHound 中解读攻击路径数据导入 Neo4j 后打开 BloodHound 的 Web 界面那种视觉冲击力是震撼的。爆炸般的节点图往往让新手眼花缭乱。但这不是艺术品这是作战地图。3.1 预置查询一键解锁夺权之路BloodHound 最友好的地方在于左上角那一排预置查询。它们是红队最常用的杀手锏Find Shortest Path to Domain Admins从当前选定的起点寻找通往域管的最短路径。这是最常用的一击必杀。Find All Domain Admins列出域内所有的域管账户及其登录位置。这用于防守方清理“孤儿域管”也用于攻击方快速定位首要打击目标。Find Workstations where Domain Admins are logged in域管登录在了哪些普通工作站上这是典型的“降维打击”路径。Find Principals with DCSync Rights谁拥有 DCSync 权限不一定是域管很多时候是配置失误的备份服务账户。3.2 路径解剖一条真实的攻击链让我们看一条在实战中经常出现的、让人拍案叫绝的路径起点普通域用户zhangsan你通过钓鱼控制终点Domain Admins 组路径如下zhangsanMemberOfIT_Helpdesk组。IT_Helpdesk组AdminToEXCHANGE-SRV计算机。EXCHANGE-SRV计算机HasSessionsvc_exchange用户Exchange 服务账户。svc_exchange用户WriteDaclDomain Admins组。红队视角的战术拆解第一步你只是张三但你属于外包 IT 运维组。这在大型企业很常见。第二步IT 运维组为了方便管理邮件服务器被设为了EXCHANGE-SRV的本地管理员。这意味着你可以通过 PSEXEC 或 WMI 登录到 Exchange 服务器上获得 System 权限。第三步在 Exchange 服务器上由于业务需要服务账户svc_exchange正在运行。它的凭证明文密码或 NTLM Hash正舒舒服服地躺在服务器的 LSASS 内存里。你只要用 Mimikatz 或 Procdump 抓取一下就拿到了svc_exchange的凭证。第四步这是致命一击。为什么svc_exchange能修改 Domain Admins 的权限因为很多企业在配置 Exchange 时为了让服务账户能管理某些特权组邮箱赋予了它 WriteDacl 权限。拿到这个权限后你可以直接给自己加上 Domain Admins 组的成员身份无需破解任何密码瞬间成神。这条路径在传统的漏扫工具里是扫不出来的因为每一步都符合系统逻辑。但把它们串联起来就是一条完美的夺权链。这就是 BloodHound 的价值所在。3.3 节点属性挖掘隐藏的宝藏除了看线还要看节点。在 BloodHound 中点击任何一个用户节点右侧会显示其属性。重点关注Allow Kerberos Constraint Delegation配置了约束委派。意味着你可以冒充其他用户访问特定服务。DoesNotRequirePreAuth开启了 AS-REP Roasting 的标志。Unconstrained Delegation非约束委派。如果这台机器上有域管登录过你可以直接抓取域管 TGT。Last Logon很久没登录的账户可能是废弃账户但往往拥有遗留的高权限。第四章高阶图论——自定义查询与高级滥用预置查询只能解决 80% 的问题。真正的红队老手会通过编写Cypher 查询语句Neo4j 的查询语言挖掘那些深埋在地下的暗河。4.1 Cypher 语言初探Cypher 语法使用圆括号表示节点方括号表示边类似 ASCII 艺术MATCH (n:User) RETURN n这表示匹配所有类型为 User 的节点并返回。如果我们要查一个用户拥有完全控制权限的目标MATCH (u:User {name:CORP\\zhangsan})-[:GenericAll]-(t) RETURN t4.2 实战高阶查询寻找隐藏的 DCSync 权限者很多时候我们不找最短路径我们找“特权滥用”。比如除了 Domain Admins域内还有谁可以执行 DCSync在 AD 中DCSync 的本质是拥有DS-Replication-Get-Changes和DS-Replication-Get-Changes-All权限。在 BloodHound 中这对应着GetChanges和GetChangesAll边。自定义查询语句MATCH (n1)-[:GetChanges]-(d:Domain) MATCH (n1)-[:GetChangesAll]-(d) WHERE NOT n1.name CONTAINS ADMINISTRATOR RETURN n1这段话的意思是寻找那些同时拥有对域对象 GetChanges 和 GetChangesAll 权限且名字里不包含 Administrator 的节点。实战中这个查询往往会帮你揪出一些年久失修的备份软件服务账户。它们平时不显山不露水却握着整个域的命脉。4.3 委派攻击的视觉化Kerberos 委派一直是 AD 攻防的重灾区。BloodHound 对委派的展示极其直观。对于非约束委派你可以查MATCH (c:Computer {unconstraineddelegation:true}) RETURN c这会列出所有配置了非约束委派的机器。如果在这些机器上能拿到 SYSTEM 权限那么一旦域管登录这台机器你就可以通过等待域管发来的 TGT直接拿走并复用实现权限提升。对于基于资源的约束委派RBCDBloodHound 的展示更为精妙。如果一个用户拥有对某台计算机的WriteAccountRestrictions权限BloodHound 会画一条AllowedToAct的边如果是已配置的或者标明其具备配置 RBCD 的资格。你可以查询MATCH (u:User)-[:GenericAll|WriteDacl|WriteAccountRestrictions]-(c:Computer) RETURN u, c这能帮你找到哪些普通用户可以控制哪些机器的委派配置从而通过添加机器账户并配置 RBCD以管理员身份登录目标机器。4.4 GPO 滥用从策略到夺权很多人忽视了 GPO 的攻击面。BloodHound 会将 GPO 视为节点并画出GPLink的边。如果 BloodHound 显示某个普通用户对某个 GPO 拥有WriteDacl或GenericAll权限且这个 GPO 应用于所有的域控。那么攻击者可以修改这个 GPO添加一个“立即执行计划任务”的策略内容是把自己的账户加入域控的本地管理员组。等待 90 分钟默认 GPO 刷新周期全网的域控就都是你的了。这在视觉上呈现为用户 - WriteDacl - GPO - GPLink - Domain Controllers。第五章蓝队的反击——防御性 BloodHound 与攻击面收缩BloodHound 绝非红队的专属。当蓝队掌握了这个工具它就变成了攻击面管理的利器。事实上微软自己的内部安全团队也在大量使用 BloodHound 进行权限审计。5.1 蓝队的第一步把图拉出来清理“Tier 0 污染”Tier 模型是微软推崇的分层防御模型。Tier 0 就是域控和最核心的资产。任何在 Tier 0 拥有关键权限的账户都不应该出现在 Tier 1/2普通服务器和办公区。蓝队拿到 BloodHound 后第一件事就是运行预置查询Find Shortest Path to Domain Admins from Non-Admins。如果这条路径很短例如只有 3 跳说明你的域环境非常脆弱。重点关注的清理方向清理域管会话运行Find Workstations where Domain Admins are logged in。如果发现域管登录在普通办公电脑上必须立刻清理。域管账户只能用于登录域控绝不能用于日常办公。收敛本地管理员权限很多时候为了方便IT 把一个组设为了所有机器的本地管理员。这意味着拿下一个员工就等于拿下了全网机器。使用 LAPS本地管理员密码解决方案或 Microsoft Intune 进行密码轮换和权限隔离。清理孤儿权限A 离职了A 的账户被禁用。但如果 A 之前是某个高权限组的成员或者 A 对某台关键服务器有 GenericAll 权限这些权限是否被清理了在 BloodHound 中搜索禁用账户的高权限边往往能发现一堆历史遗留问题。5.2 防御性图论寻找路径切断点蓝队不仅要看“路径是否存在”还要思考“如何切断路径”。这叫“图的最小割”。假设路径是UserA - AdminTo - ComputerB - HasSession - DomainAdmin。切断这条路径有两个选择节点层撤销 UserA 对 ComputerB 的本地管理员权限。边层禁止 DomainAdmin 账户登录 ComputerB。在实战中往往切断边层更可行因为业务需要 UserA 管理 ComputerB。这时限制高权限账户的登录范围通过“拒绝本地登录”组策略就是最有效的防御。5.3 监控与告警让 BloodHound 的采集无所遁形红队跑 SharpHound必然留下痕迹。蓝队可以通过这些痕迹进行告警LDAP 查询异常SharpHound 会发送大量的 LDAP 查询特别是查询((objectCategoryperson)(objectClassuser)(samAccountType805306368)(!(UserAccountControl:1.2.840.113556.1.4.803:2)))这种长字符串。在域控上部署 LDAP 查询监控策略一旦发现短时间内来自单一 IP 的高频复杂 LDAP 查询立即告警。SMB 会话枚举Event ID 5140/5145SharpHound 调用NetSessionEnum会触发网络共享相关的日志。如果一台机器突然向域内几百台机器发起 IPC$ 连接并查询会话这绝对是异常行为。SharpHound 特征SharpHound 生成的 ZIP 包里包含特定的文件名如computers.json、users.json。在流量层部署文件特征嗅探或者在 EDR 中配置内存特征扫描可以发现正在运行的采集器。5.4 防御性 BloodHound 的演进AH现在BloodHound 的商业版本 Attack Path Management (APM) 已经演变为一个企业级的防御工具。它不再需要手动跑采集器而是通过部署在域控上的只读传感器实时同步数据并在后台持续计算攻击路径。这意味着蓝队不再是定期跑一次图而是随时掌握域内权限的微小变动实现真正的“持续攻击面管理”。第六章结语——当黑暗森林被照亮从 Kerberoasting 的哈希烘烤到黄金票据的信任伪造再到 NTLM 中继的劫持我们一路走来讲的都是协议底层的漏洞与利用。但今天BloodHound 讲的是另一个故事在系统逻辑都正常的情况下复杂的权限关系本身就是最大的漏洞。大型企业的 AD 域就像一座古老的城市。几百年来为了业务需要不断修建新的桥梁、开辟新的暗道。管理员往往只记得“这条路能让我快速到达目标”却忘记了“这条路也能让小偷快速进入金库”。BloodHound 的伟大之处在于它把这座城市的地下管网完整地测绘出来并在墙上投影让所有人都能看到那些本不该存在的捷径。对于红队BloodHound 是规划进攻路线的上帝视角对于蓝队它是清理历史债务的手术刀。