hacktricks/linux-hardening/freeipa-pentesting.md

290 lines
18 KiB
Markdown
Raw Normal View History

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