域渗透:Kerberos工作原理、攻击方式

2021-11-08 17:12:20 15 17861 11


以前自己写过的一些文章,当时是发到了自己的博客和公众号;今天想到还可以发到 tools 来和大家分享,希望如有不对的地方帮忙指点一下,谢谢表哥们文章分为两部分:原理、攻击方式。


第一部分,原理:


1. 什么是 Kerberos?


kerberos  是 Active Directory 网络中域帐户的首选身份验证协议(它不能在工作组中使用),它由 kerberos  SSP 实现。Kerberos 的细节在 RFC 4120 中进行了描述,在 Active Directory 中使用的扩展记录在 MS-KILE文档中。Kerberos 侧重于使用称为“票据”的令牌,它允许根据主体对用户进行身份验证。


kerberos  SSP:


RFC4120:



MS-KILE:


2. Kerberos 相关


传输层:

Kerberos 使用 UDP 或 TCP 作为传输协议,以明文形式发送数据;因此,Kerberos 负责提供加密。

  • Kerberos 使用的端口是UDP/88和TCP/88,
  • Kerberos 密钥分发中心 (KDC) 在该端口上侦听票证请求。

代理:

几个代理一起在Kerberos中提供身份验证:

  • 希望访问服务的客户端或用户
  • AP(Application Server)它提供用户所需的服务
  • KDC  (Key Distribution Center),是Kerberos的主要服务,负责发行票据,安装在DC(域控制器)上;它由颁发 TGT 的 AS(身份验证服务)支持(Key Distribution Center),是Kerberos的主要服务,负责发行票据,安装在DC(域控制器)上;它由颁发 TGT 的 AS


加密密钥:

Kerberos 可以处理一些结构,如票据,许多这些结构都经过加密或签名,以防止被第三方篡改:


  • KDC或krbtgt键,派生自krbtgt帐户NTLM哈希
  • 从用户NTLM哈希派生的用户密钥
  • 服务密钥,派生自服务所有者的 NTLM 哈希值,服务所有者可以是用户或计算机帐户
  • 用户和 KDC 之间协商的会话密钥
  • 在用户和服务之间使用的服务会话密钥

门票:

Kerberos 处理的主要结构是票据,这些票据交付给用户,以便用户使用它们在 Kerberos 领域中执行一些操作。


有2种类型:

  • TGS  (票据授予服务)是用户可以用它来对服务进行身份验证票据,它使用服务密钥加密
  • TGT  (票据授予票据)是提交给KDC以请求TGSS票,它使用 KDC 密钥加密

PAC:

PAC  (特权属性证书)是一种包含在几乎所有票据中的结构,该结构包含用户的特权,并且使用KDC密钥进行签名。

服务可以通过与KDC通信来验证PAC(虽然这种情况并不经常发生),PAC验证只检查其签名,而不检查PAC内部的特权是否正确。

此外,客户端可以通过在票据请求的 KERB-PA-PAC-REQUEST 字段中指定 PAC 来避免将 PAC 包含在票据中。

几个用于验证 PAC 和票证数据完整性的签名


CVE-2020-17049: Kerberos Bronze Bit Attack 原理:



PAC:



Kerberos 使用不同种类的消息,主要是以下几点:

  • KRB_AS_REQ:用于向 KDC 请求 TGT
  • KRB_AS_REP:用于通过 KDC 交付 TGT
  • KRB_TGS_REQ:用于使用 TGT 向 KDC 请求 TGS
  • KRB_TGS_REP:用于通过 KDC 交付 TGS
  • KRB_AP_REQ:用于使用 TGS 针对服务对用户进行身份验证
  • KRB_AP_REP:(可选)服务用于向用户标识自己
  • KRB_ERROR:用于传达错误情况的消息

此外,即使它不是 Kerberos 的一部分,而是 NRPC的一部分,AP 也可以选择使用 KERB_VERIFY_PAC_REQUEST 消息向 KDC 发送 PAC 的签名,并验证它是否正确。

