当前位置: 首页 > news >正文

[内网安全] Windows 域认证 — Kerberos 协议认证

🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客

0x01:Kerberos 协议简介

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下,Kerberos 作为一种可信任的第三方认证服务,通过采用传统密码技术(如:共享密钥)来执行认证服务。

打一个浅显的例子,A 想要到 B 那里买东西,但是怕 B 收了钱不办事。此时,我们需要一个第三方机构 C 做担保,A 把钱给了 C,B 办完事后去 C 那里拿钱。Kerberos 协议就完成了这么一个操作。

0x02:Kerberos 协议的组成角色

在古希腊神话故事中,Kerberos 是一只具有三颗头颅的地狱恶犬,它守护在地狱之外,能够识别所有路过的亡灵,防止活着的入侵者闯入地狱:

Kerberos 协议中也存在三个角色,分别是:

  • 客户端(Client): 发送请求的一方。

  • 服务端(Server): 接收请求的乙方。

  • 密钥分发中心(Key Distribution Center,KDC): 该部分由两 AS 与 TGS 构成:

    • AS(Authentication Server): 认证服务器,专门用来认证客户端的身份并发放客户端用于访问 TGS 的 TGT(允许买票的票据 — 票据授予票据)

    • TGS(Ticket Granting Ticket): 票据授予服务器,用来执行整个认证过程以及发放客户端访问服务端时所需的服务授予票据(Ticket)

0x03:Kerberos 认证的类比流程

Kerberos 协议还是有些复杂的,所以本部分中,笔者将通过两个现实中的例子,让读者对 Kerberos 协议有一个大概的认识,为我们后面介绍 Kerberos 认证的完整流程打一个基础。

0x0301:Kerberos 类比流程 — 第三方购物

假设现在 A 要买 “电脑”,它知道 B 在卖(通过电视宣传啊),但是 AB 两人都没有见过面,现在 A 就在担心,我要是把钱直接给 B 了,B 翻脸不认人了怎么办,此时,A 就陷入了信任危机。

于是,A 想到了一个办法,它找到第三方机构 C(某东),C 机构认识 A 和 B,那么 A 就将钱交给了 C 机构,C 机构转告给 B 机构发货,等到 A 确认收货后,C 机构再把钱给 B。

上面这个例子,体现的是 Kerberos 的第三方认证特性,Kerberos 中的 KDC 在上面那里例子中就是充当 C 角色,A 就是 Client,B 就是 Server。但是上面这个例子并没有体现 KDC 中 “AS” 和 ”TGS“ 的用处,我们来看看下面这个例子。

0x0302:Kerberos 类比流程 — 乘坐过山车

假设你带着一家去做过山车,你不能直接去乘过山车,你得去售票处买票吧:

来到了售票处,你不光得有钱,你还得符合乘坐的标准吧(身高啥的),只有你都满足要求了,你才能花钱买到过山车的票,然后乘坐过山车:

在上面的那个流程中 ”你“ 就是 Client 端,”过山车“ 就是你申请的服务 Server。售票处(测量身高的阿姨 + 售票)构成了 KDC,你来到了 KDC,KDC 中的 AS 首先得校验你有没有购票资格,你有资格购票后,售票处(TGS)才能给你发放票据(Ticket)。

0x0303:Kerberos 认证流程简单概述

通过上面两个例子,相信读者对 Kerberos 已经有一个大致的认识了,这里笔者简单描述一下它的整体认证流程:客户端在访问每个想要访问的服务时,需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。

整个 Kerberos 认证流程可以简化为两大步:

  1. 客户端向 KDC 请求获取想要访问的目标服务的服务授予票据(Ticket)。

  2. 客户端拿着从 KDC 获取的服务授予票据(Ticket)访问相应的网络服务。

0x04:Kerberos 认证的完整流程

在前面类比流程中,笔者并没有详细讲 KDC 中 AS 和 TGS 的具体作用,那么在这里,笔者将详细讲解 Kerberos 认证的完整流程,并顺带介绍 AS 与 TGS 的作用。

0x0401:第一步 — 客户端与 AS 进行通信

