当前位置: 首页 > article >正文

[内网安全] 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 即以上 => 普通用户账户。

相关文章:

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

关注这个专栏的其他相关笔记:[内网安全] 内网渗透 - 学习手册-CSDN博客 0x01:SAM 文件 & Windows 本地认证流程 0x0101:SAM 文件简介 Windows 本地账户的登录密码是存储在系统本地的 SAM 文件中的,在登录 Windows 的时候&am…...

输电线路杆塔倾斜智能监测:守护电网安全的智慧之眼

​ ​2023年夏,某超高压输电线路突发倒塔事故,导致三省市大面积停电,直接经济损失超2.3亿元。事后调查显示,杆塔倾斜角度早已超出安全阈值,但传统巡检未能及时发现。这个刺痛行业的案例,揭开了电力设施监…...

FastGPT 引申:奥运选手知识图谱构建与混合检索应用

目录 FastGPT 引申:奥运选手知识图谱构建与混合检索应用第一部分:数据构建流程1. 数据抽取与预处理2. 向量化处理3. 知识图谱构建4. 数据持久化 第二部分:混合检索应用1. 用户查询处理2. 混合检索技术细节3. 返回结果示例4. 性能指标 FastGPT…...

GitHub CI流水线

GitHub CI流水线 build.yml 路径:.github/workflows/build.yml name: Docker Image CIon:workflow_dispatch:jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkoutv4- name: Set up JDK 8uses: actions/setup-javav4with:java-version: 8distributi…...

探索.NET 10 的新特性,开发效率再升级!

前言 最近,.NET 10 发布啦,作为长期支持(LTS)版本,接下来的 3 年里它会给开发者们稳稳的幸福。今天咱就来唠唠它都带来了哪些超实用的新特性。可在指定链接下载。 新特性 下面将介绍了.NET 10的新特性,其…...

算法·搜索

搜索问题 搜索问题本质也是暴力枚举,一般想到暴力也要想到利用回溯枚举。 排序和组合问题 回溯法 去重问题:定义全局变量visited还是局部变量visited实现去重? 回溯问题 图论中的搜索问题 与一般的搜索问题一致,只不过要多…...

【图像处理与OpenCV:技术栈、应用和实现】

引言 图像处理作为计算机视觉领域的重要分支,在各个行业中扮演着越来越重要的角色。从医疗诊断、自动驾驶、安防监控到人工智能领域的图像识别,图像处理无处不在。随着计算机硬件性能的提升和深度学习的快速发展,图像处理技术也在不断演进&a…...

《水利水电安全员考试各题型对比分析及应对攻略》

《水利水电安全员考试各题型对比分析及应对攻略》 单选题: 特点:四个选项中只有一个正确答案,相对难度较小。主要考查对基础知识的掌握程度。 应对攻略:认真审题,看清题目要求。对于熟悉的知识点,直接选择…...

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏,内容栏和公工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示&am…...

第16章 直接定址表

目录 16.1 描述了单元长度的标号16.2 在其它段中使用数据标号16.3 直接定址表16.4 程序入口地址的直接定址表实验16 编写包含多个功能子程序的中断例程 16.1 描述了单元长度的标号 assume cs:code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start: mov si,0      mov cx…...

【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进

深度神经网络系列文章 【AI深度学习网络】卷积神经网络(CNN)入门指南:从生物启发的原理到现代架构演进【AI实践】基于TensorFlow/Keras的CNN(卷积神经网络)简单实现:手写数字识别的工程实践 引言 在当今…...

江科大51单片机笔记【10】蜂鸣器播放提示器音乐(下)

一、蜂鸣器播放提示器 这里我们要用Key,Delay,Nixie模块 并且把Nixie.c函数里的这两句注释,因为之前是动态显示,延时后马上清零,现在是静态显示,所以需要把他注释掉 // Delay(1); // P00x00; 先验…...

Milvus JSON数据存储优化方案

无论是json数据还是string/varchar 类型数据,其长度都不能超过65536,这是根本,不像ES的text类型数据一样,可以无限长。 总结 数据类型适用场景最大长度STRINGMilvus <2.2.x 的短文本(<65KB)隐式 ≈65,535 字节VARCHAR(N)Milvus ≥2.2.x 的文本显式 N≤65,535 字符…...

MySQL 数据库连接池爆满问题排查与解决

目录 MySQL 数据库连接池爆满问题排查与解决 一、问题影响 二、问题确认 三、收集信息 四、SQL 语句分析 五、应用层代码分析 六、连接池配置检查 七、监控工具使用 八、案例分析 在实际的应用开发中&#xff0c;我们可能会遇到 MySQL 数据库连接池爆满的情况。这种情…...

PyTorch深度学习的梯度消失和梯度爆炸的识别、解决和最佳实践

通过结合梯度监控、网络架构改进和优化策略&#xff0c;可以有效应对梯度消失/爆炸问题。建议在模型开发初期就加入梯度监控机制&#xff0c;这有助于快速定位问题层。对于超深网络&#xff08;>50层&#xff09;&#xff0c;建议优先考虑使用预激活残差结构&#xff08;Res…...

Nginx1.19.2不适配OPENSSL3.0问题

Nginx 1.19.2 是较老的版本&#xff0c;而 Nginx 1.21 版本已经适配 OpenSSL 3.0&#xff0c;所以建议 升级 Nginx 到 1.25.0 或更高版本&#xff1a; wget http://nginx.org/download/nginx-1.25.0.tar.gz tar -xzf nginx-1.25.0.tar.gz cd nginx-1.25.0 ./configure --prefix…...

蓝桥杯 Excel地址

