域内渗透之HASH传递(PtH)
1.概念
NTLM hash
NTLM 这一名词是由以下单词的首字母拼凑而成的 :
NT:New technologies ( windows 的新技术 )
LAN: 本地局域网 ( Local area network )
M: 管理者 ( Manager )
NTLM hash是指Windows系统下Security Account Manager中保存的用户密码hash
该hash的生成方法:
- 将明文口令转换成十六进制的格式
- 转换成Unicode格式,即在每个字节之后添加0x00
- 对Unicode字符串作MD4加密,生成32位的十六进制数字串
在渗透测试中,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash,通过Mimikatz读取lsass.exe进程能获得已登录用户的NTLM hash
Net-NTLM hash
NTLM认证采用质询/应答(Challenge/Response)的消息交换模式,流程如下:
- 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码hash
- 服务器接收到请求后,生成一个16位的随机数(这个随机数被称为Challenge),明文发送回客户端。使用存储的登录用户密码hash加密Challenge,获得Challenge1
- 客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,获得Challenge2(这个结果被称为response),将response发送给服务器
- 服务器接收客户端加密后的response,比较Challenge1和response,如果相同,验证成功
在以上流程中,登录用户的密码hash即NTLM hash,response中包含Net-NTLM hash
在NTLM认证中,NTLM响应分为NTLM v1,NTLMv2,NTLM session v2三种协议,不同协议使用不同格式的Challenge和加密算法
所以也就存在不同协议的Net-NTLM hash,即Net-NTLM v1 hash,Net-NTLM v2 hash
从攻击角度来看
- 可以利用NTLM哈希值进行“哈希传递”攻击
- 无法利用Net-NTLM哈希值来进行“哈希传递”攻击
2.NTLM和SMB的关系
SMB的认证可以基于NTLM协议或者kerberos协议,前者使用了hash,后者使用了ticket,是构成SMB的PtH和PtT攻击的基础。(PtH和PtT攻击https://www.cnblogs.com/bmjoker/p/10355979.html)比如我们域内渗透中经常提到的黄金票据、白银票据就是基于Kerberos协议的PtT攻击
NTLM 并没有定义它所依赖的传输层协议。NTLM 消息的传输完全依赖于使用 NTLM 的上层协议来决定,可以是SMB,也可以是TCP,亦或HTTP。
3.跨协议的 NTLM-Relay
前面说过,NTLM 的上层协议基本可以是任何协议(如果上层是基于UDP 的协议的话,可能会不一样),所以这引出了跨协议的 NTLM-Relay 技巧。无论 NTLM 的上层协议是什么,其携带的 NTLM 的三条消息都是由 NTLM SSP 生成的,所以上层协议在 relay 的过程中,是可以被替换掉的。比如从 http relay 至 smb,从 smb relay 至 ldap/mssql 等等。我们只需要将一个协议中的 NTLM 消息取出来,然后原样不动的地放入另一个协议,就完成了上层协议转换的过程。
4.SMB RELAY
mitm Attacker通过不停的转换机器角色来同时欺骗Smb server和Client两端,可以拿着Client的凭据去访问Smb Server中的资源,如果这个凭据的用户权限在smb server中很大,大到可以随意操作smb server,此时凭据再一旦认证成功,随后再立即执行一段shellcode,那Smb server基本也就沦陷了。
利用1
项目地址:https://github.com/SecureAuthCorp/impacket
- python smbrelayx.py -h 192.168.1.5 -c whoami
- 当目标内网有机器访问恶意smb服务器后,便会抓取对应机器的net-ntlm v2 hash,之后再通过smbrelayx.py脚本拿着这段抓到的hash去尝试重放访问目标机器。
1 | net use \\192.168.1.100\c$ /user:"administrator@chinahope.com" "123456" |
3
4.同时也可通过这个方法上传可执行文件。如msf或CS生成的exe文件,从而获取便于控制的session或beacon。
1 | python smbrelayx.py -h 192.168.22.162 -e test.exe |
利用2
- 使用CS中beacon导出NTML hash
1 | hashdump |
2.在登陆令牌中会自动存入刚刚导出的hash,然后使用对应的hash进行登陆。如在192.168.1.3中导出的hash对192.168.1.5进行登陆。当然,前提是在192.168.1.3中到出的用户hash具有对192.168.1.5登陆的权限。