# FreeIPA渗透测试
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥 * 你在一家**网络安全公司**工作吗?想要在HackTricks中看到你的**公司广告**吗?或者你想要**获取PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 获取[**官方PEASS和HackTricks周边产品**](https://peass.creator-spring.com) * **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram群组**](https://t.me/peass) 或 **关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交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) ## 基本信息 它是微软Windows Active Directory的开源**替代品**,主要用作**Unix**环境的集成管理解决方案。类似于Active Directory,FreeIPA实现了由MIT Kerberos密钥分发中心支持的完整**LDAP目录**基础架构。它使用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 Ticket的位置**。 * **`KRB5_KTNAME`:** 如果设置了此变量,它指向要用于身份验证的**Keytab文件的位置**。 * **`KRB5_CONFIG`:** 如果设置了此变量,它指向**Kerberos配置文件的位置**。 * **`KRB5_KDC_PROFILE`:** 如果设置了此变量,它指向包含Key Distribution Center守护程序的其他配置指令的**KDC配置文件的位置**。 * **`KRB5RCACHETYPE`:** 此变量指定服务器使用的**重放缓存的默认类型**。 * **`KRB5RCACHEDIR`:** 此变量指定服务器使用的**重放缓存的默认目录**。 * **`KRB5_TRACE`:** 此变量指定要将跟踪日志输出写入的**文件名**。跟踪日志可以帮助阐明Kerberos库内部所做的决策。 * **`KRB5_CLIENT_KTNAME`:** 此变量设置**默认客户端Keytab文件名**。 * **`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票证非常容易。要**重新使用**有效的CCACHE票证,将**KRB5CCNAME**导出为有效票证文件的**路径**。系统应该识别环境变量,并在与域交互时尝试使用该凭据材料。 ```bash export KRB5CCNAME=/tmp/krb5cc_0 klist ```
### **Unix Keyring(Unix密钥环)** CCACHE Tickets(CCACHE票据)也可以存储在Linux的keyring(密钥环)中。密钥环位于内核中,使管理员对存储的票据的检索和使用具有更多控制权。票据可以按以下不同方式进行范围限定: - **`KEYRING:name`:**票据的范围限定为特定的命名密钥环。 - **`KEYRING:process:name`:**票据的范围限定为特定的进程ID。 - **`KEYRING:thread:name`:**票据的范围限定为特定的线程。 - **`KEYRING:session:name`:**票据的范围限定为特定的用户会话。 - **`KEYRING:persistent:uidnumber`:**票据的范围限定为特定的用户,不考虑会话(默认)。 根据管理员在Unix密钥环中存储的票据的范围限定方式,解析它可能会很困难。然而,CCACHE Tickets在Unix密钥环中的默认范围限定是**`KEYRING:persistent:uidnumber`**。幸运的是,如果您处于用户的上下文中,`klist`可以为我们解析这些信息。
作为攻击者,根据票据的范围限定方式,从Unix密钥环中重新使用存储的CCACHE Ticket相当困难。幸运的是,[@Zer1t0](https://github.com/Zer1t0)来自[@Tarlogic](https://twitter.com/Tarlogic)已经开发了一个工具,可以从Unix密钥环中提取Kerberos票据。该工具名为**Tickey**,可以在[**这里**](https://github.com/TarlogicSecurity/tickey)找到。
### Keytab(密钥表) {% hint style="warning" %} 通常,每个主机都部署了一个用于该主机的密钥表凭据,可用于获取有效的凭证缓存(CCACHE)票据授予票据(TGT)。 {% endhint %} 它由Kerberos主体和加密密钥的配对组成,这些密钥是从与主体关联的Kerberos密码派生出来的。由于这些密钥是从主体的密码派生出来的,如果密码更改,密钥表将无效。 密钥表文件可用于获取其范围限定的主体的有效票据授予票据(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 Ticket来**重复使用存储在密钥表文件中的凭据**。 ```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**中的**域管理员**。 {% endhint %} ### Hashes **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-265用作伪随机函数,块大小为32字节->您只能使用PBKDF2\_SHA256哈希的前256位 -> John The Ripper或hashcat可以帮助您破解它
要提取哈希值,您需要成为**FreeIPA服务器**的**root用户**,然后可以使用工具**`dbscan`**来提取它们:
### HBAC规则 这些规则授予用户或主机对资源(主机、服务、服务组等)的特定权限。 ```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 [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)\\
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * 您在**网络安全公司**工作吗?您想在HackTricks中看到您的**公司广告**吗?或者您想获得**PEASS的最新版本或下载PDF格式的HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)! * 发现我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品[**The PEASS Family**](https://opensea.io/collection/the-peass-family) * 获得[**官方PEASS和HackTricks衣物**](https://peass.creator-spring.com) * **加入**[**💬**](https://emojipedia.org/speech-balloon/) [**Discord群组**](https://discord.gg/hRep4RUj7f)或[**电报群组**](https://t.me/peass),或在**Twitter**上**关注**我[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**。** * **通过向**[**hacktricks repo**](https://github.com/carlospolop/hacktricks) **和**[**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **提交PR来分享您的黑客技巧。**