从0到1认识内网渗透3-Windows本地认证

在了解Windows认证前,有必要了解一下Windows中的加密。

Windows加密

Windows操作系统通常使用两种方法对用户的明文密码进行加密处理,在域环境中用户信息存储在ntds.dit中,加密后为散列值。Windows操作系统中的密码一般由两部分组成,一部分为 LM Hash,另一部分为NTLM Hash,在Windows操作系统中格式一般为

1
username:RID:LM-HASH:NTLM-HASH

LM-Hash

LM-Hash的全名为"LAN Manager Hash"是微软为了提高 Windows操作系统的安全性而采用的散列加密算法,其本质是DES加密(对称加密),尽管LM-Hash较容易被破解,但为了保证系统的兼容性, Windows只是将LM-Hash禁用了(从Windows vista和Windows Server2008版本开始,Windows操作系统默认禁用LM-Hash), LM-Hash明文密码被限定在14位以内,也就是说如果要停止使用LM-Hash,将用户的密码设置为14位以上即可。如果LM-Hash被禁用了,攻击者通过工具抓取的LM-Hash通常为“aad3b435b51404eead3b435b51404ee”(表示LM-Hash为空值或被禁用)

image-20250803034253187

加密步骤(以Admin123举例)

  1. 将明文口令转换为其大写形式(因此可以得出LM-Hash不区分大小写,且不超过14位,但是NTLM-Hash区分大小写)
