基础协议

NTLM 协议

NTLM 协议是微软用于 windows 身份验证的主要协议之一。其即可用于工作组中的机器身份验证,又可用于域环境身份验证,还可为 SMB、HTTP、LDAP、SMTP 等上层微软应用提供身份验证。

在 NTLM 之前,windows 使用的是 LM 协议进行身份认证,使用的加密算法是 LM Hash,其本质是 DES 加密,容易被破解。所以微软又引入了 NTLM 加密,使用的是 NTLM Hash 进行加密,加密流程:

1
密码 => 转为十六进制 => Unicode 编码 => MD4 单向 Hash 加密

用户的密码经过 NTLM Hash 加密后会存储在 C:\Windows\System32\config\SAM​ 文件中,在进行本地认证时,也就是我们在登录操作系统的时候,会由 winlogon.exe 显示登录界面并接收用户输入的账号密码,然后将密码交给 lsass.exe 进程,它会把明文密码加密为 NTLM Hash,然后将这个 Hash 与 SAM 数据库中的 Hash 进行比较,从而实现本地认证。

本地认证使用的是 NTLM Hash 对比实现,网络认证( 与其他机器 )使用的是 NTLM 认证了,NTLM 协议是一种基于 Challenge/Response ( 质询/响应 )的验证机制,由三种类型消息组成:

  • Negotiate 协商
  • Challenge 质询
  • Authentication 认证

工作组下的 NTLM 认证流程:

  1. 客户端输入服务端账号密码后在本地缓存该凭证的 NTLM Hash 值,然后向服务端发送协商消息
  2. 服务端收到协商消息后响应一个质询消息,其中包括服务端生成的一个 16 位的随机值( Challenge )
  3. 客户端收到协商消息后,取出 Challenge 值,然后用缓存的服务器 NTLM Hash 对其进行加密得到 Net-NTLM Hash 值,最后放入认证消息发送给服务端
  4. 服务端收到认证消息后,用自己的 NTLM Hash 计算出 Net-NTLM Hash 值,然后与认证消息中的值进行比较

域环境下的 NTLM 认证流程,之前的协商和执行都是相同的,不同的是服务端收到认证消息后要先发送给域控:

  1. 服务端收到认证消息后,通过 Netlogo 协议和域控建立一个安全通道,将认证消息发送给域控
  2. 域控收到认证消息后,从数据库中找出该用户的 NTLM Hash 计算出 Net-NTLM Hash 值,用计算的值和认证消息的进行比较
  3. 然后把验证结果发给服务端,服务端根据结果对客户端进行回复

Kerberos 协议

Kerberos 是西方神话中守卫低于之门的三头犬的名字,这是因为它需要三方共同参与才能完成一次认证。它是一种基于票据( Ticket )的认证方式。

Kerberos 在 TCP/UDP 88 端口进行认证,646 端口进行密码重设。

认证中的三个角色:

  1. 访问服务的客户端
  2. 提供服务的服务端
  3. 提供认证服务的 KDC ( Key Distribution Center,密钥分发中心,通常运行在域控 )

客户端想要访问服务端的某个服务,首先需要 KDC 发放一张 TGT( Ticket Granting Ticket,票据授予票据,可以看作是购买权限 ),有了 TGT 就可以去 KDC 那里申请 ST( Service Ticket, 服务票据 ),获取 ST 后就可以访问服务了。

认证流程:

kerberos6

Kerberos 协议的认证模块( 前 2 是自带,后 2 是微软的 ):

  • AS_REQ & AS_REP
  • TGS_REQ & TGS_REP
  • S4U
  • PAC

PAC( Privilege Attribute Certificate,权限属性证书 )中包含各种授权信息,它是微软自己加的一个东西。由于在域中不同权限的用户能访问的资源是不同的,所以微软设计 PAC 来辨别用户身份和权限。

在一个正常的 Kerberos 认证流程中,KDC 返回的 TGT 和 ST 都是带有 PAC 的,这样做的好处是,在之后的认证中,服务端接收客户端请求的时候可以直接去验证 PAC 中的信息,而不需要再请求 KDC 做一个完成的授权流程。

PAC 签名:

  • PAC_SERVER_CHECKSUM:使用服务秘钥进行签名
  • PAC_PRIVSVR_CHECKSUM:使用 KDC 秘钥进行签名

默认情况下,PAC 用于数据访问的时候,只检查 SERVER_CHECKSUM 去验证客户端是否指定服务的秘钥,而不会验证 PRIVSVR_CHECKSUM。

PAC 的优缺点:

  1. 客户端访问服务端资源的时候,服务端不需要在向 KDC 查询授权信息,而是直接在本地进行 PAC 信息和 ACL 的比较,节约网络资源
  2. PAC 在用户认证阶段引入会导致认证耗时过长
  3. PAC 是微软特有的一个特性,所以启用 PAC 的域中不支持装有其他操作系统的服务器,灵活性降低

Kerberos 的安全问题:

  • AS-REQ 阶段,使用的是密码 hash 或者 AES Key,只获取密码 hash 可以造成 PTH 攻击,只获取 AES key 可以造成 PTK 攻击
  • AS-REQ 的 cname 字段的值代表用户名,可以用进行域内用户枚举攻击
  • AS-REP 阶段,由于返回的 TGT 是由 krbtgt 用户的密码 Hash 加密的,所以当我们获取到 krbtgt 的密码 hash 就可以自己制作 TGT ,这个票据也被称为黄金票据。
  • 如果我们有服务的 hash 就可以签发任意用户的 ST,这个票据也被称为白银票据。
  • 如果设置了 “Do not require Kerberos preauthentication” ( 不需要预认证 )选项,攻击者就可以向 88 端口发送 AS-REQ,域控就不会做任何验证就将 Hash 加密的 Logon Session key 返回,攻击者可以对其进行破解,这叫做 AS-REP Roasting 攻击。
  • 由于 ST 是用服务 hash 加密的,因此,如果我们能获取到 ST 就可以对 ST 进行破解获取服务的 Hash 造成 Kerberoasting 攻击。

SMB 协议

SMB( ServerMessage Block )通信协议是微软( Microsoft )和英特尔 ( Intel ) 在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (ApplicationProgram Interface,简称API),一般端口使用为 139,445。

工作原理:

  1. 首先客户端发送一个SMB negport 请求数据报,,并列出它所支持的所有SMB的协议版本。服务器收到请求消息后响应请求,并列出希望 使用的SMB协议版本。如果没有可以使用的协议版本则返回0XFFFFH,结束通信。
  2. 协议确定后,客户端进程向服务器发起一个用户或共享的认证,这个过程是通过发送SessetupX请求数据包实现的。客户端发送一对用户 名和密码或一个简单密码到服务器,然后通过服务器发送一个SessetupX应答数据包来允许或拒绝本次连接。
  3. 当客户端和服务器完成了磋商和认证之后,它会发送一个Tcon或TconX SMB数据报并列出它想访问的网络资源的名称,之后会发送一个 TconX应答数据报以表示此次连接是否接收或拒绝。
  4. 连接到相应资源后,SMB客户端就能够通过open SMB打开一个文件,通过read SMB读取文件,通过write SMB写入文件,通过 close SMB关闭文件。

LDAP 协议

LDAP( Lightweight Directory Access Protocol ),轻量目录访问协议。顾名思义,LDAP是设计用来访问目录数据库的一个协议。


基础协议
https://liancccc.github.io/2024/09/15/技术/内网渗透/基础协议/
作者
守心
发布于
2024年9月15日
许可协议