# FreeIPA 渗透测试
通过 htARTE (HackTricks AWS 红队专家)从零开始学习 AWS 黑客攻击! 支持 HackTricks 的其他方式: * 如果您想在 **HackTricks** 中看到您的**公司广告**或**下载 HackTricks 的 PDF**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 发现[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏 * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
此信息取自以下帖子: * [https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a](https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a) * [https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1](https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1) * [https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be](https://www.youtube.com/watch?v=9dOu-7BTwPQ\&feature=youtu.be) ## 基本信息 它是 Microsoft Windows **Active Directory** 的一个开源**替代品**,主要用作**Unix**环境的集成管理解决方案。与 Active Directory 类似,FreeIPA 实现了完整的 **LDAP 目录**基础设施,由 MIT **Kerberos** 密钥分发中心支持。它使用 Dogtag **证书系统**进行 CA 和 RA 证书管理,使其能够处理**多因素**认证,包括智能卡。SSSD 用于将 FreeIPA 集成到标准 Unix 认证过程中。 ## 指纹 ### 文件 & 环境变量 * **`/etc/krb5.conf`:** `krb5.conf` 文件包含 Kerberos 客户端信息,这些信息是**加入域**所必需的。这包括 Kerberos 领域的 KDC 和管理员服务器的**位置**,当前领域和 Kerberos 应用程序的默认设置,以及主机名到 Kerberos 领域的映射。 * **`/etc/ipa/default.conf`:** 这是 IPA 服务器的**默认配置文件**,用于设置在运行 IPA 客户端和服务器时应用的系统范围的默认值。 * **`/etc/krb5.keytab`:** `krb5.keytab` 文件在**域**内的所有主机上都是**必需的**。它是 KDC **认证**过程的一部分。 * **`KRB5CCNAME`:** 如果设置,此变量指向用于认证的 **CCACHE 票据**的**位置**。 * **`KRB5_KTNAME`:** 如果设置,此变量指向用于认证的**密钥表**文件的**位置**。 * **`KRB5_CONFIG`:** 如果设置,此变量指向 Kerberos 配置文件的**位置**。 * **`KRB5_KDC_PROFILE`:** 如果设置,此变量指向 KDC 配置文件的**位置**,其中包含针对密钥分发中心守护进程的额外配置指令。 * **`KRB5RCACHETYPE`:** 此变量指定服务器使用的**默认重放缓存类型**。 * **`KRB5RCACHEDIR`:** 此变量指定服务器使用的**默认重放缓存目录**。 * **`KRB5_TRACE`:** 此变量指定一个**文件名以写入跟踪日志输出**。跟踪日志可以帮助阐明 Kerberos 库内部做出的决策。 * **`KRB5_CLIENT_KTNAME`:** 此变量设置**默认客户端密钥表**文件名。 * **`KPROP_PORT`:** 此变量设置 kprop 使用的**默认端口**。 ### 二进制文件 * **ipa:** 此二进制文件是**管理 FreeIPA 域**的标准。它可以用来管理主机、用户、sudo 规则等等。 * **kdestroy:** kdestroy 二进制文件用于**销毁**用户会话中的任何当前**Kerberos 票据**。 * **kinit:** kinit 二进制文件用于**建立**或**更新** **Kerberos 票据**。 * **klist:** klist 二进制文件**列出**当前使用中的任何**Kerberos 票据**,以及这些票据提供访问权限的主体。 * **kpasswd:** kpasswd 命令用于**更改 Kerberos 主体的密码**。kpasswd 首先提示输入当前的 Kerberos 密码,然后提示用户两次输入新密码,并更改密码。 * **ksu:** Ksu 可以用作**su 二进制文件的替代品**,以切换当前的**用户上下文**。 * **kswitch:** kswitch 命令将**切换**当前使用中的**凭证缓存**。 * **kvno:** kvno 二进制文件获取**指定 Kerberos** 主体的**服务票据**并打印出每个的密钥版本号。 ### 网络 这是一个 FreeIPA 服务器可能的样子:
## 认证 由于 FreeIPA 使用 **Kerberos 进行认证**,这个过程与 **Active Directory** 中的**认证**非常相似。为了**访问**域上的资源,用户必须有该资源的**有效 Kerberos 票据**。这些票据可以根据 FreeIPA 域的配置存储在不同的位置。 ### **CCACHE 票据文件** 当票据设置为在**磁盘**上以**文件**形式**存储**时,标准格式和类型是 **CCACHE** 文件。这是一种简单的二进制文件格式,用于存储 Kerberos 凭证。这些文件通常存储在 **`/tmp`** 中,并具有 **600** 权限。从攻击者的角度来看,这很重要,原因如下: 1. 有效票据可以被**利用进行认证**,**无需**相应用户的明文**密码**。 2. **CCACHE** 票据非常**便携**。它们可以下载并加载到另一台主机上,无需更新或验证票据。 **解析** CCACHE 票据可以通过多种不同的方式轻松完成。最简单的方法是使用 klist 二进制文件进行解析。 ``` klist /tmp/krb5cc_0 ```
对于攻击者来说,重用CCACHE Ticket非常容易。要**重用**有效的CCACHE Ticket,**导出** **KRB5CCNAME** 到有效票证文件的**路径**。系统应识别环境变量,并在与域交互时尝试使用该凭据材料。 ```bash export KRB5CCNAME=/tmp/krb5cc_0 klist ``` ### **Unix Keyring** CCACHE Tickets **可以** **存储** 在 **Linux keyring** 中。keyring 存在于 **内核** 中,并为管理员提供了 **更多控制存储票据检索和使用的权限**。票据可以按以下不同方式限定范围: * **`KEYRING:name`:** 票据限定在特定命名的 Keyring 中。 * **`KEYRING:process:name`:** 票据限定在特定进程 id 中。 * **`KEYRING:thread:name`:** 票据限定在特定线程中。 * **`KEYRING:session:name`:** 票据限定在特定用户会话中。 * **`KEYRING:persistent:uidnumber`:** 票据限定在特定用户中,不考虑会话(默认)。 根据管理员如何限定 Unix keyring 内存储的票据,解析它可能会很困难。然而,Unix keyring 中 CCACHE Tickets 的 **默认** **范围** 是 **`KEYRING:persistent:uidnumber`**。幸运的是,如果你处于 **用户** 的 **上下文** 中,`klist` 可以为我们 **解析** 这些信息。 作为攻击者,**重用存储在 Unix keyring 中的 CCACHE** 票据取决于票据的限定范围,可能会相当 **困难**。幸运的是,[@Zer1t0](https://github.com/Zer1t0) 从 [@Tarlogic](https://twitter.com/Tarlogic) 开发了一个工具,可以从 Unix keyring 提取 Kerberos 票据。这个工具叫做 **Tickey**,可以在[**这里**](https://github.com/TarlogicSecurity/tickey)找到。 ### Keytab {% hint style="warning" %} 通常,每个主机都部署有一个 keytab 凭证,该凭证可用于获取有效的 Credential Cache(CCACHE) Ticket Granting Ticket(TGT) 以供主机本身使用。 {% endhint %} 它由 **Kerberos 主体和加密密钥** 对组成,这些密钥是从与主体关联的 Kerberos 密码派生的。由于这些密钥是从主体的密码派生的,如果该 **密码更改,keytab 将失效**。 Keytab 文件可以用来 **获取有效的票据授予票** (TGT),适用于它限定的主体。这个认证过程 **不需要密码**,因为它包含了从密码派生的密钥。 解析 Keytab 文件非常容易,可以通过几种方式完成。解析 **keytab** 文件最简单的方法是使用 **klist**。第二种方法利用了 [Cody Thomas](https://medium.com/u/645ffcef8682?source=post\_page-----77e73d837d6a--------------------------------) 创建的一个出色的 python 工具。他的 **[KeytabParser](https://github.com/its-a-feature/KeytabParser)** 项目将解析出主体及其相关的加密密钥。 攻击者可以通过生成 kinit 二进制文件的 CCACHE 票据,**重用存储在 keytab 文件中的凭证**。 ```powershell # Parse keytab klist -k /rtc/krb5.keytab # Get TGT kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL ``` ### 速查表 您可以在以下链接中找到有关如何在linux中使用票据的更多信息: {% content-ref url="privilege-escalation/linux-active-directory.md" %} [linux-active-directory.md](privilege-escalation/linux-active-directory.md) {% endcontent-ref %} ## 枚举 {% hint style="warning" %} 您可以通过 **ldap** 和其他 **二进制** 工具执行**枚举**,或者**连接到 FreeIPA 服务器443端口的网页**。 {% endhint %} ### 主机、用户和组 可以创建**主机**、**用户**和**组**。主机和用户被分配到称为“**主机组**”和“**用户组**”的容器中。这些类似于**组织单位**(OU)。 在 FreeIPA 中,默认情况下,LDAP 服务器允许**匿名绑定**,并且大量数据可以**未经认证**地枚举。这可以枚举所有可未经认证访问的数据: ``` ldapsearch -x ``` 要获取**更多信息**,您需要使用一个**认证**后的会话(查看认证部分以了解如何准备一个认证会话)。 ```bash # Get all users of domain ldapsearch -Y gssapi -b "cn=users,cn=compat,dc=domain_name,dc=local" # Get users groups ldapsearch -Y gssapi -b "cn=groups,cn=accounts,dc=domain_name,dc=local" # Get all the hosts ldapsearch -Y gssapi -b "cn=computers,cn=accounts,dc=domain_name,dc=local" # Get hosts groups ldapsearch -Y gssapi -b "cn=hostgroups,cn=accounts,dc=domain_name,dc=local" ``` 从加入域的机器上,您将能够使用**已安装的二进制文件**来枚举域: ```bash ipa user-find ipa usergroup-find ipa host-find ipa host-group-find ------------------- ipa user-show --all ipa usergroup-show --all ipa host-find --all ipa hostgroup-show --all ``` {% hint style="info" %} **FreeIPA** 的 **admin** 用户相当于 **AD** 中的 **domain admins**。 {% endhint %} ### 哈希 **IPA 服务器**的 **root** 用户可以访问密码的**哈希**。 * 用户的密码哈希以 **base64** 存储在“**userPassword**”**属性**中。这个哈希可能是 **SSHA512**(FreeIPA的旧版本)或 **PBKDF2_SHA256**。 * 如果系统与 **AD** 有**集成**,密码的 **Nthash** 以 **base64** 存储在“**ipaNTHash**”中。 要破解这些哈希: • 如果 freeIPA 与 AD 集成,**ipaNTHash** 很容易破解:你应该**解码** **base64** -> 重新编码为 **ASCII** 十六进制 -> John The Ripper 或 **hashcat** 可以帮助你快速破解 • 如果使用的是 FreeIPA 的旧版本,因此使用 **SSHA512**:你应该解码 **base64** -> 找到 SSHA512 **哈希** -> John The Ripper 或 **hashcat** 可以帮助你破解 • 如果使用的是 FreeIPA 的新版本,因此使用 **PBKDF2_SHA256**:你应该解码 **base64** -> 找到 PBKDF2_SHA256 -> 它的**长度**是 256 字节。John 可以处理 256 位(32 字节)-> SHA-256 用作伪随机函数,块大小是 32 字节 -> 你只能使用我们的 PBKDF2_SHA256 哈希的前 256 位 -> John The Ripper 或 hashcat 可以帮助你破解
要提取哈希,你需要成为 **FreeIPA 服务器**中的 **root**,在那里你可以使用工具 **`dbscan`** 来提取它们:
### HBAC-Rules 这些规则授予用户或主机对资源(主机、服务、服务组等)的特定权限。 ```bash # Enumerate using ldap ldapsearch -Y gssapi -b "cn=hbac,dc=domain_name,dc=local" # Using ipa ipa hbacrule-find # Show info of rule ipa hbacrule-show --all ``` #### Sudo 规则 FreeIPA 提供了从一个**集中**源**管理 sudo 权限**的能力,通过 sudo 规则。这些规则集可以用来限制或委派在域中注册的主机上**作为 sudo 执行命令**的能力。作为攻击者,我们可以枚举这些规则集适用于哪些主机和用户,以及哪些命令通过规则集被允许。 ```bash # Enumerate using ldap ldapsearch -Y gssapi -b "cn=sudorules,cn=sudo,dc=domain_name,dc=local" # Using ipa ipa sudorule-find # Show info of rule ipa sudorule-show --all ``` ### 基于角色的访问控制 每个**角色**包含一组**权限**,这些相应的权限包含一组**权限**。角色可以**应用于用户**、用户**组**、**主机**、主机组和服务。为了说明这个概念,让我们讨论 FreeIPA 中默认的“用户管理员”角色。
如上图所示,“用户管理员”角色包含以下权限: * **用户管理员** * **组管理员** * **阶段用户管理员** 我们可以进一步深入并列举每个**权限**所委托的**权限**:
如我们所见,“**用户管理员**”角色在环境内包含相当**多的权限**。理解**角色**、**权限**和**权限**的一般概念和结构对于识别环境中的攻击路径至关重要。 ```bash # Using ldap ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local" # Using ipa binary ipa role-find ipa role-show --all ipa privilege-find ipa privilege-show --all ipa permission-find ipa permission-show --all ``` ### 攻击场景示例 在 [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) 中,你可以找到一个简单的例子,说明如何滥用某些权限来危害域。 ### Linikatz/LinikatzV2 * [https://github.com/Orange-Cyberdefense/LinikatzV2](https://github.com/Orange-Cyberdefense/LinikatzV2) * [https://github.com/CiscoCXSecurity/linikatz](https://github.com/CiscoCXSecurity/linikatz) ## 权限提升 ### ~~创建 root 用户~~ {% hint style="warning" %} 如果你能**创建一个名为 `root` 的新用户**,你可以冒充他,并且你将能够**作为 root SSH 进入任何机器。** **这个问题已经被修复。** {% endhint %} "**用户管理员**"权限非常强大(正如其名称所示):
拥有这个权限可以对环境内的用户产生很多不同的影响。利用这个权限,我们可以在 FreeIPA 域内**创建一个名为 \_root**\_ 的新用户。
一旦在域中创建了用户,我们可以为该账户**获取一个票据,使用 \_kinit**\_。
现在我们可以尝试使用我们新创建的 root 域账户进行 **SSH**。
如图所示,这会**将用户带入本地 root 账户**!因此,仅仅通过为本地用户创建一个域用户,我们就能使用 _root@WESTEROS.LOCAL_ 账户进行认证,并获得**本地 root 账户的用户上下文**_._ _有关此漏洞的更多详情,请查看_ [_https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b_](https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b)\\
从零开始学习 AWS 黑客攻击直到成为专家,通过 htARTE (HackTricks AWS 红队专家) 其他支持 HackTricks 的方式: * 如果你想在 HackTricks 中看到你的**公司广告**或**下载 HackTricks 的 PDF**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)! * 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com) * 发现 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们独家的 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏 * **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。** * **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享你的黑客技巧。