SPN —> Kerberoasting

使用SPN扫描,快速寻找内网中注册的服务,可以规避像端口扫描的不确定性探测动作。

TL;DR

原理

服务主体名称(SPN: Service Principal Names)是服务实例,可以将其理解为一个服务(比如 HTTP、MSSQL)的唯一标识符,服务在加入域中时是自动注册的。SPN是唯一标识符,用于将域账户与服务及主机关联起来。

如果想使用 Kerberos 协议来认证服务,那么必须正确配置 SPN。
SPN 查询,实际上就是就是查询 LDAP 中存储的内容。这是正常kerberos票据行为的一部分,因此查询SPN的操作很难被检测

LDAP 协议为一个关系型数据库,其中存储了域内主机的各种配置信息。在域控中默认安装有 ADSI 编辑器,它是 LDAP 的编辑器,可以通过在域控中运行 adsiedit.msc 来打开。

Windows域环境中的SPN格式:

  1. SERVICE/host.name 比如:HTTP/iis.lab.local

目的

查询以域用户身份起的服务的目的,主要是为了后续 Kerberoast做准备。(Kerberos身份认证过程中需要使用SPN,以便将服务实例与服务登录账户相关联)

工具

主要利用工具有:setspn、GetUserSPNs.vbs和Rubeus。

利用Windows自带的setspn工具,普通域用户权限执行即可:

  1. setspn -T domain.com -Q */*
  2. setspn -T rcoil.me -Q */* | findstr "MSSQLSvc"

可以清晰的看到DCServer机器上运行了dns服务。如果网内存在mssql,利用SPN扫描也可以得到相应的结果。

C#代码

代码实现,学习C#编程,一些要点

  1. using System.DirectoryServices;
  2. using System.DirectoryServices.ActiveDirectory;
  3. //在C#中获取域信息的引用为以上两个库
  4. Domain CurrentDomain = Domain.GetCurrentDomain();
  5. DirectoryEntry rootEntry = new DirectoryEntry("LDAP://rootDSE");
  6. //使用LDAP协议进行读取,使用 LDAP 绑定到当前域。
  7. string RootDSE = (string)rootEntry.Properties["defaultNamingContext"].Value;
  8. //获取此 DirectoryEntry 对象的 Active Directory 域服务属性。

Kerberoasting攻击

信息搜集--SPN - 图1
kerberoast认证过程:
信息搜集--SPN - 图2

  1. 用户将AS-REQ数据包发送给KDC(Key Distribution Centre,密钥分发中心-受信任的第三方/域控制器,此处为域控),进行身份认证。(as_request)
  2. KDC验证用户的凭据,如果凭据有效,则返回TGT(Ticket-Granting Ticket,票据授予票据-用于向KDC)。(as_reply)
  3. 如果用户想通过身份认证,访问某个服务(如IIS),那么他需要发起(Ticket Granting Service,票据授予服务-发行服务票证的KDC的子功能)请求,请求中包含TGT以及所请求服务的SPN(Service Principal Name,服务主体名称)。(tgs_request)
  4. 如果TGT有效并且没有过期,TGS会创建用于目标服务的一个服务票据。服务票据使用服务账户的凭据进行加密。(tgs_reply)(Domain Controller查询MySQL服务的SPN,找到对应的帐户后,使用该帐户的NTLM hash,生成TGS)
  5. 用户收到包含加密服务票据的TGS响应数据包。(ap_request)
  6. 最后,服务票据会转发给目标服务,然后使用服务账户的凭据进行解密。(ap_reply)

在第4步时,用户将会收到由目标服务实例的NTLM hash加密生成的TGS(service ticket),加密算法为RC4-HMAC 站在利用的角度,当获得这个TGS后,我们可以尝试穷举口令,模拟加密过程,生成TGS进行比较。如果TGS相同,代表口令正确,就能获得目标服务实例的明文口令

目的

Kerberoasting的目的是在SPN绑定到用户帐户而非计算机帐户的网络上索取与服务相关的服务票证。这里的背景是,如果一个人创建了一个用户,他将根据人类标准选择最有可能的密码,即短语,混有数字的单词等。如果该密码选择不当,则有可能破解哈希并获取明文凭证。
在请求访问网络上的服务的过程中,TGS将发送一个数据包,其中包含使用服务帐户的密码哈希加密的服务票证,就像在AS_REP焙烧攻击中一样,可以离线破解。

