[內網安全] 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.pswp.cn/diannao/72595.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72595.shtml
英文地址,請注明出處:http://en.pswp.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…