hacktricks/linux-hardening/freeipa-pentesting.md

23 KiB
Raw Blame History

FreeIPA Pentesting

AWSハッキングをゼロからヒーローまで学ぶ htARTE (HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

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

基本情報

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サーバーがどのように見えるかは以下の通りです:

認証

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 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@Zer1t0がUnix keyringからKerberosチケットを抽出するツールを開発しました。このツールはTickeyと呼ばれ、こちらで見つけることができます。

Keytab

{% hint style="warning" %} 通常、各ホストはそのホスト用のkeytabクレデンシャルがデプロイされ、ホスト自体の有効なCredential Cache(CCACHE) Ticket Granting Ticket(TGT)を取得するために使用されます。 {% endhint %}

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

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

Keytabファイルを解析するのは非常に簡単で、いくつかの方法で実行できます。keytabファイルを解析する最も簡単な方法はklistを使用することです。2番目の方法は、Cody Thomasが作成した素晴らしいpythonユーティリティを利用します。彼のKeytabParserプロジェクトは、プリンシパルとそれに関連する暗号化されたキーを解析します。

攻撃者は、kinitバイナリを通じてCCACHEチケットを生成することで、keytabファイルに保存されたクレデンシャルを再利用することができます。

# 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

詳細情報を取得するには、認証済みセッションを使用する必要があります認証済みセッションの準備方法については、Authenticationセクションを確認してください

# 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ユーザーは、ADdomain adminsに相当します。 {% endhint %}

ハッシュ

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がクラックするのに役立ちます

ハッシュを抽出するには、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/LinikatzV2

権限昇格

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 をチェックしてください。\

htARTE (HackTricks AWS Red Team Expert) で AWSのハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法