hacktricks/linux-hardening/freeipa-pentesting.md
2023-07-07 23:42:27 +00:00

299 lines
24 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 ペントesting
<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>
* **サイバーセキュリティ会社で働いていますか?** **HackTricksで会社を宣伝**したいですか?または、**PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を見つけてください。これは、**Unix**環境の統合管理ソリューションとして主に使用される、Microsoft Windows **Active** **Directory**のオープンソースの**代替**です。
* [**公式のPEASSHackTricks swag**](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)**。**
* **ハッキングのトリックを共有するには、PRを** [**hacktricks repo**](https://github.com/carlospolop/hacktricks) **と** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud) **に提出してください。**
</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**環境の統合管理ソリューションとして使用されます。FreeIPAは、MITの**Kerberos**キー配布センターによってバックアップされた完全な**LDAPディレクトリ**インフラストラクチャを実装しています。Dogtag **Certificate System**を使用してCARA証明書の管理を行い、スマートカードを含む**マルチファクタ**認証を処理する能力を持っています。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`** 設定されている場合、この変数はKey Distribution Centerデーモンの追加の設定ディレクティブが含まれる**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パスワードを要求し、次に新しいパスワードを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
```
<figure><img src="../.gitbook/assets/image (175).png" alt=""><figcaption></figcaption></figure>
### **Unixキーリング**
CCACHEチケットはLinuxのキーリングにも**保存**できます。キーリングはカーネル内に存在し、管理者には**保存されたチケットの取得と使用に対するより多くの制御権限が与えられます**。チケットは以下のような異なる方法でスコープを指定できます:
- **`KEYRING:name`**特定の名前付きキーリングにスコープが指定されます。
- **`KEYRING:process:name`**特定のプロセスIDにスコープが指定されます。
- **`KEYRING:thread:name`**特定のスレッドにスコープが指定されます。
- **`KEYRING:session:name`**特定のユーザーセッションにスコープが指定されます。
- **`KEYRING:persistent:uidnumber`**セッションに関係なく、特定のユーザーにスコープが指定されます(デフォルト)。
Unixキーリング内に保存されたCCACHEチケットのスコープが管理者によってどのように指定されているかによって、解析することが困難になる場合があります。ただし、Unixキーリング内のCCACHEチケットのデフォルトスコープは**`KEYRING:persistent:uidnumber`**です。幸いなことに、ユーザーの**コンテキスト**であれば、`klist`コマンドを使用してこの情報を解析できます。
<figure><img src="../.gitbook/assets/image (3) (1) (4).png" alt=""><figcaption></figcaption></figure>
攻撃者としては、Unixキーリングに保存されたCCACHEチケットを再利用することは、チケットのスコープによってはかなり困難です。幸いなことに、[@Zer1t0](https://github.com/Zer1t0)氏の[@Tarlogic](https://twitter.com/Tarlogic)からは、UnixキーリングからKerberosチケットを抽出するツールが開発されています。このツールは**Tickey**と呼ばれ、[**こちら**](https://github.com/TarlogicSecurity/tickey)で入手できます。
<figure><img src="../.gitbook/assets/image (185).png" alt=""><figcaption></figcaption></figure>
### キータブ<a href="#ff38" id="ff38"></a>
{% hint style="warning" %}
通常、各ホストはそのホストのためにデプロイされたキータブ資格情報を持っており、それを使用してホスト自体の有効なCredential CacheCCACHEチケット発行チケットTGTを取得することができます。
{% endhint %}
キータブは、Kerberosのプリンシパルと暗号化キーのペアで構成されています。これらのキーは、プリンシパルのパスワードから派生しているため、パスワードが変更されるとキータブは無効になります。
キータブファイルは、それがスコープに指定されているプリンシパルのための有効なチケット発行チケットTGTを取得するために使用できます。この認証プロセスでは、パスワードは必要ありません。なぜなら、キータブにはパスワードから派生したキーが含まれているからです。
キータブファイルの解析は非常に簡単で、いくつかの方法で行うことができます。キータブファイルを解析する最も簡単な方法は、`klist`コマンドを使用することです。2番目の方法は、Cody Thomas氏が作成した優れたPythonユーティリティを利用する方法です。彼の[**KeytabParser**](https://github.com/its-a-feature/KeytabParser)プロジェクトは、プリンシパルと関連する暗号化キーを解析します。
<figure><img src="../.gitbook/assets/image (200).png" alt=""><figcaption></figcaption></figure>
攻撃者は、キータブファイルに保存された資格情報を再利用することができます。これは、kinitバイナリを使用してCCACHEチケットを生成することによって行われます。
```powershell
# Parse keytab
klist -k /rtc/krb5.keytab
# Get TGT
kinit -kt /etc/krb5.keytab host/bastion.westeros.local@WESTEROS.LOCAL
```
<figure><img src="../.gitbook/assets/image (205).png" alt=""><figcaption></figcaption></figure>
### チートシート
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 %}
<figure><img src="../.gitbook/assets/image (184).png" alt=""><figcaption></figcaption></figure>
### ホスト、ユーザー、およびグループ <a href="#4b3b" id="4b3b"></a>
**ホスト**、**ユーザー**、および**グループ**を作成することが可能です。ホストとユーザーはそれぞれ「**ホストグループ**」と「**ユーザーグループ**」と呼ばれるコンテナに分類されます。これらは**組織単位**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 <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**の**ドメイン管理者**に相当します。
{% endhint %}
### ハッシュ <a href="#482b" id="482b"></a>
**IPAサーバー**の**root**ユーザーは、パスワードの**ハッシュ**にアクセスできます。
- ユーザーのパスワードハッシュは、「**userPassword**」**属性**に**base64**で保存されます。このハッシュは**SSHA512**古いバージョンのFreeIPAまたは**PBKDF2\_SHA256**である可能性があります。
- システムが**AD**と**統合**されている場合、パスワードの**Nthash**は「**ipaNTHash**」として**base64**で保存されます。
これらのハッシュをクラックするには:
- FreeIPAがADと統合されている場合、**ipaNTHash**は簡単にクラックできます:**base64**を**デコード**して -> **ASCII**の16進数に再エンコードして -> 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を使用してクラックできます。
<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
[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><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>
* **サイバーセキュリティ企業で働いていますか?** HackTricks で **会社を宣伝**したいですか?または、**PEASS の最新バージョンにアクセスしたり、HackTricks を PDF でダウンロード**したいですか?[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop) をチェックしてください!
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family) をご覧ください。独占的な [**NFT**](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 を提出**してください。
</details>