MENU

浅析windows认证原理

March 7, 2022 • Read: 722 • Penetration testing

前言

windows内网基础,还是得多学学,都记录一下,其中的某些概念只能说是通俗但不准确的理解,哈哈哈

一:本地认证

认证流程

Windows本地认证采用sam hash比对的形式来判断用户密码是否正确,计算机本地用户的所有密码被加密存储在%SystemRoot%system32configsam文件中,当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的密码进行比对,如果相同,证明认证成功.

winlogon.exe(Windows Logon Process)是 Windows NT 用户登陆程序用于管理用户登录和退出。
lsass.exe(Local Security Authority Subsystem Service,本地安全认证子系统服务),它用于本地安全和登陆策略该程序运行内存中会记录用户输入的 hash
两个程序都是system权限运行

具体流程如上图:首先,用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,接收输入后,将密码交给lsass进程,这个进程中会存一份明文密码,将明文密码加密成NTLM Hash 与 SAN种的NTLM Hash 进行比较

SAM文件

文件所在位置:%SystemRoot%system32configsam

这个文件中保存了计算机本地所有用户的凭证信息,可以理解为是一个数据库

LM Hash 与 NTLM Hash

借一下大师傅的图

window 系统下的hash 密码格式:
用户名称:RID:LM-HASH值:NTLM-HASH值
ps:Hash,一般翻译为“散列”,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度输出,该输出的就是散列值。
lsass进程就是将密码转换为Hash ,其实就是将NTLM Hash与SAM 文件种的NTLM Hash进行比较

LM Hash

LM Hash是Windows使用的最古老的密码存储,其历史可追溯到1980年代的OS / 2。在LAN Manager协议中使用,由于允许的字符集有限,因此它们很容易破解。如果仍然可用,则可以从Windows系统上的SAM数据库或域控制器上的NTDS数据库中获取它们

但是从Windows Vista / Server 2008开始,默认情况下已关闭LM,但某些工具的参数需要填写固定格式LM hash:NT hash,可以将LM Hash填0(LM hash可以为任意值),即00000000000000000000000000000000:NT hash
NT Hash

Vista之后现代Windows系统使用的Hash,它的前身是LM Hash,两者相差不大,只是使用的加密算法不同。通常意义上的NT Hash指存储在SAM数据库及NTDS数据库中对密码进行摘要计算后的结果,NT Hash可以通过转储SAM数据库或使用Mimikatz来获得,可直接用于PtH,并且通常存在于lsass进程中,便于SSP使用 NT Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参数。其长度为32位,由数字与字母组成,通常人们称其为NTLM Hash

二:windows网络认证

NTLM 网络协议

具体想了解NTLM协议可以看看:http://davenport.sourceforge.net/ntlm.html
简单的例子:

主机A想要访问主机B上的资源,就要向主机B发送一个存在于主机B上的一个账户,主机B接收以后会在本地进行验证,如果验证成功,才会允许主机A进行相应的访问。

NTLM 协议是一种基于挑战(Chalenge)/响应(Response)认证机制,仅支持Windows的网络认证协议。
它主要分为协商、质询和验证三个步骤

  1. 协商:这个是为了解决历史遗留问题,也就是为了向下兼容,双方先确定一下传输协议的版本等各种信息。
  2. 质询:这一步便是Chalenge/Response认证机制的关键之处,下面会介绍这里的步骤。
  3. 验证:对质询的最后结果进行一个验证,验证通过后,即允许访问资源

首先是协商

首先用户客户端向服务器发送消息协商它主要包含客户端支持和服务器请求的功能列表。

然后质询的完整过程图如下

首先server会发送一个username给server,当server接收到这个信息时,首先会在本地查询是否存在这样的一个用户,如果不存在,则直接返回认证失败,如果存在,将会生成一个16位的随机字符,即Chalenge,然后用查询到的这个user的NTLM hash对Chalenge进行加密,生成response2,将response2存储在本地,并将Chalenge传给client。当client接收到Chalenge时,将发送的username所对应的NTLM hash对Chalenge进行加密即Response,并Response发送给server。

