0x00 介绍
在Active Directory中,存储的数据包含有数据库文件和管理用户,服务和应用程序的目录信息的数据库文件和进程。 数据存储的副本在林中的每个域控制器上运行。 在我们搭建完一个域环境过后,我们知道域用户的密码 C:WindowsNTDSntds.dit 中,本文就重点介绍在AD域中Windows 是如何存储数据,数据存储的协议及ESE存储方式,还会介绍几种提取域用户密码的方法。
0x01 数据存储结构
Active Directory数据存储由若干组件组成,这些组件一起为目录客户端和其他目录服务器提供目录服务。 这些组件包括三个服务组件,四个接口和实际存储数据的目录数据库。
下图说明了数据存储的体系结构。
- 4个接口:
Lightweight Directory Access Protocol (LDAP), replication (REPL) and domain controller management interface, Messaging API (MAPI), Security Accounts Manager (SAM))
主要是提供给客户端与服务器端的交流。 -
Directory System Agent (DSA) (Ntdsa.dll)
DSA在每个域控制器上作为Ntdsa.dll运行,提供客户端和其他服务器通过其访问目录数据库的接口。 -
Database layer
数据库层是在ntdsa.dll中的,并提供应用程序和目录数据库之间的接口,以保护数据库不与应用程序的直接交互。由于目录数据库是扁平的,没有分层命名空间,因此数据库层为数据库提供了对象层次结构的抽象。 -
Extensible Storage Engine (ESE) (Esent.dll)
ESE作为Esent.dll运行,管理组成目录数据库的记录表 – 每个记录包含一个或多个列。 -
Database files
数据存储将目录信息存储在名为Ntds.dit的单个数据库文件中。 此外,数据存储还使用日志文件,临时写入未提交的事务。
0x02 数据存储协议
Active Directory数据存储使用的主要协议是轻量级目录访问协议(LDAP),它在TCP / IP之上运行。 此外,数据存储使用remote procedure call(RPC)进行MAPI,复制,域控制器管理和SAM相关操作。 虽然它没有被广泛使用,但数据存储还支持使用简单邮件传输协议(SMTP)在域控制器之间进行复制。
-
LDAP
可以通过TCP/IP,也可以通过UDP的方式。通过默认的389端口,去创建,查询,更新,删除存储在AD中的信息。AD支持 LDAP v2 (RFC 1777) and LDAP v3 (RFC 2251)。 -
RPC
数据存储使用RPC进行复制(REPL)和域控制器管理通信,MAPI通信和SAM相关通信。 RPC是一种功能强大,高效且安全的进程间通信(IPC)机制,可以实现数据交换和驻留在不同进程中的功能调用。 该不同的进程可以在同一台计算机上,局域网(LAN)上,也可以在Internet上。 -
SMTP
数据存储可以使用Internet标准SMTP作为复制通信的协议。 SMTP用于根据Request for Comments(RFC)821和RFC 822中的规范传输和传递消息.SMTP还包括基于协议的基本传递功能构建的增强功能。 有一些SMTP选项可用于控制消息的路由和传递,并提供安全通信。(smtp的复制)
0x03 ESE
The Extensible Storage Engine (ESE) 是Active Directory以及其他几个Windows组件使用的Windows组件,作为存储在索引和顺序访问方法(ISAM)数据库中的数据的接口。 (Active Directory数据库是ISAM数据库。)
有很多应用都是使用JET APIs 去访问ESE 的数据库。
-
esentutl
这是windows AD服务器内置的工具,去校验ESE数据库。 -
eseutil
这是Exchange 中的带有的工具,跟上一个工具一样的使用。,随便在附上一个Exchange 安装的教程。 -
ntdsutil
管理AD 或者ADLDS的工具,默认安装。
1.ESE 逻辑结构
使用的工具在这里下载,这个网站还有很多查看系统各种东西的工具。。
从图中可以看出来很多表,在所有ESE数据库都有一个名为MSysObjects和MSysObjectsShadow的表,它是MSysObjects的备份。
- 所有表及其表名以及它们关联的B +树在数据库中的起始位置以及其他各种元数据。
- 每个表的所有列及其名称,存储在其中的数据类型以及各种模式约束。
- 表上的所有索引及其名称,以及它们关联的B +树在数据库中的起始位置。
2.ESE 物理结构
一个ESE 数据库也是存储在硬盘当中的。每个数据库中的header 都有page的大小,AD 通常都是8k。
第一页H就是header,SH是header的复制,页面编号1是其中的第三页。
esentutl /mh 可以查看page大小,cbDbPage 就是page的大小, AD 和ADLDS 的page大小都是8K。其他的ESE数据库的大小不一样。
关于其中的B+树。
0X04 导出域用户密码
1. vss 提取不想写了,网上GOOGLE吧。
2. NTDSUtil获取ntds.dit文件ntdsutil "ac i ntds" "ifm" "create full c:temp" q q
3.powershell 方式
用这个脚本:https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-NinjaCopy.ps1
4.Mimikatz的DCSync
要想批量导出所有用户,先把用户名导出到TXT中,在for /f "tokens=1" %i in (username.txt) do @mimikatz.exe "lsadump::dcsync /user:%i /domain:localtest.com" exit >> info.txt
这样就导出所有用户的HASH了。从下面防御规则可以看出,是调用了我们所说的四种接口中的replication (REPL) and domain controller management interface
。
防御规则:
5.Impacket
我觉得这个是最好的工具,支持本地ntds.dit的解析,及获取历史记录等,最常用就是这个了。
impacket 只有python 版的,而且在windows 下支持不好,所以可以直接编译一个windows 下的impacket,参考这里。
0x05 总结
本文就是粗略介绍了在AD中数据的存储方式,ESE 具有高效,安全的特性,所以在Windows 中很多应用都有用到。对于其中LDAP,RPC这些比较重要的协议,也没有详细解析了。
审核人:yiwang 编辑:边边