前言
笔者最近打算系统的学习以下内网渗透以及域渗透的一些知识,一方面对之前学习过的知识进行梳理,另一方面则对未曾进行深入了解的知识进行学习,本系列大概率会首先对计算机域内的一些基础概念,知识进行总结,然后对内网渗透、域渗透技术进行总结,若有侵权请联系删除。
LDAP与AD简介
LDAP 全程为Lightweight Directory Access Protocol,轻量目录访问协议。顾名思义,LDAP这个协议是设计出来访问目录这个东西的。不过这种说法并不准确,应当说是设计出来访问目录数据库的。
在计算机域中,目录服务数据库存储着整个域内所有的计算机,用户等的所有信息。 目录服务由 目录服务数据库 + 访问协议组成。
目录服务数据库本质上就是一个数据库,用来存储数据的,只不过组织数据的方式与普通关系型数据库(如MySQL、Oracle数据库)不同,主要有以下两个特点
- 它成树状结构组织数据,类似文件目录一样。
- 它是为查询、浏览和搜索而优化的数据库,也就是说LDAP的读性能特别强,但是写性能差,而且还不支持事务处理、回滚等复杂功能。
为了能够访问目录数据库,必须存在一种能够访问目录服务数据库的协议,LDAP是其中一种实现协议。
如上图所示是目录服务数据库,它成树状结构组织数据。下面介绍一些基本概念
- 目录树:如上图所示,在一个目录服务系统中,整个目录信息集可以表示为一个目录信息树,树中的每个节点是一个条目。
- 条目:每个条目就是一条记录,每个条目有自己的唯一可区别的名称(DN)。比如图中的每个圆圈都是一条记录。
- DN,RDN:比如说第一个叶子条目,他有一个唯一可区分的名称DN:uid=bob,ou=people,dc=acme,dc=org。类似于文件目录的相对路径绝对路径,他除了有个DN之外,还有个RDN,他与目录结构无关,比如之前咱们提过的uid=bob,ou=people,dc=acme,dc=org,他的RDN就是uid=bob
- 属性:描述条目具体信息。比如`uid=bill,ou=people,dc=acme,dc=org,他有属性name 为bill,属性age为11,属性school 为xx。
下图为各个厂商对目录服务数据库实现的产品
可以看出 AD即Active Directory 是微软对目录服务数据库的实现方式,而LDAP 则是为访问Active Directory 而设计的访问协议。
想要链接 Active Directory有两种方法
- 每台与控制都有一份完整的Active Directory ,可以链接域控的389和636端口,636为LDAPS来进行修改查询。
- 若不知道对象处于哪一个域,也知道对象名称,微软提出全局编录服务器(GC,Global Catalog), 全局编录服务器中除了保存本域中所有对象的所有属性外,还保存林中其它域所有对象的部分属性,这样就允许用户通过全局编录信息搜索林中所有域中对象的信息。也就是说如果需要在整个林中进行搜索,而不单单是在具体的某个域进行搜索的时候,可以连接域控的3268/3269端口。
Naming Context 与 Application Partitions
一个林中有若干个域,每个域内有若干台域控,每台域控有一个独立的Active Directory。这个时候就有必要将数据隔离到多个分区中,如果不隔离的话,则每个域控制器都必须复制林中的所有数据。若隔离为若干个分区之后,就可以有选择性的复制某几个分区。微软将Active Directory划分为若干个分区(这个分区我们称为Naming Context,简称NC),每个Naming Context都有其自己的安全边界。
微软自定义了的三个预定义的 Naming Context
- Configuration NC(Configuration NC)
- Schema NC(Schema NC)
- Domain NC(DomainName NC)
Configuration NC内存储的主要是配置信息,关站点,服务,分区和Active DirectorySchema 的信息,处于根域之下,并复制到林中的每个域控中。
Schema NC 存储的Active Directory中存储的对象的定义,个人感觉类似Mysql中的元数据库的概念,包含Schema 信息,定义了Active Directory中使用的类和属性。
Domain NC 每个域都有一个域Naming Context,不同的域内有不同的域Naming Context,其中包含特定于域的数据。之前我们说过,域内的所有计算机,所有用户的具体信息都存在Active Directory底下。
搜索Active Directory
通过查询目录,可以直接收集到要求的数据。查询目录需要指定两个要素
- BaseDN
- 过滤规则
BaseDN
比如指定BaseDN为DC=test.DC=local就是以DC=test.DC=local为根往下搜索
过滤规则
LDAP 搜索过滤器语法有以下子集:
- 用与号 (&) 表示的 AND 运算符。
- 用竖线 (|) 表示的 OR 运算符。
- 用感叹号 (!) 表示的 NOT 运算符。
- 用名称和值表达式的等号 (=) 表示的相等比较。
- 用名称和值表达式中值的开头或结尾处的星号 (*) 表示的通配符。
下面举几个例子
- (uid=testuser)
匹配 uid 属性为testuser的所有对象 - (uid=test*)
匹配 uid 属性以test开头的所有对象 - (!(uid=test*))
匹配 uid 属性不以test开头的所有对象 - (&(department=1234)(city=Paris))
匹配 department 属性为1234且city属性为Paris的所有对象 - (|(department=1234)(department=56*))
匹配 department 属性的值刚好为1234或者以56开头的所有对象。
一个需要注意的点就是运算符是放在前面的,跟我们之前常规思维的放在中间不一样
访问AD的工具
- ADSI 编辑器 微软自带,输入adsiedit.msc可访问
- ADExplorer ,https://docs.microsoft.com/en-us/sysinternals/downloads/adexplorer
参考
https://daiker.gitbook.io/windows-protocol/ldap-pian/8