下面显示了执行身份验证的消息序列摘要:


3. 认证流程:

KRB_AS_REQ:

首先,用户必须从 KDC 获得一个 TGT。为此,必须发送 KRB_AS_REQ:


KRB_AS_REQ具有以下字段:

  • 带有客户端密钥的加密时间戳,用于验证用户身份并防止重放攻击
  • 认证用户的用户名
  • 与krbtgt帐户关联的服务SPN
  • 由用户生成的Nonce

注意:加密的时间戳只有在用户需要预认证时才需要,比较常见,除非在用户帐户中设置了 DONT_REQ_PREAUTH 标志。


KRB_AS_REP:

接收到请求后,KDC通过解密时间戳验证用户身份,如果消息是正确的话,那么它会响应一个KRB_AS_REP:  


KRB_AS_REP包含以下信息:

  • 用户名
  • TGT,其中包括:用户名、会话密钥、TGT 的有效期、具有用户权限的PAC,由 KDC 签名
  • 一些使用用户密钥的加密数据,其中包括:会话密钥、TGT 的有效期、用户的 nonce,以防止重放攻击


完成后,用户就已经拥有 TGT,可用于请求 TGS,然后访问服务。

KRB_TGS_REQ:

为了请求 TGS,必须向 KDC 发送 KRB_TGS_REQ 消息:



KRB_TGS_REQ包括:

  • 使用会话密钥加密的数据用户名、时间戳
  • TGT
  • 请求服务的SPN
  • 用户生成的Nonce

KRB_TGS_REP

收到KRB_TGS_REQ消息后,KDC 在KRB_TGS_REP内部返回一个 TGS :


KRB_TGS_REP包括:

  • 用户名
  • TGS,其中包含:服务会话密钥、用户名、TGS的有效期、具有用户权限的 PAC,由 KDC 签名
  • 使用会话密钥加密的数据服务会话密钥、TGS的有效期、用户 nonce,防止重放攻击

KRB_AP_REQ


最后,如果一切顺利,用户已经拥有了一个有效的 TGS 来与服务交互,为了使用它,用户必须向 AP 发送一条KRB_AP_REQ消息:


KRB_AP_REQ包括:

  • TGS
  • 使用服务会话密钥加密的数据
  • 用户名
  • 时间戳,避免重放攻击

之后,如果用户权限正确,就可以访问服务。


第二部分,攻击方式:------------------------------------------------------------------------------------------------------------------------------

展示一些针对该协议的攻击


目录:

  • Kerberos 暴力破解
  • ASREPRoast
  • Kerberoasting
  • Pass the key
  • Pass the ticket
  • 银票
  • 金票


目录的排序是按照执行它们时所需的权限大小来排的。执行 Kerberos 暴力破解时,只需要连接 AD(Active Directory) 的 KDC ( 密钥分发中心 ),而执行最后一项攻击,需要的是域管理员或者类似的权限。

从渗透的角度介绍两种常见的场景:

  • Linux :攻击者在域外的机器( kali ),和 DC 建立了连接。
  • Windows :域中受感染的 Windows 机器。

本文主要用到的工具:


还用到了其他的工具,会在接下来介绍。

1. Kerberos 暴力破解

Kerberos 是一种身份验证协议,我们可以对它进行暴力破解。 暴破 Kerberos 和暴破其他身份验证方法相比来说,有很多优点,如下:

  • 执行攻击不需要用到域帐户,只需连接到 KDC 。
  • Kerberos 预身份验证的错误不会在 Active Directory 中记录为正常登录失败事件(4625),而是记录在 Kerberos 预身份验证失败的特定日志里(4771)。
  • Kerberos 在输入账号时就算密码错误,也会提示用户名是否正确,这样的话我们就不必再去枚举用户名了。
  • 在 Kerberos 暴力破解中,还可以在不需要预身份验证的情况下发现用户帐户,这对于执行 ASREPRoast 攻击非常有用。

