NTLM协议

0x01 LM Hash加密算法

LM Hash本质是一个DES加密,从Windows Vista和Windows Server 2008开始就禁用了LM Hash。LM Hash明文密码被限定在14位以内,密码超过14位则会停止使用LM Hash。下面介绍一下LM Hash的加密流程,以P@ss1234为例:

  1. 将密码转成大写,然后转成十六进制。

P@ss12345->P@SS1234->5040535331323334

  1. 十六进制字符不足14字节则用0补齐(14字节包含28位十六进制数字)。

5040535331323334->5040535331323334000000000000

  1. 将14字节数据分成两组,每组7字节,将每个字节的数字逐个转化成二进制,然后拼接起来(每个字节包含2位十六进制数字)。
50405353313233
01010000010000000101001101010011001100010011001000110011

拼接后数据:01010000010000000101001101010011001100010011001000110011

34000000000000
00110100000000000000000000000000000000000000000000000000

拼接后数据:00110100000000000000000000000000000000000000000000000000

  1. 将每组二进制数据按7bit为一组,分为8组,每组末尾加0,然后将每组逐个转成16进制后拼接。
01010000010000000101001101010011001100010011001000110011
0101000000100000000101000110101000110010100010001100100001100110

转化成十六进制:5020146a3288c866

00110100000000000000000000000000000000000000000000000000
0011010000000000000000000000000000000000000000000000000000000000

转化成十六进制:3400000000000000

  1. 将上面生成的两组数据分别作为DES加密秘钥对字符串KGS!@#$%加密,然后拼接得到最终的LM Hash。
明文秘钥DES加密
KGS!@#$%5020146a3288c866896108C0BBF35B5C
KGS!@#$%3400000000000000FF17365FAF1FFE89

拼接后得到最终的LM Hash:896108C0BBF35B5CFF17365FAF1FFE89

0x02 NTLM Hash加密算法

为了解决LM Hash加密和身份验证方案中的安全弱点,微软提出了NTLM Hash加密算法。下面介绍一下LM Hash的加密流程,以P@ss1234为例。

  1. 将密码转化成ASCII编码,然后逐个编码转成16进制。
字符P@ss1234
ASCII806411511549505152
16进制5040737331323334

拼接后字符:5040737331323334

  1. 将ASCII编码的十六进制字逐个转化成Unicode编码(Unicode编码是在每个16进制字节后面加00)。

5040737331323334->50004000730073003100320033003400

  1. 对Unicode编码进行MD4加密。

50004000730073003100320033003400-> 74520a4ec2626e3638066146a0d5ceae

0x03 Net-NTLM Hash 加密算法

Net-NTLM有两个版本,两者的区别是Challenge值与加密算法不同。

版本Challenge值长度加密算法
Net-NTLM v1 Hash8字节DES加密算法
Net-NTLM v2 Hash16字节HMAC-MD5加密算法

3.1 Net-NTLM v1 Hash生成步骤

  1. 将16字节的NTLM Hash填充到21字节,并平均分成三组,每组7字节。

  2. 将这三组数据分别作为3DES的秘钥对Challenge加密,得到三个密文。

  3. 将三个密文拼接起来得到NTLM response。

  4. 拼接用户名等信息得到最终的Net_NTLM v1 Hash,格式:username::hostname:LM response:NTLM response:challenge

3.2 Net-NTLM v2 Hash生成步骤

  1. 将大写的User name和区分大小写的Domain name拼接在一起并转化成ASCII编码,然后逐个ASCII编码转成16进制,最后逐个转化成Unicode编码得到data (Unicode编码是在每个16进制字节后面加00)。

  2. 用NTLM Hash作为加密秘钥对data进行HMAC-MD5加密得到NTLM v2 Hash。

  3. 构建一个blob,将challenge和blob拼接在一起得到data2,其中blob包含了用户名、域名、随机挑战、时间戳等信息。

  4. 使用NTLM v2 Hash作为加密秘钥对data2进行HMAC-MD5加密得到HMAC-MD5。

  5. 拼接用户名等信息得到最终的Net_NTLM v2 Hash,格式:username::domain:challenge:HMAC_MD5:blob

0x04 NTLM协议认证

4.1 工作组环境下的NTLM认证