最后一步就是验证的机制

server在收到Response后,将其与response2进行比较,如果相同,则验证成功

然后就是如果是在域中,用户的 NTLM Hash都处于域控中时的认证

这个时候client就会通过 netlogon 协议联系域控建立一个安全通道,然后将 server 发送的信息发给域控(这个过程也叫作Pass Through Authentication认证流程)

(仅交互式身份验证存在此步骤)用户访问客户机并提供域名,用户名,密码。客户端计算密码的Hash,并丢弃实际密码

  1. 客户端将用户名发送到服务器
  2. 服务器生成一个16字节的随机数Challenge并发送给客户端
  3. 客户端使用用户密码的Hash对Challenge进行加密,然后将结果response(Net-NTLM hash)返回给服务器
  4. 服务器将三个信息发送到域控制器:用户名,发送给客户机的Challenge,返回给服务器的response
  5. 域控制器使用用户名从SAM数据库中检索用户密码Hash。使用此密码Hash对Challenge进行加密
  6. 域控制器将其加密的Challenge(在步骤6中)与客户端计算的response(在步骤4中)进行比较。如果它们相同则身份验证成功

值得一提的是 response 里面包含 Net-ntlm hashNTLM v1 响应和 NTLMv2 响应对应的就是 Net-ntlm hash 分为 Net-ntlm hash v1和 Net-ntlm hash v2。
Net-ntlm hash v1的格式为username::hostname:LM response:NTLM response:challenge
Net-ntlm hash v2的格式为username::domain:challenge:HMAC-MD5:blob
在实际过程中使用哪个版本的响应由 LmCompatibilityLevel 决定。
但是由于Net-ntlm hash v1的自身缺陷,所以在多数情况下Net-ntlm hash v1 已经废弃。
具体了解可以看看这篇文章:https://www.cnblogs.com/husterlong/p/14271976.html

Kerberos 域认证

在 Kerberos 协议中主要是有三个角色的存在(三个狗头)

  • 访问服务的Client(以下表述为Client 或者用户)
  • 提供服务的Server(以下表述为服务)
  • KDCKey Distribution Center密钥分发中心 kerberos 测试工具介绍

其中 KDC 服务默认会安装在一个域的域控中而 Client 和 Server 为域内的用户或者是服务如 HTTP 服务SQL 服务。在 Kerberos 中 Client 是否有权限访问 Server端的服务由 KDC 发放的票据来决定。
先了解一下前置基础

  • TGT(Ticket Granting Ticket):入场卷,通过入场卷能够获得票据,是一种临时凭证的存在
  • 票据(Ticket):是网络对象互相访问的凭证

KDC:

AD(account database):存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT
Authentiacation Service:为client生成TGT的服务 Ticket Granting
Service:为client生成某个服务的ticket

ps:物理层面看,AD与KDC均为域控制器
域认证粗略流程

  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申请

具体分析
第一步
Session Key 与 Ticket Granting Ticket

  • AS:client发送信息给KDC通过AD认证之后返回一个经过AD中查询到的对应的NTLM Hash加密的生成的随机Session key(Session Key是AS随机生成的)
  • TGT:KDC hash(AD某个特殊用户的NTLM Hash)加密一个客户端的信息(认证之后产生的),Session key与AS的是一样的

看一下客户端发送的数据结构

看一下返回的AS与TGT的具体结构

以为TGT是特殊用户加密的所有client不能解密,TGT有时间限制
第二步
Session Key 与 Ticket

这里的时间戳有防范暴力枚举的作用
Server Session key 又是KDC随机生成的(与server不共享)
KDC提取Server info中的信息,有一个计算机名,提取对应的hash值加密ticket
Ticket构成

