BloodHound CE实战:从零部署到AD域攻击路径深度分析 1. 项目概述为什么我们需要BloodHound如果你是一名负责企业内网安全的工程师或者是一名对Active DirectoryAD域安全感兴趣的研究者那么你一定对“攻击路径”这个概念不陌生。想象一下一个庞大的企业内部网络就像一座结构复杂的城堡AD域就是这座城堡的钥匙管理系统。理论上只有国王域管理员拥有所有房间的钥匙。但现实中由于多年运维积累的配置、为了便利性而做出的权限妥协、以及人员变动留下的历史遗留问题城堡里可能散落着许多把可以打开关键房间的“备用钥匙”。攻击者一旦拿到其中一把比如一个普通员工的账户就可能通过一系列权限传递和关系跳转最终拿到国王的钥匙。这个过程就是攻击路径。手动梳理这些路径几乎是不可能的因为AD域中的对象用户、计算机、组动辄成千上万它们之间的权限关系谁可以登录哪台电脑、哪个组有什么权限更是错综复杂。这就是BloodHound存在的意义。它不是一个实时入侵检测工具而是一个“离线地图绘制器”和“路径分析引擎”。它的核心工作流程是先通过一个轻量级的采集器SharpHound像侦察兵一样潜入你的AD环境悄无声息地收集所有对象和关系数据然后将这些数据导入到一个图形数据库Neo4j中最后通过BloodHound的Web界面你可以像查看谷歌地图一样直观地查询“从用户A到域管理员有哪些路可以走”并清晰地看到每一条路径上的关键节点和权限关系。这次我们要部署的BloodHound Community Edition (CE)是官方维护的免费开源版本。相较于需要商业许可的Enterprise EditionCE版已经包含了最核心的路径发现、查询和可视化功能对于绝大多数安全评估、红队演练和蓝队防御分析来说已经完全够用。它能帮你回答几个关键问题我们内网中最脆弱的用户是谁攻击者最可能利用哪条路径实现权限提升哪些配置是亟待修复的高危项接下来我就以一个实战者的角度带你从零开始部署、使用并深度理解BloodHound CE让你也能为自己的“城堡”绘制一份精准的防御地图。2. 环境准备与架构解析部署BloodHound CE本质上是在搭建一个由三个核心组件构成的微服务应用。理解这个架构能帮助你在部署和后续排错时心中有数。2.1 核心组件与选型考量整个系统由三部分组成Neo4j 图形数据库这是整个系统的“大脑”和数据存储中心。AD域中所有的用户、计算机、组都被抽象为“节点”它们之间的成员关系、权限授予、会话登录等被抽象为“边”。Neo4j专门为存储和查询这种图数据而优化BloodHound所有复杂的路径查询都是通过Cypher查询语言在Neo4j中完成的。为什么选Neo4j因为BloodHound的数据模型天生就是图结构关系型数据库如MySQL处理多跳查询效率极低而Neo4j对此是原生支持性能上有数量级的优势。BloodHound 前端界面这是一个基于Electron的桌面应用程序或通过Docker运行的Web服务提供用户交互界面。你将在这里输入查询、查看可视化图谱、分析攻击路径。它本身不存储数据只是一个与Neo4j数据库通信的客户端。SharpHound 数据采集器这是一个用C#编写的命令行工具需要在目标AD域环境中的一台已加入域的Windows主机上执行。它的作用是调用AD的API收集所有必要的安全数据并输出为JSON文件。社区版通常使用SharpHound.ps1PowerShell脚本或SharpHound.exe可执行文件。部署环境选择对于测试和学习我强烈推荐使用一台独立的Linux服务器如Ubuntu 22.04 LTS来承载Neo4j和BloodHound前端。这能避免与你的工作环境冲突。Windows当然也可以但Linux在资源消耗和长期运行的稳定性上通常更有优势。我的实操环境是一台4核CPU、8GB内存、100GB硬盘的云服务器这个配置对于分析中等规模数千个对象的AD域已经绰绰有余。2.2 基础环境搭建假设我们在一台全新的Ubuntu 22.04服务器上开始。首先通过SSH连接到服务器进行基础准备。# 更新系统包列表 sudo apt update sudo apt upgrade -y # 安装一些必要的工具如curl、wget、gnupg等 sudo apt install -y curl wget software-properties-common apt-transport-https ca-certificates gnupg lsb-release接下来是安装Docker和Docker Compose。BloodHound社区提供了官方的Docker镜像用容器化方式部署是最简单、最干净的方法能避免复杂的依赖和环境冲突。# 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 添加Docker仓库 echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装Docker引擎 sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io # 安装Docker Compose插件新版本Docker已集成compose插件 sudo apt install -y docker-compose-plugin # 验证安装 docker --version docker compose version注意如果你之前安装过旧版的docker-compose一个独立的Python工具建议卸载它sudo apt remove docker-compose使用新的docker compose插件命令两者命令格式略有不同旧版是docker-compose新版是docker compose本文后续将使用新版命令。为了让当前用户无需sudo即可运行docker命令需要将用户加入docker组。sudo usermod -aG docker $USER重要执行此命令后你需要完全退出当前SSH会话并重新登录才能使组权限生效。你可以直接断开连接然后重新SSH登录服务器。3. 使用Docker Compose一键部署手动分别启动Neo4j和BloodHound容器并配置它们之间的网络连接比较繁琐。最佳实践是使用Docker Compose通过一个YAML配置文件定义和管理多容器应用。下面是我调整和验证过的一个docker-compose.yml配置。首先在服务器上创建一个专用目录比如~/bloodhound-ce然后进入该目录创建配置文件。mkdir ~/bloodhound-ce cd ~/bloodhound-ce nano docker-compose.yml将以下内容粘贴进去。这份配置做了几件关键事定义了两个服务neo4j和bloodhound。为Neo4j设置了默认密码bloodhoundcommunity并映射数据卷到本地确保数据持久化。将BloodHound的Web界面映射到服务器的7474端口Neo4j浏览器和7687端口Bolt协议以及8080端口BloodHound UI。使用depends_on确保BloodHound容器在Neo4j之后启动。使用了官方的最新社区版镜像。version: 3.8 services: neo4j: image: neo4j:5-community container_name: bloodhound-neo4j restart: unless-stopped environment: - NEO4J_AUTHneo4j/bloodhoundcommunity # 格式为用户名/密码 - NEO4J_PLUGINS[apoc] # 安装APOC插件用于高级图算法 ports: - 7474:7474 # Neo4j浏览器 HTTP - 7687:7687 # Neo4j Bolt协议 volumes: - neo4j_data:/data - neo4j_logs:/logs - neo4j_import:/var/lib/neo4j/import - neo4j_plugins:/plugins healthcheck: test: [CMD-SHELL, wget --no-verbose --tries1 --spider http://localhost:7474 || exit 1] interval: 10s timeout: 5s retries: 5 bloodhound: image: bloodhoundcommunity/bloodhound:latest container_name: bloodhound-ui restart: unless-stopped depends_on: neo4j: condition: service_healthy environment: - NEO4J_URLbolt://neo4j:7687 - NEO4J_USERneo4j - NEO4J_PASSWORDbloodhoundcommunity ports: - 8080:8080 volumes: - bloodhound_data:/data volumes: neo4j_data: neo4j_logs: neo4j_import: neo4j_plugins: bloodhound_data:保存并退出编辑器在nano中按CtrlX然后按Y再按Enter。现在在docker-compose.yml文件所在的目录下运行以下命令启动所有服务docker compose up -d-d参数代表“detached”让容器在后台运行。你会看到Docker开始拉取镜像并启动容器。使用以下命令查看状态docker compose ps如果一切正常你应该看到两个容器的状态都是“Up”。现在你可以通过浏览器访问了BloodHound UI:http://你的服务器IP:8080Neo4j Browser (可选):http://你的服务器IP:7474(用户名:neo4j, 密码:bloodhoundcommunity)首次访问BloodHound UI (:8080)它会提示你输入数据库连接信息。因为我们在Docker Compose中已经通过环境变量配置好了所以UI通常会自动填充并连接。如果遇到连接问题检查neo4j容器的健康状态是否正常。实操心得在生产环境或更安全的测试环境中务必修改默认密码。你可以在docker-compose.yml的NEO4J_AUTH环境变量中设置一个强密码。同时考虑使用.env文件来管理密码避免将敏感信息硬编码在YAML文件中。例如创建一个.env文件内容为NEO4J_PASSWORDYourStrongPassword123!然后在docker-compose.yml中用${NEO4J_PASSWORD}引用。4. 数据采集SharpHound实战指南部署好BloodHound服务器只是准备好了“地图板”现在需要去“城堡”里收集数据。这就是SharpHound的职责。你需要在目标AD域内的一台Windows主机上运行它。这台主机最好是一台普通的域成员工作站或服务器拥有一个域用户权限即可开始基础收集。4.1 获取与执行SharpHoundSharpHound是BloodHound项目的一部分其最新版本通常与BloodHound UI同步发布。最安全的获取方式是从官方GitHub仓库的Release页面下载。下载访问 BloodHound GitHub Releases 。找到最新的版本在“Assets”下拉列表中你会找到SharpHound.ps1(PowerShell脚本) 和SharpHound.exe(可执行文件)。我通常更喜欢.ps1脚本因为它更灵活且便于在内存中执行避免接触磁盘。传输将下载的SharpHound.ps1通过你认为安全的方式传输到目标Windows主机上。可以是USB也可以是经过加密的网络传输。执行在目标主机上打开一个具有域用户权限的PowerShell窗口最好以管理员身份运行以便收集本地管理员组等信息但非管理员也能收集大量数据。首次在目标机器上运行PowerShell脚本可能需要修改执行策略。你可以使用以下命令它只对当前会话生效不会永久改变系统设置powershell -ExecutionPolicy Bypass然后进入脚本所在目录运行最基本的收集命令.\SharpHound.ps1 -CollectionMethod All --ZipFilename mydomain_collection.zip-CollectionMethod All这是最全面的收集方式包括会话谁登录了哪些机器、本地组、域信任、ACL访问控制列表、用户和计算机信息等。对于初次分析建议使用All。--ZipFilename指定输出压缩包的文件名。执行后SharpHound会开始扫描。时间长短取决于域的大小和网络状况从几分钟到几小时不等。完成后你会在当前目录下得到一个.zip文件如mydomain_collection.zip。4.2 采集方法深度解析与策略选择-CollectionMethod参数是SharpHound的灵魂理解每个选项能让你在特定场景下更高效、更隐蔽地收集数据。Session收集域内所有计算机上的活动用户会话。这是发现“用户A在计算机B上登录”关系的关键。攻击者常利用此信息进行横向移动例如窃取用户A的令牌来访问计算机B。LoggedOn收集哪些用户曾经登录过哪些计算机包括缓存的凭据。这比Session的范围更广。Group收集所有域组、本地组的成员关系。这是权限传递链条中最基础的一环。LocalGroup专门收集本地管理员组如Administrators的成员。这是发现“本地管理员权限滥用”导致权限提升的关键。ComputerOnly / DCOnly仅收集计算机或域控制器的信息。用于快速枚举资产。Trusts收集域之间的信任关系。在多域森林环境中至关重要。ACL收集所有AD对象用户、组、计算机、OU等上的访问控制列表。这是BloodHound最强大的部分之一能揭示出诸如“一个普通用户拥有重置另一个用户密码的权限”这类隐蔽的高危路径。RDP / DCOM / PSRemote收集哪些用户或组拥有通过RDP、DCOM、PowerShell远程登录到计算机的权限。这是横向移动的直接通道。Container收集组织单元OU的嵌套关系影响组策略的继承。实战策略建议初次全面评估使用-CollectionMethod All。这是黄金标准。隐蔽性红队操作避免一次性大规模收集引发告警。可以分阶段进行先运行-CollectionMethod Group, Trusts快速摸清结构。再针对关键用户或组使用-CollectionMethod Session, LoggedOn, ACL进行针对性收集。使用-Loop和-LoopDuration参数进行低带宽、长时间的慢速收集。蓝队自查可以在域控或管理服务器上定期如每周运行All收集监控攻击路径的变化。重要注意事项SharpHound的活动会在域控的安全日志事件ID 4662和终端的安全日志中留下痕迹。作为蓝队你可以通过这些日志监控是否有未经授权的数据收集行为。作为红队则需要考虑日志绕过或清理技术这属于高级话题需在授权测试范围内进行。此外确保你的行为获得了明确的授权未经授权的AD信息收集可能违反法律和公司政策。5. 数据导入与BloodHound界面初探采集到数据后我们需要将其导入到之前部署好的BloodHound系统中。上传数据将生成的.zip文件如mydomain_collection.zip从Windows主机传输到你的BloodHound服务器上。你可以使用SCP、SFTP或者任何安全的文件传输方式。我将它放在服务器的~/bloodhound-ce目录下。进入容器导入BloodHound的Docker容器内置了导入工具。我们需要进入bloodhound-ui容器内部执行导入命令。# 进入bloodhound容器内部 docker exec -it bloodhound-ui /bin/bash # 在容器内部假设你把zip文件放在了 /data 目录因为我们做了卷映射 # 你需要先将文件从宿主机复制到容器的/data目录。更简单的方法是在启动docker-compose时将宿主机目录映射到容器。 # 我们修改一下docker-compose.yml添加一个临时卷映射然后重启。 # 先退出容器 exit更优雅的方式是修改docker-compose.yml为bloodhound服务添加一个卷映射指向存放zip文件的宿主机目录。例如在bloodhound服务的volumes部分添加一行- /home/yourusername/bloodhound-ce/import:/import:ro。然后运行docker compose down docker compose up -d重启。假设我们已经映射了/import目录重新进入容器docker exec -it bloodhound-ui /bin/bash cd /import执行导入使用bloodhound命令导入数据。bloodhound --no-prompt -d neo4j -u neo4j -p bloodhoundcommunity -c All,LoggedOn -z mydomain_collection.zip--no-prompt: 非交互模式。-d: Neo4j数据库地址容器内通过服务名neo4j访问。-u/-p: 数据库用户名和密码。-c: 指定导入的收集类型通常与采集时一致或选择All。-z: 指定zip文件路径。导入过程会在终端显示进度。完成后退出容器 (exit)。登录界面现在打开浏览器访问http://服务器IP:8080。首次使用BloodHound可能会让你创建一个本地UI的用户这个用户只用于访问BloodHound Web界面与Neo4j数据库用户无关。创建后登录。登录成功后你会看到BloodHound的主界面。左侧是搜索和查询面板中间是巨大的可视化图谱区域右侧是节点/边的详细信息面板。一开始图谱是空的因为还没有执行任何查询。6. 核心攻击路径分析与可视化实战BloodHound的强大之处在于其预置的“查询”Queries功能。这些查询是经过精心设计的Cypher语句能一键揭示最常见的危险攻击路径。我们来看几个最经典、也最致命的路径分析。6.1 “最短路径到高价值目标” - 找到通往王座的钥匙这是BloodHound的招牌功能。在左侧查询面板找到“Find Shortest Paths to Domain Admins”找到到域管理员的最短路径并点击运行。发生了什么BloodHound会从你当前拥有凭据的所有起点在导入Session数据后它会知道哪些用户/计算机是你“已拥有的”出发在图数据库中寻找所有能到达“Domain Admins”组的路径并计算出其中最短的几条。结果会以图谱形式展示。如何解读图谱节点不同形状和颜色代表不同类型对象。例如用户是菱形计算机是正方形组是三角形。红色通常代表高权限组如Domain Admins, Enterprise Admins。边连线代表关系。线上有箭头和标签。MemberOf: 用户/组是另一个组的成员。这是最常见的权限继承方式。HasSession: 用户在某台计算机上有活动会话。这是横向移动的跳板。AdminTo: 用户/组是某台计算机的本地管理员。这意味着可以在该计算机上执行任意代码。CanRDP/CanPSRemote: 拥有远程登录权限。GenericAll/GenericWrite/WriteOwner/WriteDACL/ForceChangePassword: 这些都是ACL权限非常危险。例如ForceChangePassword意味着你可以重置某个用户的密码然后以他的身份登录。实战案例 假设图谱显示一条路径你的用户 - MemberOf - HelpDesk组 - AdminTo - 服务器SRV-01 - HasSession - 域管用户DA-User - MemberOf - Domain Admins。 这条路径解读为你属于HelpDesk组而HelpDesk组是服务器SRV-01的本地管理员。恰好一位域管理员DA-User当前正登录在SRV-01上。因此你可以登录SRV-01窃取DA-User的令牌或转储其凭据从而获得域管理员权限。这条路径清晰地指出了防御薄弱点不应将高权限组即使是HelpDesk直接设为关键服务器的本地管理员并且要严格控制域管理员登录非域控的机器。6.2 “拥有出站域信任的用户” - 跨域攻击的跳板在多域环境中信任关系是攻击者扩大战果的桥梁。运行查询“Find Principals with DCSync Rights”的变体或查看域信任关系。关键点DCSync攻击如果一个用户或组拥有复制域控密码哈希的权限Replicating Directory Changes和Replicating Directory Changes All攻击者就可以模拟域控同步所有用户的哈希这是极其危险的权限。BloodHound可以快速找出拥有此权限的非预期账户。跨域信任如果域A信任域B那么域B中的某些用户/组可能对域A有权限。攻击者在攻陷子域后往往会尝试利用信任关系攻击父域或同级域。BloodHound可以可视化这些跨域的攻击路径。6.3 “高价值目标的可达路径统计” - 风险评估量化除了看单条路径BloodHound还能提供统计数据。运行“Find High Value Targets”然后查看“Node Info”面板。如何利用BloodHound会标记出“高价值目标”如域管理员组、企业管理员组、架构管理员组等。点击某个高价值目标比如DOMAIN ADMINSDOMAIN.LOCAL右侧面板会显示关于这个组的大量信息。切换到“Outbound Control Rights”或“Inbound Control Rights”标签页。这里会列出有多少条不同的路径可以控制这个对象以及有多少个不同的起始点可以到达这里。这个数字是衡量该目标脆弱性的关键指标。数字越大风险越高。进一步你可以点击“展开”按钮逐条查看这些路径定位到具体的源头比如是哪个普通用户通过哪台机器、利用哪个ACL权限最终能控制域管理员。6.4 自定义查询与深度挖掘预置查询很强大但有时你需要回答更具体的问题。这时就需要用到Cypher查询语言。在左侧搜索栏上方的“Raw Query”选项卡中你可以编写自己的Cypher查询。例如我想找出所有被标记为“Owned”已拥有的计算机并且这些计算机上有域管理员会话MATCH (c:Computer) WHERE c.owned true MATCH (u:User)-[:HasSession]-(c) WHERE (u)-[:MemberOf*1..]-(:Group {name: DOMAIN ADMINSDOMAIN.LOCAL}) RETURN c.name, u.name这个查询会返回所有已被攻陷的、且当前有域管理员登录的计算机列表这是横向移动的绝佳跳板。实操心得图谱操作技巧布局默认的“分层”布局有时会很乱。尝试使用“环形”或“力导向”布局能让关系更清晰。选择与聚焦点击一个节点按F键可以将其聚焦并居中显示。按住Ctrl键可以多选节点。标记在实战中当你攻陷一个账户或机器可以在BloodHound中右键点击该节点选择“标记为已拥有”Mark as Owned。这样在后续的路径查询中BloodHound会将这些节点作为起点让你看到从当前已控制点出发能到达哪里这对红队行动规划至关重要。导出你可以将查询出的子图或整个视图导出为JSON或图片用于报告编写。7. 常见问题、性能调优与防御思考7.1 部署与运行常见问题问题1访问BloodHound UI (:8080) 时连接失败或空白页。排查首先检查容器状态docker compose ps。确保两个容器都是“Up”状态。查看日志docker compose logs bloodhound和docker compose logs neo4j看是否有错误信息。常见错误是Neo4j启动慢BloodHound连接超时。我们配置的depends_on中的condition: service_healthy就是为了解决这个问题。防火墙确保服务器的安全组或防火墙放行了8080、7474、7687端口。浏览器缓存尝试使用浏览器的无痕模式访问。问题2SharpHound采集时卡住或报错“Unable to connect to LDAP server”。权限确保运行SharpHound的账户是有效的域账户并且网络可以连通域控制器。网络策略检查主机防火墙是否阻止了到域控TCP 389, 636, 3268, 3269的通信。使用备用方法尝试指定域控制器和端口-DomainController dc01.domain.local -LdapPort 389。分块收集如果域太大尝试使用-CollectionMethod All --Split 1000将输出分割成多个文件避免内存不足。问题3数据导入速度非常慢。Neo4j配置默认的Neo4j容器配置可能针对小数据量。对于大型域数万个对象需要调整Neo4j的堆内存。可以修改docker-compose.yml中neo4j服务的环境变量添加environment: - NEO4J_AUTHneo4j/yourpassword - NEO4J_server_memory_heap_initial__size2G - NEO4J_server_memory_heap_max__size4G - NEO4J_server_memory_pagecache_size2G然后重启服务。具体数值根据服务器内存调整建议总内存的50%-70%给堆内存。APOC插件确保APOC插件已安装我们的配置中已包含它能加速某些导入和查询过程。7.2 从蓝队视角如何利用BloodHound进行防御BloodHound不仅是攻击者的利器更是防御者的“显微镜”。以下是蓝队的使用思路定期基线扫描每月或每季度对生产环境运行一次全面的SharpHound收集并导入到一个独立的“基线”BloodHound实例中。将每次的扫描结果进行对比可以快速发现异常的新增攻击路径例如某个服务账户被意外添加到了一个高权限组。漏洞修复优先级排序BloodHound揭示的路径可能成千上万。如何修复遵循“关键路径优先”原则优先修复通向“高价值目标”的最短路径。优先修复涉及“已拥有”节点的路径在蓝队演练中可以将已知的脆弱服务账户标记为“Owned”进行模拟。优先修复利用“ACL权限”如ForceChangePassword, WriteDACL的路径因为这些权限修改往往更容易只需要在AD用户和计算机管理器中调整权限且破坏性极大。监控SharpHound活动在域控上启用并监控相关日志事件ID 4662将SharpHound的特定命令行参数或进程创建作为威胁检测规则用于发现内网中的可疑侦察行为。与SIEM/SOAR集成虽然BloodHound CE的API有限但企业版支持与工作流集成。核心思路是将BloodHound识别出的最高风险路径例如存在一条从实习生账户到域管理员且步骤少于3的路径作为安全事件告警到SOC平台并触发调查工单。7.3 性能调优与维护数据库清理长期使用后Neo4j中可能会积累多次导入的数据。如果需要清理旧数据可以登录Neo4j Browser (:7474)执行MATCH (n) DETACH DELETE n;警告此操作会删除所有数据。更安全的方式是在导入新数据前通过BloodHound UI的数据库管理功能进行清理。备份定期备份Docker卷。Neo4j的数据存储在neo4j_data卷中。可以使用docker run --rm -v neo4j_data:/data -v $(pwd):/backup alpine tar czf /backup/neo4j_backup.tar.gz /data来备份。更新关注BloodHound GitHub仓库的Release定期更新Docker镜像以获得新功能和漏洞修复。更新前请做好备份。部署和使用BloodHound Community Edition的过程就像是为你的AD域安全进行了一次全面的“CT扫描”。它不会自动修复问题但它将那些隐藏极深、错综复杂的风险脉络清晰地呈现在你面前。无论是作为红队队员规划攻击链还是作为蓝队成员加固防御体系这张由数据和关系构成的“攻击路径地图”都是不可或缺的决策依据。真正的安全始于可见性而BloodHound正是照亮AD域黑暗角落的那盏最亮的灯。

本月热点