Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ffffffff0x] 浅谈windows认证原理

[ffffffff0x] 浅谈windows认证原理

原创
作者头像
r0fus0d
修改于 2020-12-28 03:55:05
修改于 2020-12-28 03:55:05
1.9K0
举报
文章被收录于专栏:ffffffff0xffffffff0x

前言

在实战渗透中,常常存在把windows主机作为跳板以此进行横向移动的情况,其实际原理并不难。本篇来谈windows系统的认证原理,并演示抓取密码相关场景。


本地认证

在 Windows 系统中本机用户的密码 Hash 是放在本地的 SAM 文件里面,域内用户的密码 Hash 是存在于域控的 NTDS.DIT 文件里。

sam 的简称是Security Account Manager,安全账户管理器。

Windows XP、Windows Vista、Windows 7、Win 8.1 Win 10 的用户密码以 hash 形式存储在 %SystemRoot%\system32\config\sam 数据库文件中。被保存的 hash 分为 LM HashNTLM hash;微软在 Windows NT 4.0 中引入 SYSKEY 对 SAM 文件加密。

所谓哈希(hash),就是使用一种加密函数进行计算后的结果。这个加密函数对一个任意长度的字符串数据进行一次数学加密函数运算,再返回一个固定长度的字符串。现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。Windows 加密过的密码口令,我们称之为 hash. Windows 的系统密码 hash 默认情况下一般由两部分组成:LM-hash和 NTLM-hash。

登录系统的时候,系统会自动对比 SAM 文件中的密码与键入的密码。若相同,则认证成功。

操作系统启动之后,SAM 文件将被锁定。这意味着操作系统运行之时,用户无法打开或复制 SAM 文件。除了锁定,整个 SAM 文件加密,且不可见。

LM Hash

LAN Manager(LM)哈希是 Windows 系统所用的第一种密码哈希算法,是一种较古老的 Hash。在 LAN Manager 协议中使用,非常容易通过暴力破解获取明文凭据。它只有唯一一个版本且一直用到了 NT LAN Manager(NTLM)哈希的出现,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,LM 哈希算法是默认关闭的,LM 算法是在 DES 基础上实现的,不区分字母大小写。

  • 生成原理
    1. 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
    2. 密码的16进制字符串被分成两个 7byte 部分。每部分转换成比特流,并且长度位 56bit,长度不足用0在左边补齐长度
    3. 再分 7bit 为一组,每组末尾加 0,再组成一组
    4. 上步骤得到的二组,分别作为 key 为 KGS!@#$% 进行 DES 加密。
    5. 将加密后的两组拼接在一起,得到最终 LM HASH 值。

NTLM Hash

NT LAN Manager(NTLM)哈希是 Windows 系统认可的另一种算法,用于替代古老的 LM-Hash,一般指 Windows 系统下 Security Account Manager(SAM)中保存的用户密码 hash,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,NTLM 哈希算法是默认启用的。

当用户登录时,将用户输入的明文密码加密成 NTLM Hash,与 SAM 数据库文件中的 NTLM Hash 进行比较。

渗透测试中,通常可从 Windows 系统中的 SAM 文件和域控的 NTDS.dit 文件中获得所有用户的 hash,通过 Mimikatz 读取 lsass.exe 进程能获得已登录用户的 NTLM hash

  • 生成原理
    1. 先将用户密码转换为十六进制格式。
    2. 将十六进制格式的密码进行 Unicode 编码。
    3. 使用 MD4 摘要算法对 Unicode 编码数据进行 Hash 计算

下面是使用python快速生成ntlm hash的代码

代码语言:txt
AI代码解释
复制
python2 -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "P@ssw0rd".encode("utf-16le")).digest())'

本地认证流程

winlogon.exe -> 接收用户输入 -> lsass.exe -> 认证

  1. 当刚开机、注销等操作后,winlogon.exe 进程会显示一个登录界面要求输入用户名和密码。
  2. 输入用户名和密码后,会被 winlogon.exe 获取,然后将其发送给 lsass.exe 进程。
  3. lsass.exe 将明文密码计算得到 NT Hash(不考虑LM)。
  4. 之后会将用户名和计算得到的 NT Hash 拿到 SAM 数据库去查找比对。
  • Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。
  • LSASS 用于微软 Windows 系统的安全机制。用于本地安全和登陆策略。

