[内网安全] Windows 本地认证 — NTLM 哈希和 LM 哈希

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客

0x01:SAM 文件 & Windows 本地认证流程

0x0101:SAM 文件简介

Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候,系统会将用户输入的密码与 SAM 文件中的密码进行对比,如果相同,则认证成功,你就可以登录了。

SAM 文件存储在系统的 %SystemRoot%\system32\config\ 目录下,该文件用于存储本地所有用户的凭证信息。值得注意的是,哪怕我们能看到该文件,我们也是无法直接查看到文件内容的:

0x0102:Windows 本地认证流程

下图就是 Windows 本地认证的流程,这个流程每当我们进行登录时系统就会自动走一遍:

Windows 本地认证流程如下:

  • 首先,用户注销、重启、锁屏后,操作系统会让 winlogon.exe 显示登录界面,接收用户输入的账号密码。

  • 用户在 winlogon.exe 中输入账号密码后,winlogon.exe 会将明文密码发送到 lsass.exe 进程中。

  • lsass.exe 将收到的明文密码保存到内存中,并将明文密码进行 NTLM Hash 加密。

  • lsass.exe 将加密后的密码与 SAM 文件中的值进行比对,比对成功就允许登录,反之,登录失败。

Winlogon.exe 即 Windows Logon Process,是 Windows NT 用户登录程序,用于管理用户的登录和退出。

Lsass.exe 是微软 Windows 系统的一个安全机制,它用于控制本地安全和登录策略。


在进行本地认证的过程中,用来处理用户输入密码的进程 lsass.exe 会将用户的密码以明文形式存储一份在内存中,以供该进程将密码计算成 NTLM Hash 与 SAM 进行比对。我们后面使用 Mimikatz 来获取的明文密码,便是通过该进程读取到的。

即,若要让 Mimikatz 成功抓取密码,被抓密码的用户必须在该机器中登陆过,且明文密码被保存在了内存中。(关机重启后内存就刷新了,密码就消失了,也就抓不到了)

0x02:NTLM Hash & LM Hash 原理剖析

Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash,另一部分为 NTLM Hash。在 Windows 操作系统中,Hash 的结构通常如下:

username:RID:LM-HASH:NTLM-HASH

LM Hash 简介 — DES 加密(可逆)

LM Hash 的全名为 “LAN Manager Hash”,是微软为了提高 Windows 操作系统的安全性而采用的散列加密算法,其本质是 DES 加密(DES 加密是可逆的,可被破解的)。

由于 LM Hash 比较容易被破解,微软又为了保证系统的兼容性,所以从 Windows Vista 和 Windows Server 2008 开始,LM Hash 默认是被禁用了(开始使用 NTLM Hash)。

LM Hash 明文密码被限定在 14 位以内,即,如果要停止使用 LM Hash,将用户的密码设置为 14 位以上即可。如果 LM Hash 被禁用了,攻击者通过工具抓取到的 LM Hash 通常为 “ad3b435b51404eead3b435b51404ee” 标示 LM Hash 为空值或者被禁用。

NTLM Hash 简介 — MD4 加密(不可逆)

NTLM Hash 是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。NTLM Hash 是基于 MD4 加密算法进行加密的。

个人版从 Windows Vista 以后,服务器版从 Windows Server 2003 以后,Windows 操作系统的认证方式均为 NTLM Hash。

为了解决 LM 加密和身份验证方案中固有的安全弱点,Microsoft 于 1993 年在 Windows NT 3.1 中引入了 NTLM 协议,下面是各个版本对 LM 和 NTLM 的支持:

0x0201:LM Hash 加密原理

这部分我们将以明文口令 Admin@123 为例一步一步的演示 LM Hash 加密的流程,以此加深大家对 LM Hash 加密的理解(下面加密流程中,字节之间是没有空格的,笔者这样写只是方便大家看清而已)。

第一步:将明文口令转换为其大写形式 => ADMIN@123

