BloodHound
参考:https://github.com/BloodHoundAD/BloodHound/wiki
BloodHound
是一个单页的JavaScript
的Web应用程序,构建在Linkurious
上,用Electron
编译,使用的数据库是Neo4j
BloodHound
使用可视化图来显示Active Directory
环境中隐藏的、通常是无意的关系。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则这些攻击路径无法快速识别。防御者可以使用BloodHound
来识别和防御那些相同的攻击路径。蓝队和红队都可以使用BloodHound
轻松深入了解Active Directory
环境中的权限关系。
BloodHound
在域渗透信息收集之中可谓是利器,下面讲一下BloodHound的基本使用

图来源于:BloodHound wiki
安装
BloodHound是依赖于Neo4j
数据库的,所以开始先安装Neo4j
,Neo4j
需要安装最新JDK,如果不是最新JDK那么将会报错

下载地址:https://neo4j.com/download-center/#community
下载完成之后到bin目录运行如下命令
windows:
1 | neo4j.bat console |
linux
1 | ./neo4j console |
运行之后

Neo4j默认是只能本地登陆的,如果你想远程登陆的话请修改一下配置文件,配置文件在conf目录下的neo4j.conf
1 | dbms.default_listen_address=0.0.0.0 |
登陆后台http://localhost:7474
URL为:neo4j://localhost:7687
用户名默认为:neo4j
密码默认为:neo4j

登陆之后里面长这样

neo4j安装好了,那么下一步就是下载BloodHound:https://github.com/BloodHoundAD/BloodHound/releases
如果是kali的话,可以不用下载直接使用apt-get
就可以安装,BloodHound
依赖于neo4j
,所以neo4j
也会安装
1 | apt-get update |
下载完成之后,如下命令启动
1 | ./BloodHound --no-sandbox |
输入数据库地址、用户名以及密码即可

登陆进去里面大概长这样子

面板上有三个选项,分别为数据库信息、节点信息、查询模块。
现在里面什么都没有,因为我们没有上传数据,下面说一下数据收集
数据采集
数据采集我们可以用SharpHound:地址,一个C#写的程序
然后到域上用SharpHound
进行信息收集,支持Group, LocalGroup, GPOLocalGroup, Session, LoggedOn, ObjectProps, ACL, ComputerOnly, Trusts, Default, RDP, DCOM, DCOnly
等信息的收集,默认导出所有的信息,具体请看github提供的手册。
1 | SharpHound.exe -c all |

导出之后解压会有多个json文件,里面保存着域内的各种关系

然后到BloodHound上传数据,点最右边第四个上传按钮,把所有json文件逐个上传即可

上传之后就可以在左上角看到域内的一些信息了
第一个数据库信息

可以看到域上一共有6个用户、3个主机、52组、一个会话、489条ACL,546个关系
第二个为结点信息,你点一下节点,它会显示这个结点的一些信息,这里我们显示域管理员的一些信息

第三个Queries
为查询模块,有如下选项

查找所有域管理员
查找到域管理员的最短路径
查找具有DCSync权限的主体
具有外部域组成员身份的用户
具有外部域组成员身份的组
域信任地图
达到无约束委托系统的最短路径
到达
Kerberoastable
用户的最短路径从
Kerberoastable
用户到域管理员的最短路径到达自拥有主体的最短路径
从拥有的主体到域管理员的最短路径
到达高价值目标的最短路径
下面我来挑几个模块来讲一下
最短到达域管理员路径

注: 路径由粗到细的那边,就是xx对xx具有的权限或者说关系
这里可以看到,有2条最短路径可以达到域管理权限,一个是通过约束委派(test用户),一个是通过SID History
(qiyou用户),路径上都有说明
首先先看一下用户qiyou的SID History
,可以从下图中看到这个SID History
的RID部分为500的,也就是这个为域管理员的SID,那么当KDC为QIYOU
这个用户创建kerberos票证时,它将包含ADMINISTRATOR
的SID,因此授予QIYOU
与ADMINISTRATOR
相同的权限。
从Node Info
中可以得到SID History

回到域上验证一下

然后可以以这个用户尝试一下访问域控

另外一条路径是通过约束委派,用户test对主机DM2012.TEST.LOCAL
中的某个服务具有约束委派的权限,而administrator
在DM2012.TEST.LOCAL
主机上有一个会话,也就是说如果用户可能通过约束委派得到主机DM2012.TEST.LOCAL
的权限,那么就有可能从内存中dump出用户administrator的凭证。用户test具有的委派的权限点击用户test即可看到

