Attacking Kerberos

Kerberos是什么?

kerberos是Microsoft Windows域的默认身份验证服务,通过使用第三方票据授权或者更强的加密方式,它往往比NTML更安全,尽管NTM相比于Kerberos有更多的攻击选择,但是Kerberos也存在着一些漏洞能够被利用

Kerberos是一个域内认证协议,是一种基于票据的认证方式

Kerberos的标志是三头犬,分别有一下角色

  • Client客户端
  • Server服务端或者说是Application Server-应用服务器
  • KDC(Key Distribution Center)= DC(Domain Controller),KDC是密钥分发中心,由域控担任

这里提供一下Kerberos中的常见名词和术语

  • Ticket:票据,网络对象互相访问的凭证
  • Key Distribution Center(KDC):密钥分发中心,负责身份认证和会话密钥的分发,由Authentication Server,认证服务器和Ticket Granting Server,票据授权服务器组成
  • Ticket Granting Ticket (TGT):TGT是一种身份验证票据(临时凭证,相当于入场券–可以请求其他票据),用于从 TGS处 请求域中特定资源的服务票据
  • Authentication Service (AS):是KDC的一部分,身份验证服务(AS)发出 TGT 以供域中的 TGS 使用,以请求访问其他机器和服务票据
  • Ticket Granting Service (TGS):是KDC的一部分,票据授予服务(TGS)获取 TGT 并将票据返回到域上的机器
  • ST :服务票据 Service Ticket,由TGS服务发布
  • DC:域控制器Domain Controller
  • AD:活动目录Active Directory,集中管理网络中的用户、计算机、权限、策略和资源访问

总结下来就是Kerberos 是一种基于票据的认证协议,由域控上的 KDC 集中管理票据,通过加密票据控制用户对服务的访问权限,实现单点登录和双向认证

Kerberos协议认证过程

这里借用一下fushuling师傅的图片

第一步 AS-REQ

用户登陆/解锁:向AS拿TGT

AS在这一步要确认你真的知道这个用户的密码

kerberos服务会向KDC的AS发送认证请求,请求包中包含:请求用户名,主机名,加密类型和Pre-Authentication Data(用户NTLM hash加密的时间戳)以及一些其他信息

利用

域内用户枚举

在AS-REQ阶段,请求包cname对应的值是用户名,当用户状态不同时,比如用户存在且启用、用户存在但禁用、用户不存在,不同的状态返回包的提示都是不同的,因此可以进行枚举

Hash传递

可使用用户的NTLM hash加密的时间戳作为Authenticator,就可以在无需破解密钥的明文的情况下通过hash伪造用户身份发起请求

密码喷洒

当用户名存在,密码正确或者错误的时候,返回包也不一样,因此可以进行用户名密码爆破。在内网里域管理者为了方便可能会用相同的密码对服务器进行配置,因此拿到一个有效密码可以在内网里喷洒试试,说不定就能拿下好几台内网服务器

第二步 AS-REP

在KDC接收请求后,会先到AD活动目录查询当前用户的密码hash,然后AS会使用Client_hash对请求包中的Authenticator进行解密,解密成功且时间戳范围在五分钟内则返回用krbtgt用户hash加密票据,TGT里面包含PAC(PAC 是由 KDC(域控)生成并签名、嵌入在 Kerberos 票据中的授权数据,用于让服务端在不再次查询 KDC 的情况下完成用户的权限判断),PAC包含Client的sid、Client所在的组,除此之外AS会生成一个临时秘钥Login session key,并使用用户(之前发请求那个用户)NTLM-Hash加密Login session key作为响应包的一部分内容

AS验证过后会返回两件东西

TGT以及给客户端的“会话密钥包”

验证客户端并发回加密的 TGT

(Authenticator 是一个由客户端临时生成、用会话密钥加密的数据结构,用来证明“我不仅拿着票据,而且是当前、真实的票据持有者”,从而防止票据被重放或盗用)

第三步 TGS-REQ

客户端将加密的 TGT 发送到具有客户端希望访问的服务的服务主体名称(SPN)的票据授予服务器(TGS)

此时TGS通过krbtgt(krbtgt 是 Kerberos 的“票据签发根密钥”,用来加密和验证所有 TGT(Ticket Granting Ticket))的hash解密TGT票据,验证客户端的身份

第四步:TGS-REP

TGS → 用户,返回 Service Ticket

颁发只能被目标服务器解密的门票

TGS返回两个东西:Service Ticket(服务票据,给目标服务看的)和 给客户端的会话密钥包(Login session key)

TGS首先会检查是否存在客户端所请求的服务,若存在就会使用krbtgt用户的NTLM hash解密TGT并得到Login session key

