白袍的小行星

域渗透--有关NTLM

字数统计: 2.1k阅读时长: 7 min
2020/04/25 Share

前两篇写了有关Kerberos的内容,这次来看看有关NTLM的。

基础知识

Windows的登录有多种方式,其中本地认证就是跟NTLM有关。在C:/Windows/system32/config/sam中,存储着本地认证的密码哈希,需要登录时就取出对应账户的哈希进行比对,其作用类似于linux中的/etc/passwd,这里的哈希即为NTLM Hash.

除了在上述目录中,我们还可以在域控的NTDS.dit文件中得到NTLM Hash.

还有一种叫Net-NTLM Hash,它是基于NTLM Hash使用一定算法生成的,用于网络环境下的认证。

攻击

1. 暴力破解

这种不必多谈,利用hashcat即可。

2. 哈希传递

认证过程

先来看看Net-NTLM认证的流程,分为三大步:

  • 协商:确认双方协议版本
  • 质询:挑战(Challenge)/响应(Response)认证机制
  • 验证:验证结果

其中质询的步骤可以细分为:

  1. 客户端发送用户信息请求
  2. 服务端生成Challenge(16位随机字符,每次都不同),将Challenge发送给客户端,再使用客户端发送的用户名对应的NTLM Hash加密Challenge,得到Challenge1
  3. 客户端得到Challenge后,使用请求登录的用户哈希对Challenge进行加密,得到Response,再将Response发送给服务端

质询完成后即验证,服务端比较Response和Challenge1,如果相同,验证成功。

演示

我这里使用msf的exploit/windows/smb/psexec模块,介绍比较重要的几个参数:

SMBDomain # 这个目标有域环境需要填上
SMBPass # 这一项为LM Hash和NTLM Hash的组合,即 LM Hash:NTLM Hash
SMBUser # 用户名

贴一下我的配置:

最后获取到shell:

注意

这里要说清楚一些问题。

我们提到了Net-NTLM Hash,它的具体表现其实就是质询中生成的Response。我们在使用哈希传递攻击时,需要的是NTLM Hash而不是Net-NTLM Hash,后者是不能用来进行哈希传递攻击的。

原因也很简单,设想一下这个场景:你通过某种手段获取了主机的权限,但是无法得到明文密码(系统版本限制或其他),只有NTLM Hash,这时你发现内网还有别的机器,于是就可以使用NTLM Hash进行哈希传递登录,这就是NTLM Hash的使用方法。

Net-NTLM Hash在本地无法直接获取,可以通过别的方法如中间人攻击得到,具体下面再讲。

分析

本来不想这么麻烦的,但是看到某文章写得有问题,激起了我的好奇心,所以想深究一下哈希传递攻击更细致的流程。

这里抓取演示时的包,即利用msf的psexec进行哈希传递。



可以看到,这里使用的Net-NTLM HashNTLM Hash完全不同,所以利用原理应该是:

客户端得到Challenge后,使用请求登录的用户哈希对Challenge进行加密,得到Response,再将Response发送给服务端

这一步中,客户端使用的哈希并非是本地存储的哈希,而是直接使用攻击程序提供的哈希,这样一来即可完成攻击。

严格来说,哈希传递并非是漏洞,而是微软设计的协议特性,只是会被攻击者滥用所以才被称为漏洞。

3. 获取Net-NTLM Hash

前面已经提到,Net-NTLM Hash一般在本地很难得到,下面介绍几种获取它的方法。

中间人攻击

当域内的一台win机器向另一台win机器请求资源时会发生什么?

  1. 通过本地host文件解析访问对应主机
  2. 本地host解析失败,会通过本地DNS缓存解析访问
  3. DNS缓存也失败,则求助于域内DNS服务器
  4. 如果还失败,则会使用LLMNRnetbios-ns处理。

LLMNR,即链路本地多播名称解析,而netbios是名称服务,专门用于同一内网下windows机器之间通过机器名相互访问。

假如受害者通过主机名来访问域内的资源,那么就会使用netbios查询,这时攻击机在监听网段内所有的netbios流量,发现后直接告诉受害者:我就是你要找的服务,那么自然受害者就去访问攻击机了。

一句话概括:骗取受害者将哈希发给我们

