FreeIPA Pentesting

Support HackTricks

基本情報

FreeIPAは、主にUnix環境向けのMicrosoft Windows Active Directoryのオープンソースの代替です。これは、Active Directoryに類似した管理のために、完全なLDAPディレクトリとMIT Kerberosキー配布センターを組み合わせています。CAおよびRA証明書管理のためにDogtag 証明書システムを利用し、スマートカードを含む多要素認証をサポートしています。Unix認証プロセスのためにSSSDが統合されています。

フィンガープリント

ファイルと環境変数

  • /etc/krb5.confにあるファイルは、ドメインへの登録に必要なKerberosクライアント情報が保存されています。これにはKDCと管理サーバーの場所、デフォルト設定、およびマッピングが含まれます。

  • IPAクライアントとサーバーのシステム全体のデフォルトは、/etc/ipa/default.confにあるファイルで設定されています。

  • ドメイン内のホストは、認証プロセスのために/etc/krb5.keytabkrb5.keytabファイルを持っている必要があります。

  • 様々な環境変数(KRB5CCNAMEKRB5_KTNAMEKRB5_CONFIGKRB5_KDC_PROFILEKRB5RCACHETYPEKRB5RCACHEDIRKRB5_TRACEKRB5_CLIENT_KTNAMEKPROP_PORT)は、Kerberos認証に関連する特定のファイルと設定を指し示すために使用されます。

バイナリ

ipakdestroykinitklistkpasswdksukswitchkvnoなどのツールは、FreeIPAドメインの管理、Kerberosチケットの処理、パスワードの変更、サービスチケットの取得などの機能において中心的な役割を果たします。

ネットワーク

典型的なFreeIPAサーバーのセットアップを示す図があります。

認証

FreeIPAにおける認証は、Kerberosを利用してActive Directoryのそれを反映しています。ドメインリソースへのアクセスには、有効なKerberosチケットが必要であり、これはFreeIPAドメインの設定に応じて様々な場所に保存されます。

CCACHEチケットファイル

CCACHEファイルは通常**/tmp600**の権限で保存され、Kerberos資格情報を保存するためのバイナリ形式であり、ユーザーの平文パスワードなしで認証を行うために重要です。CCACHEチケットの解析はklistコマンドを使用して行うことができ、有効なCCACHEチケットを再利用するには、KRB5CCNAMEをチケットファイルのパスにエクスポートします。

Unixキーレング

代わりに、CCACHEチケットはLinuxキーレングに保存でき、チケット管理に対するより多くの制御を提供します。チケットストレージの範囲は(KEYRING:nameKEYRING:process:nameKEYRING:thread:nameKEYRING:session:nameKEYRING:persistent:uidnumber)異なり、klistはユーザーのためにこの情報を解析できます。しかし、UnixキーレングからCCACHEチケットを再利用することは課題を伴う場合があり、Kerberosチケットを抽出するためのTickeyのようなツールが利用可能です。

キータブ

Kerberosプリンシパルと暗号化されたキーを含むキータブファイルは、プリンシパルのパスワードを必要とせずに有効なチケット付与チケット(TGT)を取得するために重要です。キータブファイルからの資格情報の解析と再利用は、klistのようなユーティリティやKeytabParserのようなスクリプトを使用して簡単に行えます。

チートシート

Linuxでのチケットの使用方法についての詳細は、以下のリンクで確認できます:

Linux Active Directory

列挙

ldapや他のバイナリツールを使用して列挙を行うことができるか、FreeIPAサーバーのポート443に接続することができます。

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

ホストユーザー、およびグループを作成することが可能です。ホストとユーザーはそれぞれ「ホストグループ」および「ユーザーグループ」と呼ばれるコンテナに整理されます。これらは組織単位(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

FreeIPAadminユーザーは、ADdomain adminsに相当します。

ハッシュ

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-Rules

FreeIPAは、sudo-rulesを介して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

Role-Based Access Control

ロールは、さまざまな特権で構成されており、それぞれが権限のコレクションを含んでいます。これらのロールは、ユーザー、ユーザーグループホスト、ホストグループ、およびサービスに割り当てることができます。たとえば、FreeIPAのデフォルトの「ユーザー管理者」ロールを考えて、この構造を例示します。

ロールUser Administratorには、次の特権があります:

  • ユーザー管理者

  • グループ管理者

  • ステージユーザー管理者

次のコマンドを使用すると、ロール、特権、および権限を列挙することができます:

# 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ユーザーの作成

もし root という名前の新しいユーザーを作成できるなら、彼になりすますことができ、rootとして任意のマシンにSSH接続することができます。

これはパッチが当てられました。

詳細な説明は https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b で確認できます。

参考文献

HackTricksをサポートする

Last updated