如何理解Windows认证流程
0x01 Windows本地认证
a. 概述
Windows本地认证采用sam hash比对的形式来判断用户密码是否正确。
计算机本地用户的所有密码被加密存储在%SystemRoot%\system32\config\SAM
文件中,当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的密码进行比对,如果相同,证明认证成功.。
本地认证的过程其实就是Windows把用户输入的密码凭证和sam里的加密hash比对的过程。
b. 加密方式
Windows对用户密码凭证有两种加密算法,NTLM和LM。
1. LAN Manager Hash(LM)
LM Hash(LAN Manager Hash) 是windows最早用的加密算法,由IBM设计。LM Hash 使用硬编码秘钥的DES,且存在缺陷。早期的Windows系统如XP、Server 2003等使用LM Hash,而后的系统默认禁用了LM Hash并使用NTLM Hash。
作为早期的算法,LM Hash存在着诸多问题:
- 密码长度不会超过14字符,且不区分大小写
- 如果密码长度小于7位,后一组哈希的值确定,可以通过结尾为
aad3b435b51404ee
来判断密码长度不超过7位- 分组加密极大程度降低了密码的复杂度
- DES算法强度低
2. NT LAN Manager Hash(NTLM)
为了解决LM Hash的安全问题,微软于1993年在Windows NT 3.1中引入了NTLM协议。
Windows 2000 / XP / 2003 在密码超过14位前使用LM Hash,在密码超过14位后使用NTLM Hash。而之后从Vista开始的版本都使用NTLM Hash。
NTLM Hash的计算方法为:
- 将密码转换为16进制,进行Unicode编码
- 基于MD4计算哈希值
3. 内部认证流程
本地认证中用来处理用户输入密码的进程即lsass.exe,密码会在这个进程中明文保存,供该进程将密码计算成NTLM Hash与sam进行比对我们使用mimikatz来获取的明文密码,便是在这个进程中读取到的。
0x02 Windows网络认证
a. 概述
网络认证即在工作组环境下远程登陆另一台电脑所采用的认证机制。
假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。只能点对点,是比较落后的认证方式,没有信托机构。
例如:FTP、SMB
b. 协议出现
早期SMB协议在网络上传输明文口令。后来出现LAN Manager Challenge/Response
验证机制,简称LM。因为相应加密算法比较脆弱很容易就被破解。
微软提出了 Windows挑战响应验证机制,称之为NTLM。现在已经有了更新的 NTLMv2
以 Kerberos
验证体系。
c. 挑战响应机制
NTLM协议的认证过程分为三步:
- 协商
- 质询
- 验证
1. 协商
双方确定使用的协议版本,NTLM存在V1和V2两个版本,具体区别就是加密方式不同
2. 质询(核心)
-
客户端向服务器端发送用户信息(用户名)请求
-
服务器接受到请求后,判断本地用户列表是否存在客户端发送的用户名,如果没有返回认证失败,如果有,生成一个16位的随机数,被称之为“Challenge”, 然后使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1保存在内存中。同时,生成Challenge1后,将Challenge(16位随机字符)发送给客户端。
-
客户端接受到Challenge后,使用自己提供的账户的密码转换成对应的NTLM Hash,然后使用这个NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
3. 验证
服务端收到客户端发送的Response后,与之前保存在内存中的Channelge1比较,如果相等认证通过。
d. 相关知识点
经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash
。
网络中没有传输与密码本身相关的任何数据。
NTML v2
- Challage:NTLM v1的 Challenge有8位, NTLM v2的 Challenge为
16位。 - Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的
主要加密算法是HMAC-MD5。
Pass The Hash(哈希传递)
在域环境中,用户登录计算机时使用的大都是域账号,大量计算机在安装时会使用相同的本地管理员账号和密码,因此,如果计算机的本地管理员账号和密码也是相同的,攻击者就能使用哈希传递攻击的方法登陆内网中的其他计算机。
使用条件
- 哈希传递需要被认证的主机能够访问到服务器
- 哈希传递需要被传递认证的用户名
- 哈希传递需要被传递认证用户的 NTLM Hash
利用工具
- Smbmap
- CrackMapExec
- Smbexec
- Metasploit
0x03 Acitve Directory(活动目录)
a. 概述
活动目录(Active Directory)是指域环境中提供目录服务的组件。
目录用于存储有关网络对象的信息。
目录服务是指帮助用户快速、准确地从目录中找到其所需要的服务。
活动目录实现了目录服务,为企业提供了网络环境的集中式管理机制。
b. 功能
活动目录(Active Directory)主要提供以下功能:
- 服务器及客户端计算机管理:管理服务器及客户端计算机账户,所有服务器及客户端计算机加入域管理并实施组策略。
- 用户服务:管理用户域账户、用户信息、企业通讯录(与电子邮件系统集成)、用户组管理、用户身份认证、用户授权管理等,按省实施组管理策略。
- 资源管理:管理打印机、文件共享服务等网络资源。
- 桌面配置:系统管理员可以集中的配置各种桌面配置策略,如:用户使用域中资源权限限制、界面功能的限制、应程序执行特征限制、网络连接限制、安全配置限制等。
- 应用系统支撑:支持财务、人事、电子邮件、企业信息门户、办公自动化、补丁管理、防病毒系统等各种应用系统。
c. 域认证体系 - Kerbroes
1. 概述
Kerberos是一种网络认证体系,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。
该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意的读取、修改和插入数据。在以上情况下,Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术执行认证服务的。
2. 域认证角色
- Client
- Server
- KDC(域控制器)
- AD(account database):存储Client白名单
- AS(Authentication Service):为Client生成TGT服务
- TGT(Ticket Granting Service):为Client生成某个服务的ticket
3. 认证流程
- KDC(Key Distribution Center):密钥分发中心,里面包含两个服务:AS和TGS
- AS(Authentication Server):身份认证服务
- TGS(Ticket Granting Server):票据授予服务,该服务提供的票据也称为 TGS 或者叫白银票据
- TGT(Ticket Granting Ticket):由身份认证服务授予的票据(黄金票据),用于身份认证,存储在内存,默认有效期为10小时
详解kerberos认证流程此篇文章讲的十分详细,建议参考。
第一次通信
为了获得能够用来访问服务端服务的票据,客户端首先需要来到KDC获得服务授予票据(Ticket)。由于客户端是第一次访问KDC,此时KDC也不确定该客户端的身份,所以第一次通信的目的为KDC认证客户端身份,确认客户端是一个可靠且拥有访问KDC权限的客户端,过程如下:
① 客户端用户向KDC以明文的方式发起请求。该次请求中携带了自己的用户名,主机IP,和当前时间戳;
② KDC当中的AS(Authentication Server)接收请求(AS是KDC中专门用来认证客户端身份的认证服务器)后去kerberos认证数据库中根据用户名查找是否存在该用户,此时只会查找是否有相同用户名的用户,并不会判断身份的可靠性;
③ 如果没有该用户名,认证失败,服务结束;如果存在该用户名,则AS认证中心便认为用户存在,此时便会返回响应给客户端,其中包含两部分内容:
- 第一部分内容称为TGT,他叫做票据授予票据,客户端需要使用TGT去KDC中的TGS(票据授予中心)获取访问网络服务所需的Ticket(服务授予票据),TGT中包含的内容有kerberos数据库中存在的该客户端的Name,IP,当前时间戳,客户端即将访问的TGS的Name,TGT的有效时间以及一把用于客户端和TGS间进行通信的Session_key(CT_SK)。整个TGT使用TGS密钥加密,客户端是解密不了的,由于密钥从没有在网络中传输过,所以也不存在密钥被劫持破解的情况。
- 第二部分内容是使用客户端密钥加密的一段内容,其中包括用于客户端和TGS间通信的Session_key(CT_SK),客户端即将访问的TGS的Name以及TGT的有效时间,和一个当前时间戳。该部分内容使用客户端密钥加密,所以客户端在拿到该部分内容时可以通过自己的密钥解密。如果是一个假的客户端,那么他是不会拥有真正客户端的密钥的,因为该密钥也从没在网络中进行传输过。这也同时认证了客户端的身份,如果是假客户端会由于解密失败从而终端认证流程。
至此,第一次通信完成。
第二次通信
此时的客户端收到了来自KDC(其实是AS)的响应,并获取到了其中的两部分内容。此时客户端会用自己的密钥将第二部分内容进行解密,分别获得时间戳,自己将要访问的TGS的信息,和用于与TGS通信时的密钥CT_SK。首先他会根据时间戳判断该时间戳与自己发送请求时的时间之间的差值是否大于5分钟,如果大于5分钟则认为该AS是伪造的,认证至此失败。如果时间戳合理,客户端便准备向TGS发起请求,其次请求的主要目的是为了获取能够访问目标网络服务的服务授予票据Ticket(进入动物园需要的门票)。 在第二次通信请求中,客户端将携带三部分内容交给KDC中的TGS,第二次通信过程具体如下所述:
客户端行为:
① 客户端使用CT_SK加密将自己的客户端信息发送给KDC,其中包括客户端名,IP,时间戳;
② 客户端将自己想要访问的Server服务以明文的方式发送给KDC;
③ 客户端将使用TGS密钥加密的TGT也原封不动的也携带给KDC;
TGS行为:
① 此时KDC中的TGS(票据授予服务器)收到了来自客户端的请求。他首先根据客户端明文传输过来的Server服务IP查看当前kerberos系统中是否存在可以被用户访问的该服务。如果不存在,认证失败结束。如果存在,继续接下来的认证。
② TGS使用自己的密钥将TGT中的内容进行解密,此时他看到了经过AS认证过后并记录的用户信息,一把Session_KEY即CT_SK,还有时间戳信息,他会现根据时间戳判断此次通信是否真是可靠有无超出时延。
③ 如果时延正常,则TGS会使用CK_SK对客户端的第二部分内容进行解密(使用CT_SK加密的客户端信息),取出其中的用户信息和TGT中的用户信息进行比对,如果全部相同则认为客户端身份正确,方可继续进行下一步。
④ 此时KDC将返回响应给客户端,响应内容包括:
- 第一部分:用于客户端访问网络服务的使用Server密码加密的ST(Servre Ticket),其中包括客户端的Name,IP,需要访问的网络服务的地址Server IP,ST的有效时间,时间戳以及用于客户端和服务端之间通信的CS_SK(Session Key)。
- 第二部分:使用CT_SK加密的内容,其中包括CS_SK和时间戳,还有ST的有效时间。由于在第一次通信的过程中,AS已将CT_SK通过客户端密码加密交给了客户端,且客户端解密并缓存了CT_SK,所以该部分内容在客户端接收到时是可以自己解密的。
至此,第二次通信完成。
第三次通信
此时的客户端收到了来自KDC(TGS)的响应,并使用缓存在本地的CT_SK解密了第二部分内容(第一部分内容中的ST是由Server密码加密的,客户端无法解密),检查时间戳无误后取出其中的CS_SK准备向服务端发起最后的请求。
客户端:
① 客户端使用CK_SK将自己的主机信息和时间戳进行加密作为交给服务端的第一部分内容,然后将ST(服务授予票据)作为第二部分内容都发送给服务端。
服务端:
① 服务器此时收到了来自客户端的请求,他会使用自己的密钥,即Server密钥将客户端第二部分内容进行解密,核对时间戳之后将其中的CS_SK取出,使用CS_SK将客户端发来的第一部分内容进行解密,从而获得经过TGS认证过后的客户端信息,此时他将这部分信息和客户端第二部分内容带来的自己的信息进行比对,最终确认该客户端就是经过了KDC认证的具有真实身份的客户端,是他可以提供服务的客户端。此时服务端返回一段使用CT_SK加密的表示接收请求的响应给客户端,在客户端收到请求之后,使用缓存在本地的CS_ST解密之后也确定了服务端的身份(其实服务端在通信的过程中还会使用数字证书证明自己身份)。至此,第三次通信完成。此时也代表着整个kerberos认证的完成,通信的双方都确认了对方的身份,此时便可以放心的进行整个网络通信了。