网络认证

在内网渗透中,经常遇到工作组环境。工作组环境是一种逻辑上的网络环境(工作区),隶属于工作组的机器之间,无法互相建立完美的信任机制且只能点对点,没有信托机构,是比较落后的认证方式。

假设 A 主机与 B 主机属于同一个工作组环境,A 若想访问 B 的资料,需要将存在于 B 主机上的账户凭证发送至 B 主机,经过认证后方能访问 B 主机上的相关资料。

这是我们接触比较多的 SMB 共享文件的案例,SMB 的默认端口是 445。

早期 SMB 协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称 LM,它很容易被破解,就又有了 NTLM 以及 Kerberos。

Net-NTLM hash

NTLM 是一种网络认证协议,以 NTLM Hash 作为凭证进行认证。NTLM Hash 长度为32位,由数字和字母组成,采用挑战/响应(Challenge/Response)的消息交换模式,流程如下:

  1. 客户端向服务器发送一个请求,请求中包含明文的登录用户名。服务器会提前存储登录用户名和对应的密码 hash
  2. 服务器接收到请求后,生成一个16位的随机数(这个随机数被称为 Challenge),明文发送回客户端。使用存储登录用户密码 hash 加密 Challenge,获得 Challenge1
  3. 客户端接收到 Challenge 后,使用登录用户的密码 hash 对 Challenge 加密,获得 Challenge2(这个结果被称 response),将 response 发送给服务器
  4. 服务器接收客户端加密后的 response,比较 Challenge1 和 response,如果相同,验证成功

在以上流程中,登录用户的密码 hash 即 NTLM hash,response 中包含 Net-NTLM hash

在 NTLM 认证中,NTLM 响应分为 NTLM v1,NTLMv2,NTLM session v2 三种协议,不同协议使用不同格式的 Challenge 和加密算法

所以也就存在不同协议的 Net-NTLM hash,即 Net-NTLM v1 hash,Net-NTLM v2 hash

NTLMv2 协议

NTLMv1 和 NTLMv2 的加密因素都是 NTLM Hash,而最显著的区别就是 Challenge 和加密算法不同:

  • Challage: NTLMv1 的 Challenge 有8位,NTLMv2 的 Challenge 为16位。
  • Net-NTLM Hash:NTLMv1 的主要加密算法是 DES,NTLMv2 的主要加密算法是 HMAC-MD5。

抓取密码

下面使用mimikatz进行抓取密码的测试,目标机器为win2008

先提权

代码语言:txt
AI代码解释
复制
privilege::debug

抓取密码

代码语言:txt
AI代码解释
复制
sekurlsa::logonpasswords

可以看到直接抓取出了明文密码,但是,同意存在无法抓取明文密码的情况

下面使用mimikatz进行win7抓取密码的测试,如图

可以看到,并没有抓取到明文的密码,这是因为在 KB2871997 之前, Mimikatz 可以直接抓取明文密码。但微软在 win7 之后就打了补丁 kb2871997,当服务器安装 KB2871997 补丁后,系统默认禁用 Wdigest Auth ,内存(lsass 进程)不再保存明文口令。Mimikatz 将读不到密码明文。

但由于一些系统服务需要用到 Wdigest Auth,所以该选项是可以手动开启的。(开启后,需要用户重新登录才能生效)

代码语言:txt
AI代码解释
复制
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f

由于mimikatz被使用的过于频繁,所以免杀是必须要做的。这里就不再多谈。


总结

本文解释了windows的认证机制,包括本地认证和网络认证,并且演示了使用mimikatz抓取系统认证的场景。受篇幅限制,Kerberos,pth、ptt、ptk这些内容需下次介绍。