第二步:将大写的明文口令转换为十六进制字符串 => 41 44 4D 49 4E 40 31 32 33

字符串HEX转换hex转string,string转hex,hex转字符串,字符串转hexhttps://www.lddgo.net/string/hex

第三步:密码不足 14 字节要求用 0 补全,1Byte=8bit,上面十六进制字符串共 9 字节,还差 5 字节,我们需要用 00 补全,最终结果为:

41 44 4D 49 4E 40 31 32 33 00 00 00 00 00

第四步:将上述编码每 7 个字节一组,分成两组:

第一组: 41 44 4D 49 4E 40 31
第二组: 32 33 00 00 00 00 00

第五步:将每一组 7 个字节的十六进制转换为二进制:

第一组: 41 44 4D 49 4E 40 31
转化过程:41 => 4 1 => 0100 000144 => 4 4 => 0100 01004D => 4 D => 0100 110149 => 4 9 => 0100 10014E => 4 E => 0100 111040 => 4 0 => 0100 000031 => 3 1 => 0011 0001
转化后: 0100 0001 0100 0100 0100 1101 0100 1001 0100 1110 0100 0000 0011 0001
第二组: 32 33 00 00 00 00 00
转化过程:32 => 3 2 => 0011 001033 => 3 3 => 0011 001100 => 0 0 => 0000 0000
转化后: 0011 0010 0011 0011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

第六步:每 7bit 一组末尾加零,再转化成十六进制得到 2 组 8 字节的编码:

第一组: 0100 0001 0100 0100 0100 1101 0100 1001 0100 1110 0100 0000 0011 0001
转换过程: 每 7 bit 一组末尾加零,并转化为十六进制:
0100 0000 => 40
1010 0010 => A2
0001 0010 => 12
1010 1000 => A8
1001 0100 => 94
0111 0010 => 72
0000 0000 => 00
0110 0010 => 62
转换后: 40 A2 12 A8 94 72 00 62
第二组: 0011 0010 0011 0011 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
转换过程: 每 7 bit 一组末尾加零,并转化为十六进制:
0011 0010 => 32 
0001 1000 => 18
1100 0000 => C0
0000 0000 => 00
0000 0000 => 00
0000 0000 => 00
0000 0000 => 00
0000 0000 => 00
转换后: 32 18 C0 00 00 00 00 00

第七步:将前面步骤得到的两组 8 字节编码分别作为密钥,对字符串 KGS!@#$% 的十六进制值(4B47532140232425)进行 DES 加密:

DES 加密工具:DES加密工具.exe

被加密的明文: 4B47532140232425
第一组(密钥): 40A212A894720062
第二组(密钥): 3218C00000000000

第八步:将两次 DES 加密的结果拼接在一起就是最终的 LM Hash值:

6F08D7B306B1DAD4B75E0C8D76954A50

0x0202:NTLM Hash 加密原理

这部分我们将以明文口令 Admin@123 为例一步一步的演示 NTLM Hash 加密的流程,以此加深大家对 NTLM Hash 加密的理解(下面加密流程中,字节之间是没有空格的,笔者这样写只是方便大家看清而已)。

第一步:将明文口令转化为十六进制格式 => 41 64 6D 69 6E 40 31 32 33

第二步:将转化的十六进制再转化为 Unicode 格式(在每个字节后面补两个 0):

原始: 41 64 6D 69 6E 40 31 32 33
转 Unicode 格式: 4100 6400 6D00 6900 6E00 4000 3100 3200 3300
最终值: 410064006D0069006E004000310032003300

第三步:对 Unicode 字符串进行 MD4 加密,生成 32 位的 NTLM Hash 值:

HashCalc 工具获取:HashCalc.exe

570a9a65db8fba761c1008a51d4c95ab


综上所属,如果我们有一个用户账号信息为:admin : Admin@123,那么其在 SAM 文件中的格式就长下面这样:

admin:RID:6F08D7B306B1DAD4B75E0C8D76954A50:570a9a65db8fba761c1008a51d4c95ab

