Kerberos协议探索系列之扫描与爆破篇

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

hashcat使用说明hashcat使用说明

0x00 引言 Kerberos是一种网络身份验证协议,由MIT(麻省理工大学)提出。它旨在为客户端/服务器应用程序提供强身份验证,通过使用密钥加密技术。然而,在了解Kerberos的过程中,我发现许多相关文章都是机器直接翻译的,有些写得很好,但实际操作性较弱,可能会让初次接触Kerberos的人感到无从下手。因此,本文旨在通过详细的实验结合原理,介绍与Kerberos相关的一些攻击技术。本文将分为三篇。第一篇将介绍域环境和Kerberos协议的说明,以及Kerberoasting攻击技术。第二篇将介绍MS14068漏洞和Kerberos票据的利用。第三篇将介绍Kerberos委派的攻击技术和原理。

hashcat使用说明

0x01 域环境 在介绍Kerberos之前,先了解一些域环境的概念。域的产生是为了解决企业内部的资源管理问题。例如,一个公司可以在网络中建立一个域环境,以便更方便地管理内部资源。在一个域中,有域控、域管理员、普通用户、主机等各种资源。在下图中,YUNYING.LAB是其他两个域的根域,NEWS.YUNYING.LAB和DEV.YUNYING.LAB是YUNYING.LAB的子域,这三个域组成了一个域树。子域可以理解为一个集团在不同业务上的分公司,它们有一些业务重合的点,但都属于YUNYING.LAB这个根域,同时又独立运作。TEST.COM也是一个独立的域树,YUNYING.LAB和TEST.COM组合起来被称为一个域林。

hashcat使用说明

本文以根域为YUNYING.LAB的域为例进行演示。YUNYING.LAB的域控是DC.YUNYING.LAB,子域NEWS.YUNYING.LAB和DEV.YUNYING.LAB的域控分别是NEWSDC.NEWS.YUNYING.LAB和DEVDC.DEV.YUNYING.LAB。上面提到的都是FQDN(Fully Qualified Domain Name,全限定域名),即同时包含主机名和域名的名称。例如,DC.YUNYING.LAB中的DC是主机名,域名是YUNYING.LAB,所以它的FQDN名称是DC.YUNYING.LAB。

hashcat使用说明

如果想了解如何搭建域环境和建立子域,可以参考一些在线说明。本文中使用的操作系统是Windows Server 2008 R2+Windows 7。

0x02 Kerberos简介 在Kerberos认证中,最主要的问题是如何证明“你是你”的问题。例如,当一个Client想要访问Server服务器上的某个服务时,Server如何判断Client是否有权限访问自己主机上的服务,并确保即使通信内容被拦截或篡改,也不会影响通信的安全性。这正是Kerberos所解决的问题。在域渗透过程中,Kerberos协议的攻防也非常重要。

1 Kerberos协议框架 Kerberos协议中主要涉及三个角色:访问服务的Client、提供服务的Server和KDC(Key Distribution Center,密钥分发中心)。

其中,KDC服务通常安装在域的域控中,而Client和Server是域内的用户或服务,例如HTTP服务、SQL服务。在Kerberos中,Client是否有权限访问Server端的服务由KDC发放的票据决定。

如果将Kerberos中的票据类比为一张火车票,那么Client端就是乘客,Server端就是火车,而KDC就是车站的认证系统。只有当Client端的票据是合法的(由乘客本人购买并持有的身份证明)且具有访问Server端服务的权限(车票对应正确的车次),乘客才能上车。不同于火车票的是,Kerberos中存在两张票,而火车票只有一张。

KDC服务框架中包含一个KRBTGT账户,它是在创建域时系统自动创建的一个账号,可以暂时理解为一个无法登录的账号。

2 Kerberos认证流程 当Client想要访问Server上的某个服务时,需要先向AS证明自己的身份,然后通过AS发放的TGT向Server发起认证请求。这个过程分为三个阶段:

