Kerberos认证原理及相关漏洞

news2024/11/18 4:42:57

Kerberos认证协议

Kerberos认证协议也称三头犬协议,因为在Kerberos认证过程中,需要有三个角色:Client、Server以及KDC(Key Distribution Center)密钥分发中心。

Kerberos认证协议的目的是为客户端/服务端提供身份验证。最主要的问题是如何证明“你是你”

认证过程中涉及到的名词:

  • AS(Authentication Server) 认证服务器
  • KDC(Key Distribution Center) 密钥分发中心
  • TGT(Ticket Granting Ticket) 票据授权票据
  • TGS(Ticket Granting Server) 票据授权服务器
  • SS(Service Server) 特定服务提供端
  • session_key随机生成的字符串

KDC(密钥分发中心),由Authentication Server(认证服务器)和Ticket Granting Server(票据授权服务器)组成,认证的时候,它会访问AD数据库。

Kerberos认证步骤

认证步骤主要有三个来回,过程简单描述为:

  1. 用户向KDC发送请求验证自己的身份
  2. KDC确认用户身份并给用户发送凭证
  3. 用户向KDC发送网络服务访问请求凭证
  4. KDC给用户发送网络服务凭证
  5. 用户使用网络服务凭证访问相应的网络服务
  6. 网络服务器确认网络服务凭证有效并向用户提供网络服务

详细过程为:

K(c,tgs):session_key(client与tgs之间的通信)

K(c,s):session_key(client与server之间的通信)

  1. client->dc(kdc(as)):客户端向认证服务器(AS)发送一个认证请求,给AS发送的信息:

    • 用户hash加密的时间戳以及其他一些信息
    • 用户名明文
    • TGS的一些信息
  2. DC(KDC(AS))->client:认证服务器(AS)认证通过后(对比用户名是否在AD中),给客户端发送的信息:

    • TGT(里面包含了PAC),也就是用krbtgt用户的hash加密后的Session Key以及时间戳
    • Session Key明文
  3. Client->DC(KDC(tgs)):客户端用Session_key加密自己的相关信息以及时间戳,向TGS申请ST(Service Ticket),向TGS发送的信息:

    • TGT
    • Session_key加密的自己的相关信息以及时间戳
    • 客户端自己的信息(明文)
  4. DC(KDC(tgs))->client:TGS拿到TGT和Session_key加密的信息之后,首先检查自身是否存在Client所申请的服务,如果存在就用krbtgt用户的hash解密TGT,获得session_key,再用session_key解密加密的信息,对比明文客户端信息和时间戳,如果都没问题,TGS会生成一个Server Session_key,给客户端发送的内容:

    • AS的session_key加密的TGS session_key
    • ST(ST中的PAC是TGT中的PAC复制进去的),也就是客户端申请的服务对应的hash加密TGS session_key

    这一步不管用户有没有访问服务器的权限,只要TGT正确,就返回TGS。这也是**SPN提权(Kerboasting)**可以利用的原因,任何一个用户,只要hash正确就能拿到TGS,然后爆破TGS,拿到用户的密码。

  5. Client->Server:客户端先用AS的session key解密得到TGS session_key,然后用TGS session_key加密时间戳,然后去访问服务器(无双向认证的话,认证通过后,即可访问,若双向认证,认证通过后继续走到第6步),给服务器发送的信息:

    • ST
    • TGS session_key加密的时间戳
  6. Server->Client:服务器先用自己的hash解密ST,得到TGS session_key,再用TGS session_key解密加密的信息,校验时间戳,如果都没问题,放行,并且给客户端发送一个加密的时间戳,用于让客户端识别是否访问正确的服务端。给客户端发送的信息:

    • 用TGS session key加密时间戳

      Kerberos认证流程

S4U2SELF协议

微软引入s4u2self(Service for User to Self)和s4u2proxy(Service for User to Proxy)协议的目的是为了增强其身份验证和授权机制。

假设用户A访问服务B,服务B需要代替A去访问服务C。(约束委派)(如果是非约束委派,那就不用S4U2这两个扩展了,因为非约束委派那个时候他俩还没设计出来)

