认识Windows Hash

早期SMB协议在网络上传输明文口令。后来出现LAN Manager 挑战/响应验证机制(LM),其很容易破解,因此微软提出了WindowsNT挑战/响应验证机制(NTLM)

现在已经诞生NTLMv2以及Kerberos验证体系。Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM Hash,第二部分是NT Hash

NT Hash与LM Hash算法相比,明文口令大小写敏感,但无法根据NT Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串KGS!@#$%,MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大

问题在于,微软一味强调NT Hash的强度高,却避而不谈一个事实,为了保持向后兼容性,NT Hash总是与LM Hash一起使用。这意味着NT Hash强度再高也是无助于安全,相反存在潜在危害

认识LM Hash、NTLM Hash、Net-NTLM Hash

LM Hash

LM Hash是Windows使用的最古老的密码存储,其历史可追溯到1980年代的OS / 2。在LAN Manager协议中使用,由于允许的字符集有限,因此它们很容易破解。如果仍然可用,则可以从Windows系统上的SAM数据库或域控制器上的NTDS数据库中获取它们

从Windows Vista / Server 2008开始,默认情况下已关闭LM,但某些工具的参数需要填写固定格式LM hash:NT hash,可以将LM Hash填0(LM hash可以为任意值),即00000000000000000000000000000000:NT hash

NT Hash(aka NTLM Hash) new technology

通常人们称其为NTLM Hash,这具有误导性,因为Microsoft将其称为NT Hash(至少在某些地方)。建议称其为NT Hash,以免造成混淆

Vista之后现代Windows系统使用的Hash,它的前身是LM Hash,两者相差不大,只是使用的加密算法不同。通常意义上的NT Hash指存储在SAM数据库NTDS数据库中对密码进行摘要计算后的结果,NT Hash可以通过转储SAM数据库或使用Mimikatz来获得,可直接用于PtH,并且通常存在于lsass进程中,便于SSP使用

NT Hash是支持Net NTLM认证协议本地认证过程中的一个重要参数。其长度为32位,由数字与字母组成

本地认证

Windows不存储用户的明文密码,它会将用户的明文密码经过加密后存储在SAM数据库中。SAM文件的路径是%SystemRoot%\system32\config\sam。在进行本地认证的过程中,当用户登录时,系统将用户输入的明文密码加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较,从而实现认证

在域环境下,域控制器中也存在这样的数据库AD (Account Database),位于ntds.dit

winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)

用户注销、重启、锁屏后,操作系统会让winlogon显示登录界面,也就是输入框,接收输入后,将密码交给lsass进程,这个进程中会存一份明文密码,将明文密码加密成NTLM Hash,对比SAM数据库中的hash进行验证

NT Hash生成算法

  1. 明文转换为16进制ASCII码
  2. 使用little-endian(小端)序将其在转换为Unicode格式。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成 0×00??。此类标准ASCII串按little-endian序转换成Unicode串,就是简单地在原有每个字节之后添加0×00
  3. 对所获取的 Unicode串进行标准MD4单向哈希,无论数据源有多少字节,MD4固定产生128-bit的哈希值
plain 123456
-> 313233343536
-> 16字节 310032003300340035003600
-> MD4 Hash 32ED87BDB5FDC5E9CBA88547376818D4
NT Hash 32ED87BDB5FDC5E9CBA88547376818D4

Net-NTLM Hash

Net-NTLM Hash用于网络身份认证(例如NTLM认证),目前分为两个版本:

  • Net-NTLMv1
  • Net-NTLMv2

通常使用Responder等工具获取到的就是Net-NTLM,Het-Hash并不能直接用来PtH,但有可能通过暴力破解来获取明文密码

NTLMv1 (aka Net-NTLMv1)

NTLM协议在服务器和客户端之间的质询/响应中使用NT Hash。协议v1同时使用NT Hash和LM Hash

NTLMv2 (aka Net-NTLMv2)

NTLM协议的新版本和改进版本,这使其很难破解。该概念与NTLMv1相同,只是发送到服务器的算法和响应不同,也可以通过Responder或类似对象捕获。从Windows 2000开始,在Windows中为默认值

联系&总结

LM和NT哈希是Windows存储密码的方式。NT令人困惑,也称为NTLM。可以破解以获取密码,或用于传递哈希值。

NTLMv1 / v2是用于Windows环境中身份验证的质询响应协议。它们在算法中使用NT哈希,这意味着可以通过Brute Force/Dictionary攻击将其还原成明文密码,也可以用于中继攻击

NTML网络认证机制

NTLM 协议

NTLM是除Kerberos之外的一种网络认证协议,只支持Windows。它是一种基于质询/应答 (Challenge/Response)消息交换模式的认证机制, 常用于工作组域环境下登录场景的身份认证