这里笔者简单介绍一下 RID:

在 WIndows 操作系统中,RID(Relative Identifier,相对标识符)是安全标识符(SID)的一部分,用于唯一标识用户账户、组或其他安全主体。

  • SID(Security Identifier,安全标识符): 是一个唯一标识用户、组或计算机账户的数字。它由两部分组成:域 SID 和 RID。

  • RID(Relative Identifier,相对标识符): 是 SID 中的一部分,用于区分同一域内的不同对象。每次创建新账户或组时,RID 会递增。

例如,一个用户账户的 SID 可能是 S-1-5-21-1234567890-1234567890-1234567890-1000,其中 1000 就是 RID。

常见的 RID 值有以下几个:

  • 500 => 本地管理员账户。

  • 501 => 来宾账户。

  • 1000 即以上 => 普通用户账户。

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

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

相关文章

算法-图-dijkstra 最短路径

理论知识 dijkstra三部曲 朴素版dijkstra 模拟过程 堆优化版dijksra 经典模版例题 Dijkstra求最短路 I 参加科学大会(第六期模拟笔试)--模版题 网络延迟 ref 理论知识 最短路是图论中的经典问题即:给出一个有向图,一…

Qt添加MySql数据库驱动

文章目录 一. 安装MySql二.编译mysql动态链接库 Qt版本:5.14.2 MySql版本:8.0.41 一. 安装MySql 参考这里进行安装:https://blog.csdn.net/qq_30150579/article/details/146042922 将mysql安装目录里的bin,include和lib拷贝出来…

浅论数据库聚合:合理使用LambdaQueryWrapper和XML

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库聚合替代内存计算(关键优化)二、批量处理优化四、区域特殊处理解耦五、防御性编程增强 前言 技术认知点:使用 XM…

Ubuntu 22.04安装NVIDIA A30显卡驱动

一、安装前准备 1.禁用Nouveau驱动 Ubuntu默认使用开源Nouveau驱动,需要手动禁用: vim /etc/modprobe.d/blacklist-nouveau.conf # 添加以下内容: blacklist nouveau options nouveau modeset0 # 更新内核并重启: update-initr…

Docker Desktop 4.38 安装与配置全流程指南(Windows平台)

一、软件定位与特性 Docker Desktop 是容器化应用开发与部署的一体化工具,支持在本地环境创建、管理和运行Docker容器。4.38版本新增GPU加速支持、WSL 2性能优化和Kubernetes 1.28集群管理功能,适用于微服务开发、CI/CD流水线搭建等场景。 二、安装环境…

音视频入门基础:RTP专题(15)——FFmpeg源码中,获取RTP的视频信息的实现

一、引言 通过FFmpeg命令可以获取到SDP文件描述的RTP流的视频压缩编码格式、色彩格式(像素格式)、分辨率、帧率信息: ffmpeg -protocol_whitelist "file,rtp,udp" -i XXX.sdp 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这…

深度学习---卷积神经网络

一、卷积尺寸计算公式 二、池化 池化分为最大池化和平均池化 最常用的就是最大池化,可以认为最大池化不需要引入计算,而平均池化需要引出计算(计算平均数) 每种池化还分为Pooling和AdaptiveAvgPool Pooling(2)就是每2*2个格子…

netty中Future和ChannelHandler

netty中的Future,继承自 jdk中的Future,, jdk中的Future,很垃圾,只能同步阻塞获取结果,,, netty中的Future进行了升级,,可以addListener()异步获取结果&…

java 初学知识点总结

