WINDOWS认证(1)-------NTLM协议

本文详细解释了Windows本地认证的过程,包括密码存储在SAM文件中的哈希形式,NTLMHash的生成与验证,以及NTLM协议的演变,特别是NTLMv2的安全性提升。同时介绍了哈希传递(PassTheHash)的概念和利用方法,以及在内网渗透中的应用实例。
摘要由CSDN通过智能技术生成

1:Windows本地认证

思考1:从图1到图2是如何完成的,即:输入用户名+密码后,Windows系统如何完成认证并登陆的?

1648606911_6243bebf248176c556548.png!small

简述本地认证过程:

1:输入用户信息登陆系统时,系统会自动的读取数据库的“密码”与用户输入的“密码”进行比对,若相同,则认证成功。

2:登陆验证时,数据库通常并不存储明文对,一般是通过哈希值来对登陆信息进行校验,即:Windows并不存储明文信息。

思考2:我们的用户名-密码信息保存在哪儿?文件中是什么形式(数据格式)进行存储?

回答1:SAM文件  存储位置:C:/WINDOWS/SYSTEM32/CONFIG/SAM

回答2:NTLM Hash 即:NT LAN Manager Hash

思考3:什么是NTLM Hash?如何产生NTLM Hash?

1.1 -NTLM简述:

  • 长度32位,数字+字母组合

  • Windows本身并不存储用户明文密码,反而是将用户的明文密码通过加密算法后存储在SAM数据库中。

  • 用户登录时,将用户输入的明文密码加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较。NTLM Hash的前身是LM Hash(现已被淘汰,但是存在,例如XP 2003server等)

示例:基于python生成NTLM Hash

代码示例:

import hashlib,binascii
NTLM_hash = hashlib.new('md4', "root".encode('utf-16le')).digest()
print (binascii.hexlify(hash))

输出结果:b'329153f560eb329c0e1deea55e88a1e9'

root---->329153f560eb329c0e1deea55e88a1e9NTLM Hash

1.2-NTLM产生过程(“三步走”)

1:转成16进制:root--->hex(16进制)

2:Unicode编码:----->Unicode

3:MD4算法------->MD4

329153f560eb329c0e1deea55e88a1e9   NTLM Hash

1.3 本地认证具体流程:

  1. Windows Logon Process(Winlogon.exe)是Windows NT用户登录程序,主要用于管理用户登录和退出.

  2. LSASS,即lsass.exe(拉起此进程)属于微软Windows系统的安全机制,其主要功能是在于本地安全和登录策略。

1648607298_6243c042c9dfb51cbc95d.png!small

2  Windows网络认证(NTLM协议)

2.1背景:

  • 在内网渗透过程中,通常会遇到工作组的环境,而工作组环境事实上是一个逻辑上的网络环境(工作区),隶属于此工作组的机器之间是无法互相建立一个完美的信任机制的,只能点对点(认证方式较为落后)的方式,没有第三方可信机构。

  • 假设A主机和B主机属于同一个工作组环境,A想访问B主机上的资源,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证之后,才能够访问B主机上的相关资源

  • 常见服务:SMB服务  端口:445

NTLM协议(NT LAN Manager)

  • 早期SMB协议在网络上传输明文口令,后来出现LAN Manager Challenge/Response验证机制,简称LM,但是由于很容易就会被破解,不安全。因此微软之后又提出了WindowsNT挑战/应答验证机制,即:NTLM。如今:NTLM v2以及Kerberos验证体系较为流行

基于Challenge/Response机制的NTLM协议

“三步走”:协商----->质询------->验证

2.2认证简述:

1:第一步:协商

客户端向服务器确认协议的版本,是V1版本还是 V2版本?,其主要是版本确认,其具体过程类似于SSH认证第一步,例如确定SSH版本,用何种加密算法等。

