1.LDAP简介
LDAP全称是Lightweight Directory Access Protocol,轻量目录访问协议。顾名思义,LDAP是设计用来访问目录数据库的一个协议。协议就是标准,并且是抽象的。在这套标准下,AD(Active Directory)是微软的对目录服务数据库的实现。目录服务数据库也是一种数据库,这种数据库相对于我们熟知的关系型数据库(比如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。
2.Active Directory简介
上面讲过AD(Active Directory)是微软的对目录服务数据库的实现,Active Directory存储着整个域内所有的计算机,用户等的所有信息。换言之,在渗透测试中,通过Active Directory对域环境进行信息收集,是一种十分全面也有效的手段之一。那么,我们如何访问域内的Active Directory呢?
- 通过连接域控的389/636端口(636端口是LDAPS)来进行连接查看修改。
- 如果需要在整个林中进行搜索,而不单单是在具体的某个域进行搜索的时候,可以连接域控的3268/3269端口。
3.Active Directory详解
接下来我们来具体的探究下Active Directory具体有啥东西。
3.1.Naming Context
Active Directory具有分布式特性,一个林中有若干个域,每个域内有若干台域控,每台域控有一个独立的Active Directory。微软将Active Directory划分为若干个分区(这个分区我们称为Naming Context,简称NC),每个Naming Context都有其自己的安全边界。
Active Directory预定义了三个Naming Context
- Configuration NC(Configuration NC)
- Schema NC(Schema NC)
- Domain NC(DomainName NC)
使用ADExplorer连接进来就可以看到这三个:
3.1.1.Configuration NC
配置NC,林配置信息的主要存储库,包含有关站点,服务,分区和Active DirectorySchema 的信息,并被复制到林中的每个域控制器。
Naming Context的顶级容器有:
RDN | 说明 |
---|---|
CN=DisplaySpecifiers | 定义了Active Directory管理单元的各种显示格式 |
CN=Extended-Rights | 扩展权限对象的容器 |
CN=ForestUpdates | 包含用于表示森林状态和与域功能级别更改的对象 |
CN=Partitions | 包含每个Naming Context,Application Partitions以及外部LDAP目录引用的对象 |
CN=Physical Locations | 包含位置对象,可以将其与其他对象关联 以表示该对象的位置 |
CN=Services | 存储有关服务的配置信息,比如文件复制服务 |
CN=Sites | 包含所有站点拓扑和复制对象 |
CN=WellKnown Security Principals | 包含常用的外部安全性主题的对象,比如Anonymous,Authenticated Users,Everyone等等 |
3.1.2.Schema NC (Schema NC)
Schema NC 包含表示 Active Directory 支持的类和属性的对象。schema是在林范围内定义的,因此Schema NC被复制到林中的每个域控制器。Schema NC 的根可以在 Schema 容器中找到,尽管 Schema container看起来是 Configuration container的子容器,但实际上它本身就是单个容器。(Although the Schema container appears to be a child of the Configuration container, it is actually a separate naming context in its own right. )
3.1.3.Domain NC (DomainName NC)
之前我们说过,域内的所有计算机,所有用户的具体信息都存在Active Directory底下,具体来说,就是在Active Directory的这个Naming Context里面。我们用工具查看的默认Naming Context选的也是这个Naming Context。后面对域内很多东西的查看都在这个Naming Context里面进行。
RDN | 说明 |
---|---|
CN=Builtin | 内置本地安全组的容器,包括管理员,域用户和账号操作员等等 |
CN=Computers | 机器用户的容器,包括加入域的所有机器 |
OU=Domain Controllers | 域控制器的容器,包括域内所有域控 |
CN=ForeignSecurityPrincipals | 代表域中来自森林外部域的组中的成员 |
CN=Keys | Server 2016之后才有,关键凭证对象的默认容器 |
CN=Managed Service Accounts | 托管服务帐户的容器 |
CN=System | 各种预配置对象的容器。包括信任对象,DNS对象和组策略对象 |
CN=TPM Devices | 可信平台模块(TPM)密钥的恢复信息的容器 |
CN=Users | 用户和组对象的默认容器 |
3.2.Application Partitions
从 Windows Server 2003 开始,微软允许用户自定义分区来扩展Naming Context的概念。Application Partitions其实就是Naming Context的一个扩展,它本质上还是属于Naming Context。
关于Application Partitions有一些限制需要注意:
Application Partitions不能包含安全主体,主要包括user、inetOrgPerson、group和computer objects。 可以在Application Partitions中创建任何其他类型的对象。
Application Partitions中包含的所有对象都不会复制到全局目录
(Global Catalog)中。 即使拥有Application Partitions副本的域控也是Global Catalog server(全局编录服务器),域控也不会在进行全局目录(Global Catalog)搜索时从Application Partition返回任何对象。Application Partitions中的对象不能移出分区。 这与域中包含的对象不同,后者可以在域之间移动。
4.组
组(Group)是用户账号的集合。通过向一组用户分配权限,就可以不必向每个用户分别分配权限了。按照用途来分,组分为通讯组和安全组。
5.OU
组织单位(Organization Unit),简称OU,是一个容器对象,将域中的对象组织成逻辑组,帮助网络管理员简化管理组。组织单位包含下列类型的对象:用户,计算机,工作组,打印机,安全策略,其他组织单位等。可以在组织单位基础上部署组策略,统一管理组织单位中的域对象。 在企业域环境里面,我们经常看到按照部分划分的一个个OU。
5.1.OU跟组的区别
组织单位跟组是两个完全不同的概念。很多人经常会把这两个弄混。组是权限的集合。OU是管理对象的集合。举个例子,运维需要对公司的网络进行管理,需要一些特殊的管理权限,我们就可以设置个组,对组配置权限。然后将运维拉近组里面,组里面的运维就拥有了该权限。比如我们需要对财务部里面的用户进行统一管理,那我们可以设置个OU,然后把财务部的用户拉近这个OU,这样就可以进行集中管理,比如说下发组策略。说通俗点,组是管理的集合,OU是被管理的集合。
6.相关工具
-
ADSI 编辑器
微软自带
-
LDP
微软自带
-
ADexplorer
-
adfind && admod
adfind用于查询,admod用于修改
- ldapsearch
Linux下用的多
ldapsearch -h 127.0.0.1 -p 389 -x -b "ou=People,dc=example,dc=org" -D "cn=aaa,dc=example,dc=org" "(&(objectClass=inetOrgPerson)(cn=userid))" -W