为了获得能用来访问服务端服务的票据,客户端首先需要来到 KDC 获得服务授予票据(Ticket)。由于客户端是第一次访问 KDC,此时 KDC 也不能确认该客户端的身份,所以在第一次通信的时候 KDC 需要对客户端身份进行认证,确认客户端是一个可靠且拥有访问 KDC 权限的客户端。

第一步:Client 首先向 KDC 以明文方式发起请求,并在该次请求中携带了自己的用户名,主机 IP 和当前时间戳。

第二步:KDC 中的 AS (AS 是 KDC 中专门用来认证客户端身份的认证服务器)接收请求后去 Kerberos 认证数据库中根据用户名查找是否存在该用户(注意:此时只会查找是否有相同用户名的用户,并不会判断身份的可靠性)。

第三步:如果没有该用户名,则认证失败,服务结束;如果存在用户名,则 AS 认证中心便认为用户存在,此时便会返回相应给客户端,响应中包含两部分内容:

  • 第一部分内容被称为(TGT),即 ”票据授予票据“。客户端后续需要使用 TGT 去 TGS(票据授予中心)获取访问网络服务所需的 Ticket(服务授予票据),TGT 中包含 Kerberos 数据库中存在的该客户端的 Name,IP,当前的时间戳,客户端即将访问的 TGS 的 Name,TGT 的有效时间以及一把用于客户端和 TGS 间进行的 Session_Key(CT_SK)。整个 TGT 使用 TGS 密钥加密,客户端是解密不了的,由于密钥从没有在网络中传输过,所以也不存在密钥被劫持破解的情况。

  • 第二部分内容是使用客户端密钥加密的,其中包括用于客户端和 TGS 间通信的 Session_Key(CT_SK),客户端即将访问的 TGS 的 Name 以及 TGT 的有效时间,和一个当前的时间戳。该部分内容使用客户端加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。如果是一个假的客户端,那么他是不会拥有真正客户端的密钥的,因为该密钥也没在网络中进行传输过。这也同时认证了客户端的身份,如果是假客户端会由于解密失败而终止认证流程。

第一阶段的整体流程如下图所示:

0x0402:第二步 — 客户端和 TGS 进行通信

经过了第一步,Client 收到了来自 KDC(准确来说是 AS)的响应,并获取到了其中两部分的内容。此时客户端会用自己的密钥将第二部分内容解密,获取时间戳、自己将要访问的 TGS 的信息以及用于与 TGS 通信的密钥 CT_SK。Client 在获取上述信息后,会先根据时间戳判断该时间戳与自己发送请求时的时间之间的差值是否大于 5 分钟,如果大于五分钟则认为该 AS 是伪造的,认证失败。如果时间戳合理,客户端就会准备向 TGS 发起请求。客户端和 TGS 通信流程如下:

Client(客户端)行为:

  1. 客户端使用 CT_SK 加密将自己的客户端信息发送给 KDC,其中包括客户端名,IP,时间戳。

  2. 客户端将自己想要访问的 Server 服务以明文的方式发送给 KDC。

  3. 客户端将使用 TGS 密钥加密的 TGT 也原封不动的携带给 KDC。

KDC 中的 TGS(票据授予服务器)行为:

  1. TGS 收到了来自客户端的请求。首先根据客户端明文传输过来的 Server 服务 IP 查看当前 Kerberos 系统中是否存在可以被用户访问的对应服务。如果不存在,认证失败,如果存在,继续下一步。

  2. TGS 使用自己的密钥将 TGT 中的内容进行解密,此时他看到了经过 AS 认证过后并记录的用户信息,CT_SK 以及时间戳信息,它会先根据时间戳判断此次通信是否真实可靠没有超出时延。

  3. 如果时延正常,则 TGS 会使用 CT_SK 对客户端的第一部分内容进行解密(使用 CT_SK 加密的客户端信息),取出其中的用户信息和 TGT 中的用户信息进行比对,如果全部相同则认为客户端身份正确,可以进行下一步。

  4. 此时,KDC(准确来说是 TGS)将返回一个 Ticket,该 Ticket 由两个部分组成:

    1. 第一部分,用于客户端访问网络服务的使用 Server 密码加密的 ST(Server Ticket),其中包括客户端的 Name,IP,需要访问的网络服务的地址 Server IP,ST 的有效时间,时间戳以及用于客户端和服务端之间通信的 CS_SK(Session Key)。

    2. 第二部分,使用 CT_SK 加密的内容,其中包括 CS_SK 和时间戳,还有 ST 的有效时间。由于在第一次通信过程中,AS 已将 CT_SK 通过客户端密码加密交给了客户端,且客户端解密并缓存了 CT_SK,所以该部分内容在客户端接收到时是可以自己解密的。