2:第二步:质询 (实际上TCP三次握手等,以及密码学认证协议都用到了此机制 挑战/应答-Challenge/Response

  • 客户端向服务器端发送**用户信息(用户名)**等请求消息

  • 服务器接收到请求后,生成一个16位的随机数,即:“Challenge”

  • 使用登录用户名对应的NTLM Hash对Challenge(16位随机数)进行加密,生成所谓的Challenge1,并将challenge发送至客户端。(注意:发送给客户端的随机数Challenge)

Net NTLM Hash = NTLM Hash(Challenge)

  • 客户端接收到Challenge后,将要登录到账户对应的NTLM Hash再次加密Challenge生成Response,然后再将Response发送至服务器端。

3:第三步验证(注实际上在这里,Net NTLM Hash就是Challenge1)

  • 服务器端收到客户端的Response后,对比Challenge1与Response是否相等,若相等,则认证通过。

2.3认证过程(详细)

1:Server接收到Client发送的请求消息(包含用户名等),首先判断本地账户列表是否有用户名(例子:share_user)

如果没有,则返回本次认证失败

如果有

服务器生成一个16位的随机数:Challenge,并且从本地SAM文件中查找此用户名,即share_user所对应的NTLM Hash,然后使用NTLM Hash加密随机数Challenge,生成一个Net-NTLM Hash存在内存中,并将Challenge发送给Client。

2:Client接收到Challenge后,将用户名share_user所对应的passwd转成为NTLM Hash,使用NTLM Hash加密随机数Challenge,得到Response,其表现形式是Net-NTLM Hash,最后将Response发送给Server.

3:Server接收到Client发送的Response,将Response与先前生成的Net-NTLM Hash,即Challenge1进行比较,如果两者相等,则认证通过。

1648607682_6243c1c23b89a8011b4cf.png!small

注意:

1:Challenge是由认证Server产生的一个16位的随机数,每次认证都不同。

2:Response的表现形式是Net-NTLM Hash,它是由客户端提供的密码Hash生成NTLMhash 加密Server返回的Challenge产生的结果。

2.4 NTLM V2协议

  • NTLM v1与NTLM v2最显著的区别:Challenge与加密算法不同,共同点就是加密的原料都是 NTLM Hash。

  • Challenge:NTLM v1的Challenge有长度为8位,NTLM v2的Challenge长度为16位,所以v2版本更加安全。

  • Net-NTLM Hash:NTLM v1的主要加密算法是DES,NTLM v2的主要加密算法是HMAC-MD5。

  • 工具:Responder,smbexec
    工具使用案例

  • Responder工具可以毒化LLMNR和NBT-NS请求,所谓度化本质上为中间人攻击
    假设我们已连接到Windows Active Directory环境,当网络上的设备尝试用LLMNR和NBT-NS请求来解析目标机器时,Responder就会伪装成目标机器。当受害者机器尝试登陆攻击者机器,responder就可以获取受害者机器用户的NTLMv2哈希值。

    • 获取NTLM V2哈希值后如何进行攻击利用(参考博客https://www.freebuf.com/articles/system/194549.html)

    1.获取NTLMv2哈希值,并使用Hashcat密码破解工具破解。

    2.使用Responder和Multirelay.py脚本,脚本负责执行NTMLMv2哈希值中继到“已禁用SMB签名”的机器上。如果中继成功,就可以访问目标机器。

2.5 哈希传递 Pass The Hash (解决了我们渗透中获取不到明文密码,破解不了NTLM Hash而又想扩大战果的问题。)

背景 :

在内网渗透过程中,通常会需要抓取管理员的密码,即NTLM Hash,通过收集此类信息有助于我们进一步扩大战果,进行横向渗透,尤其是在域环境下。

问题1:什么是哈希传递?

哈希传递是能够在不需要账户明文密码的情况下完成认证的一个技术。其实本质上是利用了NTLM Hash认证协议特点。试想,我们在内网渗透中暂时未能获取明文密码,也就意味着无法通过暴力破解的手段爆破NTLM hash,是不是意味着我们就无法进行横向渗透,或者进一步扩大战果?

其实仔细查看NTLM协议,其整个过程只是用到了NTLMhash加密随机数,因此只需要有NTLM哈希值即可,无需要对其进行爆破就能达到认证的目的,那么问题来了?如何获取到这个NTLM hash?

仔细观察NTLM认证协议的过程。发现利用NTLMhash值的关键步骤在于此

1648610746_6243cdba2738e7410be16.png!small?1648610746690

因此能够推出哈希传递的必要条件,也就是使用哈希传递的前提。

Pass The Hash --必要条件

  1. 哈希传递需要被认证的主机能够访问到服务器,你首先的在用户名白名单列表,不然直接认证失败

  2. 哈希传递需要被传递认证的用户名,没有用户名哪儿来的NTLM值

  3. 哈希传递需要被传递认证用户的NTLM Hash

Pass The Hash --原理分析

要完成一个NTLM认证,第一步需要客户端将自己要参与认证的用户名发送至服务器,等待服务器端给出的Challenge----

其实哈希传递本质上就是利用用户名对应的NTLM Hash将服务器给出的Challenge加密,生成一个Response,来完成认证,(没有用户名,就不会有Challenge,那么NTLM hash就无用武之地)

1648610974_6243ce9e3fd8633269e67.png!small?1648610974815

如何进行哈希传递?即:Pass The Hash工具

Smbmap

Crack MapExec

Smbexec

Metasploit

哈希传递利用案例:

哈希传递攻击的前提:有管理员的 NTLM Hash ,并且目标机器开放445端口。(利用案例参照博客https://cloud.tencent.com/developer/article/1752176)

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值