# 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来分享您的黑客技巧。**