ntlm浅析及安全问题

584 阅读5分钟

引言

内网渗透压,NTLM协议必不可少。

站在巨人的肩膀上:www.anquanke.com/post/id/193…

灵腾yyds

简介

NTLM (NT LAN MANAGER) 是一种认证协议,在 Kerberos出现之前广泛应用于工作组和域环境。

现在 NTLM 有两个版本, NTLMv1NTLMv2,主要区别在于 Challenge的长度不一样,v1版本长度为8,v2版本长度为16。

认证过程主要有三条消息:

  • Negotiate

  • Challenge

  • Auth

这里分别称为type1,type2,type3

LM Hash && NTLM Hash

已知windows密码都不是明文保存的,都是以hash的形式放在了本地sam内,域内的密码hash则保存在了域控的ntds.dit内

在Windows系统导出密码的时候,经常看到这样的密码格式

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中的AAD3B435B51404EEAAD3B435B51404EE是LM Hash

31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash

LM 全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。

LM加密方式存在一些缺陷,如不区分大小写等,这里不做详细讨论,目前很少使用LM hash

NTLM hash的计算:

1.先将用户密码转换为十六进制格式。

2.将十六进制格式的密码进行Unicode编码。

3.使用MD4摘要算法对Unicode编码数据进行Hash计算

Net-NTLM Hash

意为在 NTLM认证过程中产生的hash

Net-ntlm hash v1的格式为:

username::hostname:LM response:NTLM response:challenge

Net-ntlm hash v2的格式为:

username::domain:challenge:HMAC-MD5:blob

抓包分析

注意: NTLM只能嵌套在上层协议,例如 HTTP,SMB

NTLM协议里有很多字段,一堆flag,这里只分析关键信息,如要看详细字段,阅读这篇

环境:

本机win10开启目录共享

虚拟机kali尝试输入用户名和密码访问共享目录

客户端首先会将输入明文密码处理成hash,并缓存,再发起请求

这里通过访问共享文件抓取 NTLM数据包,这里咱们不分析SMB,这里为 NTLMv2

如图所示:就是这三个步骤

Negotiate

客户端向服务端发送Negotiation消息,这一步没有什么关键信息,主要包含客户端支持和服务端请求的功能列表,注意 NTLM MESSAGE TYPE 则表示消息类型,这里 0x01000000 表示 Negotiation

Challenge

服务端生成一个16位随机数并缓存,被称为 Challege,并同部分服务端信息发送给客户端

Auth

客户端使用缓存的 hashChallenge 进行加密,加密的结果为 Response,并将其与部分用户信息发送服务端,如图:

服务端接收到消息后,如果是工作组环境,则直接使用用户名对应的 NTLM hashChallenge进行加密得到 Response2,将其与 Response进行对比,相同则认证通过。如果是域环境,hash存在域控里,所以需要再通过 Netlogon 协议请求域控,并且将以上 三条消息都发给域控,域控则使用用户 hash加密 Challenge得到 Response2再进行验证。

安全问题

1.利用ntlm进行信息收集

回想type1和type2,type2中包含了一些服务端的信息,而且服务端在回复type2的时候并没有验证任何信息,咱们发送type1也不需要任何信息。也就是说,我们可以尝试构建ntlm消息发送type1,然后解析返回的type2即可。前面提到ntlm协议需依赖上层协议,如SMB,HTTP,LDAP等。windows默认开启445/139即SMB,那么我们可以把NTLM嵌入到SMB进行信息收集。

msf中有自带模块 smb_version可进行信息收集:

分别测试了win10和win2012,两者结果不一样,win10没有探测到系统信息,查看数据包:

先看win2012的

发现SMB直接成功了,系统信息只在SMB中才有,SMB2中没有系统信息

SMB:

SMB2:

再看win10的:

使用的是SMB2,在win10中, SMB默认是关闭的,需手动开启,因此探测不到信息

2.ntlm relay

NTLM认证过程为单向认证,只有服务端向客户端认证身份,而客户端并没有向服务认证,这样就可能导致假冒服务端

这里咱们就说说如何利用:

环境

使用 smbrelay.py 脚本

在hacker上运行python3 smbrelayx.py  -h 192.168.221.139 -c whoami

-h 后面跟目标,-c代表执行命令

让域内任意用户对hacker发起ntlm认证,此时hacker会转发这个请求到目标,后续的所有请求都会转发,相当于中转请求

这里让client 访问 hacker:

此时 hacker机器:

回到 hacker 上可以看到命令执行成功

同样也可以msf上线

先用msf生成一个后门,设置监听

注意设置自动进程迁移,因为smbrelayx会自动删掉文件

使用 smbrelayx.py, -e 代表执行文件

server 成功上线!

注意:这里为什么能成功?

这里的 ntlm是嵌套在 SMB里面的,而在 SMB2以后,默认数据包必须检测签名,也就是说直接转发的话,签名无法通过,数据包会被丢弃。

下一篇分析如何绕过签名