内网渗透测试:NTLM 与 NTLM 身份认证 – 作者:MrAnonymous

前言

由于感觉自己一直对一些 Windows 底层协议和原理了解的不够深入,最近一段时间恶补了一些基础的东西。

从这一篇文章开始,我们的内网渗透测试系列文章将更注重于底层协议和原理的学习,包括Windows 的常见认证体系与基础协议的概念和原理,以及他们存在的相关安全问题。本篇文章将给大家介绍 Windows NTLM 认证的相关内容,包括 NTLM 的概念与相关安全问题的介绍。

文中若有不当之处还请各位大佬多多点评

我的博客:https://whoamianony.top/

公众号:WHOAMIAnony

在这之前,我们先了解一下 SSP 和 SSPI 这个概念。

SSPI 和 SSP

SSPI

SSPI(Security Support Provider Interface),即 安全服务提供接口,这是 Windows 定义的一套接口,该接口定义了与安全有关的功能函数,包含但不限于:

  • 身份验证机制

  • 信息完整性

  • 为其他协议提供的会话安全机制

SSP

SSP(Security Service Provider),即 安全服务提供,他是 SSPI 的实现者,是对 SSPI 相关功能函数的具体实现。微软自己实现了如下的 SSP,用于提供安全功能:

  • NTLM SSP

  • Kerberos

  • Digest SSP

  • Cred SSP

  • ……

在系统层面,SSP 就是一个 dll,来实现身份验证等安全功能,实现的身份验证机制是不一样的。比如 NTLM SSP 实现的就是一种 Challenge/Response 验证机制。而 Kerberos SSP 实现的就是基于 ticket 的身份验证机制。我们可以编写自己的 SSP,然后注册到操作系统中,让操作系统支持更多的自定义的身份验证方法。

什么是 Windows 认证 ?

认证实则就是想对方证明你的身份的一个过程。比如你要通过网络访问一个受保护的资源,服务器需要认证你的身份。 你可以声称你是系统管理员, 但是你怎么证明你就是系统管理员呢?

一个最简单的方法就是让你直接提供所称用户的密码给服务器,然后服务器去数据库里面对比,看你提供的密码对不对。但是这样的认证方式会使密码需要在网络上明文传输,产生的安全问题不言而喻。

那我们便要想办法怎样在不直接提供明文密码的情况下,间接证明你知道密码。

比如两个相互认识的人互相说话,说的都是明文,每一句你都能听懂。他们并没有说自己的密码就相互认证身份了,你听了半天,却不知道密码是什么。 更神奇的是, 他们认证之后,再说的话你就更听不懂了。也就是说这两个人之间协商了某种会话安全,后续的通信都是安全加密的。

在 Windows 中,最常见的两种认证体系便是 NTLM认证和 Kerberos认证了,今天我们便来详细的讲一下 NTLM 认证方式。

LM Hash 和 NTLM Hash

在 Windows 中是不会保存明文密码的,只会保存密码的哈希值。 其中本机用户的密码哈希是放在 本地的 SAM 文件 里面,域内用户的密码哈希是存在域控的 NTDS.dit 文件 里面。在渗透测试中,通常可从 Windows 系统中的 SAM 文件和域控的 NTDS.dit 文件中导出所有用户的Hash。导出来的哈希经常会看到这样的格式:

Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::

其中的AAD3B435B51404EEAAD3B435B51404EE是LM Hash,31D6CFE0D16AE931B73C59D7E0C089C0是NTLM Hash。

LM Hash

LM Hash 的全称为 LAN Manager Hash,这是 Windows 中最早用的加密算法。

LM Hash的计算方式如下:

1.用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。

2.密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度

3.再分7bit为一组,每组末尾加0,再组成一组

4.上步骤得到的二组,分别作为key 为 “KGS!@#$%“进行DES加密。

5.将加密后的两组拼接在一起,得到最终LM HASH值。

NTLM Hash

为了解决 LM Hash 加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议。下面是各个版本对LM和NTLM的支持。

也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储 NTLM Hash,LM Hash 将不再存在。(因此后面我们将不再介绍LM Hash)如果空密码或者不储蓄 LM Hash 的话,我们抓到的LM Hash是AAD3B435B51404EEAAD3B435B51404EE。所以在 Windows 7 中我们看到抓到 LM Hash 都是AAD3B435B51404EEAAD3B435B51404EE,这里的 LM Hash 已经没有任何价值了。

LM Hash的计算方式如下:

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

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

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

NTLM 身份验证