第二阶段整体流程如下图所示:

0x0403:第三步 — 客户端和服务端进行通信

经过前面两步,此时客户端收到了来自 TGS 的响应,并使用缓存在本地的 CT_SK 解密出了第二部分的内容(第一部分内容中的 ST 是由 Server 密码加密,客户端无法解密)。客户端在检验第二部分时间戳无误后取出其中的 CS_SK 准备向服务端发起最后的请求:

Client(客户端)行为:

客户端使用 CS_SK 将自己的主机信息和时间戳进行加密作为交给服务端的第一部分内容,然后将 ST(服务授予票据)作为第二部分内容都发送给服务端。

 Server(服务端)行为:

服务端收到来自客户端的请求,使用自己的密钥,将客户端发送来的 ST 部分进行解密,核对时间戳后将其中的 CS_SK 取出,使用 CS_SK 将客户端发来的第一部分内容进行解密,从而获得经过 TGS 认证过后的客户端信息,此时他将这部分信息和客户端第二部分内容带来的信息进行比对,最终确认客户端就是经过了 KDC 认证的具有真实身份的客户端,是他可以提供服务的客户端。

此时服务端会返回一段使用 CT_SK 加密的表示接收请求的响应给客户端,在客户端收到请求后,使用缓存在本地的 CS_SK 解密后也确认了服务端的身份。(其实服务端在通信过程中还会使用数字证书证明自己身份)。

至此,第三次通信完成,此时也代表整个 Kerberos 认证的完成,通信的双方都确认了对方的身份,此时便可以放心的进行整个网络通信了。第三阶段流程如下:

0x0404:Kerberos 认证完整流程图

相关文章:

[内网安全] Windows 域认证 — Kerberos 协议认证

🌟想系统化学习内网渗透?看看这个:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:Kerberos 协议简介 Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过…...

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”(vision vocabulary) 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…...

C++之thread_local变量

C之thread_local变量_c threadlocal-CSDN博客 thread_local简介 thread_local 是 C11 为线程安全引进的变量声明符。表示对象的生命周期属于线程存储期。 线程局部存储(Thread Local Storage,TLS)是一种存储期(storage duration),对象的存储是在…...

【国产Linux | 银河麒麟】麒麟化龙——KylinOS下载到安装一条龙服务,起飞!

🗺️博客地图 📍一、下载地址 📍二、 系统安装 本文基于Windows操作系统vmware虚拟机安装 一、下载地址 官网:产品试用申请国产操作系统、麒麟操作系统——麒麟软件官方网站 下载自己需要的版本,完成后&#xff0c…...

(接“使用js去复制网页内容的方法”)js中的execCommand怎么复制富文本内容解析

document.execCommand(copy) 是传统的剪贴板操作方法,但它主要用于复制纯文本内容。如果你想复制富文本内容(包括 HTML 标签和样式),需要结合一些技巧来实现。以下是具体方法: 方法:通过创建隐藏的富文本元…...

npm ERR! code 128 npm ERR! An unknown git error occurred

【问题描述】 【问题解决】 管理员运行cmd(右键window --> 选择终端管理员) 执行命令 git config --global url.“https://”.insteadOf ssh://git cd 到项目目录 重新执行npm install 个人原因,这里执行npm install --registryhttps:…...

解决Leetcode第3470题全排列IV

3470.全排列IV 难度:困难 问题描述: 给你两个整数n和k,一个交替排列是前n个正整数的排列,且任意相邻两个元素不都为奇数或都为偶数。 返回第k个交替排列,并按字典序排序。如果有效的交替排列少于k个,则…...

MyBatis 配置文件核心

MyBatis 配置文件核心标签解析 以下是针对你的笔记中的三个核心标签的详细解析,帮助你全面理解它们的用途和配置逻辑。 1. properties 标签:动态加载外部配置 功能 将环境相关的配置(如数据库连接、密钥等)与 MyBatis 核心配置…...