(1) The Authentication Service Exchange:Client与AS的交互
Client首先向KDC的AS发送Authenticator1,其中包含通过Client密码加密的时间戳、Client ID、网络地址和加密类型等内容。

AS接收到Client的请求后,根据KDC中存储的密码来解密Authenticator1。如果解密成功并验证信息无误,AS会返回由Client密码加密的sessionkey-as和TGT(由KRBTGT密码加密的sessionkey-as和时间戳等信息)给Client。

(2) The Ticket-Granting Service (TGS) Exchange:Client与TGS的交互
Client收到加密后的sessionkey-as和TGT后,使用自身密码解密得到sessionkey-as,但无法解密TGT。然后,Client使用sessionkey-as加密时间戳和TGT,向KDC中的TGS(Ticket Granting Server,票据授权服务器)发起请求,以获取访问Server的票据。

TGS收到Client发送的TGT和sessionkey-as加密的时间戳后,首先检查自身是否存在Client所请求的服务。如果服务存在,则使用KRBTGT密码解密TGT。通常情况下,TGS会检查TGT中的时间戳,以查看TGT是否过期,并验证原始地址是否与TGT中保存的地址相同。验证成功后,TGS将使用sessionkey-as加密的sessionkey-tgs和Server密码加密的sessionkey-tgs发送给Client。

(3) The Client/Server Authentication Exchange:Client与Server的交互
Client收到sessionkey-as加密的sessionkey-tgs和Server密码加密的sessionkey-tgs后,使用sessionkey-as解密得到sessionkey-tgs,并将sessionkey-tgs加密的时间戳和ST一起发送给Server。

Server通过自身密码解密ST,得到sessionkey-tgs,并使用sessionkey-tgs解密Authenticator3以获取时间戳。如果验证正确,Server返回验证成功的消息。

这就是Kerberos认证的流程,由于篇幅限制,上述过程进行了简化说明。如需更详细的信息,请参考下面的链接。

3 PAC 在Kerberos中,除了证明Client的身份外,还需要确定Client是否具有访问Server服务的权限。为了解决这个问题,微软在Kerberos实现中引入了PAC(Privilege Attribute Certificate,特权属性证书)的概念。可以将PAC理解为一种校验信息,类似于火车票的一等座和二等座,用于区分不同权限的方式。

(1) PAC的实现
当用户与KDC完成认证过程后,Client在访问Server提供的服务时,Server需要将Client的User SID等信息传递给KDC。KDC根据SID判断用户的用户组信息和用户权限,并将结果返回给Server。Server将此信息与用户所请求的资源的ACL进行比较,最终决定是否提供相应的服务。

PAC通常存储在KRBASREP中的TGT中,并由KDC密码加密。同时,PAC中包含两个数字签名:PACSERVERCHECKSUM和PACPRIVSVRCHECKSUM,分别由Server端密码和KDC的密码加密。

TGS在解密TGT并验证签名正确后,重新构造包含新PAC的ST返回给Client。Client将ST发送给Server进行验证。

(2) Server与KDC
PAC可以理解为一串校验信息,为防止伪造和篡改,通常存储在TGT中,并由KDC密码加密。尾部还有两个数字签名,分别由KDC密码和Server密码加密,以防止数字签名内容被篡改。

0x03 Kerberos与SPN
1 SPN简介
SPN(Service Principal Names,服务主体名称)是服务实例的唯一标识符。Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联。如果在整个林或域中的计算机上安装了多个服务实例,则每个实例都必须具有自己的SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个SPN。SPN始终包含运行服务实例的主机的名称,因此服务实例可以为其主机的每个名称或别名注册SPN。

如果想要使用Kerberos协议进行服务认证,就必须正确配置SPN。

2 SPN格式与配置
在SPN的语法中,有四个元素,其中两个是必需的,另外两个是可选的:

/: :标识服务类的字符串
:服务所在主机名称
:服务端口
:服务名称