Excel地址 题目描述 Excel 单元格的地址表示很有趣&#xff0c;它使用字母来表示列号。 比如&#xff0c; A 表示第 1 列&#xff0c; B 表示第 2 列&#xff0c; Z 表示第 26 列&#xff0c; AA 表示第 27 列&#xff0c; AB 表示第 28 列&#xff0c; BA 表示第 53 列&#x…...

免费pdf格式转换工具

基本功能 - 支持单文件转换和批量转换两种模式 - 内置PDF文件预览功能 - 支持8种常见格式转换&#xff1a;Word、Excel、JPG/PNG图片、HTML、文本、PowerPoint和ePub 单文件转换功能 - 文件选择&#xff1a;支持浏览和选择单个PDF文件 - 输出位置&#xff1a;可自定义设置输出…...

I²C总线应用场景及1.8V与3.3V电压选择

以下是关于IC总线应用场景及1.8V与3.3V电压选择的详细分析: 一、IC总线的典型应用场景 1. 板内通信(主要场景) 描述:IC 最初设计是为电路板(PCB)上的芯片间短距离通信,尤其适用于集成度高的系统。典型器件: 传感器模块(如温湿度传感器BME280)。存储芯片(如EEPROM 2…...

css错峰布局/瀑布流样式(类似于快手样式)

当样式一侧比较高的时候会自动换行&#xff0c;尽量保持高度大概一致&#xff0c; 例&#xff1a; 一侧元素为5&#xff0c;另一侧元素为6 当为5的一侧过于高的时候&#xff0c;可能会变为4/7分部dom节点 如果不需要这样的话删除样式 flex-flow:column wrap; 设置父级dom样…...

Deepseek中的MoE架构的改造:动态可变参数激活的MoE混合专家架构(DVPA-MoE)的考虑

大家好,我是微学AI,今天给大家介绍一下动态可变参数激活MoE架构(Dynamic Variable Parameter-Activated MoE, DVPA-MoE)的架构与实际应用,本架构支持从7B到32B的等多档参数动态激活。该架构通过细粒度难度评估和分层专家路由,实现“小问题用小参数,大问题用大参数”的精…...

docker-compose Install reranker(fastgpt支持) GPU模式

前言BGE-重新排名器 与 embedding 模型不同&#xff0c;reranker 或 cross-encoder 使用 question 和 document 作为输入&#xff0c;直接输出相似性而不是 embedding。 为了平衡准确性和时间成本&#xff0c;cross-encoder 被广泛用于对其他简单模型检索到的前 k 个文档进行重…...

doris: MySQL

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 MySQL 数据库。本文档介绍如何配置 MySQL 数据库连接。 使用须知​ 要连接到 MySQL 数据库&#xff0c;您需要 MySQL 5.7, 8.0 或更高版本 MySQL 数据库的 JDBC 驱动程序&#xff0c;您可以从 Maven 仓库下载最新或指定版本的…...

JVM参数调整

一、内存相关参数 1. 堆内存控制 -Xmx&#xff1a;最大堆内存&#xff08;如 -Xmx4g&#xff0c;默认物理内存1/4&#xff09;。-Xms&#xff1a;初始堆内存&#xff08;建议与-Xmx相等&#xff0c;避免动态扩容带来的性能波动&#xff09;。-Xmn&#xff1a;新生代大小&…...

【DeepSeek问答】访问QStandardItemModel::index(r,c)获取的空索引导致程序崩溃

好的&#xff0c;我现在来仔细思考一下用户的问题。用户在使用QStandardItemModel的setItem方法时&#xff0c;调用了setItem(4,6,item)&#xff0c;也就是在第4行第6列的位置设置了一个item。然后他们尝试通过index(3,6)来获取这个位置的项目&#xff0c;想知道会有什么后果。…...

基于websocket的多用户网页五子棋 --- 测试报告

目录 功能测试自动化测试性能测试 功能测试 1.登录注册页面 2.游戏大厅页面 3.游戏房间页面 自动化测试 1.使用脑图编写web自动化测试用例 2.创建自动化项目&#xff0c;根据用例通过selenium来实现脚本 根据脑图进行测试用例的编写&#xff1a; 每个页面一个测试类&am…...

在 macOS 上使用 CLion 进行 Google Test 单元测试

介绍 Google Test&#xff08;GTest&#xff09;是 Google 开源的 C 单元测试框架&#xff0c;它提供了简单易用的断言、测试夹具&#xff08;Fixtures&#xff09;和测试运行机制&#xff0c;使 C 开发者能够编写高效的单元测试。 本博客将介绍如何在 macOS 上使用 CLion 配…...

深度解码!清华大学第六弹《AIGC发展研究3.0版》

在Grok3与GPT-4.5相继发布之际&#xff0c;《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经&#xff0c;不仅预测了2025年AI技术爆发点&#xff0c;更将「天人合一」的东方智慧融入AI伦理建构&#xff0c;堪称数字时代的《道德经》。 文档&#xff1a;清华大学第…...

【论文笔记】Attentive Eraser

标题&#xff1a;Attentive Eraser: Unleashing Diffusion Model’s Object Removal Potential via Self-Attention Redirection Guidance Source&#xff1a;https://arxiv.org/pdf/2412.12974 收录&#xff1a;AAAI 25 作者单位&#xff1a;浙工商&#xff0c;字节&#…...

97k倍区间

97k倍区间 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;暴力&#xff0c;2017省赛 &#x1f4d6; &#x1f4da; import java.util.Scanner;public class Main {static int N 100010;public static void main(String[] args) {Scanner sc new Scanner(System.…...