1
Admin123——>ADMIN123
  1. 将字符串大写后转换为16进制字符串(在线转换:https://tool.hiofd.com/hex-convert-string-online)
1
ADMIN123——>41444D494E313233

image-20250803032016725

  1. 密码不足14字节要求用0补全(1byte=8bit)
1
41444D494E313233——>41444D494E313233000000000000
  1. 将上述编码分成2组7字节
1
2
41444D494E3132
33000000000000
  1. 将每一组7字节的十六进制转换为二进制
1
2
01000001010001000100110101001001010011100011000100110010
00110011000000000000000000000000000000000000000000000000

image-20250803032402079

  1. 每7bit一组末尾加0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
01000000
10100010
00010010
10101000
10010100
01110000
11000100
01100100

00110010
10000000
00000000
00000000
00000000
00000000
00000000
00000000
  1. 二进制转换成十六进制组成得到2组8字节的编码
1
2
40A212A89470C464
3280000000000000
  1. 将两组8字节编码分别作为DES加密的密钥,对魔术字符串“KGS!@#$% ”进行加密(KGS!@#$%的16进制为4B47532140232425)
1
2
AC804745EE68EBEA
1AA818381E4E281B

image-20250803033536035

  1. 加密后的LM-Hash为
1
AC804745EE68EBEA1AA818381E4E281B

NTLM-Hash

NTLM-Hash是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。 NTLM-Hash是基于MD4加密算法(非对称加密)进行加密的。个人版从Windows vista以后,服务器版从Windows Server 2003以后,Windows操作系统的认证方式均为NTLM-Hash。

加密步骤(以Admin123举例)

  1. 将明文口令转换成十六进制的格式(因此区分大小写)
1
Admin123——>41646D696E313233

十六进制转换成Unicode格式(即在每个字节之后添加0x00)

1
446F646F4031333838——>410064006D0069006E00310032003300

对Unicode字符串进行MD4加密,生成32位的十六进制数字串

1
410064006D0069006E00310032003300——>e45a314c664d40a227f9540121d1a29d

image-20250803034216312

本地认证

本地进行信息的验证,无需借助网络(工作组模式就是采用本地认证)

认证流程

开机以后,SYSTEM会自动调用winlogon.exe程序,这个程序给我们提供了一个用户交互界面,也就是我们的登陆界面

image-20250803034446853

Windows Logon Process(winlogon.exe)

用户登录程序,用于管理用户登录、退出、注销、重启

image-20250803034518649

程序路径:%SystemRoot%\System32\winlogon.exe

父进程:由已退出的smss.exe实例创建,通常不显示父进程名称

实例数量:一个或多个

用户账户:本地系统

启动时间:首个实例(会话1)在系统启动数秒内运行。后续实例的启动时间随新会话创建而触发,通常通过远程桌面或快速用户切换登录实现。

描述:Winlogon负责处理交互式用户登录与注销流程。该进程会启动LogonUI.exe,后者通过凭证提供程序获取用户凭据,并将凭证传递给lsass.exe进行验证。用户通过认证后,Winlogon将用户的NTUSER.DAT加载至HKCU注册表配置单元,并通过userinit.exe启动用户外壳程序(通常为explorer.exe)。

用户交互页面输入密码并点击登陆后,系统将用户输入的明文密码先传递给Lsass.exe程序,Lsass程序先会将收到的明文账号密码在本地内存中保留一份作为备用,然后会将我们输入的密码进行NTLM-Hash加密,然后Lsass程序会去读取系统中的SAM文件中已经存在的NTLM-Hash的值,进行对比。

  • 对比相同则认证成功,将user SID \ Group SID 发送给winlogon.exe程序,然后生成会话,进入桌面(因此抓Lsass.exe程序相当于抓明文密码)
  • 对比不同则认证失败,系统返回错误提示

image-20250803040353623

本地认证流程图

Lsass.exe

用于微软系统的安全机制(负责管理本地安全策略和身份认证机制),在新Windows系统或打补丁的旧Windows系统的Lsass.exe不在会将明文密码存储在内存中

image-20250803035022848

程序路径:%SystemRoot%\System32\lsass.exe

父进程:wininit.exe

实例数量:单个

用户账户:本地系统

启动时间:开机后数秒内

描述:本地安全认证子系统服务进程负责通过调用注册表项HKLM\SYSTEM\CurrentControlSet\Control\Lsa中指定的认证包来验证用户身份。通常情况下,域账户会使用Kerberos协议,本地账户则采用MSV1_0协议。除用户认证外,lsass.exe还负责实施本地安全策略(如密码策略和审计策略)以及向安全事件日志写入事件记录。该进程应始终保持单实例运行,且极少产生子进程(加密文件系统EFS是已知例外情况)。

SAM文件

C:\Windows\System32\config\下用于存储本地所有用户的凭证信息(Windows的用户账户数据库,所有用户的登录名及口令等相关信息都会加密保存在SAM中,如果是域环境则保存在域控的ntds.dit 中)

image-20250803035157359

数据存储格式

1
用户名称:RID:LM-HASH值:NTLM-HASH值

日常常见的PE启动盘改密码原理实际上就是修改SAM文件内容达到登录系统效果。

SYSTEM文件

C:\Windows\System32\config\下用于系统的注册表配置文件,如果损坏则无法进入系统

image-20250803035311740

SYSTEM注册表配置单元中的密钥可以对SAM和ntds.dit内用户的哈希值进行加密

Ntds.dit文件

C:\Windows\NTDS\下用于域环境中活动目录数据库,包括有关域用户、组和组成员身份的信息,它还包括域中所有用户的密码哈希值

image-20250803035336146

该文件只存在于域控上

认证缺陷

  1. 既然Windows通过Hash值对比登录是否成功,攻击者可以直接跳过lsass.exe程序的加密明文对比过程,直接利用Hash进行认证
  2. 旧版本系统默认可以通过抓取内存获取lsass.exe程序储存的明文账号密码
  3. 通过破解SAM文件获取账号密码(PE启动盘改密码原理)

本地认证token窃取和利用

用户登录完后,会留下token(系统的临时密钥相当于账号密码),主要分为access token(登录token)、session token(会话token)、security token(密保token),这里主要针对access Token的窃取和利用

窃取token

将Access Token进行列举

1
incognito.exe list_tokens -u

image-20250803035823890

普通用户列举tokens

image-20250803035857016

管理员用户列举tokens

可以得出需要administrator管理员权限获取tokens,当我们如果只是一个webshell或者user组权限时,是需要先进行提权操作

利用token

复制token名来进行模拟其他用户

1
incognito.exe execute -c "完整的token名" cmd.exe

image-20250803040044082

通过exit命令,退回到当前权限

声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。