本文作者 r0fus0d

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
ASP.NET Core 选项模式源码学习Options Configure(一)
ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户机密等 并可以通过应用程序中的相同界面轻松访问,除此之外,ASP.NET中的新配置系统允许使用Options的强类型设置。
HueiFeng
2020/01/22
2.5K0
asp.net core之Options
本文将介绍 ASP.NET Core 中的 Options 概念和使用方法。Options 是一种配置管理机制,可以将应用程序的配置信息从代码中分离出来,提高代码的可维护性和可测试性。我们将详细介绍如何定义 Options 类、注册 Options、使用 Options,并提供相应的示例代码。此外,我们还将对 IOptions、IOptionsSnapshot、IOptionsMonitor、IConfigureNamedOptions、OptionsBuilder、IValidateOptions、PostConfigureOptions 等相关接口和类进行说明,并给出使用场景示例。
饭勺oO
2023/10/18
3620
asp.net core之Options
ASP.NET Core 3.0 : 二十四. 配置的Options模式
上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式。(ASP.NET Core 系列目录)
FlyLolo
2019/09/29
1.1K0
实战指南:基于OllamaSharp与.NET Core API的高效LLM查询实现
代码亮点: • OllamaClient通过构造函数注入配置参数 • QueryAsync方法实现非阻塞式异步调用 • IOptions<OllamaConfig>自动绑定JSON配置
郑子铭
2025/06/09
950
实战指南:基于OllamaSharp与.NET Core API的高效LLM查询实现
.Net Core中的Options使用以及源码解析
在.Net Core中引入了Options这一使用配置方式,通常来讲我们会把所需要的配置通过IConfiguration对象配置成一个普通的类,并且习惯上我们会把这个类的名字后缀加上Options。所以我们在使用某一个中间件,或者使用第三方类库时,经常会看到配置对应Options的代码,例如关于Cookie的中间件就会配置CookiePolicyOptions这一个对象。
AI.NET 极客圈
2019/07/19
1.1K0
《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)
要访问配置,需要使用 ConfigurationBinder 类,它实现了 IConfigurationBuilder 接口,该接口包括两个重要的方法:
郑子铭
2021/01/13
6660
《ASP.ENT Core 与 RESTful API 开发实战》(第3章)-- 读书笔记(下)
ASP.NET Core快速入门(第2章:配置管理)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore
郑子铭
2021/01/13
7440
ASP.NET Core快速入门(第2章:配置管理)--学习笔记
ASP.NET Core技术研究-探秘Host主机启动过程
当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类。
李明成
2020/04/15
1.5K0
ASP.NET Core技术研究-探秘Host主机启动过程
理解 ASP.NET Core - 配置(Configuration)
链接:cnblogs.com/xiaoxiaotank/p/15367747.html
郑子铭
2021/10/26
2.4K0
理解 ASP.NET Core - 配置(Configuration)
ASP.NET CORE Study02
默认情况下,项目下 的 launchSettings.json 配置文件的优先级最高,appsettings.Development.json 优先级次之,appsettings.json 配置文件优先级最后。 注意的是,在appsettings.json 下可以更具需求建立多个settings.json ,如development.json ,productionsetting.json 等json 配置文件,每个不同json 文件可以进行专门不同的配置信息,不仅可以使针对开发环境进行独立配置,在较为复杂的业务场景下还可以专门将一部分配置抽离出来,比如connectionsetting.json 专门进行各类连接的配置。
Echo_Wish
2023/11/30
2710
ASP.NET CORE Study02
ASP.NET Core 网站运行时修改设置如何自动生效
在ASP.NET Core中,如果修改了appsettings.json中的设置,那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢?
Edi Wang
2019/07/08
3K0
ASP.NET Core 网站运行时修改设置如何自动生效
《ASP.NET Core 微服务实战》-- 读书笔记(第9章)
或者,如果不希望在命令行中显示传入值,也可以把来自启动环境的环境变量转发到容器内部,只要不传入包含值的等式即可,例如:
郑子铭
2021/01/13
5550
《ASP.NET Core 微服务实战》-- 读书笔记(第9章)
ASP.NET Core 一个接口多个实现的依赖注入与动态选择
ASP.NET Core 自带的依赖注入(DI)非常实用,但是当一个接口有多个实现的时候怎么操作呢?运行时能否根据配置选择其中一种实现呢?能不能不用反射呢?很多小伙伴都有这样的疑问。今天我带大家看看如何在ASP.NET Core里不依赖反射,根据配置文件,在运行时动态选择一个接口的具体实现。
Edi Wang
2019/07/15
4.2K0
ASP.NET Core 一个接口多个实现的依赖注入与动态选择
[ASP.NET Core 3框架揭秘] Options[5]: 依赖注入
《Options模型》介绍了组成Options模型的4个核心对象以及它们之间的交互关系,读者对如何得到Options对象的实现原理可能不太了解,本篇文章主要介绍依赖注入的相关内容。既然我们能够利用IServiceProvider对象提供的IOptions<TOptions>服务、IOptionsSnapshot<TOptions>服务和IOptionsMonitorCache<TOptions>服务来获取对应的Options对象,那么在这之前必然需要注册相应的服务。回顾《配置选项的正确使用方式》演示的几个实例可以发现,Options模式涉及的API其实不是很多,大都集中在相关服务的注册上。Options模型的核心服务实现在IServiceCollection接口的AddOptions扩展方法。
蒋金楠
2020/02/13
1.7K0
[ASP.NET Core 3框架揭秘] Options[5]: 依赖注入
ASP.NET Core必备笔试题(含答案)
1.如何在ASP.NET Core中激活Session功能? 首先要添加 session 包. 其次要在 config service 方法里面添加 session。 然后又在 configure 方法里面调用 usesession。 2.什么是中间件? 中间件在这里是指注入到应用中处理请求和响应的组件。是通过多个委托来嵌套形成的一个俄罗斯套娃! 或 中间件在这里是指注入到应用中处理请求和响应的组件。asp.net core 的中间件模型也是洋葱模型(和 node.js d Koa 一样) 3.A
红目香薰
2022/11/29
1K0
NetCore配置框架详解
这边文章主要是对netcore中的配置框架做一个实战详解,篇幅较长内容涉及比较多,请耐心阅读并进行尝试,均采用控制台程序进行展示。 环境: netcore 3.1.4 win10 vs 2019 16.5.5
xhznl
2020/09/28
8890
.NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记
2.2.3 核心模块--配置 IConfiguration Options ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core
郑子铭
2020/12/16
3910
.NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记
dotNET Core:配置
在dotNET Core中默认情况下没有了之前版本的App.config和Web.Config文件,换成了新的json格式的配置文件。当然,如果想使用之前的方式也是可以的。下面说说在dotNET Core中各种使用配置的方法。
oec2003
2019/07/19
6550
dotNET Core:配置
ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
作为《ASP.NET Core 3框架揭秘》的升级版,《ASP.NET Core 6框架揭秘》提供了很多新的章节,同时对现有的内容进行大量的修改。虽然本书旨在对ASP.NET Core框架的架构设计和实现原理进行剖析,但是其中提供的258个实例演示却可以作为入门材料,这个系列会将这些演示实例单独提取出来并进行汇总。对于想学习ASP.NET Core的同学,如果你觉得没有必要“钻的这么深”,倒是可以看看。本篇提供的20个简单的演示实例基本涵盖了ASP.NET Core 6基本的编程模式,我们不仅会利用它们来演示针对控制台、API、MVC、gRPC应用的构建与编程,还会演示Dapr在.NET 6中的应用。除此之外,这20个实例还涵盖了针对依赖注入、配置选项、日志记录的应用。(本篇提供的实例已经汇总到《ASP.NET Core 6框架揭秘-实例演示版》)
蒋金楠
2022/05/09
1.5K0
ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验
【5min+】更好的选项实践。.Net Core中的IOptions
【五分钟的dotnet】是一个利用您的碎片化时间来学习和丰富.net知识的博文系列。它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net知识等等。
句幽
2020/04/27
9730
相关推荐
ASP.NET Core 选项模式源码学习Options Configure(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档