S4U2SELF使得服务B可以代表用户A获得服务B自身的kerberos服务票据。也就是也会拿到一个用户A对B的TGS,不过申请人是服务器B自身,而不是用户A。服务B自己拿着A的TGT申请的对于自己的TGS,我称为SSTGS,这个SSTGS会被用到后面的S4U2PROXY认证。这里面很重要的一点就是服务B获得SSTGS的整个过程中,服务B是不需要用户A的凭据的。

S4U申请的TGS会重新生成PAC,这也就是**sAMAccountName spoofing(CVE-2021-42278)**的核心原理

S4U2PROXY协议

S4U2PROXY协议则扩展了s4u2self协议的功能,允许服务B使用SSTGS去KDC那里请求服务C的TGS,并且代替用户A访问服务C,而且只能访问服务C。这种代理访问模式使得服务能够通过代表用户的身份请求其他服务的资源,而无需用户自己拥有直接访问该资源的权限。

Kerberos漏洞产生

  1. 密钥来源于用户密码
  2. 密钥存储在内存中
  3. 使用RC4加密算法的密钥没有进行加密处理,NTLM哈希值即为RC4密钥
  4. KDC密钥分发中心使用的密钥来源于krbtgt用户密码
  5. krbtgt用户密码很少更改,且更改后的旧密码仍然可用
  6. TGT票据使用krbtgt密钥进行加密,PAC数据使用krbtgt密钥进行签名
  7. Kerberos在用户登录20分钟后才会验证用户账户

基于以上原因,攻击者可借助krbtgt密码绕过身份验证系统,获取管理员访问权限,进而执行一系列管理员操作,还可以根据密码为用户创建响应的密钥。

kerberos漏洞利用

  • Kerberoasting

    简单来说就是利用高权限账户的SPN进行申请TGS,通过爆破TGS得到高权限用户的密码,后面会有文章专门介绍。这里就不多说。

  • 黄金票据

    黄金票据主要发生在kerberos认证的第三步和第四步上,当我们知道krbtgt的ntlm_hash时,就可以伪造TGT凭证,发送给票据生成服务器(TGS),跳过了AS认证,直接向TGS申请ST。

    我们自己伪造的TGT就是黄金票据

    mimikatz利用命令:

    kerberos::golden /user:xxx /domain:xxxx /sid:xxxx /krbtgt:xxxxxxx /ptt(直接pass the ticket)
    如果后面不跟/ptt,那就还需要:   
    kerberos::ptt xxxxx.kirbi
    
    mimikatz、kekeo、rubeus生成的票据是以.kirbi为后缀的。impacket生成的票据是以.ccache为后缀的。两种票据主要包含的都是session_key和加密的ticket,因此可以相互转化。
    
    用aeskey也可以
    mimikatz#kerberos::golden /user:xxx /domain:xxxx /sid:xxxx /aes256:xxxxxxxxxxxx /ptt
    

    参数说明:

    • sid:域SID
    • user:伪造的用户名
    • domain:域名
    • krbtgt:krbtgt用户的hash
  • 白银票据

    白银票据主要是发生在第五步上,只要我们有了server_ntlm_hash,我们就可以伪造Ticket,也就是白银票据,它跳过了AS和TGS两大步,直接与Server进行对接。

    mimikatz利用命令:

    kerberos::golden /user:xxxxx /sid:xxxxx /domain:xxxxx /target:xxxxxx /rc4:xxxxx /service:xxx /ptt
    

    但是我们伪造的白银票据没有带有有效KDC签名的PAC。如果将目标主机配置为验证KDC PAC签名,则银票将不起作用。

黄金票据和白银票据的不同点

  1. 访问权限不同

    黄金票据:伪造TGT,可以获取任何kerberos服务权限
    白银票据:伪造TGS,只能访问指定的服务

  2. 加密方式不同

    黄金票据由krbtgt的hash加密
    白银票据由服务账号(通常为计算机账户)Hash加密

  3. 认证流程不同

    黄金票据的利用过程需要访问域控,而白银票据不需要

PAC