攻击思路

综上,域内的任何一台主机,都能够通过查询SPN,向域内的所有服务请求TGS,拿到TGS后对其进行暴力破解

对于破解出的明文口令,只有域用户帐户(Users)的口令存在价值,不必考虑机器帐户的口令(无法用于远程连接)

  1. 查询SPN,找到有价值的SPN,需要满足以下条件:
    • 该SPN注册在域用户帐户(Users)下
    • 域用户账户的权限很高
  2. 请求TGS
  3. 导出TGS
  4. 暴力破解

工具

使用powershell模块Active Directory

安装该模块,import-module .\Microsoft.ActiveDirectory.Management.dll

  1. import-module ActiveDirectory
  2. get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon

使用PowerView

使用kerberoast

自动实现,并且不需要mimikatz,普通用户权限即可:http://www.harmj0y.net/blog/powershell/kerberoasting-without-mimikatz/

如果没有setspn,可以使用GetUserSPNs代替

后门利用

在我们取得了SPN的修改权限后,可以为指定的域用户添加一个SPN,这样可以随时获得该域用户的TGS,经过破解后获得明文口令
例如为域用户Administrator添加SPNVNC/DC1.test.com,参数如下:

  1. setspn.exe -U -A VNC/DC1.test.com Administrator //添加
  2. Invoke-Kerberoast -AdminCount -OutputFormat Hashcat | fl //获取TGS

与AS_REP Roasting的区别

TL;DR 介绍

  1. ASREQ: Client向KDC发起ASREQ,请求凭据是Client hash加密的时间戳
  2. AS_REP: KDC使用Client hash进行解密,如果结果正确就返回用krbtgt hash加密的TGT票据,TGT里面包含PAC,PAC包含Client的sid,Client所在的组。

Kerberos内的初始身份验证过程中发生了AS_REP焙烧。滥用事实是,对于带有选项“不需要设置Kerberos预身份验证”的帐户,不需要在开始时发送(通常需要的)加密时间戳(带有用户密码哈希)。因此,网络上知道受影响帐户名称的每个人都可以要求KDC以该用户身份进行身份验证,并反过来获取AS_REP响应,该响应部分用AS_REP可焙烧帐户的密码哈希加密。一旦获得,攻击者便可以尝试离线破解哈希并获取明文凭据。

现在,使用“不需要Kerberos预身份验证”选项,此帐户的时间戳记内容被禁用,只需要默认的Kerberos明文消息即可请求TGT。
这样,拥有该帐户正确名称的任何用户都可以请求TGT,而TGT将作为AS_REP的一部分发送-再次使用部分密码进行加密,这些密码使用我们要求的用户密码哈希进行加密。然后,可以使用此信息尝试破解哈希,以使明文密码脱机。

对于域用户,如果设置了选项”Do not require Kerberos preauthentication”,此时向域控制器的88端口发送ASREQ请求,对收到的ASREP内容(enc-part底下的ciper,因为这部分是使用用户hash加密session-key,我们通过进行离线爆破就可以获得用户hash)重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat对其破解,最终获得该用户的明文口令

区别

AS_REP烘焙是在Kerberos身份验证过程的最开始进行的。攻击者只需要对网络的物理访问,但还必须知道他要向TGT请求的帐户的主体名称(用户名)。需要设置选项“不要求对对象进行Kerberos预身份验证”,因此在如今的评估中不太可能找到该选项。

Kerberos滥用正在使用Kerberos的环境中滥用合法功能。问题在于,服务票证已使用SPN帐户的哈希值加密,并且Active Directory的每个帐户都可以请求此类票证。如果密码很弱,攻击者很可能能够破解它。因此,他只需要检索有效的用户帐户和凭据。

工具

Rebeus

  1. GetNPUsers.py domain.com -no-pass -usersfile users.txt
  2. 使用hashcat尝试进行破解
  3. hashcat -m 18200 asrephash /usr/share/wordlists/rockyou.txt

参考:

https://www.anquanke.com/post/id/87050 https://rcoil.me/2019/06/【域渗透】SPN 扫描利用/ https://3gstudent.github.io/3gstudent.github.io/域渗透-Kerberoasting/ https://luemmelsec.github.io/Kerberoasting-VS-AS-REP-Roasting/ https://www.anquanke.com/post/id/190261