[内网安全] 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 0001
    44 => 4 4 => 0100 0100
    4D => 4 D => 0100 1101
    49 => 4 9 => 0100 1001
    4E => 4 E => 0100 1110
    40 => 4 0 => 0100 0000
    31 => 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 0010
    33 => 3 3 => 0011 0011
    00 => 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 即以上 => 普通用户账户。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类和对象—多态—案例2—制作饮品

案例描述: 制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶 思路解析: 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类,该类…

YOLOv12本地部署教程——42%速度提升,让高效目标检测触手可及

YOLOv12 是“你只看一次”(You Only Look Once, YOLO)系列的最新版本,于 2025 年 2 月发布。它引入了注意力机制,提升了检测精度,同时保持了高效的实时性能。在保持速度的同时,显著提升了检测精度。例如&am…

SpringBoot3—场景整合:AOT

一、AOT与JIT AOT:Ahead-of-Time(提前编译):程序执行前,全部被编译成机器码 JIT:Just in Time(即时编译): 程序边编译,边运行; 编译:源代码&am…

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势

*VulnHub-FristiLeaks:1.3暴力解法、细节解法,主打软硬都吃,隧道搭建、寻找exp、提权、只要你想没有做不到的姿势 一、信息收集 1、扫靶机ip 经典第一步,扫一下靶机ip arp-scan -l 扫描同网段 nmap -sP 192.168.122.0/242、指纹扫描、端口…

20242817李臻《Linux⾼级编程实践》第二周

一、AI对学习内容的总结 第2章 Linux编程环境总结 1. GCC编译器 GCC(GNU Compiler Collection)是GNU项目的一部分,支持多种编程语言,包括C、C、Java、Fortran、Ada等。编译过程:GCC将源程序转换为可执行程序的过程包…

vue3 组合式API:插槽

一、内容与出口 1、<slot> 元素是一个插槽出口 (slot outlet)&#xff0c;标示了父元素提供的插槽内容 (slot content) 将在哪里被渲染。插槽内容可以是任意合法的模板内容&#xff0c;不局限于文本&#xff0c;可以是多个元素&#xff0c;甚至是组件 // 插槽内容可以是…

【音视频】ffplay播放控制

一、ffplay播放控制 1.1、ffplay打开视频 比如我当前目录下现在有一个1.mp4的视频&#xff0c;可以使用下面的命令用ffplay打开并播放它 ffplay 1.mp4输入后回车即可打开相应的视频 1.2 ffplay播放控制 使用q、ESC退出播放按f、双击切换全屏状态按m切换为静音按9减少音量&a…

K8S高可用集群-小白学习之二进制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…

K8S学习之基础十六:k8s中Deployment更新策略

滚动更新 滚动更新是一种自动化程度较高的发布方式、用户体验比较平滑、是目前成熟型技术组织采用的主流发布方式&#xff0c;一次滚动发布一般有若干发布批次组成&#xff0c;每批的数量一般都是可配置的&#xff0c;可通过发布模板定义&#xff0c;例如第一批10%&#xff0c…

dify + ollama + deepseek-r1+ stable-diffusion 构建绘画智能体

故事背景 stable-diffusion 集成进 dify 后&#xff0c;我们搭建一个小智能体&#xff0c;验证下文生图功能 业务流程 #mermaid-svg-6nSwwp69eMizP6bt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6nSwwp69eMiz…

如何使用 LLM 生成的术语自动在搜索应用程序上构建 autocomplete 功能

作者&#xff1a;来自 Elastic Michael Supangkat 了解如何在 Elastic Cloud 中&#xff0c;通过使用 LLM 生成的词汇&#xff0c;为搜索应用增强自动补全功能&#xff0c;实现更智能、更动态的搜索建议。 自动补全是搜索应用中的一项关键功能&#xff0c;它通过在用户输入时实…

AI学习有感

和前辈聊天&#xff0c;谈到了现在的ai技术&#xff0c;这里对那天的谈话进行总结&#xff1a; AI是无状态的 我们在使用ai时有时候会有一个错觉&#xff0c;认为和ai聊天久了&#xff0c;ai就会像人与人之间交流一样&#xff0c;会保留一种对聊天对象的认知状态&#xff0c;这…

Java 8 Stream API 详解

目录 引言 一、Stream 简介 1.1 什么是 Stream&#xff1f; 1.2 Stream 与集合的区别 1.3 Stream 的操作分类 二、Stream 的创建 2.1 从集合创建 2.2 从数组创建 2.3 使用 Stream.of 创建 2.4 使用 Stream.generate 或 Stream.iterate 创建 三、Stream 的常…

Ubuntu20.04本地配置IsaacLab 4.2.0的G1训练环境(一)

Ubuntu20.04本地配置IsaacLab的G1训练环境&#xff08;一&#xff09; 配置Omniverse环境配置IsaacSim配置IsaacLab 写在前面&#xff0c;如果Ubuntu剩余空间低于60G&#xff0c;则空间不足&#xff0c;除非你不需要资产包。但资产包中却包含了G1模型、Go2模型等机器人模型和代…

从厨电模范到数字先锋,看永洪科技如何助力方太集团开启数字新征程

在数字化洪流席卷全球的宏大背景下&#xff0c;企业转型升级的紧迫性与重要性日益凸显&#xff0c;成为驱动行业进步的关键引擎。在这一波澜壮阔的转型浪潮中&#xff0c;方太集团——厨电领域的璀璨明珠&#xff0c;以其前瞻性的战略视野和不懈的创新精神&#xff0c;携手数据…

蓝桥杯4T平台(串口打印电压值)

知识点&#xff1a;串口(单片机发送数据)按键ADC 题目 配置 代码 adc.c uint16_t getadc2(void) {uint16_t adc0;HAL_ADC_Start(&hadc2);adcHAL_ADC_GetValue(&hadc2);return adc; } adc.h uint16_t getadc2(void); main.c #include "lcd.h" #include…

[Computer Vision]实验七:图像检索

目录 一、实验内容 二、实验过程 2.1 准备数据集 2.2 SIFT特征提取 2.3 学习“视觉词典”&#xff08;vision vocabulary&#xff09; 2.4 建立图像索引并保存到数据库中 2.5 用一幅图像查询 三、实验小结 一、实验内容 实现基于颜色直方图、bag of word等方法的以图搜…

利用 ArcGIS Pro 快速统计省域各市道路长度的实操指南

在地理信息分析与处理的工作中&#xff0c;ArcGIS Pro 是一款功能强大的 GIS 软件&#xff0c;它能够帮助我们高效地完成各种复杂的空间数据分析任务。 现在&#xff0c;就让我们一起深入学习如何借助 ArcGIS Pro 来统计省下面各市的道路长度&#xff0c;这一技能在城市规划、…

关于后端接口的返回值问题

1、后端接口中&#xff0c;get请求能返回给前端一个整数么&#xff1f; 问题说明&#xff1a; 解释&#xff1a; 在 Spring MVC 项目中&#xff0c;GET 请求的后端接口可以返回一个整数给前端。因为我们在controller层中&#xff0c;设置了RestController注解&#xff0c;这表明…

React Native 实现滑一点点内容区块指示器也滑一点点

效果图如上&#xff0c;内容滑一点点&#xff0c;指示器也按比例话一点点&#xff0c;列表宽度跟数据有关。 实现思路如下&#xff1a; 1.监听列表滑动事件&#xff0c;获取列表横向滑动距离&#xff0c;假设为A&#xff1b; 2.获取列表的宽度&#xff0c;及列表可滑动的宽度…