在TGS_REP这一步中,TGS不管用户有没有访问服务器的权限,只要TGT正确,就返回TGS(ST)。但是这样就忽略了用户对该服务的访问权限的问题。

为了解决这个问题,微软就引进了PAC,PAC是可选的(但是在微软对于CVE-2021-42287的修补中,PAC已经是强制要求了,不然认证将失败),如果选择启用PAC。然后kerberos流程中主要有两步发生了变化::

  1. AS_REP,返回给用户的TGT中包含了PAC,PAC包含用户的sid,用户所在组。
  2. TGS_REP,返回给用户的TGS中包含了PAC,PAC包含用户的sid,用户所在组。
  3. AP_RES ,服务使用自己的hash解密TGS,如果解密成功,就拿着PAC去KDC询问该用户有没有访问权限,域控解密PAC。获取用户的sid,以及所在组,再判断用户是否有权限访问该服务。

PAC对于用户和服务全程都是不可见的。只有KDC能制作和查看PAC

因为PAC的安全问题导致的提权漏洞也有很多,比如说出名的ms14-068、sAMAccountName spoofing(CVE-2021-42278)等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/570136.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Win11硬盘分区

电脑重装了Win11系统,按WinE打开主文件夹,再点击此电脑,发现: 磁盘只有一个C盘。硬盘的所有空间都在该盘上了,那么我们怎么将其分区呢? Win11硬盘分区步骤: 步骤1: 按WinR输入dis…

数据库中的事务,隔离级别,以及数据展示

想要知道和学习数据库中的锁,要先学习数据库的事务和并发事务所带来的问题! 1.数据库中的事务! 1.1什么事务 事务是由一组SQL语句组成的逻辑处理单元(多个sql进行修改,新增等),这些操作要么同时…

跟踪任何目标(想跟踪什么就跟踪什么)

结果展示 介绍 该项目是一个简单的跟踪工具,可以用于跟踪任何你感兴趣的东西。它提供了一个基于Web的界面,让用户可以轻松地创建和管理跟踪列表,同时也提供了一个RESTful API,可以方便地进行数据交互。 项目的原理是将用户需要跟踪的内容,通过创建跟踪项的方式存储到数据…

Hausdorff 距离

1. 定义 给定欧氏空间中的两点集 A { a 1 , a 2 , . . . } \rm A\left \{a_1, a_2,... \right\} A{a1​,a2​,...} 和 B { b 1 , b 2 , . . . } \rm B\left \{b_1, b_2,... \right\} B{b1​,b2​,...} , H a u s d o r f f {\rm Hausdorff} Hausdorff 距离就是用…

基于SSM的在线考试系统开发与设计-(附源码文档)-毕业设计

文章目录 1.适用人群2.你将收获3.项目介绍4.系统需求分析4.1 需求特性分析4.2 功能需求分析 5.系统设计5.1 系统总体结构设计5.2 数据库设计5.2.1 数据库概念原则设计5.2.2 数据库各部分模块设计5.2.3 数据库表设计 6.系统详细设计6.1 系统各模块功能设计6.1.1 登录模块6.1.2 注…

chatgpt赋能python:如何利用Python加快计算速度

如何利用Python加快计算速度 在大数据时代,计算效率的问题成为了企业和科研机构普遍关注的焦点问题。Python是一种高级编程语言,其具有灵活、易学、语法简洁、运行速度快等优点,因此在数据分析和科学计算领域广泛应用。然而,Pyth…

chatgpt赋能python:Python内部函数介绍

Python内部函数介绍 Python是一门功能强大、易于学习的编程语言,拥有许多内部函数可供使用。本文将介绍Python的内部函数和其用途,以便更好地利用和理解Python。 什么是内部函数? 内部函数是Python提供的一组内置函数,它们可以…

2023/5/25总结

学习CSS list-style:none 去掉无序列表的带有的样式,比如原点。 border-radius:length 设置圆角,也可以写%,不一定需要些半径大小,也可以顺时针写半径大小,就会出现四个顶点不一样的圆角。或者写:borde…

chatgpt赋能python:Python写Log的技巧与最佳实践