在这里插入图片描述

  1. 用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。

  2. 服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。

  3. 客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。

  4. 服务端收到Type 3后取出Net-NTLM Hash,用服务端保存的密码生成的NTLM Hash对challenge加密得到服务端的Net-NTLM Hash,将客户端与服务端计算的Net_NTLM Hash对比,相等则认证成功,否则失败,并将验证结果发送给客户端。

4.2 域环境下的NTLM认证

在这里插入图片描述

  1. 用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。

  2. 服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。

  3. 客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。

  4. 客户端收到Type 3后提取Net-NTLM Hash,通过Netlogon协议与域控服务器简历一个安全通道,将验证消息发送给域控。

  5. 域控收到验证消息后取出Net-NTLM Hash和challenge,同时从数据库中找到该用户的NTLM Hash对challenge加密得到Net-NTLM Hash并与客户端的Net-NTLM Hash对比,相等则认证成功,否则失败,并将结果发送给服务端。

  6. 服务端收到域控的验证结果后,将验证结果发送给客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/21324.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFMPEG 编译流程(极客版)

前言 依葫芦画瓢 全程30分钟从零完成ffmpeg编译,主打的就是一个极客 编译环境 OS 要求:Ubuntu 20.04 LTS VMware新建虚拟机 NDK 要求:android-ndk-r20b FFmpeg 功能模块: libavformat:多媒体文件或协议的封装和解封装库&a…

计算机基础--->数据结构(9)【并查集】

文章目录 并查集的概述并查集的主要用途并查集的实现创建和初始化集合查找当前元素的集合根节点判断两个元素是否处于同一集合合并两个集合对节点的路径进行压缩 并查集的概述 并查集是一种用于解决集合合并和查询问题的数据结构,主要用于实现有关集合的操作&#x…

IDEA 配置 openjdk,jre

使用 idea 配置 zip 版本的 openjdk 和 jre,我使用的时 redhat 提供的 jdk 和 jre。 一、下载 idea、jdk 和 jre 红帽下载地址为: jdk 和 jre 安装地址根据个人配置,我的配置如下: 下划线的分别为我的 jdk 和 jre 保存路径 二…

【力扣刷题 | 第十八天】

目录 前言: 1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 134. 加油站 - 力扣(LeetCode) 总结: 前言: 今天随机刷题,不对题型做具体的要求 1005. K 次取反后最大化的数组和 …

【2023,学点儿新Java-33】字符型变量char | 布尔类型变量 boolean:true、false

前情提要: 【2023,学点儿新Java-32】Java基础小练习:根据圆周率与半径求圆的面积 | 温度转换 | 计算矩形面积 | 判断奇偶数 | 年龄分类【2023,学点儿新Java-31】测试:整型和浮点型变量的使用 | 附:计算机存…

2.zabbxi操作和设置

文章目录 zabbxi操作和设置添加zabbix-agent客户端web端添加客户端 自定义监控模板(面试)监控模板下载地址案例1案例2 设置邮件报警自动注册和自动发现自动发现(对于agent是被动模式)自动注册(对于agent是主动模式&…

PROFINET转TCP/IP网关TCP/IP协议的含义是

大家好,今天要和大家分享一款自主研发的通讯网关,远创智控YC-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧&…

虚拟化容器化与docker

虚拟化容器化与docker 基本概念虚拟化分类虚拟化实现主机虚拟化实现容器虚拟化实现命名空间namespace空间隔离 控制组群cgroup资源隔离 LXC(Linux Container) docker与虚拟机 基本概念 物理机: 实际的服务器或者计算机。相对于虚拟机而言的对实体计算机的称呼。物理…

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作)

DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作) 文章目录 DSP开发软件css(10)使用基础(汉化、工程导入、设置目标配置文件、选择仿真器和芯片型号、添加文件|库路径、编译下载等操作&#…

【软件设计师暴击考点】操作系统知识高频考点暴击系列【一】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:软件…

Ext4文件系统介绍 - 理论篇

Overview ext4文件系统分割成多个block groups,为了解决碎片化问题,block allocator尽量将一个文件的block放在一个group中。block groups的size通过sb.s_blocks_per_group指定,同样也可以通过8*block_size_in_bytes计算得到。block默认大小…

每个前端开发者都应知道的10个实用网站

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的,我们出的钱 体验地…