Windows 的 NTLM 认证就是利用 NTLM Hash 进行的认证,可以分为 本地认证 和 网络认证 两种方式。NTLM 的网络认证,既可用于域内的认证服务,又可用于工作组环境。NTLM 有 NTLMv1 、NTLMv2 、NTLMsession v2 三个版本,目前使用最多的是NTLMv2版本。

NTLM 本地认证

当用户在 Windows 本地登录时,用户的密码存储在本地计算机的 SAM 这个文件里,SAM 文件的路径为%SystemRoot%\system32\config\SAM。当用户输入密码进行本地认证的过程中,用户输入的密码将为被转化为 NTLM Hash,然后与SAM中的NTLM Hash进行比较。当用户注销、重启、锁屏后,操作系统会让 winlogon.exe 显示登录界面(输入框)。当 winlogon.exe 接收输入后,会将密码交给lsass进程。lsass.exe 是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略,这个进程中会存一份明文密码,将明文密码加密成 NTLM Hash,对SAM数据库比较认证。

NTLM 在工作组环境中的认证

NTLM 在网络环境中的认证采用的是一种 Challenge/Response 验证机制,由三种消息组成:

  • type 1:协商

  • type 2:质询

  • type 3:身份验证

下面详细介绍一下 NTLM 在工作组环境中的工作机制。

image-20210409091627979

(1)首先,如果客户端需要访问服务器的某个服务是需要进行身份认证的。于是,客户端要输入服务器的用户名和密码进行验证,此时客户端本地会缓存一份服务器密码的 NTLM Hash 值。客户端发送 TYPE 1 Negotiate协商消息去协商需要认证的主体,用户(服务器端的用户名),机器以及需要使用的安全服务等信息。

(2)服务端接收到客户端发送过来的 TYPE 1 消息后,会读取其中的内容,并从中选择出自己所能接受的服务内容,加密等级,安全服务等。然后传入 NTLM SSP,得到 TYPE 2 Challenge消息(被称为 Challenge 挑战消息),并将此 TYPE 2 消息发回给客户端。这个 TYPE 2 消息中包含了一个由服务端生成的16位随机值,此随机值被称为 Challenge,服务器也会将该 Challenge 保存起来。

(3)客户端收到服务端返回的 TYPE 2 消息后, 会读取出服务端所支持的内容,并取出其中的随机值 Challenge,用缓存的服务器端密码的 NTLM-Hash 对其进行加密,并与用户名、Challenge 等一起组合得到 Net-NTLMHash,最后将 Net NTLM-Hash封装到 TYPE 3 Authenticate消息中(被称为 Authenticate 认证消息),发往服务端。

(4)服务器在收到 TYPE 3 的消息之后,用自己的密码的 NTLM-Hash 对 Challenge 进行加密,并比较自己计算出的 Net NTLM-Hash 认证消息和客户端发送的认证消息是否匹配。如果匹配,则证明客户端掌握了正确的密码,认证成功,否则认证失败。

NTLM 在域环境中的认证

image-20210409092729119

NTLM 在域环境中的认证的前三步与NTLM 在工作组环境中的认证是一样的,不同的地方开始出现在第四步:

(4)服务器接收到客户端发送来的 TYPE 3消息后,取出其中的 Net NTLM-Hash值,并向域控制器发送针对客户端的验证请求。该请求主要包含以下三方面的内容:用户名(服务器端的用户名)、原始的 Challenge 和 加密后的 Challenge(即Net NTLM-Hash)。

(5)然后域控制器会根据用户名获取该帐号的密码哈希值 NTLM Hash,用哈希值对原始的 Challenge 进行加密得到 Net NTLM-Hash。如果加密后的 Challenge 和服务器发送的一致,则意味着用户拥有正确的密码,验证通过,否则验证失败。并将验证结果发给服务器。

(6)服务器根据域控制器返回的结果,对客户端进行回复。

Net-NTLM Hash

Net-NTLM Hash 与 NTLM Hash 不一样。NTLM 认证的第三步中,客户端收到服务端返回的 TYPE 2 消息后, 会读取出服务端所支持的内容,并取出其中的随机值 Challenge,用缓存的服务器端密码的 NTLM-Hash 对其进行加密,并与用户名、Challenge 等一起组合得到 Net-NTLM Hash,最后将 Net NTLM Hash封装到 TYPE 3 Authenticate消息中,发往服务端。也就是说 Net-NTLM Hash 是网络环境下 NTLM 认证的散列值。NTLM v1 响应和 NTLM v2 响应对应的就是 Net-NTLM Hash 分为 Net-NTLM Hash v1 和 Net-NTLM Hash v2。

  • Net-NTLM Hash v1的格式为:

username::hostname:LM response:NTLM response:

来源:freebuf.com 2021-05-01 17:49:20 by: MrAnonymous

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论