18 KiB
FreeIPA渗透测试
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一家网络安全公司工作吗?想要在HackTricks中看到你的公司广告吗?或者你想要获取PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获取官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
这些信息来自以下文章:
- https://posts.specterops.io/attacking-freeipa-part-i-authentication-77e73d837d6a
- https://posts.specterops.io/attacking-freeipa-part-ii-enumeration-ad27224371e1
- https://www.youtube.com/watch?v=9dOu-7BTwPQ&feature=youtu.be
基本信息
它是微软Windows Active Directory的开源替代品,主要用作Unix环境的集成管理解决方案。类似于Active Directory,FreeIPA实现了由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**权限。从攻击者的角度来看,这是非常重要的,原因如下:
- 可以使用有效的票证进行身份验证,而无需使用相应用户的明文密码。
- CCACHE票证非常便携。可以下载并加载到另一台主机上,而无需更新或验证票证。
解析CCACHE票证可以通过多种不同的方式轻松完成。最简单的方法是使用klist二进制文件进行解析。
klist /tmp/krb5cc_0
对于攻击者来说,重新使用CCACHE票证非常容易。要重新使用有效的CCACHE票证,将KRB5CCNAME导出为有效票证文件的路径。系统应该识别环境变量,并在与域交互时尝试使用该凭据材料。
export KRB5CCNAME=/tmp/krb5cc_0
klist
Unix Keyring(Unix密钥环)
CCACHE Tickets(CCACHE票据)也可以存储在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" %} FreeIPA的admin用户相当于AD中的域管理员。 {% endhint %}
Hashes
IPA服务器的root用户可以访问密码哈希值。
- 用户的密码哈希值以base64形式存储在“userPassword”属性中。该哈希值可能是SSHA512(旧版本的FreeIPA)或PBKDF2_SHA256。
- 如果系统与AD集成,密码的Nthash以base64形式存储在“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 🎥
- 您在网络安全公司工作吗?您想在HackTricks中看到您的公司广告吗?或者您想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks衣物
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享您的黑客技巧。