然后用它去解密Authenticator,解密成功说明在时间戳范围内,通过TGS验证,然后TGS会给客户端用户发放ST服务票据

包括ticket和一个新的session key

第五步 AP-REQ

客户端在收到 TGS-REP 后,获得针对目标服务的 Service Ticket(ST) 以及 Client ↔ Service 会话密钥 当客户端访问目标服务时,会在 AP-REQ 中携带 Service Ticket和使用会话密钥加密的 Authenticator 发送给服务端 服务端使用自身密钥解密 ST,校验 Authenticator,并基于票据中携带的 PAC 在本地完成身份认证与授权判断

第六步 AP-REP(双向认证)

在启用 Mutual Authentication 的情况下:

  • 服务端会返回 AP-REP
  • 使用 Kc,s 加密:
    • Authenticator 中时间戳的校验值(如 timestamp + 1)

客户端解密成功后,确认目标服务身份真实,Kerberos 双向认证完成

SPN和PAC

SPN 是 Kerberos 中服务的“身份证”,客户端正是通过 SPN 告诉 KDC:我要访问哪一个具体服务

简单一句话总结就是SPN 是 Kerberos 中用于唯一标识服务实例的名称,KDC 通过 SPN 决定 Service Ticket 的签发对象及加密密钥,是 Kerberos 服务认证与授权链路中的核心锚点

每个Kerberos的服务都需要一个SPN,同时每个SPN信息都包含一个服务和允许登陆的用户,没有SPN的话就没办法得到ST票据

当客户端拿着TGS去请求访问某个服务时,TGS就是通过查询SPN来确定是否有此服务的

只负责认证用户TGT是否有效已经验证请求服务是否存在

SPN的标准形式

ServiceClass/Host[:Port]
  • serviceclass是服务的名称,常见的有SMTP、WWW、HOST等
  • host是主机名或 FQDN,也就是完全限定域名

PAC 是 Active Directory 对 Kerberos 的扩展,用来承载“授权信息”的数据结构,由 KDC 生成并签名,嵌入 Kerberos 票据中,使服务端无需再次查询 DC 就能完成权限判断

  • 不是 Kerberos RFC 原生内容
  • 只存在于 AD Kerberos
  • 解决的是 Authorization(授权),不是 Authentication(认证)

其本质作用我总结为:把“权限状态”随票据一起带走,用于在后几步中验证用户是否有对应服务的访问权限,免得再去DC中去寻找

Attack Method

委派攻击

域委派

委派是一种域内应用模式,是指讲域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求信的服务等)

Kerberos 委派是通过「KDC 在 TGS 阶段基于委派策略,签发“可代表用户身份”的 Service Ticket」来实现的

KDC(域控) + Kerberos 票据机制 + AD 中的委派配置

一个简单的例子

用户访问的是 B, 资源在 C, 委派让 B 能“带着用户身份”去找 C

委派的分类:三种应用方式

  • 非约束委派(Unconstrained Delegation, UD)
  • 约束委派(Constrained Delegation, CD)
  • 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)

非约束委派攻击

攻击本质就是当启用了一个非约束委派的服务被攻陷后,攻击者可以滥用被该服务器接收过的用户身份,代表这些用户在域内横向访问任意服务

也就是说当启用了非约束委派的服务被用户访问时,KDC 允许该服务获得“代表该用户进行 Kerberos 请求的能力”,该能力在实现上表现为:服务可以使用用户的 TGT 或等价的票据能力

简单理解为如果一台机器配置了非约束委派。DC就会认为这台机器非常安全,所以会把用户的TGT直接塞给它,让它随便使用

核心原理

1.配置

在域控上,如果某台机器在AD用户和计算机中被勾选了Trust this computer for delegation to any service(信任该计算机作为任何服务的委派)

2.请求

当一个用户(域管理员身份)访问此台web-serber时

3.TGT转发:域控KDC在生成给web-serber的服务票据ST时,会吧该用户的TGT一并放到里面发送过去

4.缓存:web-serber收到票据后,会将此TGT解密并存储在内存(LASS进程)中,以便后续代表该用户去访问其他服务

利用方式

攻击思路1:域管理员访问web-server

1、需要Administrator权限 2、域内主机的机器账户开启非约束委派 3、域管理管理员远程访问

# 域内主机导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

# 查看票据
mimikatz.exe "kerberos::list"

然后使用kerberos::ptt导入票据伪造身份

mimikatz.exe "kerberos::ptt [0;4bbb6]-2-0-60a10000-Administrator@krbtgt-HACKME.COM.kirbi" "exit"

[0;cfd6c]-2-0-60a10000-Administrator@krbtgt-REDTEAM.LAB.kirbi 是注入的 Kerberos 票据文件的路径,表示将 Administrator 用户的 Kerberos 票据 注入到当前的会话中

