从0到1认识内网渗透3-Windows本地认证
从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为空值或被禁用)
加密步骤(以Admin123举例)
- 将明文口令转换为其大写形式(因此可以得出LM-Hash不区分大小写,且不超过14位,但是NTLM-Hash区分大小写)
1 | Admin123——>ADMIN123 |
- 将字符串大写后转换为16进制字符串(在线转换:https://tool.hiofd.com/hex-convert-string-online)
1 | ADMIN123——>41444D494E313233 |
- 密码不足14字节要求用0补全(1byte=8bit)
1 | 41444D494E313233——>41444D494E313233000000000000 |
- 将上述编码分成2组7字节
1 | 41444D494E3132 |
- 将每一组7字节的十六进制转换为二进制
1 | 01000001010001000100110101001001010011100011000100110010 |
- 每7bit一组末尾加0
1 | 01000000 |
- 二进制转换成十六进制组成得到2组8字节的编码
1 | 40A212A89470C464 |
- 将两组8字节编码分别作为DES加密的密钥,对魔术字符串“KGS!@#$% ”进行加密(KGS!@#$%的16进制为4B47532140232425)
1 | AC804745EE68EBEA |
- 加密后的LM-Hash为
1 | AC804745EE68EBEA1AA818381E4E281B |
NTLM-Hash
NTLM-Hash是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。 NTLM-Hash是基于MD4加密算法(非对称加密)进行加密的。个人版从Windows vista以后,服务器版从Windows Server 2003以后,Windows操作系统的认证方式均为NTLM-Hash。
加密步骤(以Admin123举例)
- 将明文口令转换成十六进制的格式(因此区分大小写)
1 | Admin123——>41646D696E313233 |
十六进制转换成Unicode格式(即在每个字节之后添加0x00)
1 | 446F646F4031333838——>410064006D0069006E00310032003300 |
对Unicode字符串进行MD4加密,生成32位的十六进制数字串
1 | 410064006D0069006E00310032003300——>e45a314c664d40a227f9540121d1a29d |
本地认证
本地进行信息的验证,无需借助网络(工作组模式就是采用本地认证)
认证流程
开机以后,SYSTEM会自动调用winlogon.exe程序,这个程序给我们提供了一个用户交互界面,也就是我们的登陆界面
Windows Logon Process(winlogon.exe)
用户登录程序,用于管理用户登录、退出、注销、重启
程序路径:%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程序相当于抓明文密码)
- 对比不同则认证失败,系统返回错误提示
Lsass.exe
用于微软系统的安全机制(负责管理本地安全策略和身份认证机制),在新Windows系统或打补丁的旧Windows系统的Lsass.exe不在会将明文密码存储在内存中
程序路径:%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 中)
数据存储格式
1 | 用户名称:RID:LM-HASH值:NTLM-HASH值 |
日常常见的PE启动盘改密码原理实际上就是修改SAM文件内容达到登录系统效果。
SYSTEM文件
C:\Windows\System32\config\下用于系统的注册表配置文件,如果损坏则无法进入系统
SYSTEM注册表配置单元中的密钥可以对SAM和ntds.dit内用户的哈希值进行加密
Ntds.dit文件
C:\Windows\NTDS\下用于域环境中活动目录数据库,包括有关域用户、组和组成员身份的信息,它还包括域中所有用户的密码哈希值
该文件只存在于域控上
认证缺陷
- 既然Windows通过Hash值对比登录是否成功,攻击者可以直接跳过lsass.exe程序的加密明文对比过程,直接利用Hash进行认证
- 旧版本系统默认可以通过抓取内存获取lsass.exe程序储存的明文账号密码
- 通过破解SAM文件获取账号密码(PE启动盘改密码原理)
本地认证token窃取和利用
用户登录完后,会留下token(系统的临时密钥相当于账号密码),主要分为access token(登录token)、session token(会话token)、security token(密保token),这里主要针对access Token的窃取和利用
窃取token
将Access Token进行列举
1 | incognito.exe list_tokens -u |
可以得出需要administrator管理员权限获取tokens,当我们如果只是一个webshell或者user组权限时,是需要先进行提权操作
利用token
复制token名来进行模拟其他用户
1 | incognito.exe execute -c "完整的token名" cmd.exe |
通过exit命令,退回到当前权限
声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。