记录内网渗透学习进程--DAY21 域渗透--黄金票据和白银票据

Kerberos认证

一、Kerberos认证

Kerberos的重要性:

对我们搞Web的而言,弄清Kerberos认证过程,最有利于帮助我们理解域内的金票和银票!

Kerberos介绍:

在古希腊神话中Kerberos指的是:有着一只三头犬守护在地狱之门外,禁止任何人类闯入地狱之中。
而现实中的Kerberos是一种网络身份验证协议,旨在通过密钥加密技术为客户端/服务器应用程序提供身份验证,主要用在域环境下的身份验证。

 

 

通过上图可以看到整个认证流程有三个重要的角色,分别为Client、Server和KDC。

下面介绍下几个相关的名词:

  1. 访问服务的 Client;

  2. 提供服务的 Server;

3.KDC(Key Distribution Center)密钥分发中心。
在KDC中又分为两个部分:Authentication Service(AS,身份验证服务)和Ticket Granting Service(TGS,票据授权服务)

4.DC是Domain Controller的缩写,即域控制器;AD是Active Directory的缩写,即活动目录。
DC中有一个特殊用户叫做:krbtgt,它是一个无法登录的账户,是在创建域时系统自动创建的,在整个kerberos认证中会多次用到它的Hash值去做验证。
AD会维护一个Account Database(账户数据库). 它存储了域中所有用户的密码Hash和白名单。只有账户密码都在白名单中的Client才能申请到TGT。

 

Kerberos粗略的验证流程:

举个简单的栗子:如果把 Kerberos 中的票据一类比作一张门禁卡,那么 Client 端就是住客,Server 端就是房间,而 KDC 就是小区的门禁。住客想要进入小区,就需要手里的门禁卡与门禁想对应,只有通过门禁的检验,才能打开门禁进入小区。

需要注意的是,小区门禁卡只有一张,而Kerberos认证则需要两张票。

 


 

 

首先是客户端带着自己的username(实际上发送了Pre-authentication data[一个被client hash加密的timestamp,用于KDC验证客户端身份,Client info[Clent标识,KDC以此查找clent的哈希,Serverinfo[KDC的Ticket Granting Service])去访问KDC

 

 

这时候KDC就会向AD查询这个username是否可以信任,如果可以信任,则提取此username对应的NTNL HASH,然后生成一个随机的字符串,称为session key,然后用此段NTML HASH进行加密,这一块功能叫做AS

然后使用KDC里特殊的用户对应的NTML HASH值对session key和之前提交过来的client info进行加密,然后一并返回给客户端

 

 

然后因为我们能解密Client Pass,但是我们没有KDC PASS的HASH,无法解密TGT,所以我们还要向TGS发送请求验证,我们把从AS收到的TGT原封不动的交给TGS,连同我们的Session key加密后和一些客户端服务端信息一起发送

TGS收到后,先通过KDC进行TGT的session key的解密(TGS本身没有哈希,要去查找),然后获得session key后,再对客户端信息和服务端信息进行解密

认证完毕后,KDC又生成一段随机字符(Server Session Key),用于和服务通信的验证,然后TGS提取client info的信息,然后通过计算机名对应的哈希值去加密ticket

 

Ticket是通过Server Hash加密的

 

 

最后客户端将Ticket和Server Session Key一起发给服务端,服务端有自己的HASH,所以可以解密Ticket,得到Server Session Key。然后通过Server Session Key再去解密客户端信息和时间戳,判断是否在合法的事件范围内

 

 

对应的流量包

 

 

白银票据

原理就是拿到server hash后,我们可以伪造一个票据,直接和服务进行通信。

 

 

 

可以用mimikatz伪造票据

 

导出哈希

 

 

 

 

 

 

 伪造票据

在安全策略没做好的时候,生成响应的日志都是假的,所以用户名可以随便填写

 

 

 

DCSync,如果我们知道域控账号对应的hash的话,我们可以把域里的全部账户信息给导出来

白银票据与其说是一种方式,不如说是一种后门

 

 

 白银票据防御,安全加固。

 

 

黄金票据

拿到krbtgt的HASH,可以伪造TGT。

 

利用MSF的 kiwi模块

 

 

 加固防御

 

 

 

Windows Access Token

01、Windows Access Token 简介

Windows Token其实叫Access Token(访问令牌),它是一个描 述进程或者线程安全上下文的一个对象。不同的用户登录计算机后, 都会生成一个Access Token,这个Token在用户创建进程或者线程 时会被使用,不断的拷贝,这也就解释了A用户创建一个进程而该 进程没有B用户的权限。

Access Token种类:

  • 主令牌
  • 模拟令牌

一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

02、Windows Access Token组成

  • 用户帐户的安全标识符(SID)
  • 用户所属的组的SID
  • 用于标识当前登录会话的登录SID
  • 用户或用户组所拥有的权限列表
  • 所有者SID
  • 主要组的SID
  • 访问控制列表
  • 访问令牌的来源
  • 令牌是主要令牌还是模拟令牌
  • 限制SID的可选列表
  • 目前的模拟等级
  • 其他统计数据

03、Windows Access Token

 – SID (Security Identifiers)安全标识符

安全标识符是一个唯一的字符串,它可以代表一个账户、一个用户 组、或者是一次登录。通常它还有一个SID固定列表,例如 Everyone这种已经内置的账户,默认拥有固定的SID。

SID的表现形式:

  • 域SID-用户ID
  • 计算机SID-用户ID
  • SID列表都会存储在域控的AD或者计算机本地账户数据库中。

04、Windows Access Token产生过程

每个进程创建时都会根据登录会话权限由LSA(Local Security Authority)分配一个Token(如果CreaetProcess时自己指定了 Token, LSA会用该Token, 否则就用父进程Token的一份拷贝。

05、Windows Access Token令牌假冒实战

当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清 除,只有在重启机器后才会清除。可以使用多种工具查看目前系统上存在的模拟令牌:

  • Incognito
  • Powershell - Invoke-TokenManipulation.ps1
  • Cobalt Strike - steal_token

 

 

 

 

 

 

posted @ 2021-05-17 14:11  paku  阅读(465)  评论(0编辑  收藏  举报