Linux


kerbrute.py 脚本可用于在 Linux 系统上对目标进行暴力破解:
DC环境:payloads.online 10.1.40.78
Kerberos 88端口开放:

准备字典:


执行攻击:
python3 kerbrute.py -users <用户名文本> -passwords  <密码文本> -domain payloads.online -dc-ip 10.1.40.78 -outputfile <文件名>


可以看到成功爆出了用户密码 *****961。完成后会存储获取到的 TGT 备用,并生成一个保存了用户账号的文件。

Windows
kerbrute.py 脚本同样可以在 Windows 上对目标进行爆破,结果同理:
python3 kerbrute.py -users use.txt -passwords pws.txt -domain payloads.online -outputfile rul.txt


此攻击用 Rubeus 或者其他的工具也可以实现。


2. ASREPRoast

ASREPRoast 是一种对用户账号进行离线爆破的攻击方式。但是该攻击的利用方式比较有局限性,因为它需要用户账号设置了 "Do not require Kerberos preauthentication( 不需要 kerberos 预身份验证 ) " 才能进行攻击 。( 而该属性是默认不勾选的 )

因为进行 ASREPRoast 攻击时会寻找不需要 Kerberos 预身份验证的用户,这意味着任何人都可以代表这些用户中的任何一个向 KDC 发送 AS_REQ 请求,并接收 AS_REP 消息,最后一种消息里包含了使用原始用户密钥加密的数据包,原始用户密钥来于自它的密码;最后攻击者就可以对获取到的用户 Hash 加密的 Session Key 进行离线破解,如果破解成功,就能得到该指定用户的密码明文。

执行此攻击不需要域帐户,只需连接到 KDC 就行。但如果有域帐户可以用的话,我们就可以使用 LDAP 查询来检索域中那些没有设置 Kerberos 预身份验证的用户,这样我们就不必再去枚举用户名了。

接下来为了测试,我们先手动勾上。


Linux

这里我们使用脚本GetNPUsers.py在 kali Linux 上对目标进行攻击。

首先根据响应,去查找那些勾选了  "Do not require Kerberos preauthentication( 不需要 kerberos 预身份验证 ) " 的域用户,然后将拿到的 hash 存储为文件 hashes.asreproast 。然后打开这个文件,我们可以看到 $ 符号之后的用户名 [email protected] 和:号后面的hash 值:
python3 GetNPUsers.py payloads.online/ usersfile use.txt -format hashcat -outputfile hashes.asreproast




再用 hashcat 爆破 hash值:

成功拿到密码:

用账号密码查看最新密码的修改时间、最后登陆时间、UAC(用户账户控制)等相关信息:


Windows

在受感染的 windows 上,我们可以使用 Rubeus 来寻找可利用的用户:

拿到 hash 后再用 hashcat 去爆破即可。


3. Kerberoasting

SPN简介:
通过 Microsoft官方文档 我们知道,服务主体名称(SPN: Service Principal Names)是服务实例,可以将其理解为一个服务(比如 HTTP、MSSQL)的唯一标识符,服务在加入域中时是自动注册的。
如果在整个林或域中的计算机上安装多个服务实例,则每个实例都必须具有自己的 SPN。如果客户端可能使用多个名称进行身份验证,则给定服务实例可以具有多个 SPN。SPN 始终包含运行服务实例的主机的名称,因此服务实例可以为其主机名称或别名注册 SPN。如果想使用 Kerberos 协议来认证服务,那么必须正确配置 SPN。

SPN 在 kerberos 协议中的作用:
因为 Kerberos 是一种支持票据身份验证的安全协议,如果客户端计算机身份验证的请求里包含有效的用户凭据和服务主体名称 (SPN),则 Kerberos 身份验证服务器将授予一个票据以响应该请求。然后客户端计算机使用该票据来访问网络资源,在内部网络中,SPN扫描是通过查询向域控制器执行服务发现的。
这对于红队而言,可以帮助他们识别正在运行重要服务的主机,比如终端、交换机、微软SQL等,并且可以尽量的隐藏他们自身。另外,SPN的识别也是 kerberoasting 攻击的第一步。