NTLM验证(Windows Challenge/Response)

NTLM凭据包括域名用户名用户密码的单向Hash。用户的密码不会在网络链路中传输,加密之后的Challenge值取代原本密码的作用进行对比验证,与传统传输密码的方式相比,具有较高的安全性

NTML的认证方式分为Interactive(交互式)和Noninteractive(非交互式)

  • 通过网络进行的交互式NTLM身份验证通常涉及两个系统:客户端系统,用户用于请求身份验证;域控制器,其中保留与用户密码有关的信息;交互式提供必要凭据,应用场景通常为用户要登录某台客户端

  • HTLM非交互式身份验证通常涉及三个系统:客户端服务器代表服务器进行身份验证计算的域控制器;无需交互式提供凭据,实际应用更多为已登录某客户端的用户去请求另一台服务器的资源 ,即用户只需要登录一次即可访问所有相互信任的应用系统及共享资源

域和工作组

工作组和域宏观上都是一群计算机的集合,域中计算机的数量规模通常大于工作组内的计算机。

工作组内的机器名义上虽然是属于一个集合,但是内部各计算机还是各自管理各自的,没有一个相对成熟的信任机制,工作组内各个计算机的关系依旧是点对点。因此,在工作组环境下进行访问认证,仅涉及Client和Server。我们使用的个人计算机,默认便处于WORKGROUP工作组环境下

域是一个有安全边界的计算机集合,同一个域中的计算机通过共同的第三方信任机构建立信任关系,这个第三方信任机构角色由DC(域控制器)担当。通俗来讲,域中的机器都信任域控制器,那么只要域控制器信任我们,我们就可以在域内获得对其他服务器的访问权限。在这种认证体系中涉及三方:Client、Server、DC

工作组环境NTML认证流程

  1. (仅交互式身份验证存在此步骤)用户访问客户机并提供域名,用户名,密码。客户端计算密码的Hash,并丢弃实际密码
  2. 客户端将用户名发送到服务器
  3. 服务器生成一个16字节的随机数Challenge并发送给客户端
  4. 客户端使用用户密码的Hash对Challenge进行加密,然后将结果response(Net-NTLM hash)返回给服务器
  5. 服务器使用用户名从SAM数据库中检索用户密码Hash,使用此密码Hash对Challenge进行加密
  6. 服务器将其加密的Challenge(在步骤5中)与客户端计算的response(在步骤4中)进行比较。如果它们相同则身份验证成功

域环境NTML认证流程

  1. (仅交互式身份验证存在此步骤)用户访问客户机并提供域名,用户名,密码。客户端计算密码的Hash,并丢弃实际密码
  2. 客户端将用户名发送到服务器
  3. 服务器生成一个16字节的随机数Challenge并发送给客户端
  4. 客户端使用用户密码的Hash对Challenge进行加密,然后将结果response(Net-NTLM hash)返回给服务器
  5. 服务器将三个信息发送到域控制器:用户名,发送给客户机的Challenge,返回给服务器的response
  6. 域控制器使用用户名从SAM数据库中检索用户密码Hash。使用此密码Hash对Challenge进行加密
  7. 域控制器将其加密的Challenge(在步骤6中)与客户端计算的response(在步骤4中)进行比较。如果它们相同则身份验证成功

工作组环境和域环境NTLM验证区别

域环境Server会将认证信息使用netlogon协议发送给域控制器,由域控制器完成检验并返回认证结果

本地抓取Hash

在渗透测试中,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得用户hash,通过读取lsass.exe(注意 l为小写的L)进程能获得已登录用户的NTLM hash。但需要注意的是大部分本地抓取hash工具都需要管理员权限

  • Mimikatz

    Mimikatz可以抓到本机的明文密码和其他用户的Hash密码,原因是因为其抓取本地lsass文件,lsass中有经过其它非Hash加密后的密码,此加密算法可逆因而得到明文密码;而得到其它用户Hash加密后的密码是因为ntds.dit中存储本来就是用户Hash加密后的密码

    privilege::debug
    sekurlsa::logonpasswords
  • Procdump

    procdump是微软提供的一个命令行实用程序,用于监视应用程序并生成故障转储。可以用其先dump对方主机的lsass内存文件,然后用mimikatz等工具进行处理。这种方式的好处是可以避免被查杀

    转储lsass内存文件
    procdump.exe -accepteula -ma lsass.exe lsass.dmp Mimikatz破解lsass
    sekurlsa::minidump lsass.dmp
    sekurlsa::logonpasswords

Reference

https://medium.com/@petergombos/lm-ntlm-net-ntlmv2-oh-my-a9b235c58ed4

https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm

