hacktricks/linux-hardening/freeipa-pentesting.md

293 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# FreeIPA Pentesting
<details>
<summary><strong>AWSハッキングをゼロからヒーローまで学ぶ</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法:
* **HackTricksにあなたの会社を広告したい場合**や**HackTricksをPDFでダウンロードしたい場合**は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式PEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手する
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを手に入れる
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)に**参加する**か、[**テレグラムグループ**](https://t.me/peass)に参加するか、**Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)を**フォロー**する。
* **HackTricks**と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のgithubリポジトリにPRを提出して、あなたのハッキングのコツを共有する。
</details>
この情報は以下の投稿から取得されました:
* [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はMIT **Kerberos** Key Distribution Centerによって支えられた完全な**LDAPディレクトリ**インフラを実装しています。CA & RA証明書管理のためにDogtag **Certificate System**を使用し、スマートカードを含む**多要素**認証を処理する能力を持っています。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`:** 設定されている場合、この変数は認証に使用される**Keytab**ファイルの**場所**を指します。
* **`KRB5_CONFIG`:** 設定されている場合、この変数は**Kerberos設定**ファイルの**場所**を指します。
* **`KRB5_KDC_PROFILE`:** 設定されている場合、この変数はKDC設定ファイルの**場所**を指します。これには、Key Distribution Centerデーモンの追加設定ディレクティブが含まれています。
* **`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パスワードを求め、次に新しいパスワードを2回ユーザーに求め、パスワードが変更されます。
* **ksu:** Ksuは、現在の**ユーザーコンテキスト**を切り替えるために、suバイナリの**代替**として使用できます。
* **kswitch:** kswitchコマンドは、使用中の**クレデンシャルキャッシュ**を**切り替え**ます。
* **kvno:** kvnoバイナリは、指定された**Kerberos**プリンシパルの**サービスチケット**を取得し、各チケットのキーバージョン番号を出力します。
### ネットワーク
FreeIPAサーバーがどのように見えるかは以下の通りです:
<figure><img src="../.gitbook/assets/image (197).png" alt=""><figcaption></figcaption></figure>
## 認証
FreeIPAは**認証**に**Kerberos**を使用しているため、このプロセスは**Active Directory**での**認証**と非常に似ています。ドメイン上のリソースに**アクセス**するためには、そのリソースの**有効なKerberosチケット**をユーザーが持っている必要があります。これらのチケットは、FreeIPAドメインの設定に基づいて、さまざまな場所に保存されることがあります。
### **CCACHEチケットファイル**
チケットがディスク上の**ファイル**として**保存**されるように設定されている場合、標準の形式とタイプは**CCACHE**ファイルです。これは、Kerberosクレデンシャルを保存するためのシンプルなバイナリファイル形式です。これらのファイルは通常**`/tmp`**に保存され、**600**の権限でスコープされています。攻撃者の観点からは、以下の理由で重要です:
1. 有効なチケットは、対応するユーザーのプレーンテキスト**パスワード**がなくても**認証に利用**できます。
2. **CCACHE**チケットは非常に**移植性が高い**です。チケットをダウンロードして他のホストにロードすることができ、チケットを更新または検証する必要はありません。
CCACHEチケットの**解析**は、さまざまな方法で簡単に行うことができます。最も簡単な方法は、klistバイナリで解析することです。
```
klist /tmp/krb5cc_0
```
<figure><img src="../.gitbook/assets/image (70).png" alt=""><figcaption></figcaption></figure>
攻撃者にとって、CCACHEチケットを再利用することは非常に簡単です。有効なCCACHEチケットを**再利用**するには、**KRB5CCNAME**を有効なチケットファイルの**パス**に**エクスポート**します。システムは環境変数を認識し、ドメインとのやり取りにその認証情報を使用しようと試みます。
```bash
export KRB5CCNAME=/tmp/krb5cc_0
klist
```
### **Unix Keyring**
CCACHEチケットはLinuxの**keyring**に**保存**されることもあります。keyringは**カーネル**内に存在し、管理者が保存されたチケットの取得と使用を**より制御**できるようにします。チケットは以下の異なる方法でスコープされます:
* **`KEYRING:name`:** チケットは特定の名前付きKeyringにスコープされます。
* **`KEYRING:process:name`:** チケットは特定のプロセスIDにスコープされます。
* **`KEYRING:thread:name`:** チケットは特定のスレッドにスコープされます。
* **`KEYRING:session:name`:** チケットは特定のユーザーセッションにスコープされます。
* **`KEYRING:persistent:uidnumber`:** チケットはセッションに関係なく特定のユーザーにスコープされます(デフォルト)。
管理者がUnix keyring内に保存したチケットをどのようにスコープしたかによって、それを解析するのは難しいかもしれません。しかし、Unix keyring内のCCACHEチケットの**デフォルトのスコープ**は**`KEYRING:persistent:uidnumber`**です。幸いにも、**ユーザー**の**コンテキスト**内にいれば、`klist`がこの情報を**解析**してくれます。
攻撃者にとって、Unix **keyring**に保存されたCCACHEチケットを**再利用**することは、チケットのスコープによってはかなり**難しい**です。幸いなことに、[@Tarlogic](https://twitter.com/Tarlogic)の[@Zer1t0](https://github.com/Zer1t0)がUnix keyringからKerberosチケットを抽出するツールを開発しました。このツールは**Tickey**と呼ばれ、[**こちら**](https://github.com/TarlogicSecurity/tickey)で見つけることができます。
### Keytab <a href="#ff38" id="ff38"></a>
{% hint style="warning" %}
通常、各ホストはそのホスト用のkeytabクレデンシャルがデプロイされ、ホスト自体の有効なCredential Cache(CCACHE) Ticket Granting Ticket(TGT)を取得するために使用されます。
{% endhint %}
これは**Kerberosプリンシパルと暗号化されたキー**のペアで構成されており、プリンシパルに関連付けられたKerberosパスワードから派生したキーです。これらのキーはプリンシパルのパスワードから派生しているため、その**パスワードが変更されるとkeytabは無効になります**。
Keytabファイルは、それがスコープされているプリンシパルの有効なチケット付与チケットTGTを**取得するために使用**できます。この認証プロセスはパスワードを**要求しません**。なぜなら、それはパスワードから派生したキーを含んでいるからです。
Keytabファイルを解析するのは非常に簡単で、いくつかの方法で実行できます。**keytab**ファイルを**解析**する最も簡単な方法は**klist**を使用することです。2番目の方法は、[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 %}
### ホスト、ユーザー、およびグループ <a href="#4b3b" id="4b3b"></a>
**ホスト**、**ユーザー**、および**グループ**を作成することができます。ホストとユーザーはそれぞれ「**ホストグループ**」および「**ユーザーグループ**」と呼ばれるコンテナに分類されます。これらは**組織単位**OUに似ています。
FreeIPAのデフォルトでは、LDAPサーバーは**匿名バインド**を許可し、大量のデータが**認証なしで**列挙可能です。これにより、認証なしで利用可能なすべてのデータを列挙できます:
```
ldapsearch -x
```
**詳細情報**を取得するには、**認証済み**セッションを使用する必要があります認証済みセッションの準備方法については、Authenticationセクションを確認してください
```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 <username> --all
ipa usergroup-show <user group> --all
ipa host-find <host> --all
ipa hostgroup-show <host group> --all
```
{% hint style="info" %}
**FreeIPA**の**admin**ユーザーは、**AD**の**domain admins**に相当します。
{% endhint %}
### ハッシュ <a href="#482b" id="482b"></a>
**IPAサーバー**の**root**ユーザーはパスワードの**ハッシュ**にアクセスできます。
* ユーザーのパスワードハッシュは、"**userPassword**" **属性**に**base64**で保存されます。このハッシュは**SSHA512**古いバージョンのFreeIPAまたは**PBKDF2_SHA256**の可能性があります。
* システムが**AD**と**統合**している場合、パスワードの**Nthash**は"**ipaNTHash**"に**base64**で保存されます。
これらのハッシュをクラックするには:
• 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がクラックするのに役立ちます
<figure><img src="../.gitbook/assets/image (33).png" alt=""><figcaption></figcaption></figure>
ハッシュを抽出するには、**FreeIPAサーバー**で**root**である必要があります。そこで**`dbscan`**ツールを使用して抽出できます:
<figure><img src="../.gitbook/assets/image (196).png" alt=""><figcaption></figcaption></figure>
### HBACルール <a href="#482b" id="482b"></a>
これらは、ユーザーやホストにリソース(ホスト、サービス、サービスグループ...)に対する特定の権限を付与するルールです。
```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ルール
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 <sudorule> --all
```
### ロールベースのアクセス制御
各**ロール**は一連の**権限**を含み、それらの権限は**パーミッション**のセットを含んでいます。ロールは**ユーザー**、ユーザー**グループ**、**ホスト**、ホストグループ、およびサービスに**適用**されます。この概念を説明するために、FreeIPAのデフォルトの「ユーザー管理者」ロールについて話しましょう。
<figure><img src="../.gitbook/assets/image (161).png" alt=""><figcaption></figcaption></figure>
上のスクリーンショットが示すように、「ユーザー管理者」ロールには以下の権限が含まれています:
* **ユーザー管理者**
* **グループ管理者**
* **ステージユーザー管理者**
さらに詳しく掘り下げて、各**権限**に委任された**パーミッション**を列挙することができます:
<figure><img src="../.gitbook/assets/image (189).png" alt=""><figcaption></figcaption></figure>
見ての通り、「**ユーザー管理者**」ロールは環境内にかなり**多くのパーミッション**を含んでいます。**ロール**、**権限**、および**パーミッション**の一般的な概念と構造を理解することは、環境全体で攻撃パスを特定する上で重要になることがあります。
```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
ipa privilege-find
ipa privilege-show <privilege> --all
ipa permission-find
ipa permission-show <permission> --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 %}
"**User Administrators**" 権限は、その名が示す通り非常に強力です:
<figure><img src="../.gitbook/assets/image (182).png" alt=""><figcaption></figcaption></figure>
この権限には、環境内のユーザーに影響を与えるさまざまな力が伴います。この権限を使用して、FreeIPAドメイン内に\_root\_という名前の新しいユーザーを**作成できます**。
<figure><img src="../.gitbook/assets/image (158).png" alt=""><figcaption></figcaption></figure>
ドメイン内にユーザーが作成されたら、\_kinit\_を使用してそのアカウントの**チケットを取得できます**。
<figure><img src="../.gitbook/assets/image (178).png" alt=""><figcaption></figcaption></figure>
これで、新しく作成したrootドメインアカウントを使用して**SSH**を試みることができます。
<figure><img src="../.gitbook/assets/image (176).png" alt=""><figcaption></figcaption></figure>
示されているように、これによりユーザーはローカルの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) をチェックしてください。\\
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert) で</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>AWSのハッキングをゼロからヒーローまで学ぶ</strong></a><strong></strong></summary>
HackTricksをサポートする他の方法
* **HackTricksにあなたの会社を広告したい**、または**HackTricksをPDFでダウンロードしたい**場合は、[**サブスクリプションプラン**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**公式のPEASS & HackTricksグッズ**](https://peass.creator-spring.com)を入手してください。
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションをチェックしてください。
* 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)や[**テレグラムグループ**](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を提出して、あなたのハッキングのコツを**共有してください**。
</details>