Windows认证方式学习
? Windows ?    707    0    0
t3ngyu   ? Windows ?

        当计算机用户登录时,计算机是如何判断用户输入的密码是否正确的呢?工作组和域环境的验证方式是否一样呢?

 

一、NTLM协议认证

        在工作组环境中,各个机器处于同等地位,各个计算机上的用户各自独立。当计算机用户登录时主要采用NTLM协议认证方式,对用户而言其主要涉及的进程有:

        (1)winlogon.exe 进程接收用户的明文密码输入

        (2)lsass.exe 进程加载用户的NTLM Hash认证与Hash后的明文密码对比验证

       

        Windows中的Hash结构:username:RID:LM-HASH:NT-HASH ,其中LM-HASH主要采用DES加密,大小写不敏感,容易判断出用户密码是否大于等于7位;NT-HASH是将明文转成十六进制,然后再Unicode编码,最后调用MD4加密产生的,对大小写敏感。

 

        NTLM协议的认证流程如下:

        (1)客户端向服务器发送用户信息(例:用户名user)请求
        (2)服务端接受请求,生成16位随机数Challenge,用user对应的NTLM Hash加密Challenge生成Challenge1,然后将Challenge发给客户端
        (3)客户端接收Challenge,用user对应的NTLM Hash加密Challenge生成Response发给服务器端
        (4)服务端对比接收的Response和Challenge1相同,则认证成功

        上述流程中,用户的登录密码hash为NtLM hash,Response中包含的是Net-NTLM hash。NTLM认证中,响应分为NTLM v1、NTLM v2、NTLM session v2三种协议,对应不同格式的Challenge和加密算法。对应不用的Net-NTLM hash,及Net-NTLM v1 hash、Net-NTLM v2 hash。由上述过程可知认证过程中,只涉及到本地的用户名(user)和对应的NTLM Hash,因此如果在知道用户名和对应的NTLM Hash而不知道明文密码时,也能完成NTML认证,即哈希传递

 

二、Kerberos域认证

        在域内环境中,域管理员用户可以登录上域内任意一台机器进行管理,如果采用NTLM认证,那域内主机要存储所有域管的账号Hash会造成冗余,并且极其不安全。所以其登录认证方式主要采用了Kerberos认证,首先有一些基础的概念要学习:

        (1)KDC:票据管理服务器,一般是域控。由AS(Authentication Service,为client生成TGT服务)和TGS(Ticket Granting Service: 为client生成某个服务的ticket)组成,负责负责管理票据、认证票据、分发票据

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

        (3)TGT(Ticket Granting Ticket):入场券,通过入场券能够获得票据,临时凭证,有效期默认10h

        (4)SDC:辅助域控制器,当DC出现故障时,SDC可以进行代替工作

 

        Kerberos域认证大致流程如下:

        (1)客户端发送身份信息(包含用户名:user等)到KDC,KDC查找黑白名单做处理,后生成随机字符串Session Key,根据用户名对应的NTLM Hash加密Session Key作为AS数据,使用KDC中某用户(krbtgt)的NTLM Hash加密Session Key和客户端信息作为TGT,一起发给客户端。Send=user_NTML_Hash(Session Key)+krbtgt_NTML_Hash(Session Key+client_info1)[TGT]

        (2)客户端接收后用自己的NTML Hash解出来Session Key加密客户端信息和时间戳后和TGT一起发送给KDC。Send=Session Key(time+client_info2)+krbtgt_NTML_Hash(Session Key+client_info1)[TGT]

        (3)KDC接收后,先解密TGT获得Session Key和clinet_info1,在用Session Key解密其他内容获得client_info2和time,对比clinet_info1和client_info2并参照time决定客户端是否通过验证。通过验证后,KDC生成Server Session Key和Trick(票据)给客户端。Send=Server_Hash(Server Session Key+Client_info+time)[Trick]+Server Session Key

        (4)客户端向服务端提交请求,并提供Ticket和Server Session key加密的客户端信息与时间戳 ,与服务器进行通信。通过认证后Ticket会一致在客户端内存中。Send=Trick+Server Session Key(Client_info2+time)

        上述流程中也存在一些问题,比如如果已经知道了krbtgt的hash的情况下,客户端可以完全指定自己的权限(黄金票据);验证错误导致的域内提权(MS14-068)等问题。

 

 

参考链接:

https://mp.weixin.qq.com/s/pzB8Ld6fxPk-PQ59a0SwOw

 

觉得不错,点个赞?
Sign in to leave a comment.
No Leanote account ? Sign up now.
0 条评论
文章目录