在本系列的第一篇文章,我们介绍了 FreeIPA 的一些背景和基础技术。我们还讨论了几种认证机制,以及凭证的形成,特别是如何识别、解析和重用凭证。如果你没有读过第一篇文章,你可以在这里找到它:https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a
在本系列的第二部分,我将深入到一个自定义的实验室环境中,以便展示 FreeIPA 中各种对象和结构是如何工作的,以及它们之间的相互作用,然后我们将学习如何枚举这些数据及结构。
在深入讨探之前,让我们花点时间简单回顾一下实验室环境的创建方式及其总体结构。
上图是我为该系列构建的 FreeIPA Lab 环境的总体布局,也是我在研究中使用的环境。
FreeIPA 开发者团队为 FreeIPA 服务器和客户端维护着 docker 镜像,这些 docker 镜像横跨多个流行的操作系统。你可以在 Dockerhub 或 Github 上找到这些 docker 镜像,链接如下。
所有文档和设置说明可在以下链接的 FreeIPA 主站点上找到:
在这个练习中,我们的初始权限是受 FreeIPA 管理的一台 Web 服务器的 WebShell 权限。我们的目标是获取该 FreeIPA 域的管理权限,并从 SQL 数据库中删除敏感数据。在开始操作之前,我们先来了解一下 FreeIPA 环境内部的一些基本对象和枚举技术。
与 Windows Active Directory 一样,FreeIPA 允许管理员创建主机和用户。这些主机和用户可以分类到分别称为 “Host Groups” 和 “User Groups” 的容器中。这些组的功能与 AD 的组织单位(OU)非常相像。
基于主机的访问控制规则(HBAC规则)、特权、角色和 Sudo 规则可应用与上述任何对象。如果你不熟悉 HBAC 规则、特权、角色和 Sudo 规则,也不需要过多担心,因为在后续中会陆续探讨这些内容。
有多种方法可以从 IPA 服务器枚举有关域的信息。我将在本文中介绍以下两种方法:
在 FreeIPA 中,默认情况下,LDAP 服务器允许匿名绑定,而且有大量数据未经身份验证都是可枚举的。但是,并非所有的数据都是未经身份验证的可枚举数据。负责映射安全授权控制的数据已经被 ACL 明确保护。下面的命令将检索所有可用的非认证数据:
对于本文的剩余部分,所有 ldapsearch
命令都将进行身份验证。在本系列的第一篇文章中,我们介绍了如何在 FreeIPA 环境中识别和利用凭证。
当有了有效的凭证后,我们可以设置一些过滤器,以便更好的查询。比如设置 DN,以下是查询当前实验室环境中的所有用户:
ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=westeros,dc=local"
我们可以将该语句稍微进行修改,检索当前环境中所有的主机信息:
ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=westeros,dc=local"
同样,我们可以修改语句,以完成更多的查询,以下分别是检索主机组和用户组的语句:
ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=westeros,dc=local" -------------------------------------------------------------------- ldapsearch -Y gssapi -b "cn=groups,cn=accounts,dc=westeros,dc=local"
默认情况下,加入到 FreeIPA 域中的机器,会在加入的过程中安装 IPA 管理工具。此工具对于枚举和配置环境非常有用。
但是,如果没有有效凭证,则无法使用 IPA 工具。如果发现自己缺少有效的域凭证,域内每台机器都会部署一个 Keytab 凭证。这个 Keytab 可以用来获取机器本身的有效的凭证缓存(CCACHE) TGT。
当有了有效的凭证并访问 ipa 工具,可以使用以下命令来枚举相关信息:
ipa user-find ipa usergroup-find ipa host-find ipa host-group-find ------------------- ipa user-show <username> --all ipa usergroup-show <user group> --all ipa host-find <host> --all ipa hostgroup-show <host group> --all
在官方文档中,HBAC 规则定义如下:
访问控制在高层次上定义了谁可以访问什么。谁可以是用户或主机(源主机),以及什么可以是主机(目标主机)、服务或服务组,或三者的组合。
HBAC 规则应用于委派对特定资源的访问。如果配置正确,此访问控制在缓解横向移动方面可能非常有效。作为攻击者,我们可以使用 HBAC 规则来识别哪些账户被授权访问环境内的特定资源。
让我们回顾一下如何枚举这些策略。
使用以下命令可枚举实验室环境中的所有 HBAC 规则:
ldapsearch -Y gssapi -b "cn=hbac,dc=westeros,dc=local"
使用以下命令可枚举实验室环境中的所有 HBAC 规则:
ipa hbacrule-find
-----------------
ipa hbacrule-show <hbacrule> --all
在官方文档中,Sudo 规则定义如下:
Sudo规则在某种意义上类似于访问控制规则:它们定义了被授予访问权限的用户,定义了规则范围内的命令,然后定义了规则适用的目标主机。在 FreeIPA中,可以在规则中配置额外的信息,如 sudoers选项和 run-as设置,但基本元素总是定义了谁、什么(服务)和位置(主机)。
FreeIPA 提供了通过 sudo-rules 从一个集中源管理 sudo 权限的能力。这些规则集可以用来限制或授权在域中注册的主机上执行 sudo 命令的能力。作为攻击者,我们可以枚举出这些规则集适用于哪些主机和用户,以及通过规则集允许哪些命令。
使用以下命令可枚举实验室环境中的所有 sudo 规则:
ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=westeros,dc=local"
使用以下命令可枚举实验室环境中的所有 sudo 规则:
ipa sudorule-find ----------------- ipa sudorule-show <sudorule> --all
在官方文档中,基于角色的访问控制定义如下:
基于角色的访问控制(RBAC)是一种组织对 FreeIPA 管理的数据访问的分层方式。在一个组织内执行相同任务的不同用户通常被组合成一个组,这个组成为 FreeIPA 角色的成员。这个角色为成员组和用户提供必要的权限来执行他们所分配的任务。
FreeIPA 中的角色由几个不同的元素组成。每个角色都包含一组权限,而这些相应的权限包含一组权限。角色可以应用于用户、用户组、主机、主机组和服务。为了说明这个概念,让我们讨论 FreeIPA中的默认"用户管理员 "角色。
如图所示:"用户管理员" 角色包含以下特权:
我们可以进一步挖掘并枚举委派给每个权限的权限。
我们可以看到,"用户管理员 "角色包含了相当多的权限。了解这些角色、权限的概念和结构,对于识别整个环境中的攻击路径至关重要。
使用以下命令可枚举实验室环境中的所有角色:
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
使用以下命令可枚举实验室环境中的所有角色、权限:
ipa role-find ipa role-show <role> --all ipa privilege-find ipa privilege-show <privilege> --all ipa permission-find ipa permission-show <permission> --all
我想,我们现在已经对 FreeIPA 环境中的各种不同类型的对象结构有了初步的了解,并对它们的作用也有了一些了解。作为攻击者,不仅要能够枚举出这些对象,而且还要了解这些对象的意义。
在本系列的后面的文章中,我的目标是涵盖以下内容:
利章节中所涉及的枚举技术来揭示实验室环境内部的攻击路径。
最后,概述了一些攻击者在 FreeIPA 环境中可能滥用的错误配置和独特的场景。
原文:https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1