FreeIPA Pentesting

Reading time: 11 minutes

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks

基本信息

FreeIPA 是一个开源的 替代方案,用于 Microsoft Windows Active Directory,主要针对 Unix 环境。它结合了一个完整的 LDAP 目录 和一个 MIT Kerberos 密钥分发中心,管理方式类似于 Active Directory。利用 Dogtag 证书系统 进行 CA 和 RA 证书管理,支持 多因素 认证,包括智能卡。SSSD 集成用于 Unix 认证过程。

指纹

文件和环境变量

  • Kerberos 客户端信息存储在 /etc/krb5.conf 文件中,这是加入域所必需的。这包括 KDC 和管理员服务器的位置、默认设置和映射。
  • IPA 客户端和服务器的系统范围默认设置在 /etc/ipa/default.conf 文件中。
  • 域内的主机必须在 /etc/krb5.keytab 处拥有 krb5.keytab 文件以进行认证过程。
  • 各种环境变量(KRB5CCNAMEKRB5_KTNAMEKRB5_CONFIGKRB5_KDC_PROFILEKRB5RCACHETYPEKRB5RCACHEDIRKRB5_TRACEKRB5_CLIENT_KTNAMEKPROP_PORT)用于指向与 Kerberos 认证相关的特定文件和设置。

二进制文件

工具如 ipakdestroykinitklistkpasswdksukswitchkvno 是管理 FreeIPA 域、处理 Kerberos 票证、修改密码和获取服务票证等功能的核心。

网络

提供了一幅插图,描绘了典型的 FreeIPA 服务器设置。

认证

FreeIPA 中的认证利用 Kerberos,与 Active Directory 中的认证相似。访问域资源需要有效的 Kerberos 票证,具体存储位置取决于 FreeIPA 域配置。

CCACHE 票证文件

CCACHE 文件通常存储在 /tmp 中,权限为 600,是用于存储 Kerberos 凭据的二进制格式,重要的是可以在没有用户明文密码的情况下进行认证。可以使用 klist 命令解析 CCACHE 票证,重新使用有效的 CCACHE 票证涉及将 KRB5CCNAME 导出到票证文件的路径。

Unix 密钥环

另外,CCACHE 票证可以存储在 Linux 密钥环中,提供对票证管理的更多控制。票证存储的范围各异(KEYRING:nameKEYRING:process:nameKEYRING:thread:nameKEYRING:session:nameKEYRING:persistent:uidnumber),klist 能够为用户解析这些信息。然而,从 Unix 密钥环重新使用 CCACHE 票证可能会面临挑战,像 Tickey 这样的工具可用于提取 Kerberos 票证。

Keytab

Keytab 文件包含 Kerberos 主体和加密密钥,对于在不需要主体密码的情况下获取有效的票证授予票(TGT)至关重要。可以使用 klist 等实用程序和 KeytabParser 等脚本轻松解析和重新使用 keytab 文件中的凭据。

备忘单

您可以在以下链接中找到有关如何在 Linux 中使用票证的更多信息:

Linux Active Directory

枚举

warning

您可以通过 ldap 和其他 二进制 工具进行 枚举,或 连接到 FreeIPA 服务器的 443 端口的网页

主机、用户和组

可以创建 主机用户。主机和用户被分类到称为“主机组”和“用户组”的容器中。这些类似于 组织单位(OU)。

在 FreeIPA 中,LDAP 服务器默认允许 匿名绑定,大量数据可以 未经身份验证 进行枚举。这可以枚举所有可用的未经身份验证的数据:

ldapsearch -x

要获取更多信息,您需要使用经过身份验证的会话(请查看身份验证部分以了解如何准备经过身份验证的会话)。

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

从域加入的机器上,您将能够使用 已安装的二进制文件 来枚举域:

bash
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

note

FreeIPAadmin 用户相当于 AD 中的 domain admins

Hashes

IPA serverroot 用户可以访问密码 hashes

  • 用户的密码 hash 存储为 base64 在“userPasswordattribute 中。这个 hash 可能是 SSHA512(旧版本的 FreeIPA)或 PBKDF2_SHA256
  • 如果系统与 ADintegration,则密码的 Nthash 存储为 base64 在“ipaNTHash” 中。

要破解这些 hashes:

• 如果 freeIPA 与 AD 集成,ipaNTHash 很容易破解:你应该 decode base64 -> 重新编码为 ASCII hex -> John The Ripper 或 hashcat 可以帮助你快速破解

• 如果使用的是旧版本的 FreeIPA,则使用 SSHA512:你应该解码 base64 -> 找到 SSHA512 hash -> John The Ripper 或 hashcat 可以帮助你破解

• 如果使用的是新版本的 FreeIPA,则使用 PBKDF2_SHA256:你应该解码 base64 -> 找到 PBKDF2_SHA256 -> 它的 length 是 256 字节。John 可以处理 256 位(32 字节)-> SHA-265 用作伪随机函数,块大小为 32 字节 -> 你只能使用我们的 PBKDF2_SHA256 hash 的前 256 位 -> John The Ripper 或 hashcat 可以帮助你破解

要提取 hashes,你需要在 FreeIPA server 中是 root,在那里你可以使用工具 dbscan 来提取它们:

HBAC-Rules

这些规则授予用户或主机对资源(主机、服务、服务组等)的特定权限。

bash
# 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 执行命令。攻击者可以通过检查这些规则集来识别适用的主机、用户和允许的命令。

bash
# 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 中的默认“用户管理员”角色来举例说明这个结构。

角色 User Administrator 拥有以下特权:

  • 用户管理员
  • 组管理员
  • 阶段用户管理员

使用以下命令可以枚举角色、特权和权限:

bash
# 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 用户创建

warning

如果您可以 创建一个名为 root 的新用户,您可以冒充他并能够 以 root 身份 SSH 进入任何机器。

这已经被修补。

您可以在 https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b 中查看详细说明。

参考文献

tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)

支持 HackTricks