Python 写 Log 的技巧与最佳实践 在编写 Python 应用程序时,日志记录(Logging)是一项非常重要的功能,尤其是在调试或部署过程中。本文将介绍一些 Python 写 Log 的技巧和最佳实践,以帮助你更好地处理日志记录并提高应…

Java的String(字符串详解)

字符串 1.字符串的常见构造方法 主要有三种,一种是直接使用常量去构造,要么使用new String来构造,或者还可以使用字符数组的形式。 public static void main(String[] args) { // 使用常量串构造 String s1 "hello"; System.ou…

order by排序语句的用法

文章目录 学习连接语法用法示例1、按单个列的值排序2、按多个列的值排序3、按指定的规则排序4、按中文拼音字母顺序5、Order by和where条件共用 数据库中常用order by关键字对结果集进行排序,又可使用desc和asc来进行指定规则的排序。 学习连接 数据库:…

chatgpt赋能python:单行for循环:Python编程的神器

单行for循环:Python编程的神器 Python是一门功能强大的编程语言,其中的单行for循环功能更是让它的编程效率倍增。在本文中,我们将探讨单行for循环是如何提升编程效率的。 什么是单行for循环 单行for循环是一种简单而强大的编程方式。它可以…

【利用AI让知识体系化】V8引擎相关知识

文章目录 I. 引言V8引擎的背景和概述 II. V8的设计和工作原理V8的整体设计V8的工作流程和运行机制V8在浏览器中的应用场景 III. 内存管理内存模型和内存管理策略垃圾回收机制和算法内存泄漏和内存优化 IV. JIT编译器JIT编译器的作用和优势V8的编译流程和编译器类型编译器优化技…

make的路径搜索

文章目录 前言一、VPATH二、vpath三、vpath 与 VPATH 的差别四、GPATH 用法总结 前言 在大型软件项目中,通常会存在多个目录,包含有源代码、头文件、库文件等不同类型的文件。在编译或链接时,需要指定相应的文件路径才能正确地进行构建。但是…

【计算机图形学】曲线和曲面(Bezier曲线 Bezier曲面)

模块5 曲线和曲面 一 实验目的 编写曲线和曲面的算法 二 实验内容 1:绘制Bezier曲线,并采用自行设计输入和交互修改数据点的方式。 实验结果如下图所示: 第一步:输入特征多边形的顶点个数,并按照顺序输入顶点的坐…

css3新增特性

1. 初始化 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, …

怎么通过ecs云服务器来给小程序发送消息

如果您想通过 ECS 云服务器向小程序发送消息&#xff0c;可以使用 WebSocket 技术。具体步骤如下&#xff1a; 1. 在 ECS 云服务器上搭建 WebSocket 服务器。您可以使用 Node.js、Java、Python 等编程语言来实现 WebSocket 服务器&#xff0c;具体实现方式可参考相关技术文档或…

Java笔记——KMP算法

KMP算法 文章目录 KMP算法KMP算法介绍主要逻辑Next数组KMP搜索代码解释生成next数组模式串匹配 源码展示 KMP算法介绍 KMP算法是一种串的模式匹配算法&#xff0c;用来求子串在主串的位置。是数据结构中比较难的一种算法。KMP算法的核心在于点在于如何利用子串生成next数组&am…

vim的使用、vim入门的三种常用模式、以及vim中常用的命令(超详细)

vim 入门的三种常用模式&#xff1a;分别是 1. 命令模式、2. 插入/编辑模式、3. 底行模式 1. 命令模式 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动复制某区段及进入Insert mode下&#xff0c;或者到 last line mode 如下&#xff0c;这个就是命令模式…

Numpy入门看这一篇就够了【史上入门最简单,开袋即食】

一边学习一边分享&#xff0c;好记性不如烂笔头 目录 一边学习一边分享&#xff0c;好记性不如烂笔头 NumPy问题思考&#xff1a; numpy是什么&#xff1f; 为什么要学习numpy&#xff1f; numpy是怎么组成的&#xff1f;特点是什么&#xff1f; numpy的应用场景有哪些&a…