当域内某个用户去请求同域内的某个服务资源时,请求会首先被送达 KDS 的 AS 中进行身份认证,认证通过后 AS 会返回一个用用户密码 hash 加密的 TGT 给用户,然后用户再拿着这个 TGT 向 TGS 去请求,TGS 会返回一个用对应服务账号的密码 hash加密过( RC4_HMAC_MD5 )的专门用于访问特定服务的服务票据回来,最后用户只需拿这张服务票据去访问对应的服务资源即可;

而问题就出在 TGS 返回服务票据,目标服务此时用的一个域账号来运行的,那么 TGS 在向用户返回服务票据时,用户就可以拿到这张服务票据中 hash,由于 TGS 服务票据加密算法已知,然后我们对它进行爆破,模拟加密过程,生成TGS进行比较。如果TGS相同,代表口令正确,就能获得目标服务实例的明文口令,这就是  Kerberoasting 攻击。

需要注意的是,虽然域内的任何一台主机,都可以通过查询SPN,向域内的所有服务请求TGS,然后进行暴力破解,但是对于破解出的明文,只有域用户的是可以利用的,机器账户的不能用于远程连接,所以我们的关注点主要就是在域用户下注册的SPN。
步骤:

  • 查询SPN,找到有价值的SPN。1.该 SPN 注册在域用户帐户( Users )下,而不是注册在域内机器账户(Computers)上、2.域用户账户的权限很高
  • 请求TGS。
  • 导出TGS。
  • 暴力破解。

DC环境:xiaoying  10.255.255.71

Linux

为了方便测试,我们在域环境给一些目标注册 SPN:


我们可以通过受感染的 windows 主机,在域外的kali linux 上选择使用 GetUserSPNs.py 脚本在域内根据响应去查询 SPN,并将拿到的 TGS 存到给定名为 hashes.kerberoast 的文件里。
可以看到查到了注册在 Users 下的 SPN,和 hash 里的 域名 / 账户名


用 hashcat 对 hash 暴力破解:


拿到密码*****.net.cn:


用 john 爆破:


Windows

在受感染的 windows 主机上,我们同样可以使用多种工具来进行 Kerberoasting 攻击,比如 Empire 项目的 Rubeus 或者 Invoke-Kerberoast

第一步,windows 场景下的SPN发现:

