热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kerberos票据_干货|内网渗透之kerberos协议分析

内容来源:先知社区一、前言Kerberos协议是一种网络认证协议,其设计目标是通过密钥系统为客户服务器应用程序提供强大的认证服务。在令牌窃取攻击中&#x

内容来源:先知社区

bea09feb9fd3dca157cb55edf11c803e.png

一、前言

Kerberos协议是一种网络认证协议,其设计目标是通过密钥系统为客户/服务器应用程序提供强大的认证服务。在令牌窃取攻击中,该攻击的核心就是Kerberos协议。Kerberos协议要解决的实际上就是一个身份认证的问题,顾名思义,当一个客户机去访问一个服务器的某服务时,服务器如何判断该客户机是否有权限来访问本服务器上的服务,同时保证在该过程中的通讯内容即便被拦截或者被篡改也不影响整个通讯的安全性

二、概念说明

先来简要说明几个主要的名词

(1)Client:访问服务的客户机

(2)Server:提供服务的服务器

(3)KDC(Key Distribution Center):密钥分发中心

(4)KDC中分成两个部分:Authentication Service和Ticket Granting Service
    Authentication Service(AS):身份验证服务
    Ticket Granting Service(TGS):票据授予服务

    AS和TGS如下:

    Authentication Service:AS的作用就是验证Client端的身份,验证通过之后,AS就会给TGT票据(Ticket Granting Ticket)给Client.
    Ticket-granting COOKIE(TGC):存放用户身份认证凭证的COOKIE,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此COOKIE值对应的用户信息.
    Ticket-granting ticket(TGT):TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT.


    Ticket Granting Service(TGS):TGS的作用是通过AS发送给Client的TGT换取访问Server端的ST(Server Ticket)给Client.
    SEerver Ticket(ST):ST服务票据,由TGS服务发布.


(5)Active Directory(AD):活动目录

(6)Domain Controller(DC):域控制器

(7)Ticket-granting COOKIE(TGC):存放用户身份认证凭证的COOKIE,在浏览器和CAS Server间通讯时使用,是CAS Server用来明确用户身份的凭证。TGT封装了TGC值以及此COOKIE值对应的用户信息.

(8)Ticket-granting ticket(TGT):TGT对象的ID就是TGC的值,在服务器端,通过TGC查询TGT.
三、认证过程

Kerberos认证的过程形象地比喻如下:

疫情期间,小明去拿一个重要包裹,由于包裹是来自海外的,所以需要严格登记:
(1)拿包裹的时候,为了证明自己是合法公民,小明先把身份证给工作人员
(2)快递点的身份认证系统通过身份认证后,给小明一张身份认证通过证明
(3)小明拿着身份认证通过证明,来到快递收发处等一张拿快递的号码牌
(4)售票处给了张号码牌
(5)小明拿着号码牌拿快递去了
(6)在拿快递时,小明拿出自己的身份认证材料给快递点的工作人员,工作人员向快递公司的数据管理中心发了消息,问问小明是不是有包裹要拿
(7)数据管理中心将小明的快递单号,身份信息等发了过来
(8)工作人员将数据管理中心发来的信息与小明给的材料对比,得出小明是好公民,有一个重要包裹,于是带着小明来到仓库的金库,把装有老魔杖的包裹给了小明

Kerboeros协议认证过程中,会用到两个基础认证模块,分别是AS_REQ&AS_REPTGS_REQ&TGS_REP,以及在认证过程中可能会使用到的S4UPAC这两个认证模块。

使用wireshark抓包得到数据包,PS:在抓包的时候,先用mimikatz将机器中的票据清除

域控:10.10.10.10(windows server 2008 R2)

域成员:10.10.10.80(windows 7)

域用户账号密码:hunter1/1qaz@WSX

3137bfaa1d9d557165f1e3ecef9d8bf1.png

Kerberos认证中有两个问题

(1)AS如何验证Client的身份?
    AS与Client之间的认证使用AS_REQ&AS_REP模块
(2)Client如何获取ST?
    Client与TGS之间认证使用TGS_REQ&TGS_REP模块

因为kerberos协议的实现,需要三方的参与,分别如下:

1.client 访问服务的客户机
2.Server 提供服务的服务器
3.KDC(Key Distribution Center) 密钥分发中心
    KDC服务会默认安装在一个域的域控中,所以可以直接理解为,AD与KDC均为域控制器,KDC服务框架中包含一个KRBTGT账户,它是在创建域时系统自动创建的一个账号。

Kerberos认证过程如下图所示

abfdfe271b506c9d7e5d4a88e1831169.png

其中:KDC中有AS认证服务TGS认证服务