实验环境:

  • 攻击机:Parrot OS
  • 受害者:Windows 7
  • 服务器:Windows server 2008

在攻击机上使用Responder监听:

Responder -I eth0

这时受害者,向服务器的文件共享服务发起请求:

dir \\owa\

监听的攻击机已经拿到了哈希:

为什么会这样?因为涉及到Net-NTLM认证的地方,系统都会先使用本地的哈希尝试验证一遍,所以在我们告诉受害者自己是服务器时,它就把哈希也乖乖发过来啦。

注意:在受害者发起请求时,错误的SMB服务器名称也可以获取到哈希。

WPAD(网络代理自动发现协议)

WPAD即网络代理自动发现协议,主要是用来发现代理自动配置文件的,即wpad.dat文件。企业内常常采用代理服务器来上网,用户想要上网就要把自己终端的代理地址设为代理服务器的地址,WPAD协议可以自动化完成这个过程,自动发现wpad.dat文件并下载进行配置。

发现wpad.dat文件的方式不止一种,有DNS查询、DHCP查询,还有LLMNR查询,很眼熟对吧。

操控前两种很容易被发现,LLMNR就是最佳选择。

攻击过程也很简单,攻击机通过广播告诉网段内的主机,自己就是WPAD服务器,这样配置了“自动检测代理设置”的主机就会下载攻击机准备的wpad.dat文件,所有流量都会流经攻击机。

  • 攻击机:Parrot OS
  • 受害者:Windows 7
  • 服务器:Windows server 2008

首先配置受害者机器的浏览器设置:

然后在攻击机上开启监听:

responder -I eth0 -wFb

当用户打开浏览器时,就会弹出这个框来:

如果用户在此输入凭证,就会被我们捕捉到:

不仅如此,我们还能将受害者重定向至恶意网页或者下载恶意文件,具体实现需要修改工具配置。

好像跑题了,Responder-F选项即强制使用NTML或基础认证,浏览网站或重启主机时都能抓到哈希。

Web漏洞

可以看看这篇文章:如何利用Web漏洞窃取NTLM哈希

4. SMB中继

Net-NTLM Hash是不能被用来哈希传递了,但是可以破解出NTLM Hash,只不过这种是Net-NTLMv1 Hash,,加密程度很弱,而且自Windows Vista起,微软默认使用Net-NTLMv2协议,破解出的概率很小,但我们还可以使用另一种攻击方法,就是SMB中继。

原理

SMB中继从本质上来说也是中间人攻击,只不过动作更复杂。一般的中间人攻击只欺骗一方,如欺骗客户端把该发送给服务端的数据发送给自己,而 SMB中继则是两方都欺骗,即先欺骗客户端拿到其凭据,再欺骗服务端访问资源。

此种方式的核心就在欺骗重放上,如何让客户端的流量流经你的机器?这就是首先要解决的问题。

要说明的是,SMB中继是有利用条件的,即目标机器不能开启SMB签名,有了签名,重放这个动作自然也就无效了。

利用

第一步要识别出目标机器是否禁用了SMB签名,Windows 7/8/10默认不开启,Windows server默认开启,并且对打了ms08-068的老系统如xp/2003以下的系统无效。

nmap -p 445 --open --script smb-security-mode.nse,smb-os-discovery.nse 192.168.52.0/24

上图可以看到有一台Win 7没有开启SMB签名,那受害者就是你了。

因为环境实在太麻烦,我就放链接替代实验过程吧:smb重放攻击

总结

大致写完了域内有关NTLM的东西,啥也不说干就完了。

CATALOG
  1. 1. 基础知识
  2. 2. 攻击
    1. 2.1. 1. 暴力破解
    2. 2.2. 2. 哈希传递
      1. 2.2.1. 认证过程
      2. 2.2.2. 演示
      3. 2.2.3. 注意
      4. 2.2.4. 分析
    3. 2.3. 3. 获取Net-NTLM Hash
      1. 2.3.1. 中间人攻击
      2. 2.3.2. WPAD(网络代理自动发现协议)
      3. 2.3.3. Web漏洞
    4. 2.4. 4. SMB中继
      1. 2.4.1. 原理
      2. 2.4.2. 利用
  3. 3. 总结