例如,如果要将域中一台名为S2的主机上的MSSQL服务注册到SPN中,可以使用以下命令:Setspn -A MSSQLSvc/s2.yunying.lab:1433 tsvc

注册成功后,可以使用命令setspn -T yunying.lab –q /或setspn –q /来查看已注册的SPN。SPN在其注册的林中必须是唯一的。如果不唯一,身份验证将失败。

在注册SPN时,可以使用NetBIOS名称(如s2),也可以使用FQDN(如s2.yunying.lab)。如果发现某种名称注册的SPN无法成功访问,可以尝试使用其他名称。

3 SPN扫描
在了解了Kerberos和SPN之后,可以通过SPN来获取所需的信息,例如想知道域内哪些主机安装了什么服务,就不需要进行批量的网络端口扫描。相比传统的网络端口扫描,SPN扫描具有更高的隐蔽性,因为它不需要直接与服务主机建立连接。

(1) 扫描工具
有多种扫描工具可供选择,下面介绍几种常见的工具:

Discover-PSMSSQLServers:Discover-PSMSSQLServers是Powershell-AD-Recon工具集中的一个工具,用于查询已注册的MSSQL类型的SPN。

GetUserSPNs:GetUserSPNs是Kerberoast工具集中的一个Powershell脚本,用于查询域内注册的SPN。

PowerView:PowerView是由Will Schroeder开发的Powershell脚本,已集成在Powersploit和Empire工具中。PowerView相对于其他工具更详细地返回与不同用户的objectsid相关的信息。

还有其他一些脚本,使用方法类似,可以根据需要选择合适的工具。大多数工具都可以在GitHub上找到下载链接。

(2) 原理说明
在SPN扫描过程中,可以通过脚本、命令直接查询内网已注册的SPN内容。那么,想了解这个过程是如何实现的,就需要提到LDAP协议。

LDAP协议全称为Lightweight Directory Access Protocol,是一种用于查询和更新Active Directory的目录服务通信协议。AD域服务利用LDAP命名路径(LDAP naming path)来表示对象在AD内的位置,以便用于访问AD内的对象。

LDAP数据的组织方式可以类比为关系型数据库,其中存储了域内主机的各种配置信息。在域控中,默认安装了ADSI编辑器(Active Directory Service Interfaces Editor),可以通过在域控中运行adsiedit.msc来打开(只有域控中才有整个域内的配置信息)。

通过adsiedit.msc,可以修改和编辑LDAP。在SPN查询时,实际上就是查询LDAP中存储的内容。例如,在实验环境域YUNYING.LAB中,存在名为svcserver的OU(Organization Unit,组织单位,类似于部门,如开发部、财务部等),其中包含了tsvc这个用户。从用户属性中可以看到tsvc注册过的SPN内容。

当在一台主机上执行setspn -T yunying.lab -q /命令查询域内SPN时,通过抓包可以看到实际上是通过LDAP协议向域控中安装的LDAP服务查询SPN的内容。

因此,这些Powershell脚本实际上主要是通过查询LDAP的内容,并对返回结果进行过滤和展示。

0x04 Kerberoasting
在前面介绍Kerberos的认证流程时提到,在KRBTGSREP中,TGS会返回给Client一张票据ST,而ST是由Client请求的Server端密码进行加密的。当Kerberos协议设置票据为RC4方式加密时,我们可以通过爆破在Client端获取的票据ST,从而获得Server端的密码。

下图显示了如何设置Kerberos的加密方式,可以在域控的“组策略管理”中进行设置。

设置完成后,运行gpupdate命令刷新组策略,使其生效。

1 早期的Kerberoasting
Kerberoasting这种攻击方式最初是由Tim Medin提出的。下面通过实验进行演示。

实验环境:
域:YUNYING.LAB
域控:Windows Server 2008 R2 x64(DC)
域内主机:Windows 7 x64(s1),用户ts1
域内主机:Windows Server 2008 R2 x64(s2),用户tsvc
所需工具:
Kerberoast工具包
Mimikatz
攻击流程:

