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

24 KiB
Raw Blame History

FreeIPA ペントesting

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
  • サイバーセキュリティ会社で働いていますか? HackTricksで会社を宣伝したいですか?または、PEASSの最新バージョンにアクセスしたり、HackTricksをPDFでダウンロードしたいですか?SUBSCRIPTION PLANSをチェックしてください!
  • The PEASS Familyを見つけてください。これは、Unix環境の統合管理ソリューションとして主に使用される、Microsoft Windows Active Directoryのオープンソースの代替です。
  • 公式のPEASSHackTricks swagを手に入れましょう。
  • 💬 Discordグループまたはtelegramグループに参加するか、Twitterフォローしてください🐦@carlospolopm
  • ハッキングのトリックを共有するには、PRを hacktricks repo hacktricks-cloud repo に提出してください。

この情報は以下の投稿から取得されました:

基本情報

これは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サーバーの見た目です

認証

FreeIPAは認証にKerberosを使用しているため、このプロセスはActive Directory認証と非常に似ています。ドメイン上のリソースにアクセスするためには、ユーザーはそのリソースに対して有効なKerberosチケットを持っている必要があります。これらのチケットは、FreeIPAドメインの設定に基づいて、さまざまな場所に保存されることがあります。

CCACHEチケットファイル

チケットがディスク上のファイルとして保存される場合、標準の形式とタイプはCCACHEファイルです。これはKerberosの資格情報を保存するためのシンプルなバイナリファイル形式です。これらのファイルは通常、**/tmp**に保存され、600のパーミッションでスコープが設定されています。攻撃者の観点からは、以下の理由で重要です:

  1. 有効なチケットは、対応するユーザーの平文のパスワードを必要とせずに認証に利用できます。
  2. CCACHEチケットは非常に移植性が高いです。チケットをダウンロードして別のホストにロードすることができ、チケットを更新または検証する必要はありません。

CCACHEチケットの解析は、さまざまな方法で簡単に行うことができます。最も簡単な方法は、klistバイナリを使用して解析することです。

klist /tmp/krb5cc_0

攻撃者にとって、有効なCCACHEチケットの再利用は非常に簡単です。有効なCCACHEチケットを再利用するには、KRB5CCNAMEを有効なチケットファイルのパスエクスポートします。システムは環境変数を認識し、ドメインとのやり取り時にその認証資格情報を使用しようとします。

export KRB5CCNAME=/tmp/krb5cc_0
klist

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コマンドを使用してこの情報を解析できます。

攻撃者としては、Unixキーリングに保存されたCCACHEチケットを再利用することは、チケットのスコープによってはかなり困難です。幸いなことに、@Zer1t0氏の@Tarlogicからは、UnixキーリングからKerberosチケットを抽出するツールが開発されています。このツールはTickeyと呼ばれ、こちらで入手できます。

キータブ

{% hint style="warning" %} 通常、各ホストはそのホストのためにデプロイされたキータブ資格情報を持っており、それを使用してホスト自体の有効なCredential CacheCCACHEチケット発行チケットTGTを取得することができます。 {% endhint %}

キータブは、Kerberosのプリンシパルと暗号化キーのペアで構成されています。これらのキーは、プリンシパルのパスワードから派生しているため、パスワードが変更されるとキータブは無効になります。

キータブファイルは、それがスコープに指定されているプリンシパルのための有効なチケット発行チケットTGTを取得するために使用できます。この認証プロセスでは、パスワードは必要ありません。なぜなら、キータブにはパスワードから派生したキーが含まれているからです。

キータブファイルの解析は非常に簡単で、いくつかの方法で行うことができます。キータブファイルを解析する最も簡単な方法は、klistコマンドを使用することです。2番目の方法は、Cody Thomas氏が作成した優れたPythonユーティリティを利用する方法です。彼のKeytabParserプロジェクトは、プリンシパルと関連する暗号化キーを解析します。

攻撃者は、キータブファイルに保存された資格情報を再利用することができます。これは、kinitバイナリを使用してCCACHEチケットを生成することによって行われます。

# 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 {% endcontent-ref %}

列挙

{% hint style="warning" %} 列挙は、ldapや他のバイナリツールを使用するか、FreeIPAサーバーのポート443でのウェブページに接続することで実行できます。 {% endhint %}

ホスト、ユーザー、およびグループ

ホストユーザー、およびグループを作成することが可能です。ホストとユーザーはそれぞれ「ホストグループ」と「ユーザーグループ」と呼ばれるコンテナに分類されます。これらは組織単位OUに類似しています。

デフォルトでは、FreeIPAではLDAPサーバーが匿名バインドを許可し、多くのデータが非認証で列挙可能です。これにより、非認証で利用可能なすべてのデータを列挙することができます:

ldapsearch -x

さらなる情報を得るためには、認証済みのセッションを使用する必要があります(認証済みセッションの準備方法については、認証セクションを確認してください)。

# 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"

ドメインに参加したマシンからは、インストールされたバイナリを使用してドメインを列挙することができます。

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" %} FreeIPAadminユーザーは、ADドメイン管理者に相当します。 {% endhint %}

ハッシュ

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を使用してクラックできます。

ハッシュを抽出するには、FreeIPAサーバーのrootである必要があります。そこで、ツール**dbscan**を使用してハッシュを抽出できます:

HBACルール

これらは、ユーザーやホストにリソース(ホスト、サービス、サービスグループなど)に対する特定の権限を付与するルールです。

# 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としてのコマンドの実行権限を制限または委任するために使用できます。攻撃者として、これらのルールセットが適用されるホストとユーザー、およびルールセットを通じて許可されるコマンドを列挙することができます。

# 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のデフォルトの「ユーザー管理者」ロールについて説明しましょう。

上記のスクリーンショットに示されているように、「ユーザー管理者」ロールには次の特権が含まれています:

  • ユーザー管理者
  • グループ管理者
  • ステージユーザー管理者

さらに、各特権に委任された許可を詳細に調べることができます:

ユーザー管理者」ロールには、環境内にかなり多くの許可が含まれていることがわかります。ロール特権、および許可の一般的な概念と構造を理解することは、環境全体での攻撃経路の特定に重要です。

# 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 では、いくつかの権限を悪用してドメインを侵害する方法の簡単な例が示されています。

Linikatz

https://github.com/CiscoCXSecurity/linikatz

特権昇格

rootユーザーの作成

{% hint style="warning" %} 名前が root の新しいユーザーを作成できる場合、そのユーザーになりすまして任意のマシンに root として SSH できます。

これは修正されました。 {% endhint %}

User Administrators」特権は非常に強力です(その名前が示すように):

この特権には、環境内のユーザーに影響を与えるためのさまざまな権限が付属しています。この特権を使用して、FreeIPA ドメイン内に新しいユーザーである _root を作成できます。

ドメイン内にユーザーが作成されたら、 _kinit を使用してアカウントのチケットを取得できます。

これで、新しく作成した root ドメインアカウントを使用して SSH を試行できます。

表示されるように、これによりユーザーはローカルの root アカウントに移動します!したがって、ローカルユーザーのためにドメインユーザーを作成するだけで、root@WESTEROS.LOCAL アカウントを使用して認証し、ローカル root アカウントのユーザーコンテキストを取得できました。

この脆弱性の詳細については、https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b を参照してください。

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