还要注意一点就是用户test是一个在域中注册了spn的服务账户,也就是说这个用户是Kerberoastable
,所以如果我们没有这个用户的权限,我们可以通过Kerberoasting
得到这个用户的hash,然后爆破它的密码。如果想枚举出域中Kerberoastable
用户的关系,可以使用模块Shortest Paths from Kerberoastable Users
。
还有一个tips是你右键路径描述,它会给出一些利用的信息以及学习参考资料方便你进行下一步操作
利用信息

参考资料

到达无约束委托系统的最短路径
模块为Shortest Paths to Unconstrained Delegation Systems
,点击一下即可看到路径

因为这个域上的关系结构比较简单,所有看起来也不是很复杂,我们这里以域用户qiyou
为例吧,可以把鼠标放在这个用户图标上,然后与它相关的路径都会变红,如下图

有两个具有非约束委派的系统,一个是win10
一个是windows server 2008R2


首先看到第一条路径,用户qiyou
是对Default Domain Policy
具有委派权限的,权限为GenericWrite
,也就是说用户qiyou对这个GPO具有修改权限的,那么我们就可以通过这个用户来修改域上默认组策略的一些设置,比如设置计划任务,Default Domain Policy
这个GPO默认是链接到域本身的,也就说这个GPO的计划任务是对域内所有机器生效,通过命令行来注册GPO计划任务可以参考三好学生师傅这个篇文章:地址/),因为不是这里重点就不多赘述了

回到域控验证用户qiyou对该GPO是否具有委派权限

第二条路径,如下图所示

路径的大概描述是:用户qiyou对test具有GenericAll
权限(完全控制权限),而test
对主机DM2012.TEST.LOCAL
具有某个服务的约束委派权限,那么就有可能通过约束委派得到DM2012.TEST.LOCAL
的权限,而用户administrator又在主机DM2012.TEST.LOCAL
上有一个会话,那么就有可能从内存中dump出用户administrator的凭证,而用户administrator
又属于DOMAIN ADMINS
组,DOMAIN ADMINS
组又对该非约束委派的主机具有完全控制权限。
用户qiyou对test具有完全控制权限,那么用户qiyou可以给用户test注册spn、修改密码等等

到达Kerberoastable
用户的最短路径
这个就比较简单了,也不用多讲了上面也说过了用户test是Kerberoastable
,域上的所有用户都是可以通过Kerberoasting
得到Kerberoastable
用户hash的

注册的SPN可以在左侧Node Info
看到,为test/test.local

Kerberoasting
可以得到用户hash,然后hashcat
枚举口令即可

查找具有DCSync权限的主体
这个模块会列出域中所有具有DCsync权限的主体(包括用户和计算机)
DCsync大致原理是通过GetNCChanges
请求域控制器(利用Directory Replication Service
协议)复制用户凭据。
运行DCSync需要特殊权限,Administrators
组、Domain Admins
组或Enterprise Admins
组以及域控中的任何成员都通过DCSync来提取用户凭证。如果配置不当,可导致普通用户也能具有DCsync权限
这里为了可以看到效果,就给普通用户qiyou添加个DCsync权限
如果普通用户想具有DCsync权限,可以给对象添加以下三条ACE:
DS-Replication-Get-Changes
,对应GUID为:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2
DS-Replication-Get-Changes-All
,对应GUID为:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2
DS-Replication-Get-Changes-In-Filtered-Set
,对应GUID为:89e95b76-444d-4c62-991a-0facbeda640c
powerview模块集成了添加DCsync
权限的方法,所以我们不需要一个一个添加了
1 | Add-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity qiyou -Rights DCSync -Verbose |

回到BloodHound上看一下
可以看到箭头上有两个明显标志:GetChangesAll(DS-Replication-Get-Changes-All
)和GetChanges(DS-Replication-Get-Changes
)

利用用户qiyou即可dump出域内所有用户的hash

other
因为我这个域环境比较简单,其它模块和上面的大同小异,所以我们这里就不多演示了,有兴趣的同学可以自己搭建一个域环境或者网上下载靶机自己模拟一下,我上写得可能比较乱,不清楚的同学可以多看一下官方文档
后记
无论是对红队还是蓝队来说BloodHound
确实是一款非常nice的工具,它可以帮助我们节省很大的时间和精力。因为我这个是本地测试域比较小,而且一些域内的关系是我故意设计,所以很容易找出对应的关系,但是如果到大型很复杂的域环境中,那么这个就不是那么简单了,毕竟BloodHound
只是辅助工具,最终还是需要人来分析的