域环境密码凭证获取
windwos域认证
包括三个方面
本地认证:用户直接操作计算机登录账户
网络认证:远程连接到工作组中的某个设备
域认证:登陆到域环境中的某个设备
域内认证即采用了 Kerberos 协议的认证机制,与前两者相比最大的区别是有一个可信的第三方机构 KDC(主要是域控) 的参与
活动目录
活动目录:Active Diretory,AD,是指域环境中提供目录服务的组件。目录用于存储有关网络对象(例 如用户、组、共享资源计算机、、打印机和联系人等)的信息。能够快速、准确的从目录中找到其所需的信息的服务,为企业提供了网络环境集中式管理的机制。
活动目录主要的功能:
账号集中管理:所有的账户都存储在服务器中,可以方便快捷的执行命令和管理密码等。
软件集中管理:能够统一推送软件,安装网络打印机等服务器
环境集中管理:统一客户端桌面、IE等
增强安全性:统一部署杀软,统一执行病毒扫描任务、集中管理用户的计算机权限,统一指定密码 策略。
更加的可靠更短的宕机时间
Kerberos协议简介
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为 客户机/服务器 应用程序提供强大的 认证服务。
该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。
在以上情况下, Kerberos 作为一 种可信任的第三方认证服务,是通过传统的密码技术(如:共享密 钥)执行认证服务的。
参与域认证的三个角色
访问服务的client
提供服务的server
KDC密钥分发中心
在Kerberos中Client是否有权限访问Server端的服务由KDC发放的票据来决定。
Kerberos认证协议基础
- 票据(Ticket)
是网络对象互相访问的凭证。
AD(Account Database)
存储域中所有用户的用户名和对应的 NTLM Hash,可以理解为域中的SAM数据库,KDC 可以从AD中 提取域中所有用户的 NTLM Hash,这是Kerberos 协议能够成功实现的基础。
这个ad不一样,这个是数据库,存储了所有用户的hash
KDC(Key Distribution Center)
密钥分发中心,负责管理票据、认证票据、分发票据,里面包含两个服务:AS 和 TGS
KDC(Key Distribution Center) = DC(Domain Controller) = AD(Account Database)+ AS(Authenication Service)+ TGS(Ticket Granting Service)
关系的等于,不是数字的等于。这个的意思就是说kdc就是域控
从物理层面看,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 Hash之后作为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 解密Authenticator 1,获取到 {Client ID, Timestamp} 并与通过解密TGT获取到的{Client ID, 有效时间}进行对 比
TGS为Client响应服务授权票据
graph TB
subgraph KDC
AS === TGS
end
subgraph AS_result
AS_ret
if1
TGT
end
subgraph TGS_result
TGS_ret
if2
end
subgraph server_result
ser_ret
end
client ==用户name+password+请求时间+票据有效时间+时间戳by用户的NTML===> AS
AS ==接收到信息===AS_ret(使用用户名字查找NTDS是否存在这个用户)
AS_ret ==不存在用户===> 认证失败
AS_ret ==存在用户===> if1(读出NTML_hash,使用这个hash解密得到时间戳,对比票据有效时间)
if1 ==超过时间===> 认证失败
if1 ==未超过时间===> TGT(生成TGT,TGT包括*login_session_key,用户名,认证时间,过期时间*,使用用户的NTMLhash加密login_session_key)
AS ==TGT_by_bertgt_NTML+加密的login_session_key+others===>client
client==接收到as===使用自己的NTML解密得到login_session_key
client==请求时间+票据有效时间+时间戳by用户的NTML+TGT===>TGS
TGS=====TGS_ret(使用kertgt_hash解密得到存活时间和login_session_key,利用login_session_key解密得到时间戳)
TGS_ret==时间超时,或者不能解出时间戳===>认证失败
TGS_ret==login_session_key能解出时间戳+不超过时间===>if2(生成tiket包含*server_session_key,过期时间,生成时间*,使用server_session_key加密时间戳)
TGS==tiket_bt_server_NTML+server_session_key_by_login_session_key+others==>client
client==接收到TGS==>使用login_session_key得到server_session_key,通过server_session_key加密时间戳
client==tiket+时间戳by_server_session_key==>server
server==同理能获取时间,并且准确==>ser_ret(认证成功,访问服务)
server==不能解出时间,或者时间不正确===>认证失败
活动目录数据库
Active Directory 域服务AD DS 数据存储:
- 由 NTDS.DIT 文件构成,是Active Directory的核心
- 默认存储在域控的 %SystemRoot%\ntds\ 文件夹下
- 只能通过域控制器进程和协议访问
活动目录数据库 NTDS.DIT:NTDS.DIT是主要的AD数据库,包括有关域用户,组和组成员身份的信 息。它还包括域中所有用户的密码哈希值。
这个文件对于内网渗透来说非常非常的重要
在工作组环境中,SAM文件存储着当前主机用户的密码哈希值
在域环境中,NTDS.DIT文件存储了域中所有用户的密码哈希值
如果有这两个文件我们就可以获取到存储的密码的hash值
Windows系统为了进一步保护存储的密码哈希值,使用存储在 SYSTEM 注册表配置单元中的密钥对这些哈希值进行加密。
因此想要破解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)
由于Window会阻止对这些文件的标准读取或复制操作,如果直接去复制NTDS.DIT文件,会提示文件被系统占用,所以常规的复制下载方法是无法获取到文件副本的,因此需要通过特殊方法来获取。
Volume Shadow Copy
Volume Shadow Copy Service 卷影复制服务(VSS)是微软从 Windows XP 开始提供的用于创建 一致性的时间点副本(也就是快照)的服务框架。用于更好的备份和还原关键业务数据。当所有组件 都支持VSS时,可以使用它们来备份应用程序数据,而无需使应用程序脱机。
这个微软提供的服务可以解除NTDS.DIT一直占用的状态,然后将其以生成快照的方式获取到
用于数据备份 支持 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 会额外产生 Event ID 为 98 的日志
Ntdsutil
Ntdsutil.exe 是一个命令行工具,它为 Active Directory 域服务 (AD DS) 和 Active Directory轻型目录服务 (AD LDS) 提供管理工具。您可以使用ntdsutil命令执行 AD DS 的数据库维 护,管理和控制单个主机操作,并删除域控制器留下的元数据,这些域控制器在未正确卸载的情况下 从网络中删除
域环境默认安装,要使用 Ntdsutil.exe,必须从管理员命令提示符运行
如果安装了 AD LDS 服务器角色但未安装 AD DS 服务器角色,则可以使用 dsdbutil.exe 和 dsmgmt.exe 命令行工具来执行可以使用 ntdsutil.exe 执行的相同任务。
创建快照 ,从而获取到NTDS.DIT的备份
使用方法
方法一
使用管理员打开cmd,必须是cmd,powershell无法完成
1 |
|
然后就可以目录访问
方法二
在进入ntdsutil之后
1 |
|
方法三(非交互式)
1 |
|
查询当前系统的快照
1 |
|
创建快照
1 |
|
挂载快照
1 |
|
复制ntds.dit
1 |
|
卸载快照
1 |
|
删除快照
1 |
|
Vssadmin
vssadmin:卷影复制服务管理命令行工具 域环境默认安装
- 查询当前系统的快照
1 |
|
创建快照
1
vssadmin create shadow /for=c:
获得Shadow Copy Volume Name为\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10
访问快照中的文件
查看快照列表:
1 |
|
无法直接访问 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12 中的文件可通过创建符号链接访问快照中的文件:
1 |
|
删除符号链接:
1 |
|
复制ntds.dit
如果不想使用个链接的方式,就可以使用这个方法
1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10\windows\NTDS\ntds.dit c:\ntds3.dit
删除快照
1 |
|
NinjaCopy
使用 PowerShell 复制 NTDS.dit / Registry Hives,绕过 SACL/ DACL / File Locks
https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke- NinjaCopy.ps1
1 |
|
cs内存加载
1 |
|
解密得到hash
在线破解
在线破解,不用将域控上的ntds.dit文件下载下来,直接在已有的shell上破解。
有一个Cobaltstrike弹回的beacon,就可以在beacon中直接利用mimikatz来破解,前提是要有管理员权限
有一个 Meterpreter Shell ,可以在Session会话中加载kiwi模块,直接在目标主机进行密码凭证获取
Mimikatz有一个功能dcsync,它可以利用目录复制服务(Directory Replication Service, DRS)从NTDS.DIT文件中提取密码哈希值。
1 |
|
查看单个用户的详细信息
1 |
|
查看所有用户的详细信息
1 |
|
离线破解
离线破解一般需要两步,首先就是将远端域控的ntds.dit下载到本地,然后再在本地进行破解。 ntds.dit文件一直在被windows系统使用,所以常规的复制下载方法是无法将文件下载到本地的。首先将域控的 NTDS.DIT 和 SYSTEM 文件下载到本地,然后在本地进行破解。
SecretsDump
1 |
|
john 解密hash
需要将hash放入1 文件
1 |
|
NT代表NTML
DSInternals
DSInternals PowerShell模块提供了构建在框架之上的易于使用的cmdlet。主要功能包括离线 ntds.dit文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。
1 |
|
导出hashcat
1 |
|