Almost all notes are from hackndo

https://en.hackndo.com/ntlm-relay/

What is NTLM

NTLM(新技术局域网管理器)是一种用于在使用 Windows 服务时确认用户身份的协议。 身份验证通过客户端和目标服务器之间的直接通信进行,通常称为 NTLM 质询/响应。 NTLM 协议包含在大多数常用协议中,例如 HTTP、SMB、FTP、SQL、LDAP……

而NTLM Relay扮演着中间人(MiTM)的角色,可以拦截并重放客户端和服务器之间的所有通信。

在本文中,我将介绍 NTLM Relay 的工作原理以及在攻防中的对抗。

How NTLM protocol works

Protocol

NTLM身份验证基于零知识证明。它涉及三条消息:协商、质询和身份验证。

  1. 客户端向服务器发送消息以启动身份验证流程
  2. 服务器以随机质询进行响应
  3. 客户端以加密响应进行回复,证明其拥有正确的凭据

显然,在这个流程中,中间人中继攻击很容易发生。攻击者只需在客户端和服务器之间来回中继 NTLM 消息,直到服务器为客户端建立会话,从而允许攻击者执行客户端可以在服务器上执行的任何操作。

image.png

SSPI & NTLMSSP

SSPI 接口(即安全支持提供程序接口)是由 Microsoft 提出的一种接口,用于标准化身份验证,无论使用哪种身份验证类型。不同的软件包可以连接到此接口来处理不同类型的身份验证。 SSPI 接口提供了多个函数,包括 AcquireCredentialsHandle、InitializeSecurityContext 和 AcceptSecurityContext。 在 NTLM 身份验证期间,客户端和服务器都将使用这些函数。

  1. 客户端调用 AcquireCredentialsHandle 函数以获取对用户凭据的间接访问权限。
  2. 客户端随后调用 InitializeSecuriyContext 函数,该函数在首次调用时将创建类型 1 的消息,因此类型为 NEGOTIATE。
  3. 服务器在收到该消息时,调用 AcceptSecurityContext 函数。该函数随后将创建类型 2 的消息,即 CHALLENGE。
  4. 收到此消息后,客户端将再次调用 InitializeSecurityContext 函数,但这次将 CHALLENGE 作为参数传递。 NTLMSSP 包负责通过加密质询来计算响应,并生成最后的 AUTHENTICATE 消息。
  5. 收到最后一条消息后,服务器还会再次调用 AcceptSecurityContext,并自动执行身份验证。

image.png

由于API的存在,windows实际上并不关心传递的三条信息,整个过程允许这种不透明的结构(NEGOTIATE、CHALLENGE、RESONSE)以某种方式传递,且无论以什么协议他们都可以正常工作。

image.png

这一点表明应用层(HTTP、SMB、SQL 等)与身份验证层(NTLM、Kerberos 等)完全独立,也就是身份验证过程并不会在意数据包的应用层协议,这也就导致了跨协议中继的可能,如HTTP→SMB。

Examples

HTTP NTLM

基础HTTP请求像这样