NTLM(NT LAN Manager)
NTLM协议是在Microsoft环境中使用的一种身份验证协议,它允许用户向服务器证明自己是谁(挑战(Chalenge)/响应(Response)认证机制),以便使用该服务器提供的服务。NTLM协议即可以为工作组的机器提供身份验证,也可以用于域环境身份验证,NTLM还可以为SMB,HTTP,LDAP,SMTP等上层协议提供认证
NTLM协议发展历程
早期SMB认证协议以明文传输,因此出现了安全问题,后来出现了LM协议,但是比较容易破解,再后来出现了NTLM协议,目前NTLM协议主要有两个版本,NTLM v1和NTLM v2版本,区别如下
- challage不同:v1版本的challage是8位,v2版本的是16位(关于challage是什么后面会说)
- 加密算法不同:v1主要加密算法是DES,v2的主要加密算法是HMAC-MD5
NTLM认证大致流程
NTLM的认证分为三步
- 协商
- 质询
- 验证
协商
协商这一步比较简单,客户端向服务器端发送协商消息,包含了协议版本等信息
质询
- 客户端向服务端发送用户名信息的请求
- 服务端接收到之后判断本地列表是否包含用户名,如果有则生成一个随机数称之为
challenge
,使用登入用户名对应的NTML Hash加密challenge,生成challenge1 (也叫Net NTLM Hash),同时将challenge发送给客户端 - 客户端接收到challenge之后,使用将要登入账户的NTLM Hash加密生成Response,然后将Response发送给服务器端
验证
服务器收到Response之后,判断是否与challenge1相等,如果相等则通过
个人觉得,这个过程和公私钥认证的过程挺像的
LM协议与NTLM协议
在Windows系统导出密码的时候,经常看到这样的密码格式
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
其中的
- AAD3B435B51404EEAAD3B435B51404EE是LM Hash
- 31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash
LM Hash的本质是DES加密,但是现在基本都已经没有使用LM Hash
由于LM Hash加密算法的不安全性,微软后面推出NTLM Hash。其与LM Hash有着不同的加密算法
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash
用户登入的密码存储在lsass.exe进程中
右击可以转为存储文件
使用mimikatz.exe 查看hash值
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
Kerberos
Kerberos是一种计算机网络认证协议 ,其设计目标是通过密钥系统为网络中通信的客户机(Client)/服务器(Server)应用程序提供严格的身份验证服务,确保通信双方身份的真实性和安全性。不同于其他网络服务,Kerberos协议中不是所有的客户端向想要访问的网络服务发起请求,他就能建立连接然后进行加密通信,而是在发起服务请求后必须先进行一系列的身份认证,包括客户端和服务端两方的双向认证,只有当通信双方都认证通过对方身份之后,才可以互相建立起连接,进行网络通信。即Kerberos协议的侧重在于认证通信双方的身份,客户端需要确认即将访问的网络服务就是自己所想要访问的服务而不是一个伪造的服务器,而服务端需要确认这个客户端是一个身份真实,安全可靠的客户端,而不是一个想要进行恶意网络攻击的用户。
协议端口
88
Kerberos协议角色组成
- 客户端(Client):发送请求的一方
- 服务端(Server):接收请求的一方
- 密钥分发中心(Key distribution KDC)
密钥分发中心又分为两个部分,分别是:
- AS(Authentication Server):认证服务器,专门用来认证客户端的身份并发放客户用于访问TGS的TGT(票据授予票据),主要是接收客户端的请求
- TGS(Ticket Granting ticket):票据授予服务器,用来发放整个认证过程以及客户端访问服务端时所需的服务授予票据(ticket)
Kerberos认证过程简化描述
客户端在访问每个想要访问的网络服务时,他需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。所以整个流程可简化为三步:
- 客户端向AS请求,证明自己身份,并且表明自己想要访问什么服务,AS核实身份之后会向客户端发送TGT
- 客户端拿到TGT之后访问TGS,TGS核实客户端的TGT之后,会向客户端发送ST
- 最后客户端拿着ST去访问想要访问的服务
在域渗透中,黄金票据就是伪造TGT,白银票据就是伪造ST
如果你的理解能力很强的话,可以参考:[1]毕淏,程晓荣.Kerberos认证协议分析与研究[J].电脑知识与技术,2017,13(27):37-38+59.DOI:10.14004/j.cnki.ckt.2017.3068.
在域环境下NTLM协议与kerberos协议应用的一些问题
其实无论是在域环境下还是在非域环境下,这两个协议都可以使用,在域环境下到底使用哪一个,主要还是由域控配置来进行选择,两个协议都是windows的一种安全认证协议,其应用比较广泛,设置可以应用到web服务之中,尽管如此,但是在windows server 2008以及更高的版本中,默认使用kerberos协议来进行安全认证
Windows登入认证过程
SAM文件
windows本机内是不存储明文密码的,只存储Hash值,本机用户的密码hash是放在本地的SAM文件里面,域内用户的密码hash是存在域控的NTDS.DIT文件里面
SAM文件的路径:C:\Windows\System32\config\SAM
认证流程
- 通过winlogon.exe获取用户输入的用户名与密码
- winlogon.exe将密码传递给lsass.exe,lsass.exe负责将密码进行加密为NTLM Hash
- 将lsass.exe加密的NTLM Hash与本地SAM文件里面的NTLM Hash进行比较,如果相同则将User SID,Group SID发送给winlogon.exe,否则登入失败
相关安全问题
lsass.exe这个进程比较特殊,会存储明文密码