首先我们可以使用 windows 本地的二进制文件 setspn 工具,它可以检索用户账户与服务之间的映射。我们可以用它来添加、删除和查询SPN注册。
setspn -Q  */*


我们可以看到注册在机器账户下(Computers),和用户账户下( Users )的SPN;而 Users 下的SPN正是我们想要的。

我们还可以用Tim Medin开发的一个PowerShell脚本,它是 kerberoast 工具包的一部分,可以帮助我们查询活动目录,以发现仅与用户帐户相关联的服务。
.\GetUserSPNs.ps1


还有一个 VBS 脚本也是这个工具的一部分,可以为我们提供相同的信息。该脚本可以通过使用本机的 Windows 二进制 cscript 从 Windows 的命令提示符执行。


除了这些我们还可以使用PowerShell AD Recon 存储库里的各种 PowerShell 脚本来执行 Kerberos 侦察,开发者 Sean Metcalf 将每个脚本绑定到一个特定的服务,具体取决于我们想要发现哪些 SPN;比如 Exchange,Microsoft SQL,Terminal等等,这里不再列举。

接下来我们先在受感染的 windows 主机上使用 Rubeus 获取 hash:
.\Rubeus.exe kerberoast /outfile:hashes.kerberoast


hashes.kerberoast 里的 hash

另一种在 windows 主机上实现 Kerberoast 的方法是使用同样来自 Empire 项目的 powershell 脚本 Invoke-Kerberoast,它可以直接加载到内存中:
.\Invoke-Kerberoast.ps1 -OutputFormat hashcat | % { $_.Hash } | Out-File -Encoding ASCII hashes.



完成后将 hash 保存并生成一个文件,我们再拿去爆破。

4. 哈希绕过/密钥传递(PTK)
在 windows 内网渗透中三种常见的攻击方法:

  • pass the hash(hash传递攻击,简称pth)
  • pass the ticket(票据传递攻击,简称ptt)
  • pass the key(密钥传递攻击,简称ptk)

先介绍下 NTLM:


通过 Microsoft 官方文档 我们得知,NTLM是一种基于质询/应答 (Challenge/Response )消息交换模式的认证机制,常用于工作组和域环境下的身份认证。

NTLM 的认证过程有三步:

  • 协商:主要用于确认双方协议版本(NTLMv1、NTLMv2等)
  • 质询:质询/应答 (Challenge/Response)模式,用于消息交换
  • 验证:验证身份合法性,通常由 Server端或 DC完成这个过程

大致流程如下:


  • 客户端对密码进行哈希处理并缓存密码 hash,丢弃实际的明文密码(不存储),然后将用户名发送到服务器,发起认证请求
  • 服务器生成一个 16字节的随机数,称为质询发送给客户端
  • 客户端使用用户密码Hash 对此质询进行加密,将结果发送给服务器
  • 服务器发送三项数据给域控制器(DC):User name、发送给客户端的质询、从客户端接收到的加密结果
  • 域控制器使用 User name从 AD中检索该用户密码的 NTLM Hash,并使用此 NTLM Hash来加密该质询,然后把这个值和客户端计算的响应值加密结果进行比较。如果它们相同,则验证成功

以上步骤中,用户的登录密码 Hash 即为 NTLM Hash,经过NTLM Hash加密的结果在网络协议中称之为 Net NTLM Hash。

PTH 的原理就是攻击者可以直接通过 LM Hash 或者NTLM Hash 访问远程主机或服务,而不用提供明文密码,详细内容我们不在此展开,因为本系列主要是针对kerberos,所以我们这里讲 PTK。

PTK 是在域中攻击 kerberos 协议的一种方式,可以在NTLM认证被禁止的情况下用来实现/替代类似 PTH 的功能,为了执行此攻击,我们需要目标用户帐户的 NTLM 哈希(或密码)。所以一旦获得用户哈希,就可以为该帐户请求 TGT,最后就可以访问用户帐户具有权限的任何服务或机器。

Linux

我们在kali linux 上可以选择使用 impacket 来执行此攻击。

首先使用 getTGT.py 脚本来请求 TGT 并将其保存为 ccache( 当票据设置为磁盘上的文件时,标准格式和类型都将是 CCACHE 文件;这是一个简单的二进制文件格式,用于存储 Kerberos 凭据。从攻击者的角度来看,CCACHE 票据便于移动,因为它们可以被下载并加载到另一台主机上,而无需更新或验证票证,所以可以利用有效票证进行身份验证,而不需要各自的用户明文密码 ):
python3 getTGT.py fuckfuckfuck.com/xiaoying -hashes :********* //这里可以指定密码,哈希或aesKey


我这里是用的 mimikatz 来获取 NTLM,有很多其他的方法,我就不再列举了。
然后指定 KRB5CCNAME 环境变量的位置( 如果设置了该变量,则该变量指向用于身份验证的 CCACHE 票证的位置 ):
export KRB5CCNAME=/root/impacket-examples/velociraptor.ccache


再使用 psexec.py 脚本连接目标:
python3 psexec.py domain/user@<target name> (这里的target必须是注册了SPN的) -k -no-pass


可以看到生成并使用 TGT 后,最后会启动一个 shell 。
除了 psexec.py ,我们还可以使用其他工具例如 wmiexec.py(它比 psexec.py 更加隐蔽,因为它不会上传任何二进制文件并且不启动任何服务)或 atexec.py(使用计划的任务执行代码)。
wmiexec.py :
wmiexec.py -k -no-pass fuckfuckfuck.com/xiaoying:******.net.cn@*****ient002.fuckfuckfuck.com ipconfig



Windows

在受感染的 windows 主机上,我们这里选择使用 Rubeus 和 PsExec 来实现 PTK。

先获取票据:
.\Rubeus.exe asktgt /domain:fuckfuckfuck.com /user:xiaoying /rc4:*******0ee7522bac27eadaa6aa /ptt


然后我们通过 PsExec 来连接 DC:
.\PsExec.exe -accepteula \\*****.fuckfuckfuck.com cmd


连接成功。

5. 票据传递 (PTT)

这种攻击类似于 hash 传递,但不是使用哈希来请求票据,而是票据本身被盗并用于验证其所有者的身份。也就是我们获取到其他用户的票据后,再以此票据去请求/连接其他目标,从而就可以达到不需要明文密码就可以访问其他用户的目的。

Windows

当前所在主机为:xxx6699  Hostname:Win10Client001,我们要连接的目标机Hostname为:Win10Client002。

在 Windows 中,票据由负责安全的 lsass(本地安全机构子系统服务)进程处理和存储。
我们这里可以选择使用 Mimikatz 的 sekurlsa::tickets /export 命令直接从 LSASS 进程的内存中导出所有的 Kerberos 票据:
"privilege::debug" "sekurlsa::tickets /export"
sekurlsa::tickets /export



后缀为 .kirbi 的文件,便是在 windows 被我们导出的票据文件 ;这里解释一下这个文件格式:
因为 Windows 和 Linux 使用不同的方法来保存票据,所以在开始使用票据之前,我们得把他们根据需求互相转换,例如从 ccache(Linux 文件格式)转换为 kirbi(Mimikatz 和 Rubeus 使用的 Windows 文件格式),反之亦然。

我们可以使用 ticket_converter.py 工具在平台之间互相转换 Linux 和 Windows 的票据格式:
python3 ticket_converter.py xiaoying.kirbi xiaoying.ccache
//或者
python3 ticket_converter.py xiaoying.ccache xiaoying.kirbi


转换成功后,我们就可以将.ccache 格式的票据文件在kal inux 上使用;先将文件路径设置为 KRB5CCNAME 环境变量,再用 impacket 里的脚本去连接目标。
除了使用 mimikatz 以外,我们还可以在 powershell 中用 Rubeus dump出所有票据:
./Rubeus dump



在执行以上其中一个动作之后,票据已经被我们成功获取。
拿到票据后,我们用 mimikatz 可以看到当前主机缓存内的票据的用户名和编号为 60a10000:
kerberos::list


然后清空缓存的票据:
kerberos::purge


接下来将目标主机的票据 40a10000 注入当前主机后,再查看一次当前缓存的票据,可以发现已经注入成功:
kerberos::ptt <ticket name> //注入票据


最后可以选择使用 PsExec 连接目标。
PeExec.exe -accepteula \\domain cmd


票据传递成功。
用 Rubeus 同样可以完成 PTT 攻击;我们当前缓存的票据是刚才注入的,先将其清空:

用 Rubeus 重新注入:

连接成功:

注入用户帐户的票据后,我们就可以远程操作目标替我们执行命令。

除此之外,PTT攻击利用得比较多的方法还有 MS14-068 漏洞,它是密钥分发中心(KDC)服务中的Windows漏洞,它允许经过身份验证的用户在其 Kerberos 票据(TGT)中插入任意PAC(表示所有用户权限的结构),该漏洞位于kdcsvc.dll域控制器的密钥分发中心(KDC)中;用户可以通过呈现具有变化的PAC的Kerberos TGT来获得票据。
造成的危害是允许域内任何一个普通用户,将自己提升至域管理员权限,微软已经给出了补丁。这里因为此文目前篇幅已经很长了,就不展示利用过程了。

6. 白银票据( Silver Ticket )

黄金票据(Golden ticket)、白银票据( Silver Ticket )是域内常用的两种票据攻击方式,这里大致讲一下金票与银票在域内的区别:

  • Silver Ticket(白银票据)不同与 Golden Ticket。Silver Ticket 的利用过程是伪造 TGS,通过已知的授权服务密码生成一张可以访问该服务的 TGT。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志,而 Golden Ticket 在利用过程中需要由 KDC 颁发 TGT,并且在生成伪造的 TGT 的 20分钟内,TGS 不会对该 TGT 的真伪进行校验。
  • Silver Ticket(白银票据)依赖于服务账号的密码散列值,这不同于 Golden Ticket 利用需要使用 krbtgt 账号的密码哈希值,因此更加隐蔽。
  • Golden Ticket 使用 krbtgt 账号密码的哈希值,利用伪造高权限的 TGT 向 KDC 要求颁发拥有任意服务访问权限的票据,从而获取域控制器权限。
  • Silver Ticket(白银票据)会通过相应的服务账号来伪造 TGS,例如:LDAP、MSSQL、WinRM、DNS、CIFS 等,范围有限,只能获取对应服务权限。
  • Golden Ticket 是由 krbtgt 账号加密的,而 Silver Ticket(白银票据)是由特定服务账号加密的。
  • 金票的特点是不需要与AS进行交互,但需要用户krbtgt的HASH;银票的特点是不需要与 KDC 进行交互,但代价是伪造的时候需要服务的 NTLM hash。

制作/伪造一张银票,我们需要以下信息:


  • 域名
  • 域 SID
  • 目标服务器的 FQDN( 全称域名 )
  • 可利用的服务
  • 服务账号的NTLM Hash
  • 要伪造的用户名(自定义)

Windows


收集我们需要的信息:

当前本机的域名:fuckfuckfuck.com 计算机名:Win10Client001
net config workstation


再用 wmic useraccount get name,sid 可以看到所有用户的 SID:
wmic useraccount get name,sid



然后我们到另一台拥有域管理员权限的域服务账户( Win10Client002 )上获取 NTLM :
"sekurlsa::logonpasswords"


回到Win10Client001上,然后清空票据缓存:


用得到的信息制作/伪造一张白银票据:
kerberos::golden /domain:fuckfuckfuck.com /sid:S-1-5-21-2122058825-1058390281-3825209234-1646 /target:Win10Client002.fuckfuckfuck.com /service:Apache /rc4:1802b0f80f63ec1fb6f57ffec1ed3635 /user:daxiao



生成的文件:

用 Rubeus 将票据注入内存,最后 PsExec 连接目标:
Rubeus.exe ptt /ticket:ticket.kirbi



Linux

在kali linux,我们可以使用 impacket 的 ticketer.py 来制作白银票据,然后设置 KRB5CCNAME 环境变量,最后使用 psexec.py 连接目标服务:


7. 黄金票据(Golden ticket)

当域内有可疑行为时,管理员通常会修改域控管理员密码来避免攻击者进一步攻击,但通常会忘记修改 krbtgt 的密码,导致攻击者可以利用此来进行权限维持。在域环境中所有的票据都是由 krbtgt 生成,获取了 krbtgt 的 NTLM 或 AES-256 我们就可以伪造域内任意用户的身份去访问其他服务。
制作/伪造一张黄金票据需要的信息:

  • 需要伪造的域管理员名称
  • 域 SID
  • 目标服务器的 FQDN( 全称域名 )
  • Krbtgt 的 Hash NTLM 值或 AES-256 值

Windows


在一台拥有域管理员权限的域服务账户主机( Win10Client002 )上抓取 krbtgt hash 的 NTLM 。



同样生成文件后,我们回到 Win10Client001,用其制作一张黄金票据:

用 Rubeus 将金票注入后,连接目标:


Linux

使用 impacket 的 ticketer.py 来制作白银票据,然后设置 KRB5CCNAME 环境变量,最后使用 psexec.py 连接目标服务。跟银票差不多的操作,只是这里不需要再去指定 -SPN:

连接成功:


防御措施
为了防止或减轻许多此类 Kerberos 攻击,可以实施一系列策略,一些示例如下:

  • 启用强密码策略:第一步是避免在域用户帐户中使用弱口令,我们应该实施强密码策略,要确保在 Active Directory 域上启用复杂密码的选项。还要将密码中一些常见且容易被预测的术语,例如公司名称、年份或月份名称、生日日期等列入黑名单,因为这些信息容易被黑客用来做爆破字典。
  • 避免没有预认证的账户:如果可以的话,尽量所有账户都勾选上 “账户必须启用 Kerberos 预认证”。如果无法避免的话,我们就要特别注意这些特殊的帐户并创建具有高度复杂性的伪随机密码。
  • 避免代表用户帐户执行服务:避免在域用户帐户上下文中运行的服务,如果使用特殊用户帐户启动域服务(SPN),那么请为该帐户生成强伪随机密码。
  • 验证 PAC:启用 PAC 验证以避免 Silver Ticket 等攻击;要启用此检查,请将子项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters 中的值 ValidateKdcPacSignature (DWORD)设置为 1。
  • 定期更改密码:设置策略以确保用户定期修改用户密码,例如每 2 到 4 个月。作为特殊情况,还应定期更改 krbtgt 帐户密码,因为该密钥用于创建 TGT。还可以使用脚本 https://gallery.technet.microsoft.com/Reset-the-krbtgt-account-581a9e51。要注意:因为缓存的原因 所有 krbtgt 的密码必须修改两次才能使当前域票据无效 。还有一个要注意的:域的功能级别必须等于或高于 Windows Server 2008,才能操作 krbtgt 帐户凭据。
  • 禁用 Kerberos 弱加密类型:只允许使用 AES 密钥进行 Kerberos 加密。建议监视具有较低加密级别(如 RC4)的 Kerberos 请求,因为攻击工具通常会使用该请求。


因为篇幅太长,这里不再列举,更详细的可以看这份 Microsoft 发布的指南,其中解释了预防和缓解此类攻击更详细的方法;


------------------------------------------------------------------------------------------------------------------------------------------------
这是一篇比较基础的域渗透文章,所以文中是测试环境,实战中要注意的点很多:比如psexec.exe和psexex.py早已被淘汰了,该使用wmiexec等更隐蔽的工具。还有相关工具的免杀(这个坛子里也有一些文讲这个)、动静大小、还有通信隐蔽等等....

关于通信隐蔽的问题,我是这么做的:匿名买的四件套+一台匿名买的电脑+物理机断网(从买的那一刻起断网。软件什么的全部离线安装)、虚拟机联网+操作系统安全基线配置(如关掉win自带的一些配置、虚拟机和物理机藕断丝连的配置、端口等等...)+手动找的VPN和匿名买的VPS。其中还有很多细节如自己写的RAT是否做好了混淆、加密、免杀等等这些细节什么的。一般这样去隐蔽就算被溯源到所有的代理,对方很大可能也只能摸到虚拟机。( 如果对方虚拟机逃逸,就把电脑销毁了跑路 )

文到这里截止,图太多了,可能会有上传错的情况,表哥们如看到图文不对的情况说一下,谢谢!

自评 TCV 3

关于作者

楚门6篇文章438篇回复

微信公众号:深潜之眼
Blog:www.kalpa0129.com
专注定向攻击

评论15次

要评论?请先  登录  或  注册