第三步
Server Session Key与Ticket

server解密Ticket得到Server Session Key,再解密下面的加密信息,两者都有时间限制的验证

三:白银票据和黄金票据

白银票据

白银票据的特点:

  1. 不需要与KDC进行交互
  2. 需要目标服务的NTLM Hash

在kerberos认证的第三步Ticket中组成:
Ticket=Server Hash(Server Session Key + Client info + End time)
当我们拥有Server Hash时,我们就可以伪造一个不经过KDC认证的一个Ticket。
PS:Server Session Key 来自未发送Ticket之前KDC随机生成且没与server共享的,所有server不知道它具体是什么,(意思是我们客户端可以随意构造Server Session Key来伪造一个Ticket)
所有:一切的凭据都来自Server Hash

白银票据伪造
条件

  1. 域名
  2. 域SID
  3. 目标服务器的FQDN
  4. 可利用的服务
  5. 服务账号的 NTLM Hash
  6. 需要伪造的用户名

使用Mimikatz

kerberos::list #列出票据
kerberos::purge #清楚票据

1:导出目标服务器计算机名的的Hash

mimikatz: C:\files>mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit" > log.txt

2:票据伪造

mimikatz "kerberos::golden /domainL:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit

3:白银票据(Silver Tickets)-伪造默认服务

重点关注DCSync服务,这是域同步的服务,我们如果通过这个服务拿到域控的hash我们就可以拿到整个域的用户的hash以至于拿下整个域

具体伪造过程可以看看这篇文章:https://www.jianshu.com/p/dbea5b78ad18

白银票据防御

1:尽量保证服务器凭证不被窃取
2:开启PAC(Privileged Attribute Certificate)特权属性证书保护功能,开启PAC后,PAC会将client发送的票据ticket发送给KDC,由KDC来进行验证ticket是否有效,就可以使所伪造的票据无法进行利用。
开启方式:将注册表中的HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsaKerberosParameters中的ValidateKdcPacSignature设为1

具体可以看看这篇文章:https://zhuanlan.zhihu.com/p/89380294

黄金票据

黄金票据的特点:

  1. 需要与DC通信
  2. 需要krbtgt用户的hash

ps:这里的krbtgt hash就是之前将的KDC Hash(其实就是第一步中那个特殊用户的hash )

意思就是我们只需要拿到krbtgt hash 就能伪造TGT,而session key是由AS随机生成的,TGS在收到TGT之前并不知道,所以可以伪造,然后申请不同服务的Ticket,虽然黄金票据伪造难,但是TGT被KRBTGT密码散列加密并且可以被域中的任何KDC服务解密的,所以危害大。

黄金票据伪造
条件

  1. 完整的域名称
  2. krbtgt账户的NTLM Hash 或者 AES-256
  3. 域的sid
  4. 需要伪造的域管理员用户名

利用:Mimikatz与msf 中的 kiwi模板
具体可以看看这篇文章:https://www.jianshu.com/p/233d9d180cb1

黄金票据的防御
(1) 限制域管理员登录到除域控制器和少数管理服务器以外的任何其他计算机,将所有其他权限委派给自定义管理员组。这可以降低攻击者访问域控制器的Active Directory的ntds.dit文件。而如果攻击者无法访问AD数据库(ntds.dit文件),则其无法获取到krbtgt hash。
(2) 增加更改krbtgt账户的密码的频率。

结语

其实并不很难,Kerberos只是升级版的NTLM ,然后白银票据和黄金票据只是在Kerberos中的不同步骤窃取凭证而已,最后都是达到一个Ticket的构造的目的,只是黄金票据可以持续维权还有可溯源性很低。
如果还不懂,推荐看一下这个视频:https://www.bilibili.com/video/BV1S4411e7hr

Last Modified: March 9, 2022
Archives Tip
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. 芜湖 芜湖

    师傅总结的太好了!