krbtgt 是 Kerberos 的密钥生成账户,在攻击中经常用来做 票据生成 或 票据伪造

.kirbi 是 Kerberos 票据的文件格式

后面就可以去执行一下命令了

攻击思路2:强制认证+非约束

具体的有很多,这里介绍一种,后面都会总结一下的

DFSCoerce(CVE-2022-26925)

利用条件:

  • 仅对域控有效
  • 要求有一个域用户的凭据信息
  • 域内启用MS-DFSNM协议

工具

python3 dfscoerce.py -u [目标用户名] -hashes "[NTLM 哈希]" -d [目标域] [计算机名] [目标主机的 IP 地址]

也可以使用密码进行使用,这里我以使用NTLM为例

配合

Rubeus.exe monitor /interval:1 /nowrap /targetuser:[目标用户]

使用 Rubeus 来监控与特定 计算机账户相关的 Kerberos 认证请求,监控的间隔是1秒,并且不换行显示结果

利用此工具就可以捕获到票据,接着就可以打票据注入

Rubeus.exe ptt /ticket:[票据]

当我们用域外用户,利用强制域认证和所有的非约束委派,就可以实现对域内用户(机器用户)的票据捕获(尤其是域控制器),当我们成功捕获票据后,就可以利用猕猴桃工具去得到域内所有用户hash

mimikatz.exe "kerberos::purge" "kerberos::ptt DC01.kirbi" "lsadump::dcsync /domain:xiaorang.lab /user:administrator" "exit"

此命令是一个做题演示,具体使用还请根据实际情况修改(kerberos::ptt 命令注入了 DC01$ 域控制器的 Kerberos 票据,DCSync 命令用于从域控制器同步并提取 administrator 用户的 NTLM 哈希)

约束性委派攻击

于2007年微软为kerberos协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议S4u2self(Service for User to Self)S4U2proxy(Service for User to Proxy)

委派的定义我们都知道了,那么什么叫约束性委派呢?

白话说就是“不是想去哪里就去哪里”,也就是说被委派任务的那个人,只能代表用户去访问白名单里列出的服务,这就是约束性委派(KDC)

KCD 通过 AD 中的白名单(AllowedToDelegateTo / msDS-AllowedToDelegateTo)限制 S4U2Proxy 只能去特定 SPN

S4u2self & S4U2proxy

S4U2Self

允许服务主题在不持有用户凭据的情况下,为某个用户申请到该服务本身的票据

S4U2Proxy

允许服务主体携带证据票据,向KDC申请代表该用户访问另一个服务的票据

其中配置约束性委派的账户属性会有这种变化

1.账户msDS-AllowedToDelegateTo的属性,它记录了该账号允许委派到哪些服务 SPN(白名单)

2.配置了(支持 S4U 的)委派后,账号的 userAccountControl 中会包含 TRUSTED_TO_AUTH_FOR_DELEGATION 等相关标志位;同时会设置 msDS-AllowedToDelegateTo 白名单以限制可委派的目标 SPN

侦查约束委派服务的方法

ADFind

PowerView

利用方式1:利用机器票据攻击

这里要注意理解用户身份和机器身份,这里举个例子

用户身份主体是域用户账户(如 alice@domain.comadministrator@domain.com),用于访问用户权限下的服务和资源

机器身份主体是计算机账户(如 WIN10$DC01$),用于访问计算机权限下的服务和资源,并且机器账户常常被用于向其他计算机或服务发起请求,那么机器票据就常用于身份验证,代表的是计算机身份

简单来说就是,用户身份代表域内的用户,机器身份代表域内的计算机(可能不是很恰当?!)

利用条件

  • 拥有Administrator权限
  • 目标机器账户配置了约束性委派

当我们拥有Administrator用户权限时,可以利用猕猴桃导出lsass.exe进程中所有的票据,得到想要的服务票据,查看当前机器中都有哪些票据缓存

mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

kekeo工具可以通过S4U2Proxy协议申请服务票据

kekeo.exe "tgs::s4u /tgt:<TGT文件> /user:<user> /service:<service>"

通过约束性委派攻击获取到了另一台机器的票据,利用猕猴桃导入票据就可以访问其计算机资源了,横向拿下

利用方式2:使用机器账户hash

利用条件

  • 拥有Administrator权限
  • 目标机器配置了约束性委派

利用猕猴桃获取NTLM Hash值

# 使用mimikatz获取机器账户NTLM Hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

然后利用Rubeus可申请访问自身的服务票据,可以接着利用此票据去请求其他服务的票据并注入,达到横向的目的

基于资源的约束性委派攻击

咕咕咕了~复习去了

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