(1)Client向KDC的AS认证服务请求TGT票据=>AS_REQ
(2)Client通过认证后,KDC将会发放TGT票据=>AS_REP
(3)Client带上TGT票据,向TGS认证服务请求ST服务票据=>TGS_REQ
(4)Client通过了TGS认证服务后,TGS将会发放ST服务票据=>TGS_REP
(5)Client使用ST服务票据向服务端请求服务=>AP_REQ
(6)Server拿到PAC询问KDC,Client是否有权限
(7)KDC将Client的权限信息发给Server
(8)Server根据KDC返回的权限信息对比,判断Client是否有权限访问该服务,并把结果返回给Client=>AP_REP

注:(6)(7)两步不一定发生,需要将目标主机配置为验证KDC PAC验证。

93c9a4e14849df5a3e48a0ddd3348946.png

域中每个用户的Ticket都是由krbtgt的密码Hash来计算生成的,因此只要我们拿到了krbtgt的密码Hash,就可以随意伪造Ticket,进而使用Ticket登陆域控制器,使用krbtgt用户hash生成的票据被称为Golden Ticket,此类攻击方法被称为票据传递攻击。

先前提到两个问题,第一个问题

(1)AS如何验证Client的身份?
    AS与Client之间的认证使用AS_REQ&AS_REP模块

1、AS_REQ&AS_RE

(1)分析AS-REQ的数据包

AS-REQ:当某个域用户试图访问域中的某个服务,于是输入用户名和密码,本机Kerberos服务会向KDCAS认证服务发送一个AS-REQ认证请求。该请求包中包含:请求用户名,客户端主机名,加密类型Autherticator(用户NTLM Hash加密的时间戳)以及一些信息。

ClientKDC发起AS_REQ请求凭据是用户hash加密的时间戳。请求凭据放在PA_DATA里面。

6c211956d292be6a5874ac0d5f9dab21.png

Pvno kerberos协议版本号:05(Hex)
5MSG-TYPE 类型 AS_REQ对应(krb-as-req)0a(Hex)
PA-DATA 预认证信息数据 一个列表,包含若干个认证消息用于认证,每个认证消息有type和value。
AS_REQ 阶段主要用到的有两个
  1.ENC_TIMESTAMP
  这个是预认证,就是用用户hash加密时间戳,作为value 发送给AS服务器。然后AS服务器那边有用户hash,使用用户hash进行解密,获得时间戳,如果能解密,且时间戳在一定的范围内,则证明认证通过。
  2.PA_PAC_REQUEST
  这个是启用PAC支持的扩展。PAC(Privilege Attribute Certificate)并不在原生的kerberos里面,是微软引进的扩展。PAC包含在AS_REQ的响应body(AS_REP)。这里的value对应的是include=true或者include=false(KDC根据include的值来判断返回的票据中是否携带PAC)。
REQ_BODY
  1.cname
  PrincipalName 类型。PrincipalName包含type和value。
  KRB_NT_PRINCIPAL = 1 means just the name of the principal 如daizhibin
  KRB_NT_SRV_INST = 2 service and other unique instance (krbtgt) 如krbtgt,cifs
  KRB_NT_ENTERPRISE_PRINCIPAL = 10 如 user@domain.com
  在AS_REQ里面cname 是请求的用户,这个用户名存在和不存在,返回的包有差异,可以用于枚举域内用户名。
  2.sname
  PrincipalName 类型,在AS_REQ里面sname是krbtgt,类型是KRB_NT_SRV_INST
  3.realm 域名
  4.from 发送时间
  5.till 到期时间,rubeus和kekeo都是20370913024805Z,这个可以作为特征来检测工具。
  6.nonce
  随机生成的一个数kekeo/mimikatz nonce是12381973,rubeus nonce是1818848256,这个也可以用来作为特征检测工具。
  7.etype
  加密类型
这个地方要注意的是如果在配置里面选择用hash(不是plaintext)的话,hash的加密类型,要跟etype一样。因为KDC是按照etype类型选择用户对应加密方式的hash,如果是选择明文(plaintext),那么client 会按照etype里面的加密方式将明文加密成hash

08c8226dac41801b8ba467f03a53d0e6.png

cf0b47db48ff22b47ffa0e7bc74c4e4e.png

d0040dce95056b52f51164dc9e4e9f47.png

(2)分析AS-REP的数据包

c3c87dfbb7c91fad2ec0e491036b249b.png

AS-REP:Client发送AS_REQ,请求凭据是用户 hash加密的时间戳。请求凭据放在PA_DATA里面。当KDC中的AS认证服务收到后,在AS服务器中有用户hash,使用用户hash进行解密,获得时间戳,如果解密成功,并且时间戳在五分钟之内,那么预认证通过。接着AS认证服务将会向Client发送响应包,响应包中包括krbtgt用户的NTML hash加密后的TGT票据以及用户NTML Hash加密的Login Session key和其他信息

af1a3690d9dee624d97be64a06a8be8d.png

ticket中的enc-part是由krbtgt的密码hash加密生成的。如果我们拥有krbtgt的hash,便可以自制ticket,发起黄金票据攻击

