hacktricks/linux-hardening/freeipa-pentesting.md
2023-08-03 19:12:22 +00:00

18 KiB
Raw Blame History

FreeIPA渗透测试

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

这些信息来自以下文章:

基本信息

它是微软Windows Active Directory的开源替代品,主要用作Unix环境的集成管理解决方案。类似于Active DirectoryFreeIPA实现了由MIT Kerberos密钥分发中心支持的完整LDAP目录基础架构。它使用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 Ticket的位置
  • KRB5_KTNAME 如果设置了此变量,它指向要用于身份验证的Keytab文件的位置
  • KRB5_CONFIG 如果设置了此变量,它指向Kerberos配置文件的位置
  • KRB5_KDC_PROFILE 如果设置了此变量它指向包含Key Distribution Center守护程序的其他配置指令的KDC配置文件的位置
  • KRB5RCACHETYPE 此变量指定服务器使用的重放缓存的默认类型
  • KRB5RCACHEDIR 此变量指定服务器使用的重放缓存的默认目录
  • KRB5_TRACE 此变量指定要将跟踪日志输出写入的文件名。跟踪日志可以帮助阐明Kerberos库内部所做的决策。
  • KRB5_CLIENT_KTNAME 此变量设置默认客户端Keytab文件名
  • 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票证非常容易。要重新使用有效的CCACHE票证KRB5CCNAME导出为有效票证文件的路径。系统应该识别环境变量,并在与域交互时尝试使用该凭据材料。

export KRB5CCNAME=/tmp/krb5cc_0
klist

Unix KeyringUnix密钥环

CCACHE TicketsCCACHE票据也可以存储在Linux的keyring密钥环中。密钥环位于内核中使管理员对存储的票据的检索和使用具有更多控制权。票据可以按以下不同方式进行范围限定

  • **KEYRING:name**票据的范围限定为特定的命名密钥环。
  • **KEYRING:process:name**票据的范围限定为特定的进程ID。
  • **KEYRING:thread:name**票据的范围限定为特定的线程。
  • **KEYRING:session:name**票据的范围限定为特定的用户会话。
  • **KEYRING:persistent:uidnumber**票据的范围限定为特定的用户,不考虑会话(默认)。

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

作为攻击者根据票据的范围限定方式从Unix密钥环中重新使用存储的CCACHE Ticket相当困难。幸运的是@Zer1t0来自@Tarlogic已经开发了一个工具可以从Unix密钥环中提取Kerberos票据。该工具名为Tickey,可以在这里找到。

Keytab密钥表

{% hint style="warning" %} 通常每个主机都部署了一个用于该主机的密钥表凭据可用于获取有效的凭证缓存CCACHE票据授予票据TGT。 {% endhint %}

它由Kerberos主体和加密密钥的配对组成这些密钥是从与主体关联的Kerberos密码派生出来的。由于这些密钥是从主体的密码派生出来的如果密码更改密钥表将无效。

密钥表文件可用于获取其范围限定的主体的有效票据授予票据TGT。此身份验证过程不需要密码,因为它包含从密码派生出来的密钥。

解析Keytab文件非常简单可以通过几种方式完成。解析keytab文件的最简单方法是使用klist。第二种方法利用了Cody Thomas创建的一个很棒的Python工具。他的KeytabParser项目将解析出主体及其相关的加密密钥。

攻击者可以通过使用kinit二进制文件生成CCACHE Ticket来重复使用存储在密钥表文件中的凭据

# 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中的域管理员。 {% endhint %}

Hashes

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

  • 用户的密码哈希值以base64形式存储在“userPassword”属性中。该哈希值可能是SSHA512旧版本的FreeIPAPBKDF2_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-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规则

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

https://github.com/CiscoCXSecurity/linikatz

提权

创建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\

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