SAM、SECURITY、SYSTEM 和 NTDS.dit 的详细区别
引言
在网络安全领域,凭证提取(Credential Dumping)是一种常见的攻击技术。它允许攻击者从目标系统中获取用户凭证的哈希值或明文,从而实现横向移动、权限提升或持久化。Impacket 是一个开源的 Python 库集合,专为处理网络协议而设计,其中 secretsdump.py 工具是其核心组件之一。该工具可以从 Windows 系统或 Active Directory 环境中提取敏感凭证,而不需在目标机上执行任何代理程序。
secretsdump.py 常用到的文件包括 SAM、SECURITY、SYSTEM 这三个 Windows 注册表 hive(蜂巢),以及 NTDS.dit 这个 Active Directory 数据库文件。这些文件存储了本地或域级别的用户凭证、密码哈希、安全策略等关键信息。通过这些文件,攻击者可以离线解析并破解凭证,实现进一步的攻击。例如,在域环境中,提取 NTDS.dit 可以获取所有域用户的 NTLM 哈希,从而进行密码喷洒(Credential Spraying)或过哈希攻击(Pass-the-Hash)。
理解这些文件的区别至关重要,因为它们适用于不同的场景:SAM、SECURITY 和 SYSTEM 主要针对本地系统,而 NTDS.dit 专属于域控制器(Domain Controller, DC)。在本地机器上,secretsdump 可以直接从注册表 hive 中提取 SAM 秘密和 LSA(Local Security Authority)秘密;在域环境中,则需结合 NTDS.dit 来提取域级凭证。这些区别不仅影响提取方法,还涉及安全风险和防御策略。
Windows 凭证存储概述
Windows 操作系统的凭证存储机制源于其注册表和 Active Directory 架构。注册表是一个分层数据库,用于存储系统配置、用户设置和应用程序数据。其中,hive 是注册表的逻辑分组,每个 hive 对应一组键、子键和值,并由支持文件备份。这些文件位于 %SystemRoot%\System32\config 目录下,包括日志文件(.log)和备份文件(.sav)。
在凭证方面,Windows 使用哈希算法(如 NTLM 或 LM)存储密码,以避免明文暴露。本地凭证主要存储在 SAM 和 SECURITY hive 中,而系统配置(如解密密钥)则在 SYSTEM hive 中。Active Directory(AD)引入了 NTDS.dit,这是一个使用 Extensible Storage Engine(ESE)格式的数据库,专为域环境设计,用于管理大规模用户和资源。
凭证提取攻击利用这些存储机制。Impacket secretsdump 通过远程或本地方式访问这些文件,提取哈希值。例如,对于本地系统,它需要 SAM、SECURITY 和 SYSTEM 来解密凭证;对于域,它结合 NTDS.dit 和 SYSTEM 来解析域用户数据。这种机制源于 Windows NT 的设计,旨在平衡安全性和可用性,但也成为攻击者的目标。根据 MITRE ATT&CK 框架,这属于 T1003 技术(OS Credential Dumping)。
理解这些文件有助于识别攻击向量,如通过 Volume Shadow Copy(VSS)复制文件,或使用 DCSync 模拟域复制提取数据。接下来,我们逐一剖析每个文件。
SAM 文件
SAM(Security Account Manager,安全账户管理器)是 Windows 系统的一个核心组件,负责管理本地用户账户和组的凭证。它是一个注册表 hive,存储在 %SystemRoot%\System32\config\SAM 文件中,支持文件包括 SAM.log(事务日志)和 SAM.sav(备份)。在运行时,SAM hive 被加载到 HKEY_LOCAL_MACHINE\SAM 键下,但由于系统锁定,无法直接复制,需要特殊工具如 Volume Shadow Copy 或 Impacket 来访问。
SAM 的结构基于注册表键值对。根键下有子键如 Domains\Account\Users,存储用户 SID(Security Identifier)、用户名、密码哈希(NTLM 或 LM)和账户属性(如最后登录时间、密码过期策略)。密码以加密形式存储,使用 SYSKEY(系统密钥)保护,该密钥派生自 SYSTEM hive。早期 Windows 使用 LM 哈希(基于 DES 算法,易破解),现代版本偏向 NTLM(基于 MD4,更安全但仍可离线破解)。
在内容上,SAM 主要存储本地账户凭证。在非域机器上,它包含所有本地用户(如 Administrator)的哈希;在域控制器上,仅存储本地账户,如 DSRM(Directory Services Restore Mode)管理员账户和 Guest。该账户用于 AD 恢复模式,密码独立于域策略。SAM 还可能缓存域用户凭证(MSCache 哈希),但仅限于最近登录的 10 个用户,且这些哈希不易用于 Pass-the-Hash 攻击。
secretsdump工具使用 SAM 来提取本地 NTLM 哈希。例如,命令 secretsdump.py -sam sam.save -system system.save LOCAL
可以离线解析 SAM 文件,输出格式如 Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
。这允许攻击者破解弱密码或重用凭证。相比其他文件,SAM 的范围有限,仅适用于本地攻击,但它是初次入侵后的常见目标。
历史背景:SAM 源于 Windows NT 3.1,旨在取代早期的工作组模型。随着 AD 的引入,其作用从中心化转向本地化,但仍为凭证 dumping 的基础。根据安全研究(如 Praetorian 博客),SAM 漏洞常被用于权限提升,如通过 RID Hijacking 修改用户 SID。
SECURITY 文件
SECURITY hive 是 Windows 注册表的另一个关键部分,负责存储本地安全策略和 LSA(Local Security Authority)秘密。它位于 %SystemRoot%\System32\config\SECURITY,支持文件为 SECURITY.log 和 SECURITY.sav。在注册表中,它对应 HKEY_LOCAL_MACHINE\SECURITY 键,默认对非管理员隐藏,需要系统权限查看。
结构上,SECURITY 包含子键如 Policy\PolAcDmS(账户域策略)和 Policy\Secrets(LSA 秘密存储)。LSA 是 Windows 安全子系统的核心,处理认证、授权和审计。SECURITY hive 存储加密的 LSA 秘密,包括服务账户密码、远程桌面凭证和安全问题答案(JSON 格式,UTF-16-LE 编码)。
内容方面,SECURITY 专注于域缓存凭证(DCC)和 Kerberos 密钥。它存储明文密码、LM/NT 哈希、DES/AES Kerberos 密钥,以及 DCC1/DCC2 哈希(用于离线登录)。在域环境中,它缓存域用户凭证,以支持无域控制器时的认证。此外,还包括用户权限、审计策略和组策略对象(GPO)链接。与 SAM 不同,SECURITY 的数据更多样化,包括非哈希形式,如明文服务密码(L$ 服务前缀)。
secretsdump 工具提取 LSA 秘密需结合 SECURITY 和 SYSTEM。例如,secretsdump.py -security security.save -system system.save LOCAL
输出 LSA 内容,如 DPAPI 系统密钥或缓存凭证。这对攻击者价值高,因为 LSA 秘密可用于 DCSync 或 Silver Ticket 攻击。远程命令如 secretsdump.py DOMAIN/USER:PASSWORD@TARGET
会自动处理 SECURITY。
区别于其他文件:SECURITY 更侧重策略和缓存,而非纯本地账户。安全研究(如 The Hacker Recipes)指出,提取 SECURITY 可揭示域备份操作员的秘密,用于权限提升。历史上,SECURITY 漏洞如 MS08-068 允许蠕虫传播,强调其防护必要性。
SYSTEM 文件
SYSTEM hive 是 Windows 注册表的系统配置核心,不直接存储凭证,但提供解密其他 hive 的必要信息。它位于 %SystemRoot%\System32\config\SYSTEM,支持文件包括 SYSTEM.log、SYSTEM.sav 和 SYSTEM.alt(备用副本,用于崩溃恢复)。在注册表中,对应 HKEY_LOCAL_MACHINE\SYSTEM 键,包含子键如 CurrentControlSet(当前配置)和 ControlSet001/002(备份集)。
结构复杂,包含数千子键,覆盖硬件枚举、驱动加载、服务启动和引导配置。关键部分是 LSA 子键,存储 SYSKEY(引导密钥),用于加密 SAM 和 SECURITY 中的数据。SYSKEY 通过 RC4 或 AES 算法保护,早期版本可导出到软盘,现代版本集成到 SYSTEM 中。
内容上,SYSTEM 包括设备驱动列表、文件系统配置、网络设置和安全相关密钥,如 BootKey(派生自系统组件,用于解密哈希)。它不存储用户数据,但缺少 SYSTEM 就无法解析其他 hive 的加密凭证。此外,还包含挂载点、卷影拷贝信息和事件日志配置。
SYSTEM 是 secretsdump 的必备文件,用于解密。所有本地 dumping 命令都需要它,如 secretsdump.py -sam sam.save -security security.save -system system.save LOCAL
。远程时,工具会自动从目标导出 SYSTEM。SYSTEM 的提取常通过 reg save 命令,如 reg save HKLM\SYSTEM system.save
。
区别于其他文件:SYSTEM 是“辅助”文件,无独立凭证,但不可或缺。Microsoft 文档强调,SYSTEM 修改可能导致系统崩溃,故需备份。攻击者常通过 VSS 复制 SYSTEM 来辅助 NTDS.dit dumping。
NTDS.dit 文件
NTDS.dit(NT Directory Services Directory Information Tree)是 Active Directory 的核心数据库文件,专属于域控制器,位于 %SystemRoot%\NTDS\ntds.dit。它使用 ESE(Extensible Storage Engine)格式,支持并发访问和事务日志(edb.log、edb.chk)。文件大小从数百 MB 到数 GB 不等,每个用户对象约占 100-150 KB,加上 20% 扩展空间。
结构上,NTDS.dit 是一个表格化数据库,主要表包括 datatable(对象数据)、link_table(链接,如组成员)和 sd_table(安全描述符)。它包含索引以加速查询,支持 LDAP 协议访问。数据组织为树状,根为域分区,子分区包括配置、架构和域特定对象。
其内容丰富,包括所有域对象:用户账户、计算机、组、OU(组织单元)、信任域和 GPO。它存储 NTLM 哈希、Kerberos 密钥、LAPS 密码、krbtgt 哈希、用户属性(如最后登录、密码历史)和复制元数据。不同于注册表 hive,NTDS.dit 是动态数据库,支持多 DC 同步,通过 USN(Update Sequence Number)跟踪变更。
secretsdump 工具用于域级 dumping 时,需要 NTDS.dit 和 SYSTEM。例如,离线命令 secretsdump.py -ntds ntds.dit.save -system system.save LOCAL
提取所有域哈希。远程时,使用 -use-vss
选项通过 VSS 复制文件,或 DCSync 模拟复制。输出包括哈希历史,便于破解。
提取方法多样:NTDSUtil 创建快照、VSSAdmin 卷影拷贝、Invoke-NinjaCopy 解析 NTFS,或 gosecretsdump(Go 版本,更快)。安全方面,NTDS.dit 受 NTFS 权限、系统监控和加密保护,但易遭提取攻击,如通过 Backup Operator 权限。Cayosoft 等工具提供监控。
历史背景:源于 Windows 2000 的 AD 引入,取代了 SAM 的中心化作用。
这些文件之间的详细区别
SAM、SECURITY、SYSTEM 和 NTDS.dit 在位置、内容、结构和应用上存在显著区别。以下通过表格和解释进行比较:
方面 | SAM | SECURITY | SYSTEM | NTDS.dit |
---|---|---|---|---|
类型 | 注册表 hive | 注册表 hive | 注册表 hive | ESE 数据库 |
位置 | %SystemRoot%\System32\config\SAM | %SystemRoot%\System32\config\SECURITY | %SystemRoot%\System32\config\SYSTEM | %SystemRoot%\NTDS\ntds.dit |
适用范围 | 本地机器(工作站或 DC 的本地账户) | 本地安全策略和域缓存 | 系统配置(全系统) | 域控制器(整个域) |
内容 | 本地用户 NTLM/LM 哈希、SID、账户属性 | LSA 秘密:明文密码、Kerberos 密钥、DCC 哈希、安全问题 | SYSKEY、BootKey、驱动配置、无直接凭证 | 域用户/组/计算机哈希、属性、复制数据、krbtgt |
结构 | 键值对,子键如 Users | 键值对,子键如 Policy/Secrets | 键值对,子键如 CurrentControlSet | 表格(如 datatable)、索引、链接表 |
加密依赖 | 需要 SYSTEM 解密 | 需要 SYSTEM 解密 | 提供解密密钥 | 需要 SYSTEM 解密哈希 |
大小 | 小(几 MB) | 小(几 MB) | 中等(几十 MB) | 大(数百 MB 到 GB) |
提取难度 | 易,通过 reg save 或 VSS | 类似 SAM | 易,但必需结合他人 | 高,需 VSS 或 NTDSUtil,系统锁定 |
在 secretsdump 中的作用 | 提取本地哈希 | 提取 LSA 和缓存凭证 | 解密辅助 | 提取域哈希和历史 |
攻击价值 | 低(仅本地) | 中(缓存和明文) | 辅助(无独立价值) | 高(整个域控制) |
详细解释:SAM 和 SECURITY 都是本地导向的 hive,焦点在凭证存储,但 SAM 纯本地账户,SECURITY 扩展到域缓存和策略。SYSTEM 是桥梁,无凭证但不可缺。NTDS.dit 则完全不同,是域级数据库,包含 SAM 等无法覆盖的全局信息。在 DC 上,SAM 只存 DSRM 账户,而 NTDS.dit 存所有域用户,故后者是“圣杯”。提取时,本地 hive 可直接 reg backup;NTDS.dit 需绕过锁定,如 VSS。安全上,本地 hive 易遭物理攻击,NTDS.dit 需域权限。根据 Medium 文章,SAM dumping 限单机,NTDS.dit 可扩展到混合云环境。
在 Impacket Secretsdump 中的使用
Impacket secretsdump.py 是多功能工具,支持本地和远程 dumping。对于本地 hive,使用 secretsdump.py -sam sam.save -security security.save -system system.save LOCAL
提取 SAM 和 LSA 秘密,输出哈希和明文。远程时,secretsdump.py DOMAIN/USER:PASSWORD@TARGET
自动处理所有 hive,支持 PTH(如 -hashes LM:NT
)或 PTK(-k
)。
对于 NTDS.dit,远程使用 -use-vss
和 -exec-method smbexec
创建影拷贝并提取:secretsdump.py -use-vss DOMAIN/USER@DC
。离线:secretsdump.py -ntds ntds.save -system system.save LOCAL -history
包括密码历史。gosecretsdump 是更快替代品。
这些使用突显区别:hive 针对本地,NTDS.dit 针对域。示例输出:SAM 仅本地 RID 500;NTDS.dit 列所有域用户。
小结
SAM、SECURITY、SYSTEM 和 NTDS.dit 是 Windows 凭证生态的核心,区别在于范围(本地 vs 域)和结构(hive vs 数据库)。在 Impacket secretsdump 中,它们协同提取凭证。