Windows的认证包括三个部分:
NTLM哈希,是一种单向哈希算法,Windows将用户的密码计算成NTLM哈希之后才存储在电脑中
大致的运算流程为:
用户密码->HEX编码->Unicode编码->MD4
pip3 install passlib
>>> from passlib.hash import nthash
>>> print(nthash.hash('admin'))
209c6174da490caeb422f3fa5a7ae634
NTLM Hash的前身是LM Hash,由于存在安全缺陷已经被淘汰
本地认证中用来处理用户输入密码的进程即lsass.exe,密码会在这个进程中明文保存,供该进程将密码计算成NTLM Hash与sam进行比对,我们使用mimikatz来获取的明文密码,便是在这个进程中读取到的
网络认证即在工作组环境下远程登陆另一台电脑所采用的认证机制
NTLM协议的认证过程分为三步,也叫挑战相应机制:
双方确定使用的协议版本,NTLM存在V1和V2两个版本,即Net-NTLM v1 hash
、Net-NTLM v2 hash
,具体区别就是加密方式不同
在NTLM认证中,NTLM响应分为NTLM v1,NTLMv2,NTLM session v2三种协议,不同协议使用不同格式的Challenge和加密算法
挑战(Chalenge)/响应(Response)认证机制的核心
客户端向服务器端发送用户信息(用户名)请求
服务器接受到请求后,判断本地用户列表是否存在客户端发送的用户名,如果没有返回认证失败,如果有,生成一个16位的随机数,被称之为"Challenge", 然后使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符), 生成Challenge1保存在内存中。同时,生成Challenge1后,将Challenge(16位随机字符)明文发送给客户端。
客户端接受到Challenge后,使用自己提供的账户的密码转换成对应的NTLM Hash,然后使用这个NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
在质询完成后,验证结果,是认证的最后一步。
服务端收到客户端发送的Response后,与之前保存在内存中的Channelge1比较,如果相等认证通过
其中,经过NTLM Hash加密Challenge的结果在网络协议中称之为Net NTLM Hash(不能直接用来进行哈希传递攻击,但可以通过暴力破解来获取明文密码)
其中的关键点在于:第二步中客户端发送的是NTLM哈希值与随机字符串加密的结果,而这个NTLM哈希是由用户输入的密码本地计算得出的,所以在这个步骤中,只要能提供正确的NTLM哈希即使不知道正确的密码也可通过认证
NTLMv2的格式为:
username::domain:challenge:HMAC-MD5:blob
hashcat -m 5600 net-ntlm /tmp/password.list -o found.txt --force
-m:hash-type,5600对应NetNTLMv2
详细参数可查表:https://hashcat.net/wiki/doku.php?
-o:输出文件 字典文件为/tmp/password.list
--force:代表强制执行,测试系统不支持Intel OpenCL
域内认证即采用了Kerberos协议的认证机制,与前两者相比最大的区别是有个一个可信的第三方机构KDC的参与
参与域认证的三个角色:
从物理层面看,AD与AS,TGS,KDC均为域控制器(Domain Controller)。
是网络对象互相访问的凭证。
看英文名就知道,用来生成Ticket的Ticket
存储域中所有用户的用户名和对应的NTLM Hash,可以理解为域中的SAM数据库,KDC可以从AD中提取域中所有用户的NTLM Hash,这是Kerberos协议能够成功实现的基础。
密钥分发中心,负责管理票据、认证票据、分发票据,里面包含两个服务:AS和TGS
身份认证服务,为Client生成TGT的服务,也用来完成对Client的身份验证
票据授予服务,为Client生成允许对某个服务访问的ticket,就是Client从AS那里拿到TGT之后,来TGS这里再申请对某个特定服务或服务器访问的Ticket,只有获取到这个Ticket,Client才有权限去访问对应的服务,该服务提供的票据也称为 TGS 或者叫白银票据
由身份认证服务授予的票据(黄金票据),用于身份认证,存储在内存,默认有效期为10小时
注意:
Client 密钥 TGS密钥 和 Service 密钥 均为对应用户的NTLM Hash
TGS密钥 == KDC Hash == krbtgt用户的NTLM Hash
Server 和 Service可以当作一个东西,就是Client想要访问的服务器或者服务
S
Client/(TGS/Server) Sessionkey 可以看作客户端与TGS服务和尝试登陆的Server之间会话时用来加密的密钥,而(Client/TGS/Service)密钥(上面提到的三个实际为NTLM Hash的密钥)是用来加密会话密钥的密钥,为了保证会话密钥的传输安全,这些加密方式均为对称加密
参与认证的三个角色的NTLM Hash是三个密钥,这三个NTLM Hash的唯一作用是确保会话密钥Sessionkey的安全传输
Client向KDC发起服务请求,希望获取访问Server的权限。 KDC得到了这个消息,首先得判断Client是否是可信赖的, 也就是从AD数据库中寻找该用户是否可用来登录。这就是AS服务完成的工作,成功后,AS返回TGT给Client。
Client得到了TGT后,继续向KDC请求,希望获取访问Server的权限。KDC又得到了这个消息,这时候通过Client 消息中的TGT,判断出了Client拥有了这个权限,给了Client访问Server的权限Ticket。(TGS服务的任务)
Client得到Ticket后便可以使用这个Ticket成功访问Server。但是这个Ticket只能用来访问这个Server,如果要访问其他Server需要向KDC重新申请。
此时并未发送[密码]或[密钥]信息
- AS响应的消息中有一条是属于Client的,但另外一条却属于TGS。
- Client/TGS SessionKey出现了两个Copy,一个给Client端,一个给TGS端。
- 认证过程中的加密除哈希外均采用的是对称加密算法。
客户端发送的请求中包含如下两个消息:
KDC接收到TGT与其他内容后,会首先使用KDC 的NTLM Hash解密TGT,只有KDC可以解密TGT,从TGT中提取到 CLIENT/TGS SESSIONKEY ,再使用 CLIENT/TGS SESSIONKEY 解密Authenticator 1,获取到{Client ID, Timestamp} 并与通过解密TGT获取到的{Client ID, 有效时间}进行对比
TGS为Client响应的消息包括:
Msg F使用了 CLIENT/TGS SESSIONKEY 加密,因此,该消息对Client可见。Client对其解密以后可获取到 CLIENT/SERVER SESSIONKEY 。
而Msg E使用了 [SERVICE密钥] 加密,该消息可视作是TGS给Service Server的消息,只不过由Client一起携带发送给Service Server
发送的消息中包括:
- CLIENT/SERVER SESSIONKEY 并非直接传输,而是被包含在使用[Service密钥]加密的Msg E中。
- 既然 [CLIENT/SERVER SESSIONKEY] 并不直接明文传输, Client需要向Service Server证明自己拥有正确的 CLIENT/SERVER SESSIONKEY ,所以,Authenticator 2使用了 CLIENT/SERVER SESSIONKEY 加密。
SS收到客户端的服务请求之后,先利用自身的 [SERVICE密钥] 对Msg E进行解密,提取出Client-To-Server Ticket, 在3.2步骤中,提到了该Ticket中包含了 CLIENT/SERVER SESSIONKEY 以及Client ID信息。
SS使用 CLIENT/SERVER SESSIONKEY 解密Msg G,提取Client ID信息,而后将该Client ID与Client-To-Server Ticket中的Client ID进行比对,如果匹配则说明Client拥有正确的 CLIENT/SERVER SESSIONKEY 。
而后,SS向Client响应Msg H(包含使用 CLIENT/SERVER SESSIONKEY 加密的Timestamp信息)。
Client收到SS的响应消息Msg H之后,再使用 CLIENT/SERVER SESSIONKEY 对其解密,提取Timestamp信息,然后确认该信息与Client发送的Authenticator 2中的Timestamp信息一致。
如上信息可以看出来,该交互过程起到了Client与SS之间的“双向认证”作用。
2.2 AS确认Client端登录者用户身份
4.1 Client向SS(Service Server)发送服务请求
关于Service Hash,Service Hash其实是目标中一个用户名与hostname相同的用户的Hash
如hostname为PC-WIN7的服务器,对应的Hash就是Username : PC-WIN7$的哈希
Windows下的密码hash——NTLM hash和Net-NTLM hash介绍
彻底理解Windows认证 - 议题解读 « 倾旋的博客