Login Session Key使用用户NTML Hash加密,作用是用于是用于确保客户端和KDC下一阶段之间通信安全,作为下一阶段的认证密钥

在这一阶段,Client与KDC之间的交互在于AS认证服务,主要是为了获得TGT认证票据,以及Login Session Key,经过该阶段后,Client将会使用自身密码的NTML hash解密Login Session Key得到原始的Login Session Key。然后它会在本地缓存TGT票据和原始Login Session Key

2、TGS_REQ&TGS_REP

先前提到两个问题,第二个问题

(2)Client如何获取ST?
    Client与TGS之间认证使用TGS_REQ&TGS_REP模块

Client在拿到TGTLogin Session Key之后,下一步的认证交互在于KDC中的TGS认证服务,主要目的是为了获取ST服务票据,因为当Client需要访问某服务器中的某服务时,需要"门票"--ST服务票据

这一阶段,微软引进了两个扩展S4U2SELFS4U2PROXY

(1)TGS-REQ数据包分析

该数据包中的主要内容为:客户端信息,Authenticator(Login Session Key加密的时间戳)、TGT认证权证(padata下ap-req下的ticket)以及访问的服务名等。

73b4149f02219da81f45f67d559df74b.png

padata部分:

2ca4866b49e9f66f1b56af7af6f98562.png

padata中有很重要的一部分叫做AP-REQ,这是TGS-REQ中必须有的数据,这部分会携带AS-REP里面获取到的TGT票据,KDC检验TGT票据,如果票据正确,返回ST票据

5a5976a523580907de2a215e18ae01bf.png

TGS-REQ请求包中的authenticator就是AS-REP响应包返回的Login Session key加密的时间戳

req-body部分:

bb7d4b45099f38ae427f27f8cc9f5b74.png

req-body

padding:0
kdc-options:用于与KDC约定一些选项设置
realm:域名
sname:这里是要请求的服务
till:到期时间
    rebeus和kekeo都是20370913024805Z,可用于作为特征值检验用
nonce:随机生成数
    kekeo/mimikatz的nonce为12381973,rubeus的nonce为1818848256,可用于作为特征值检验 用
etype:加密类型

(2)分析TGS-REP数据包

TGS-REP:当TGS收到请求后,将会检查自身是否存在客户端所请求的服务,如果服务存在,通过krbtgt用户的NTML hash解密TGT并且得到Login Session Key,通过Login Session Key解密Authenticator

486b05e3c318024ff1b024ff40ca7416.png

这一系列解密成功的话,将会验证对方的身份,验证时间戳是否在范围内,并且检查TG中的时间戳是否过期,且原始地址是否和TGT中保存的地址相同

完成认证后,TGS生成ST票据(包括客户端信息和原始Server Session key,整个ST服务票据使用该服务的NTML hash加密以及一个AS-REP返回的Login-Session-Key加密的Server Session Key。这两个将在响应包中发送给Client

c9ceb992add6769c5b4f91078eea250a.png

PS:在这一步中,不论用户是否有权限访问服务,只要TGT解密无误,都将返回ST服务票据。任何一个用户,只要hash正确,就可以请求域内任何一个服务的票据

ST票据通过认证访问服务

3、使用ST票据通过认证访问服务

9f5c8e013ab8bc82729bb849f6428abf.png

需要强调的是,这里需要使用双向验证,因为实际情况中,需要客户端和服务器互相验证

(1)服务端验证客户端:防止非法用户操作

a1e33be7be030fcdd7830ddc0dc2f379.png

(2)客户端验证服务端:防止误入恶意服务

ef745eddbb254a17ab61a055800d7bd4.png

PS:PAC并不是所有服务都开启的,这需要配置验证KDC PAC 签名。没有验证PAC,可能会导致白银票据攻击。因为开启PAC后,就算攻击者拥有用户hash,能制作ST票据后,无法通过PAC验证,还是无法访问服务

四、后话

Kerberos的攻击有如下:

23b99cb30657d6ac30a664ad17e29e94.png

参考文章:

https://www.zhihu.com/question/22177404

https://blog.csdn.net/matthewei6/article/details/50769670

http://www.secwk.com/2019/11/05/13711/

https://www.cnblogs.com/zlg666/p/12048853.html

https://mp.weixin.qq.com/s/QCyadi2Alb4CMfegxXgs1A

abcd67192146975d806e262ead80d5e8.pngbfc6d31fb306bd157d67db464bb8aeb3.png



推荐阅读
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 在IDEA中运行CAS服务器的配置方法
    本文介绍了在IDEA中运行CAS服务器的配置方法,包括下载CAS模板Overlay Template、解压并添加项目、配置tomcat、运行CAS服务器等步骤。通过本文的指导,读者可以轻松在IDEA中进行CAS服务器的运行和配置。 ... [详细]
author-avatar
mobiledu2502857377
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有