https://ssooking.github.io/yu-shen-tou-zhi-ntml-hash/

http://blog.sycsec.com/2018/10/02/What-is-Pass-the-Hash-and-the-Limitations-of-mitigation-methods/

右下角还有打赏功能呦~要不测试一下打赏功能能否正常运行?

浅谈NTLM Hash的更多相关文章

  1. 浅谈字符串Hash

    浅谈字符串Hash 本篇随笔讲解Hash(散列表)的一个重要应用:字符串Hash. 关于Hash Hash是一种数据结构,叫做Hash表(哈希表),也叫散列表.关于Hash的实现,其实与离散化颇为类似 ...

  2. 浅谈一致性Hash原理及应用

    在讲一致性Hash之前我们先来讨论一个问题. 问题:现在有亿级用户,每日产生千万级订单,如何将订单进行分片分表? 小A:我们可以按照手机号的尾数进行分片,同一个尾数的手机号写入同一片/同一表中. 大佬 ...

  3. 浅谈一致性hash

    相信做过互联网应用的都知道,如何很好的做到横向扩展,其实是个蛮难的话题,缓存可横向扩展,如果采用简单的取模,余数方式的部署,基本是无法做到后期的扩展的,数据迁移及分布都是问题,举个例子: 假设采用取模 ...

  4. $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )

    $.ajax()方法详解   jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...

  5. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

  6. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore

    本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...

  7. 浅谈HTTPS以及Fiddler抓取HTTPS协议

    最近想尝试基于Fiddler的录制功能做一些接口的获取和处理工作,碰到的一个问题就是简单连接Fiddler只能抓取HTTP协议,关键的登录请求等HTTPS协议都没有捕捉到,所以想让Fiddler能够同 ...

  8. 转【】浅谈sql中的in与not in,exists与not exists的区别_

    浅谈sql中的in与not in,exists与not exists的区别   1.in和exists in是把外表和内表作hash连接,而exists是对外表作loop循环,每次loop循环再对内表 ...

  9. 浅谈sql中的in与not in,exists与not exists的区别

    转 浅谈sql中的in与not in,exists与not exists的区别   12月12日北京OSC源创会 —— 开源技术的年终盛典 »   sql exists in 1.in和exists ...

随机推荐

  1. matplotlib中文显示乱码解决方法

    在学习<机器学习实战>这本书的决策树一章时,要用matplotlib画出决策树,然而在显示中文时出现了乱码 import matplotlib.pyplot as plt #定义文本框和箭 ...

  2. 洛谷 P3063 【[USACO12DEC]Milk Routing S】

    这道题可以暴力哒~ 我们枚举每一个出现过的容量,然后跑一次最短路,求延迟,在跑最短路的时候,如果遇到的某一个点,比我们当前枚举的那个点小,那么就直接不走这一个点,然后枚举完后,就能得到最大值了. 代码 ...

  3. spring boot 整合Thymeleaf模板

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  4. Idea自带插件Groovy无法创建和启动

    前言 如果现在有人要开始完全重写 Java,那么 Groovy 就像是 Java 2.0.Groovy 并没有取代 Java,而是作为 Java 的补充,它提供了更简单.更灵活的语法,可以在运行时动态 ...

  5. PHPstorm快捷键的学习

    1.Ctrl + 空格 当输入代码时,PHPstorm 会自动出现联想选项. 但是,如果在输入时联想时错过了选择,我们要想让他再一次出现联想,通常采用的方法是在先前的输入后面再输入字符,这时联想又会出 ...

  6. 彻底解决安卓7.0及以上版本抓包https失败

    目录 现象 原因 解决办法 webview抓包失败 警告 现象 android7.0以上的手机https抓包失败(安装了https证书也不行) 原因 android7.0+的版本新增了证书验证(系统证 ...

  7. 每日一题 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目信息 时间: 2019-06-29 题目链接:Leetcode tag: 数组 哈希表 难易程度:简单 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 假设数组是非空的 ...

  8. 微信小程序获取index索引值的方法

    功能:点击某一项,底部出现粉色边框 首先需要通过 bindtap 为每一个item项绑定一个点击事件,其次需要添加自定义属性 data-* = {{index}} ,以便在函数中获取到被点击item项 ...

  9. 爬虫python3:TypeError: cannot use a string pattern on a bytes-like object

    import re from common_p3 import download def crawl_sitemap(url): sitemap = download(url) links = re. ...

  10. 数据可视化之 图表篇(三)体验Power BI最新发布的AI图表:分解树

    在刚刚发布的11月更新中,PowerBI界面全新改版,采用和Office套件相似的Ribbon风格,除了这个重大变化,还发布了一个AI黑科技图表:分解树(Decomposition Tree). 无论 ...