
AS-REP Roasting
预身份验证是Kerberos身份验证的第一步(AS_REQ & AS_REP),它的主要作用是防止密码脱机爆破。默认情况下,预身份验证是开启的,KDC会记录密码错误次数,防止在线爆破。
AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式。但是该攻击方式利用比较局限,因为其需要用户账号设置 "Do not require Kerberos preauthentication(不需要kerberos预身份验证) " 。而该属性默认是没有勾选上的。
勾选上后,域控不会作任何验证就将TGT票据和该用户Hash加密的Session Key返回。因此,攻击者就可以对获取到的用户Hash加密的Session Key进行离线破解,如果破解成功,就能得到该指定用户的密码明文。
使用Rubeus.exe
下载地址:https://github.com/GhostPack/Rubeus
Rubeus里面的kerberoast支持对所有用户或者特定用户执行kerberoasting操作,其原理在于先用LDAP查询域内的spn,再通过发送TGS包,然后直接打印出能使用hashcat或爆破的Hash。 以下的命令会打印出注册于用户下的所有SPN的服务票据的hashcat格式。
Rubeus.exe asreproast
或者
Rubeus.exe asreproast > hash.txt
来将hash导出到文件当中
为了能让hashcat识别,我们要在$krb5asrep后面添加一个$23
然后使用hashcat爆破即可
使用Powerview.ps1&ASREPRoast.ps1
powerview脚本是包含在empire项目下的
empire下载地址:https://github.com/EmpireProject/Empire/
powerview脚本可以查找域中设置了不需要kerberos预身份验证的用户,导入脚本后运行命令
Get-DomainUser -PreauthNotRequired
然后再使用ASREPRoast.ps1获取AS-REP返回的Hash
下载地址:https://github.com/HarmJ0y/ASREPRoast/
先导入脚本,在执行命令
Get-ASREPHash -UserName testuser -Domain g1ts.com
就可以拿到hash,然后就可以用hashcat进行爆破
Kerberoast
SPN在域环境中的应用
Windows域环境是基于微软的活动目录服务工作的,它在网络系统环境中将物理位置分散、所属部门不同的用户进行分组,集中资源,有效地对资源访控制权限进行细粒度的分配,提高了网络环境的安全性及网络资源统一分配管理的便利性。
在域环境中运行的大量应用包含了多种资源,为资源的合理分组、分类和再分配提供了便利。微软给域内的每种资源分配了不同的眼务主体名称( Service Principal Name,SPN)
SPN扫描
概念
在使用 Kerberos协议进行身份验证的网络中,必须在内置账号(Networkservice, Localsystem)或者用户账号下为服务器注册SPN。对于内置账号,SPN将自动进行注册。
但是,如果在域用户账号下运行服务,则必须为要使用的账号手动注册SPN。因为域环境中的每台服务器都需要在Kerberos身份验证服务中注册SPN,所以攻击者会直接向域控制器发送查询请求,获取其需要的服务的SPN,从而知晓其需要使用的服务资源在哪台机器上。
Kerberos身份验证使用sPN将服务实例与服务登录账号关联起来。如果域中的计算机上安了多个服务实例,那么每个实例都必须有自己的SPN。如果客户端可能使用多个名称进行身份验证,那么给定的服务实例可以有多个SPN。例如,SPN总是包含运行的服务实例的主机名称,所以,服务实例可以为其所在主机的每个名称或别名注册一个SPN。
根据Kerberos协议,当用户输人自己的账号和密码登录活动目录时,域控制器会对账号和密码进行验证。验证通过后,密钥分发中心(KDC)会将服务授权的票据(TGT)发送给用户(作为用户访问资源时的身份凭据)
下面通过一个例子来说明。当用户需要访问MSSQL服务时,系统会以当前用户身份向城制器查询SPN为“MSSQL”的记录。找到该SPN记录后,用户会再次与KDC通信,将KDC发放的TGT作为身份凭据发送给KDC,并将需要访问的SPN发送给KDC.KDC中的身份验证量务(AS)对TGT进行解密。
确认无误后,由TGS将一张允许访问该SPN所对应的服务的票据和该SPN所对应的地址发送给用户,用户使用该票据即可访问MSSQL服务。
SPN命令格式
SPN = serviceclass "/" hostname [":"port] ["/" servicename]
serviceclass:服务组件的名称
hostname:以"/"与后面的每次分割,是计算机的FQDN(全限定域名,同时带有计算机名和域名)
port:以冒号分隔,后面的内容为该服务监听的端口号。
servicename:一个字符串,可以是服务的专有名称(DN)、objectGuid、Internet主机名或全限定域名。
常见SPN服务
MSSQL服务的示例代码如下
MSSOLSvc/computer1.g1ts.com:1433
MSSQLSvc:服务组件的名称,此处为 MSSQL服务。
pentest com:主机名为computer1,域名为pentest.com
1433:监听的端口为1433
serviceclass和hostname是必选参数,port和servicename是可选参数,hostname和port之间的冒号只有在该服务对某端口进行监听时才会使用
Exchange服务的示例代码如下
exchangeMDB/EXCAS01.g1ts.com
RDP服务的示例代码如下
TERMSERV/EXCAS01.g1ts.com
WSMan/WinRM/PSRemoting服务的示例代码如下
NSMAN/EXCAS01.g1ts.com
用于进行SPN扫描的PSH脚本
当计算机加入域时,主SPN会自动添加到域的计算机账号的ServicePrincipalName属性中。在安装新的服务后,SPN也会被记录在计算机账号的相应属性中。
SPN扫描也称作“扫描Kerberos服务实例名称”。在活动目录中发现服务的最佳方法就是SPN扫描。SPN扫描通过请求特定SPN类型的服务主体名称来查找服务。
与网络端口扫描相比,SPN扫描的主要特点是不需要通过连接网络中的每个IP地址来检查服务端口(不会因触发内网中的IPS、IDS等设备的规则而产生大量的警告日志),因为SPN查询是 Kerberos票据行为的一部分,所以检测难度较大。
PowerShell-AD-Recon工具包提供了一系列服务与服务登录号和运行服务的主机之间的对应关系,这些服务包括但不限于MSSQL、Exchange、RDP、WinRM。
PowerShell-AD-Recon下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon
(1)利用SPN发现域中所有的MSSQL服务
Discover-PSMSSQLServers下载地址:https://github.com/PyroTek3/PowerShell-AD-Recon/blob/master/Discover-PSMSSQLServers
因为SPN是通过LDAP协议向域控制器进行查询的,所以,攻击者只要获得一个普通的域用户权限,就可以进行SPN扫描。
在域中的任意一台机器上,以域用户身份运行一个Powershell进程,将脚本导入并执行,命令如下
先导入脚本
Discover-PSMSSQLServers
我的机器没有装MSSQL
(2)扫描域中所有的SPN信息
Discover- Psinterestingservices的下载地址见:https://github.com/PyroTek3/PowerShell-AD-Recon/blob/master/Discover-PSInterestingServices
在域中的任意一台机器上,以域用户的身份运行一个Powershell进程,将脚本导入并执行,命令如下
先导入脚本
Discover-PSInterestingServices
可以看到,域中有LDAP、DNS Zone、Wsman、MSSQL等多个SPN
因为每个重要的服务在域中都有对应的SPN,所以,攻击者不必使用复杂的端口扫描技术,只要利用SPN扫描技术就能找到大部分的应用服务器。
(3)powershell自带命令
在不使用第三方的powershell脚本的情况下,输入命令
setspn -T domain -q */* // 查看当前域内所有的 SPN
即可使用windows自带的工具列出域中所有的SPN信息
setspn -T g1ts.com -Q */* //查看指定域g1ts.com注册的SPN,如果指定域不存在,则默认切换到查找本域的SPN
setspn -L <username>/<hostname> //查找指定用户/主机名注册的 SPN
(4)使用GetUserSPNs.ps1脚本
下载地址:https://github.com/nidem/kerberoast.git
(5)使用powerview脚本
同样可以使用上面AS-REP Roasting提到的powerview脚本,此脚本包含在empire中
导入后使用命令
Get-NetUser -SPN
请求服务票据
使用Rubeus
同样可以用到上文提到的Rubeus
Rubeus里面的kerberoast支持对所有用户或者特定用户执行kerberoasting操作,其原理在于先用LDAP查询于内的spn,再通过发送TGS包,然后直接打印出能使用 hashcat 或 john 爆破的Hash。 以下的命令会打印出注册于用户下的所有SPN的服务票据的hashcat格式。
Rubeus.exe kerberoast
使用powershell请求服务票据
请求服务票据
Add-Type -AssemblyName System.IdentityModel New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/WinSer2016.g1ts.com:3306/MySQL"
klist
使用mimikatz
//请求服务票据 kerberos::ask /target:MySQL/WinSer2016.g1ts.com:3306 //列出服务票据 kerberos::list //清除所有票据 kerberos::purge
服务票据的导出
使用 Mimikatz 工具导出
kerberos::list /export
服务票据的暴力破解
使用tgsrepcrack.py脚本
下载地址:https://github.com/nidem/kerberoast.git
Tgsrepcrack.py 是 Kerberoast 工具集中的一个 Python 脚本,可用来对导出的服务票据文件进行离线破解
//python2 tgsrepcrack.py <字典> <导出的服务票据> python2 tgsrepcrack.py wordlists.txt xxxxxx.kirbi
使用 Hashcat 工具
之前我们在请求和导出服务票据时,可以直接得到Hashcat格式的票据,将导出的 Hashcat 格式的票据保存在文件中,使用Hashcat进行爆破即可
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