bert模型笔记

1.各预训练模型说明 BERT模型在英文数据集上提供了两种大小的模型,Base和Large。Uncased是意味着输入的词都会转变成小写,cased是意味着输入的词会保存其大写(在命名实体识别等项目上需要)。Multilingual是支持多语言的&#xff0…...

微信小程序接入deepseek

先上效果 话不多说&#xff0c;直接上代码&#xff08;本人用的hbuilder Xuniapp&#xff09; <template><view class"container"><!-- 聊天内容区域 --><scroll-view class"chat-list" scroll-y :scroll-top"scrollTop":…...

推荐算法和推荐系统入门第一趴

以下是推荐系统技术总结的架构梳理和建议表达思路&#xff1a; 从原理到生产环境&#xff1a;推荐系统核心技术与实战代码解析 一、推荐算法的演进图谱 传统算法三剑客 ![推荐系统算法分类示意图] &#xff08;使用Mermaid绘制算法分类关系图&#xff0c;清晰展示技术演进&am…...

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …...

基于深度学习的青花瓷图像检索系统开发与实现

目录 1.研究背景与目的 1.1课题背景 1.2研究目的 二、调研资料情况 2.1图像分割研究现状 2.2图像检索调研 2.2.1选择深度学习进行检索的原因及优势 2.2.2基于深度学习的图像检索技术的发展 2.2.3基于深度学习的图像检索的研究重点 2.3基于深度学习的图像检索方法调研 …...

uniapp 系统学习,从入门到实战(八)—— Vuex 的使用

全篇大概 4500 字(含代码)&#xff0c;建议阅读时间 30min &#x1f4da; 目录 Vuex核心概念解析在 UniApp 中集成Vuex状态管理与数据共享实践总结 一、Vuex 核心概念解析 1.1 什么是状态管理 在跨多组件的大型应用中&#xff0c;不同页面/组件需要共享和修改相同数据时&am…...

Vue Hooks 深度解析:从原理到实践

Vue Hooks 深度解析&#xff1a;从原理到实践 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff01;点我试试&#xff01;&#xff01; 文章目录 Vue Hooks 深度解析&#xff1a;从原理到实践一、背景…...

django中序列化器serializer 的高级使用和需要注意的点

在 Django REST framework(DRF)中,序列化器(Serializer)是一个强大的工具,用于将复杂的数据类型(如 Django 模型实例)转换为 Python 原生数据类型,以便将其渲染为 JSON、XML 等格式,同时也能将接收到的外部数据反序列化为 Django 模型实例。以下将介绍序列化器的高级…...

靶场(二)---靶场心得小白分享

开始&#xff1a; 看一下本地IP 21有未授权访问的话&#xff0c;就从21先看起 PORT STATE SERVICE VERSION 20/tcp closed ftp-data 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_Cant get dire…...

PHP Error处理指南

PHP Error处理指南 引言 在PHP开发过程中,错误处理是一个至关重要的环节。正确的错误处理不仅能够提高代码的健壮性,还能提升用户体验。本文将详细介绍PHP中常见的错误类型、错误处理机制以及最佳实践,帮助开发者更好地应对和处理PHP错误。 PHP错误类型 在PHP中,错误主…...

视频输入设备-V4L2的开发流程简述

一、摄像头的工作原理与应用 基本概念 V4L2的全称是Video For Linux Two&#xff0c;其实指的是V4L的升级版&#xff0c;是linux系统关于视频设备的内核驱动&#xff0c;同时V4L2也包含Linux系统下关于视频以及音频采集的接口&#xff0c;只需要配合对应的视频采集设备就可以实…...

【Manus资料合集】激活码内测渠道+《Manus Al:Agent应用的ChatGPT时刻》(附资源)

DeepSeek 之后&#xff0c;又一个AI沸腾&#xff0c;冲击的不仅仅是通用大模型。 ——全球首款通用AI Agent的破圈启示录 2025年3月6日凌晨&#xff0c;全球AI圈被一款名为Manus的产品彻底点燃。由Monica团队&#xff08;隶属中国夜莺科技&#xff09;推出的“全球首款通用AI…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...