BloodHound

参考:https://github.com/BloodHoundAD/BloodHound/wiki

BloodHound是一个单页的JavaScript的Web应用程序,构建在Linkurious上,用Electron编译,使用的数据库是Neo4j

BloodHound使用可视化图来显示Active Directory环境中隐藏的、通常是无意的关系。攻击者可以使用BloodHound轻松识别高度复杂的攻击路径,否则这些攻击路径无法快速识别。防御者可以使用BloodHound来识别和防御那些相同的攻击路径。蓝队和红队都可以使用BloodHound轻松深入了解Active Directory环境中的权限关系。

BloodHound在域渗透信息收集之中可谓是利器,下面讲一下BloodHound的基本使用

image.png
image.png

图来源于:BloodHound wiki

安装

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

image.png
image.png

下载地址:https://neo4j.com/download-center/#community

下载完成之后到bin目录运行如下命令

windows:

1
neo4j.bat console

linux

1
./neo4j console

运行之后

image.png
image.png

Neo4j默认是只能本地登陆的,如果你想远程登陆的话请修改一下配置文件,配置文件在conf目录下的neo4j.conf

1
2
3
4
dbms.default_listen_address=0.0.0.0
dbms.default_advertised_address=0.0.0.0
dbms.connector.bolt.listen_address=0.0.0.0:7687
dbms.connector.http.listen_address=0.0.0.0:7474

登陆后台http://localhost:7474

URL为:neo4j://localhost:7687

用户名默认为:neo4j

密码默认为:neo4j

image.png
image.png

登陆之后里面长这样

image.png
image.png

neo4j安装好了,那么下一步就是下载BloodHound:https://github.com/BloodHoundAD/BloodHound/releases

如果是kali的话,可以不用下载直接使用apt-get就可以安装,BloodHound依赖于neo4j,所以neo4j也会安装

1
2
3
apt-get update
apt-get dist-upgrade
apt-get install bloodhound

下载完成之后,如下命令启动

1
./BloodHound --no-sandbox

输入数据库地址、用户名以及密码即可

image.png
image.png

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

image.png
image.png

面板上有三个选项,分别为数据库信息、节点信息、查询模块。

现在里面什么都没有,因为我们没有上传数据,下面说一下数据收集

数据采集

数据采集我们可以用SharpHound:地址,一个C#写的程序

然后到域上用SharpHound进行信息收集,支持Group, LocalGroup, GPOLocalGroup, Session, LoggedOn, ObjectProps, ACL, ComputerOnly, Trusts, Default, RDP, DCOM, DCOnly等信息的收集,默认导出所有的信息,具体请看github提供的手册。

1
SharpHound.exe -c all
image.png
image.png

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

image.png
image.png

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

image.png
image.png

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

第一个数据库信息

image.png
image.png

可以看到域上一共有6个用户、3个主机、52组、一个会话、489条ACL,546个关系

第二个为结点信息,你点一下节点,它会显示这个结点的一些信息,这里我们显示域管理员的一些信息

image.png
image.png

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

image.png
image.png
  1. 查找所有域管理员

  2. 查找到域管理员的最短路径

  3. 查找具有DCSync权限的主体

  4. 具有外部域组成员身份的用户

  5. 具有外部域组成员身份的组

  6. 域信任地图

  7. 达到无约束委托系统的最短路径

  8. 到达Kerberoastable用户的最短路径

  9. Kerberoastable用户到域管理员的最短路径

  10. 到达自拥有主体的最短路径

  11. 从拥有的主体到域管理员的最短路径

  12. 到达高价值目标的最短路径

下面我来挑几个模块来讲一下

最短到达域管理员路径

image.png
image.png

注: 路径由粗到细的那边,就是xx对xx具有的权限或者说关系

这里可以看到,有2条最短路径可以达到域管理权限,一个是通过约束委派(test用户),一个是通过SID History(qiyou用户),路径上都有说明

首先先看一下用户qiyou的SID History,可以从下图中看到这个SID History的RID部分为500的,也就是这个为域管理员的SID,那么当KDC为QIYOU这个用户创建kerberos票证时,它将包含ADMINISTRATOR的SID,因此授予QIYOUADMINISTRATOR相同的权限。

Node Info中可以得到SID History

image.png
image.png

回到域上验证一下

image.png
image.png

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

image.png
image.png

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

image.png
image.png

还要注意一点就是用户test是一个在域中注册了spn的服务账户,也就是说这个用户是Kerberoastable,所以如果我们没有这个用户的权限,我们可以通过Kerberoasting得到这个用户的hash,然后爆破它的密码。如果想枚举出域中Kerberoastable用户的关系,可以使用模块Shortest Paths from Kerberoastable Users

还有一个tips是你右键路径描述,它会给出一些利用的信息以及学习参考资料方便你进行下一步操作

利用信息

image.png
image.png

参考资料

image.png
image.png

到达无约束委托系统的最短路径

模块为Shortest Paths to Unconstrained Delegation Systems,点击一下即可看到路径

image.png
image.png

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

image.png
image.png

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

image.png
image.png
image.png
image.png

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

image.png
image.png

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

image.png
image.png

第二条路径,如下图所示

image.png
image.png

路径的大概描述是:用户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、修改密码等等

image.png
image.png

到达Kerberoastable用户的最短路径

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

image.png
image.png

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

image.png
image.png

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

image.png
image.png

查找具有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
image.png
image.png

回到BloodHound上看一下

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

image.png
image.png

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

image.png
image.png

other

因为我这个域环境比较简单,其它模块和上面的大同小异,所以我们这里就不多演示了,有兴趣的同学可以自己搭建一个域环境或者网上下载靶机自己模拟一下,我上写得可能比较乱,不清楚的同学可以多看一下官方文档

后记

无论是对红队还是蓝队来说BloodHound确实是一款非常nice的工具,它可以帮助我们节省很大的时间和精力。因为我这个是本地测试域比较小,而且一些域内的关系是我故意设计,所以很容易找出对应的关系,但是如果到大型很复杂的域环境中,那么这个就不是那么简单了,毕竟BloodHound只是辅助工具,最终还是需要人来分析的

Reference

https://www.freebuf.com/sectool/179002.html

https://github.com/BloodHoundAD/BloodHound/wiki