前言
大家好,这里是 渗透攻击红队的 内网域渗透系列文章,我是 saulGoodman,对于本文的这些技术分享,都是我自行搭建的环境进行操作的,本文仅用于技术讨论与研究,如因此产生的一切不良后果与文章作者无关!
只有对原理了然于心,才能做到真正的自由, 只有突破更多的限制,才可能获得真正意义上的技术进步。要掌握的东西还很多,后面的路也还很长,静心学习,耐心沉淀,送给未来的自己,所有真正的价值都是来源于实实在在的贡献!大家共勉!
BloodHound 使用可视化图形显示域环境中的关系,红队人员可以使用 BloodHound 识别高度复杂的攻击路径,蓝队可以使用 BloodHound 来识别和防御那些相同的攻击路径。蓝队和红队都可以使用 BloodHound 轻松深入域环境中的权限关系。
在做内网域渗透的时候,若是我们是手动去挨个信息搜集,如果一个域内只有几十台域机器倒也应付的过来,若这个域是有上万,上百万的域机器的时候,我们手动去信息搜集自然是不行,只能依赖于机器帮我们自动化信息搜集,而 BloodHound 就能过帮我们梳理域内每一台主机的详细信息,一是方便了我们省去了手工搜集时间,二是能够用图形化的界面呈现出域内的各种复杂环境。
在不同的操作系统下安装 BloodHound
Kali Linux 安装 BloodHound
当前 Kali Linux 版本是 2021最新版本,在 Kali Linux 下安装 BloodHound 我们直接一条命令安装:
apt-get install bloodhound
安装完成后运行图形化数据库 neo4j:
neo4j start
发现报错了,报错信息是:
./bin/neo4j:行390: /usr/share/neo4j/logs/neo4j.log: 没有那个文件或目录
解决方法就是:创建/logs/
目录 和neo4j.log
文件:
mkdir /usr/share/neo4j/logs
touch /usr/share/neo4j/logs/neo4j.log
然后再次运行图形化数据库 neo4j:
neo4j start
这个时候就启动成功了,我们访问http://127.0.0.1:7474/
:
Host : bolt://127.0.0.1:7687
User : neo4j
Password : neo4j
第一次登陆成功会提示你需要更改一次密码,在这里我吧密码更改为:whoami
这个时候neo4j
就成功安装了:
最后运行命令启动bloodhound
:
在终端输入:bloodhound
url :bolt://localhost:7687
user :neo4j
pass :whoami
这个时候出现下面的界面则代表bloodhound
启动成功:
Windows 安装 Bloodhound
在 Windows 下安装 Bloodhound 需要安装 Java 环境,因为 Neo4j 数据库需要 Java 支持,因此安装 BloodHound 需要先安装 Java。
建议下载 JDK 11 版本,不然 Neo4j 运行可能会报错,JDK 下载地址:https://www.oracle.com/java/technologies/javase-downloads.html:
下载之后,直接安装完设置环境变量后即可:
安装完 JDK 后 还需要去 下载Neo4j 最新版本,下载地址:https://neo4j.com/download-center/#community
之后解压下载文件,打开 bin 目录,执行命令neo4j.bat console
:
之后打开浏览器访问 http://localhost:7474登陆后台:
输入以下信息连接到数据库说明安装就完成了:
URL : neo4j://localhost:7687
user :neo4j
pass :neo4j
第一次登陆成功需要更改一下neo4j
的密码,我更改为:whoami
然后出现这个页面说明neo4j
已经搭建完毕:
最后去 Github 上下载 BloodHound :https://github.com/BloodHoundAD/BloodHound
下载完后解压出来直接运行:BloodHound.exe
url : bolt://localhost:7687
user : neo4j
pass : whoami (就是刚刚更改的密码)
这个时候出现这个页面则代表安装完成:
Mac OS 安装 BloodHound
从 https://neo4j.com/download-center/#community下载 macOS 版本的 neo4j Community Edition Server (不要从 brew 安装)
解压neo4j
文件夹后在 macOS 终端中,将目录更改为neo4j
文件夹,切换到bin
目录,然后输入:
./neo4j console
然后浏览器访问:http://localhost:7474
url : bolt://localhost:7687
user : neo4j
pass : neo4j
第一次登陆成功需要更改一下密码:whoami
出现这个界面则代表安装成功:
最后去下载最新版本的 BloodHound GUI :https://github.com/BloodHoundAD/BloodHound/releases
解压文件夹并双击 BloodHound 输入刚刚设置的账户密码登陆:
user : neo4jpass : whoami
以上就是各个操作系统安装 BloodHound 的详细步骤了,接下来就是 BloodHound 的使用教程。
使用 BloodHound 分析大型域内环境
当我们在本地安装完成 BloodHound 后,需要进行数据的采集与导入,数据的采集可以使用ps1
脚本或者使用exe
程序收集,工具下载地址: https://github.com/BloodHoundAD/BloodHound/tree/master/Collectors
使用 BloodHound.exe 采集数据
这里使用 SharpHound.exe 进行数据的采集,将 SharpHound.exe 拷贝到目标上,执行SharpHound.exe -c all
进行数据采集:
采集完数据会在当前路径下生成一个以时间戳命名的zip
文件,我们只需要把这个文件拖回来即可。
使用 BloodHound.ps1 采集数据
若目标机器上有 powershell 环境,我们还可以通过ps1
脚本来采集数据:
powershell -exec bypass -command "Import-Module ./SharpHound.ps1; Invoke-BloodHound -c all"
采集完数据会在当前路径下生成一个以时间戳命名的zip
文件,我们只需要把这个文件拖回来即可。
导入 BloodHound 数据
当我们数据采集完我们拖回本地后,我们就可以直接把zip
文件导入:
导入数据后Database info
就会有数据显示了:
BloodHound 板块介绍
1、Database Info(数据库信息),可以查看当前数据库中的域用户、域计算机等统计信息。
2、Node Indo(节点信息),单击某个节点时,在这里可以看到对应节点的相关信息。
3、Analysis(分析查询),在 BloodHound 中预设了一些查询条件,具体如下:
1、查询所有域管理员2、寻找到域管理员的最短路径3、查找具有DCSync权限的主体4、具有外部域组成员资格的用户5、具有外部域名组成员资格的组6、映射域信任7、到无约束委托系统的最短路径8、到达Kerberoastable用户的最短路径9、从Kerberoastable用户到域管理员的最短路径10、拥有的主体的最短路径11、从拥有的主体到域管理员的最短路径12、到高价值目标的最短路径13、查找域用户是本地管理员的计算机14、查找域用户可以读取密码的计算机15、从域用户到高价值目标的最短路径16、找到从域用户到高价值目标的所有路径17、找到域用户可以RDP的工作站18、找到域用户可以RDP的服务器19、查找域用户组的危险权限20、找到高价值群体中能够支持kerberoable的成员21、列出所有kerberoable用户22、查找具有大多数特权的Kerberoastable用户23、查找到非域控制器的域管理登录24、查找不支持操作系统的计算机25、查找AS-REP Roastable用户(DontReqPreAuth)
接下来我就带大家看看最常用的查询条件如何分析。
查询所有域管理员(Find all Domain Admins)
点击Analysis
-Find all Domain Admins
:
上图可以看到右边会有一个拓扑图显示,由黄色DOMAIN.ADMINS@REDTEAM.COM
组查询后由两个域管理员,分别是用户:ADMIN@REDTEAM.COM
、ADMINISTRATOR@REDTEAM.COM
,这样我们就知道当前域内有两个域管理员。
寻找到域管理员的最短路径(Find Shortest Paths to Domain Admins)
点击Analysis
-Find Shortest Paths to Domain Admins
:
上图可以看到右边会有一个拓扑图显示:
黄色图标的则代表的是用户组,可以看到有三个用户组 DOMAIN ADMINS、ENTERPRISE ADMINS、ADMINISTRATORS。
绿色图标小人则代表的是域用户,可以看到有三个域用户 WHOAMI、ADMIN、ADMINISTRATOR。
蓝色网状图标则代表当前域名,可以看到当前域名为 REDTEAM.COM。
紫色序列图标则代表默认域策略。
查找具有DCSync权限的 主体(Find Principals with DCSync Rights)
点击Analysis
-Find Principals with DCSync Rights
:
DCSync 是域渗透中经常会用到的技术,我们可以通过 DCSync 来导出域内某个用户的 Hash,或者域内所有用户的 Hash。
Mimikatz 在 2015 年发布了新版本的 Mimikatz,新增加了 DCSync 功能。模仿一个域控制器 DC,从真实的域控制器中请求获取数据,例如账号的口令散列值等数据。
一个用户想发起 DCSync 攻击,必须获得以下任一用户的权限:
Administrators 组内的用户
Domain Admins 组内的用户
Enterprise Admins 组内的用户
域控制器的计算机帐户
在一般默认情况下域管理员组具有该权限,所以在域渗透中拿到域管理员账号就可以变相拿到整个域的控制权限。
查看域信任关系(Map Domain Trusts)
点击Analysis
-Map Domain Trusts
:
可能有一些朋友还不知道什么是信任, 为什么要在域之间建立信任关系?
域是安全边界,若无信任关系,域用户帐户只能在本域内使用。信任关系在两个域之间架起了一座桥梁,使得域用户帐户可以跨域使用。
确切地说就是:信任关系使一个域的 DC(域控制器) 可以验证其他域的用户,这种身份验证需要信任路径。
例如:A域与B域没有信任关系,A域上的员工可以使用自己在A域的帐户,那么将不能访问B域上的资源。
总之,两个域之间只有建立适当的信任关系后才可以实现互相访问,这就像两个公司之间要进行友好往来需要建立外交关系一样。
知道了原理之后我们再来看上面这张图,SAUL.REDTEAM.COM域,被信任(trustedby) REDTEAM.COM域。
这个信任关系 指明 **SAUL.REDTEAM.COM **域是受 REDTEAM.COM域,信任的域,即 **SAUL.REDTEAM.COM ** 域的用户帐户可以访问 REDTEAM.COM域的资源(在拥有相应权限的前提下)。
从这里我们可以看出,信任关系具有方向性,这个图看上去信任关系是单向信任,**SAUL.REDTEAM.COM **域的用户可以访问 **REDTEAM.COM 域的资源,但 REDTEAM.COM域的用户还不能访问 SAUL.REDTEAM.COM ** 域的资源,但是这是父子域的一个信任关系。在域森林中,父子域之间存在的信任关系,称为父子信任,在默认情况下, 当现有域树中添加新的子域时,将自动建立父子信任关系。这种信任是双向的可传递的信任关系,所以这个图本身就有问题,他们应该是双向信任,也就是 **SAUL.REDTEAM.COM ** 域的用户可以访问 **REDTEAM.COM **域的资源,而 **REDTEAM.COM **域的用户也可以同样访问 **SAUL.REDTEAM.COM **域的资源!
还有一种信任关系:A域和B域之间的双向信任(A域信任B域,且B域信任A域), 在这种信任关系下,A域和B域的用户帐户都能访问对方域的资源,因为这两个域都得到了对方域的信任,就类似于上面提到的父子域信任关系。
对于域信任关系,我们后面会有单独篇章讲跨域攻击,通过一个域信任的关系来跨域攻击到另外一个域内,这都是后话了。
查询到非约束委派系统的最短路径(Shortest Paths to Unconstrained Delegation Systems)
域委派是指将域内部用户的权限委派给服务账号,使用服务账号能以用户的权限在域内展开活动。
比如在域中如果出现一种使用 Kerberos 身份验证访问域中的服务B,而服务B再利用A的身份去请求域中的服务C,这个过程就可以理解为委派。
委派主要分为非约束委派(Unconstrained delegation)
和约束委派(Constrained delegation)
两个方式,还有一种是基于资源的约束委派(Resource Based Constrained Delegation
)。
而通过非约束委派攻击我们就可以通过TGT
去获取到AD
或者其他域内服务主机的权限,至于什么是TGT
我也会单独写一篇来讲解域内的每一个协议,大家只需要初步的认为非资源约束委派可以帮助我们拿到其他主机的权限就好。
其实 BloodHound 常用的也就这些,接下来我在讲下一些图标具体是干啥的。
BloodHound 节点图标、语句详解(必须了解)
节点图标
当我们鼠标右键空白处时,会弹出以下内容:
我们可以鼠标右键点击任一节点,会弹出以下内容:
当我们看每个节点时,可能会发现有些节点和别的不太一样,比如有些有钻石图标还有靶子的图标,那些是什么意思呢?
蓝色位置图标意味着这是开始节点;
白色骷髅头说明是已拥有节点;
红色靶子图标是目标节点;
钻石图标则是高价值目标;
节点又细分为6种,分别是 Users用户、Groups组、Computers计算机、Domain域、**GPOs **组策略对象、OUs组织单位:
HasSession
当用户与计算机时进行会话时,凭据会保留在内存中,可用 LSASS 注入或者凭据转储来获取用户凭据,图中该用户在两台计算机上存在会话:
也就是我们发现在他们两台计算机之间存在 HasSession的关系,那么可以使用 PTH 哈希传递攻击通过中间的用户获取两台机器的权限。
MemberOf
MemberOf此节点是上一节点的成员,由末端指向上的尖端:
如上图的最上面我标记的红圈圈,WHOAMI@REDTEAM.COM就是 ADMINISTRATORS@REDTEAM.COM本地管理员组下的成员。
如上图的中间我标记的红圈圈,ADMIN@REDTEAM.COM就是 DOMAIN ADMINS@REDTEAM.COM域管理员组下的成员。
如上图的最下面我标记的红圈圈,ADMINISTRATOR@REDTEAM.COM就是 DOMAIN ADMINS@REDTEAM.COM域管理员组下的成员。
AdminTo
**AdminTo **末端是尖端的本地管理员,本地管理员对这台计算机的管理权限比较大,下面的这个用户组是前一台计算机的本地管理员:
如上图我标记红圈圈哪里可以得知,用户 ADMINISTRATOR@REDTEAM.COM是域机器 AD-2016.REDTEAM.COM的本地管理员用户,以此类推上面也有一个 WHOAMI@REDTEAM.COM用户也是域机器 AD-2016.REDTEAM.COM的本地管理员用户。
可能还会有一些其他的文字,代表不同的意思:
ACL Edges
AllExtendedRights
扩展权限是授予对象的特殊权限,这些对象允许读取特权属性以及执行特殊操作;如果对象是用户,则可以重置用户密码;如果是组,则可以修改组成员;如果是计算机,则可以对该计算机执行基于资源的约束委派
AddMember
可以向目标安全组添加任意成员ForceChangePassword
可以任意重置目标用户密码GenericAll
可以完全控制目标对象GenericWrite
写入权限,修改目标的属性或者将主体添加入组等Owns
保留修改 security descriptors 的能力,会忽略DACL权限的限制WriteDacl
可写入目标DACL,修改DACL访问权WriteOwner
保留修改 security descriptors 的能力,会忽略DACL权限的限制ReadLAPSPassword
读取LAPS上的本地管理员凭证ReadGMSAPassword
读取GMSA上的本地管理员凭证
Containers
Contains
可以在OU上添加一个新的ACE,它将继承到该OU下的所有子对象上,比如说在OU上应用GenericAll ACE ,那么所有子对象都将继承GenericAll属性GpLink
将其设置为链接容器中的对象
特殊 Edges
CanRDP
用远程桌面进行会话CanPSRemote
用PowerShell进行会话ExecuteDCOM
实例化目标的COM对象并调用其方法,可以在特定条件下执行代码AllowedToDelegate
有这个特权的节点可以将任何域主体(包括Domain Admins)模拟到目标主机上的特定服务AddAllowedToAct
可以控制任意的安全主体伪装为特定计算机的任何域用户AllowedToAct
可以使用此用户滥用S4U2self / S4U2proxy进程,将任何域用户模拟到目标计算机系统,并以“该用户”身份接收有效的服务票证SQLAdmin
该用户是目标计算机的MSSQL管理员HasSIDHistory
用户的SID历史记录,用户在域迁移后,票据还包含着前域所在组的SID,虽然用户不属于前域,但仍拥有前域的权限
结尾
到此第三章的内容:**使用 BloodHound 分析大型域内环境 **就写到这里了,内网渗透、域渗透的本质其实就是信息搜集,只要你搜集内网的信息越多,你才能了解一个内网是做什么的,那些地方会有瑕疵,那些地方会有可能被红队人员攻破的地方。
而 BloodHound这款工具可以让我们快速知道当前内网域环境里,那些主机是高价值目标,那些用户是高价值用户,我们可以分析拓扑图来制定完美的攻击路线,这样就能够让我们快速的去打穿整个内网域。
这里是 渗透攻击红队,我是 saulGoodman,有问题可以随时私信我与我联系。
我们下一篇,再见!