hashcat使用说明

使用Mimikatz导出票据。

使用Kerberoast工具包中的tgsrepcrack.py工具进行离线爆破,成功获取tsvc账号的密码admin1234!

2 Kerberoasting的“新姿势”
实验环境:
域:YUNYING.LAB
域控:Windows Server 2008 R2 x64(DC)
域内主机:Windows 7 x64(s1),用户ts1
域内主机:Windows Server 2008 R2 x64(s2),用户tsvc
所需工具:
Invoke-Kerberoast.ps1
HashCat
攻击流程:
在之前的Kerberoasting中,需要通过Mimikatz从内存中导出票据。而使用Invoke-Kerberoast,可以提取票据传输时的原始字节,并将其转换为HashCat或John the Ripper可以直接爆破的字符串。

环境不变,在s1主机上使用Invoke-Kerberoast脚本(这里使用Empire中的Invoke-Kerberoast.ps1)。

Invoke-Kerberoast -Outputformat Hashcat | fl

通过抓包可以看到Invoke-Kerberoast输出的Hash值就是TGS-REP中返回的票据内容,然后将其拼接成HashCat可以直接爆破的格式(以$krb5tgs$23*开头的)。

将内容保存到文档中,也可以直接重定向到TXT文件:

Invoke-Kerberoast -Outputformat Hashcat | fl > test1.txt

使用HashCat工具进行破解:

hashcat64.exe –m 13100 test1.txt password.list –force

可以看到离线破解成功,输出了s2的密码admin1234!。这里的-m参数表示选择不同的加密类型,其中13100对应Kerberos 5 TGS-REP类型的密文。

更多HashCat类型的信息可以参考:

3 Invoke-Kerberoast的实现
最初进行实验时,我在GitHub上搜索了Invoke-Kerberoast,下载了一个地址的工具,但下载后发现无法正常使用。查看代码后发现,在字符串拼接时存在格式问题,输出的内容不符合HashCat的格式要求。因此,我直接使用了Empire中的Invoke-Kerberoast.ps1脚本(下载地址:)。下面以该脚本为例进行说明。

在Invoke-Kerberoast函数中,通过Get-DomainUser函数查询组内所有用户的LDAP库中存储的内容,并通过管道传递给Get-DomainSPNTicket函数。

Get-DomainUser的输出结果(使用-erroraction “Silentlycontinue”消除Powershell中的红色警告,也可以直接去掉):

hashcat使用说明

Get-DomainSPNTicket函数在接收到Get-DomainUser的输出结果后,提取SPN字段的值,并将第一个值赋给变量UserSPN。在代码中添加echo语句后执行,可以看到本次结果选择了SPN列表中的第一项MSSQLSvc/s2:SQLEXPRESS。

通过KerberosRequestorSecurityToken类的GetRequest()函数发起Kerberos请求,并通过匹配返回值提取票据内容。

将提取的票据内容组合成HashCat要求的格式,并赋值给变量HashFormat,即最终可以用HashCat或John the Ripper进行爆破的值。

同样,上图框中的变量$Etype的值是23,实际上是RC4加密算法的代号。

Kerberoasting的本质是通过破解KRBTGSREP过程中TGS返回给Client的票据内容来获取密码。在大型域中,这种方式具有一定的利用价值,并且是一种离线爆破方式,较为隐蔽。

0x05 小结
本文主要介绍了Kerberos的基本原理和SPN扫描的内容,以及Kerberoasting攻击技术。Kerberos的原理较为复杂,但深入理解对于了解其他Kerberos攻击技术非常有帮助。同时,Kerberos在Windows的实现中与其他协议也有一些相关性,因此了解其他协议也是必要的。下一篇文章中,我将探讨MS14068漏洞和银票据金票据的利用和原理。感谢阅读。

实验工具:
参考链接:

赞(0)