hacktricks/linux-hardening/freeipa-pentesting.md

17 KiB
Raw Blame History

FreeIPA 渗透测试

通过 htARTE (HackTricks AWS 红队专家)从零开始学习 AWS 黑客攻击!

支持 HackTricks 的其他方式:

此信息取自以下帖子:

基本信息

它是 Microsoft Windows Active Directory 的一个开源替代品,主要用作Unix环境的集成管理解决方案。与 Active Directory 类似FreeIPA 实现了完整的 LDAP 目录基础设施,由 MIT Kerberos 密钥分发中心支持。它使用 Dogtag 证书系统进行 CA 和 RA 证书管理,使其能够处理多因素认证包括智能卡。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: 如果设置,此变量指向用于认证的密钥表文件的位置
  • KRB5_CONFIG: 如果设置,此变量指向 Kerberos 配置文件的位置
  • KRB5_KDC_PROFILE: 如果设置,此变量指向 KDC 配置文件的位置,其中包含针对密钥分发中心守护进程的额外配置指令。
  • KRB5RCACHETYPE: 此变量指定服务器使用的默认重放缓存类型
  • KRB5RCACHEDIR: 此变量指定服务器使用的默认重放缓存目录
  • KRB5_TRACE: 此变量指定一个文件名以写入跟踪日志输出。跟踪日志可以帮助阐明 Kerberos 库内部做出的决策。
  • KRB5_CLIENT_KTNAME: 此变量设置默认客户端密钥表文件名。
  • KPROP_PORT: 此变量设置 kprop 使用的默认端口

二进制文件

  • ipa: 此二进制文件是管理 FreeIPA 域的标准。它可以用来管理主机、用户、sudo 规则等等。
  • kdestroy: kdestroy 二进制文件用于销毁用户会话中的任何当前Kerberos 票据
  • kinit: kinit 二进制文件用于建立更新 Kerberos 票据
  • klist: klist 二进制文件列出当前使用中的任何Kerberos 票据,以及这些票据提供访问权限的主体。
  • kpasswd: kpasswd 命令用于更改 Kerberos 主体的密码。kpasswd 首先提示输入当前的 Kerberos 密码,然后提示用户两次输入新密码,并更改密码。
  • 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 Ticket非常容易。要重用有效的CCACHE Ticket导出 KRB5CCNAME 到有效票证文件的路径。系统应识别环境变量,并在与域交互时尝试使用该凭据材料。

export KRB5CCNAME=/tmp/krb5cc_0
klist

Unix Keyring

CCACHE Tickets 可以 存储Linux keyring 中。keyring 存在于 内核 中,并为管理员提供了 更多控制存储票据检索和使用的权限。票据可以按以下不同方式限定范围:

  • KEYRING:name 票据限定在特定命名的 Keyring 中。
  • KEYRING:process:name 票据限定在特定进程 id 中。
  • KEYRING:thread:name 票据限定在特定线程中。
  • KEYRING:session:name 票据限定在特定用户会话中。
  • KEYRING:persistent:uidnumber 票据限定在特定用户中,不考虑会话(默认)。

根据管理员如何限定 Unix keyring 内存储的票据解析它可能会很困难。然而Unix keyring 中 CCACHE Tickets 的 默认 范围KEYRING:persistent:uidnumber。幸运的是,如果你处于 用户上下文 中,klist 可以为我们 解析 这些信息。

作为攻击者,重用存储在 Unix keyring 中的 CCACHE 票据取决于票据的限定范围,可能会相当 困难。幸运的是,@Zer1t0@Tarlogic 开发了一个工具,可以从 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。第二种方法利用了 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

要获取更多信息,您需要使用一个认证后的会话(查看认证部分以了解如何准备一个认证会话)。

# 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 用户相当于 AD 中的 domain admins。 {% endhint %}

哈希

IPA 服务器root 用户可以访问密码的哈希

  • 用户的密码哈希以 base64 存储在“userPassword属性中。这个哈希可能是 SSHA512FreeIPA的旧版本PBKDF2_SHA256
  • 如果系统与 AD集成,密码的 Nthashbase64 存储在“ipaNTHash”中。

要破解这些哈希:

• 如果 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-Rules

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

# 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 %}

"用户管理员"权限非常强大(正如其名称所示):

拥有这个权限可以对环境内的用户产生很多不同的影响。利用这个权限,我们可以在 FreeIPA 域内创建一个名为 _root_ 的新用户。

一旦在域中创建了用户,我们可以为该账户获取一个票据,使用 _kinit_。

现在我们可以尝试使用我们新创建的 root 域账户进行 SSH

如图所示,这会将用户带入本地 root 账户!因此,仅仅通过为本地用户创建一个域用户,我们就能使用 root@WESTEROS.LOCAL 账户进行认证,并获得本地 root 账户的用户上下文.

有关此漏洞的更多详情,请查看 https://posts.specterops.io/attacking-freeipa-part-iv-cve-2020-10747-7c373a1bf66b\

从零开始学习 AWS 黑客攻击直到成为专家,通过 htARTE (HackTricks AWS 红队专家)

其他支持 HackTricks 的方式: