Windows认证机制学习

一直想学习一下Windows的认证机制,在这里总结一下基本概念

主要参考这篇:https://payloads.online/archivers/2018-11-30/1

本地认证

当登录系统时,系统会自动读取SAM文件,与我们输入的密码进行比对,如果相同则认证成功

Windows不保存明文密码,只保留密码的hash,这个hash称为NTLM Hash

NTLM是以NTLM Hash作为根本认证凭证的一种网络认证协议。本地认证的过程就是将用户输入的密码转换为NTLM Hash与SAM中的NTLM Hash进行比较

NTLM Hash的产生:hex -> unicode -> MD4

所以本地登录的时候流程如下

1
winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
  • Windows Logon Process(即 winlogon.exe),是Windows NT 用户登 陆程序,用于管理用户登录和退出。
  • LSASS用于微软Windows系统的安全机 制。它用于本地安全和登陆策略。

网络认证

工作组环境是一个逻辑 上的网络环境(工作区),隶属于工作组的机器之间无法互相建 立一个完美的信任机制,只能点对点进行认证,即如果A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。

NTLM协议

NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式

NTLM协议的认证过程分为三步

  • 协商
  • 质询
  • 验证

协商:用于确认双方协议版本

质询:实现挑战/响应认证机制,完整过程如下

  1. 客户端向服务器端发送用户信息(用户名)请求
  2. 服务器接受到请求,生成一个16位的随机数,被称之为Challenge, 使用登录用户名对应的NTLM Hash加密Challenge,生成Challenge1。同时,生成Challenge1后,将Challenge发送给客户端。
  3. 客户端接受到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。

其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash。

验证:比对Challenge1与Response是否一致,若一致,验证通过

Pass The Hash

在内网渗透中,我们经常会需要抓取管理员的密码、NTLM Hash,通过搜集这些信息有助于我们扩大战果,尤其是在域环境下。

哈希传递就是能够在不需要账户明文密码的情况下完成认证的一个技术。

哈希传递就是使用用户名对应的NTLM Hash将服务器给出的 Chanllenge加密,生成一个Response,来完成认证。

域认证

Active Directory

Windows提供了为企业管理资产、服务、网络对象进行组织化的管理,这非常符合企业架构的管理模式。而承载这些管理机制的就是活动目录服务。

活动目录服务以域名来划分域的边界,域外就不属于管理范围了,也就是说,一个域对应一个域名,域之间也可以相互信任。

Active Directory存储了有关网络对象的信息,并且让管理员和用 户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。

Active Directory功能

  • 服务器及客户端计算机管理:管理服务器及客户端计算机账户, 所有服务器及客户端计算机加入域管理并实施组策略。
  • 用户服务:管理用户域账户、用户信息、企业通讯录(与电子邮 件系统集成)、用户组管理、用户身份认证、用户授权管理等, 按省实施组管理策略。
  • 资源管理:管理打印机、文件共享服务等网络资源。
  • 桌面配置:系统管理员可以集中的配置各种桌面配置策略,如: 用户使用域中资源权限限制、界面功能的限制、应用程序执行特 征限制、网络连接限制、安全配置限制等。
  • 应用系统支撑:支持财务、人事、电子邮件、企业信息门户、办 公自动化、补丁管理、防病毒系统等各种应用系统。

在实际中往往需要对某些域的权限进行限制,这时就需要Kerberos认证协议来验证网络对象间的权限

Kerberos

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

Kerberos认证需要三方

  • Client
  • Server
  • KDC(Key Distribution Center) = DC(Domain Controller)

Kerberos认证协议相关基础概念

票据(Ticket):网络对象互相访问的凭证

入场券(TGT):通过入场券能够获得票据,是一种临时凭证

AD(account database):存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT

KDC负责管理票据、认证票据、分发票据,但是KDC不是一个独立的服务,它由以下服务组成:

  • Authentication Service: 为client生成TGT的服务(黄金票据)
  • Ticket Granting Service: 为client生成某个服务的ticket(白银票据)

从物理层面看,AD与KDC均为域控制器(Domain Controller)。

域认证流程

  1. client向kerberos服务请求,希望获取访问server的权限。 kerberos得到了这个消息,首先得判断client是否是可信赖的, 也就是白名单黑名单的说法。这就是AS服务完成的工作,通过在AD中存储黑名单和白名单来区分client。成功后,AS返回TGT给client。
  2. client得到了TGT后,继续向kerberos请求,希望获取访问 server的权限。kerberos又得到了这个消息,这时候通过client 消息中的TGT,判断出了client拥有了这个权限,给了client访问server的权限ticket。
  3. client得到ticket后,终于可以成功访问server。这个ticket只是针对这个server,其他server需要向TGS申请。

具体分析每一步

首先,客户端需要发送自己的身份信息到KDC,身份信息中起码包含用户名,KDC根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash。

KDC此时生成一个随机字符串,叫Session Key,使用用户名对应的NTLM Hash加密Session Key,作为AS数据,使用KDC中某个用户的NTLM Hash加密Session Key和客户端的信息,生成TGT。TGT的到期时间为8小时,如果超过了8小时,还需要重新申请TGT,不能之间进入下一步获取Ticket。

  • Session Key用于客户端向TGS服务通信。
  • 域内所有网络对象的凭证都在AD中保存
  • KDC中某个用户指的是krbtgt

第二步客户端需要提供TGT与第一步中使用自己NTLM Hash解密出来的Session Key加密的客户端信息跟时间戳。

如果假设这个数据被中间人窃取到,也无法在段时间内破解,因为KDC会校验时间戳。

KDC接到TGT与其他内容后,会首先解密TGT,只有KDC可以解密TGT,从TGT中提取到Session Key,再使用Session Key解密其他内容,解密出来的内容同TGT中的信息进行校验来确认客户端是否受信。

验证通过后,就会生成一个新的Session Key,我们称之为Server Session Key,这个Server Session Key主要用于和服务器进行通信。同时还会生成一个Ticket,也就是最后的票据了。

在第三步里,客户端向服务器请求,需要提供Ticket,Server Session Key加密的客户端信息与时间戳。

  • Ticket客户端无法解密
  • 服务器端通过解密Ticket解密Server Session Key(Client info + Timestamp)
  • 比较时间长度

校验通过后,认证成功,该票据会一直存在客户端内存中。

伪造票据

白银票据:如果我们获取了服务器端的 master key ,就可以伪造 TGS 从而跳过KDC的认证,直接和目标Server通信

黄金票据:利用krbtgt的HASH值可以伪造生成任意的TGT(使用 mimikatz),能够绕过对任意用户的账号策略,让用户成为任意组的成员

Windows Access Token

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

Access Token分为主令牌和模拟令牌

一般情况下,用户双击运行一个程序,都会拷贝“explorer.exe”的Access Token。

当用户注销后,系统将会使主令牌切换为模拟令牌,不会将令牌清除,只有在重启机器后才会清除。

SID (Security Identifiers)安全标识符

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

SID的表现形式:

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