自己总结着玩 1.基本框架 public class HelloWorld{ public static void main(String[] args){ }//类名用大写字母开头 } 2.输入: (1)Scanner:可读取各种类型,字符串相当于cin>>; Scanner anew Scanner(System.in); Scan…

质量属性场景描述

为了精确描述软件系统的质量属性,通常采用质量属性场景(Quality Attribute Scenario)作为描述质量属性的手段。质量属性场景是一个具体的质量属性需求,使利益相关者与系统的交互的简短陈述。 质量属性场景是一种用于描述系统如何…

数据可携带权的多重价值与实践思考

文章目录 前言一、数据可携带权的提出与立法二、数据可携带权的多重价值1、推动数据要素市场化配置2、促进市场竞争与创新3、强化个人数据权益 三、数据可携带权的实践挑战1、数据安全与隐私保护面临风险2、接口差异导致数据迁移成本高昂3、可携带的数据范围尚存争议 数据可携带…

蓝桥每日打卡--分考场

#蓝桥#JAVA#分考场 题目描述 n个人参加某项特殊考试。 为了公平,要求任何两个认识的人不能分在同一个考场。 求是少需要分几个考场才能满足条件。 输入描述 输入格式: 第一行,一个整数n(1≤n≤100),表示参加考试的人数。 …

RMAN备份bug-审计日志暴涨(select action from gv$session)

问题概述 /oracle 文件系统使用率过大,经过检查是审计日志过大,/oracle 目录 197G 审计日志占用70G,每6个小时产生大量审计日志,日志内容全是select action from gv$session ,猜测可能跟备份有关, $>df -h /oracle…

在Blender中给SP分纹理组

在Blender中怎么分SP的纹理组/纹理集 其实纹理组就是材质 把同一组的材质分给同一组的模型 导入到sp里面自然就是同一个纹理组 把模型导入SP之后 就自动分好了

Nuxt:Nuxt3框架中onBeforeMount函数 和onBeforeRouteUpdate函数区别介绍 【超详细!】

提示:在 Nuxt3 中,onBeforeMount 和 onBeforeRouteUpdate 是两个不同场景下使用的钩子函数,分别对应 Vue 组件生命周期 和 路由导航守卫。以下是它们的详细解释和对比: 文章目录 一、onBeforeMount(Vue 生命周期钩子&a…

华为 Open Gauss 数据库在 Spring Boot 中使用 Flyway

db-migration:Flyway、Liquibase 扩展支持达梦(DM)、南大通用(GBase 8s)、OpenGauss 等国产数据库。部分数据库直接支持 Flowable 工作流。 开源代码仓库 Github:https://github.com/mengweijin/db-migrat…

java 查找两个集合的交集部分数据

利用了Java 8的Stream API&#xff0c;代码简洁且效率高 import java.util.stream.Collectors; import java.util.List; import java.util.HashSet; import java.util.Set;public class ListIntersection {public static List<Long> findIntersection(List<Long> …

双足机器狗开发:Rider - Pi

双足机器狗开发:Rider - Pi https://github.com/YahboomTechnology/Rider-Pi-Robot 项目介绍 Rider - Pi是一款为开发者、教育工作者和机器人爱好者设计的桌面双轮腿式机器人,它基于树莓派CM4核心模块构建,具备多种先进功能和特点: 硬件特性 核心模块:采用树莓派CM4核…

Android12 添加开机铃声

系统默认是没有播放开机铃声的功能&#xff0c;MTK有一套自己的开机铃声处理逻辑&#xff0c;代码在/vendor/mediatek/proprietary/operator/frameworks/bootanimation/MtkBootanimation下&#xff0c;但是在10之后MTK就不在维护这部分代码了。直接使用会有很多编译报错&#x…

3.6V-30V宽压输入降压同步IC内置MOS,电流4A/5A/6A,可以满足汽车应急电源,BMS电池,电池组USB口输出等储能应用

今天给大家介绍一下这三款产品&#xff0c;分别是CJ92340,输入电压4.5V-30V&#xff0c;输出可调&#xff0c;电流负载能力可达4A&#xff0c;频率350KHZ。CJ92350,输入电压3.6V-30V&#xff0c;输出可调&#xff0c;频率可调&#xff0c;带载能力达5A。CJ92360,输入电压3.6V-3…