域渗透基础知识
目录
前言
这又是一个关于域内基础概念与原理的系列。如果你熟悉内网渗透,那么应该都对域环境、Active Directory、LDAP、Naming Context、域用户、域用户组、访问控制、组策略这些老生常谈的词汇有所了解。但是如果你对这些概念与原理一知半解的话,那么本系列的文章你一定不能错过。
1.什么是域
简而言之,域可以称为共享公共Active Directory
数据库的所有Active Directory
对象(如用户、计算机、组等)的集合或结构,并由称为域控制器的域的主服务器管理。域始终以其唯一的名称来引用,并且具有正确的域名结构。我们可以将Active Directory
基础结构拆分成多个单独的域,以创建更小的边界,以便可以在大型网络中分离不同域的管理任务。在Active Directory
环境中,域还可以为管理某些设置(如密码策略和帐户锁定策略)创建边界,以便它们只能应用于域级别的域用户帐户。
域名示例:
rootabc.lab
此域名中的
ROOTABC
代表其NetBIOS
名称
域中包含的几个重要组件:
- 组、用户、计算机等对象。
- 身份认证服务
- 组策略
- DNS
- DHCP
Active Directory PowerShell模块
通过在
Powershell
中导入Active Directory
模块,我们可以检索有关域环境的基本信息。默认情况下,
Active Directory
模块只存在于域控制器中,不存在工作站上。这些文件的路径:
C:\Windows\Microsoft.NET\assembly\GAC_64\Microsoft.ActiveDirectory.Management\
默认情况下,此模块需要在要启用需要管理权限的
Active Directory powershell
模块的客户端计算机上安装远程服务器管理工具包 (RSAT
)。每个域控制器都安装了RSAT
。因此域控制器和成员服务器都安装了内置的Active Directory powershell
模块。但是也有一种方法可以在工作站上使用它(无需安装RSAT
),只需从域控制器复制DLL
文件并将其导入到powershell
会话中即可。要在加入域的工作站上导入它,请从此处下载它(https://github.com/ScarredMonk/RootDSE-ActiveDirectory),然后使用
Import-Module
简单地导入它,然后就可以使用此模块中的任何命令。
Import-Module '.\Microsoft.ActiveDirectory.Management.dll'
要检索有关域的信息,我们可以使用以下命令:
PS C:\Users\HACK> Get-ADDomain AllowedDNSSuffixes : {} ChildDomains : {matrix.rootabc.lab} ComputersContainer : CN=Computers,DC=rootabc,DC=lab DeletedObjectsContainer : CN=Deleted Objects,DC=rootabc,DC=lab DistinguishedName : DC=rootabc,DC=lab DNSRoot : rootabc.lab DomainControllersContainer : OU=Domain Controllers,DC=rootabc,DC=lab DomainMode : Windows2016Domain DomainSID : S-1-5-21-580985966-2115238843-2989639066 ForeignSecurityPrincipalsContainer : CN=ForeignSecurityPrincipals,DC=rootabc,DC=lab Forest : rootabc.lab InfrastructureMaster : RDSEDC01.rootabc.lab LastLogonReplicationInterval : LinkedGroupPolicyObjects : {CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=rootabc,DC=lab} LostAndFoundContainer : CN=LostAndFound,DC=rootabc,DC=lab ManagedBy : Name : rootabc NetBIOSName : rootabc ObjectClass : domainDNS ObjectGUID : 70b22e8c-d4e3-4690-b4e0-0998b0125fb2 ParentDomain : PDCEmulator : RDSEDC01.rootabc.lab PublicKeyRequiredPasswordRolling : True QuotasContainer : CN=NTDS Quotas,DC=rootabc,DC=lab ReadOnlyReplicaDirectoryServers : {} ReplicaDirectoryServers : {RDSEDC01.rootabc.lab} RIDMaster : RDSEDC01.rootabc.lab SubordinateReferences : {DC=matrix,DC=rootabc,DC=lab, DC=ForestDnsZones,DC=rootabc,DC=lab, DC=DomainDnsZones,DC=rootabc,DC=lab, CN=Configuration,DC=rootabc,DC=lab} SystemsContainer : CN=System,DC=rootabc,DC=lab UsersContainer : CN=Users,DC=rootabc,DC=lab
SID
每个域都有一个唯一的SID
(安全标识符)来标识它。通常,SID
用于唯一标识安全主体,例如用户帐户、计算机帐户或在安全上下文中运行的进程或用户或计算机帐户。SID
在其范围内(域或本地)是唯一的,并且永远不会被重用。对于域帐户,安全主体的SID
是通过将域的SID
与帐户的相对标识符 (RID
) 连接起来创建的。
RID
RID
(相对标识符)是Active Directory
对象的安全标识符(SID
)的一部分,用于唯一标识域中的帐户或组。它在创建时分配给Active Directory
对象。RID
是SID
的最后一部分。
FQDN( 完全合格域名/全称域名)
完全合格域名是域中特定主机的完整域名。
FQDN
包含两部分:主机名+域名
例如,如果域是matrix.rootabc.lab
,并且矩阵域中的计算机具有主机名MTRXDC01
,则该计算机的FQDN
将是mtrxdc01.matrix.rootabc.lab
2.什么是Active Directory(
活动目录AD)
Active Directory
简单来说,就是Microsfot
提供的一项功能服务,它充当集中存储库并存储与Active Directory
用户、计算机、服务器和组织内的其他资源等对象相关的所有数据,它使系统管理员的管理变得容易。但它的主要功能是提供一种在域环境中对用户和机器进行身份验证的方法。使用Active Directory
,可以远程管理用户、工作站及其权限等资源。因此,它是一个可从网络上的任何地方访问的单一管理界面。它主要是Microsoft Windows
的一项功能,但其他操作系统也可以加入其中,例如你可以在Active Directory
环境中加入Linux
主机。
活动目录AD是域环境中提供目录服务的组件。在活动目录中,所有的网络对象信息以一种结构化的数据存储方式来保存,使得管理员和用户能够轻松地查找和使用这些信息。活动目录以这种结构化的数据存储方式作为基础,对目录信息进行合乎逻辑的分层组织。活动目录存储着有关网络对象(如用户、组、计算机、共享资源、打印机和联系人等)的信息。目录服务是帮助用户快速准确从目录中查找到他所需要的信息的服务。安装有AD活动目录的服务器就是域控DC。
如果将企业的内网看成是一本字典,那么内网里的资源就是字典的内容, 活动目录就相当于字典的索引。即活动目录存储的是网络中所有资源的快捷方式,用户通过寻找快捷方式而定位资源。
3.域控制器(Domain Controller)
在域架构中域控是用来管理所有客户端的服务器,它负责每一台联入的电脑和用户的验证工作,域内电脑如果想互相访问首先都得经过它的审核。域控是域架构的核心,每个域控制器上都包含了AD活动目录数据库。一个域环境可以有多台域控,每一台域控的地位几乎是平等的,他们各自存储着一份相同的活动目录数据库。当你在任何一台域控制器内添加一个用户账号或其他信息后,此信息默认会同步到其他域控的活动目录数据库中。多个域控的好处就是,当其中有域控出现故障了,仍然能够由其他域控来提供服务,除非所有域控都出现故障。当域中的一台计算机安装了AD活动目录后,它就成了域控DC了。域控制器在进行活动目录数据库复制时,分为两种复制模式:
* **多主机复制模式**(Multi-master replication model) :活动目录数据库内的大部分数据是利用此模式进行复制的。在此模式下,你可以直接更新任何一台域控的活动目录对象,之后这个更新过的对象会被自动复制到其他域控制器。
* **单主机复制模式** (Single-master replication model):活动目录数据库内的少部分数据是采用此模式进行复制的。在此模式下,当你提出修改对象数据的请求时,会由其中一台域控负责接收与处理此请求,也就是说该对象是先在该域控被更新,再由该域控复制给其他域控。
简而言之,Active Directory
域控制器承载对域中的身份验证请求进行响应的服务。它对网络上的用户访问进行身份验证和验证。当用户和计算机帐户登录到网络时,他们向域控制器进行身份验证,域控制器验证他们的信息(如用户名、密码),然后决定是允许还是拒绝这些用户的访问。域控制器是攻击者的重要服务器和主要目标,因为它持有Active Directory
环境的密钥。每个域至少有一个域控制器(也可以有其他域控制器)。
要检查域控制器,我们可以使用以下命令:
PS C:\Users\HACK> (Get-ADDomainController).HostName
RDSEDC01.rootabc.lab
只读域控制器
出于备份目的,域控制器有三种类型,即主域控制器、只读域控制器和附加域控制器。只读域控制器(RODC)不允许对数据库进行任何更改。如果是只读域控制器,则必须在可写域控制器上进行更改,然后将其复制到特定域中的只读域控制器。只读域控制器是为了解决在远程位置的分支机构中常见的问题,这些分支机构可能没有域控制器,或者物理安全性差、网络带宽差,或者没有当地的专业知识来支持它。只读域控制器的主要用途是促进来自远程办公分支机构的身份验证,并允许用户访问域资源。
4.域树(Domain Tree)
域树指若干个域通过建立信任关系组成的集合。一个域管理员只能管理本域的内部,不能访问或者管理其他的域,二个域之间相互访问则需要建立 **信任关系 (Trust Relation)**。信任关系是连接在域与域之间的桥梁。父域与子域之间自动建立起了双向信任关系,域树内的父域与子域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理,以及相互通信和数据传输。同一个域树中,父域和子域会自动创建双向信任关系,并且信任关系可传递。所以也就是如下:abc.com 自动与 asia.abc.com 和 europe.abc.com 建立起了双向信任关系,asia.abc.com 和 cn.asia.abc.com以及 europe.abc.com 与 fr.asia.abc.com 自动建立起了双向信任关系。由于信任关系可以传递,所以cn.asia.abc.com和abc.com以及fr.asia.abc.com和abc.com都自动建立起了双向信任关系。但是 asia.abc.com 和 europe.abc.com 之间并没有建立起信任关系。所以也就是 asia.abc.com 和 europe.abc.com 之间不能进行数据共享等操作。他们之间要想进行数据共享等操作,需要手动为他们之间建立信任关系。在域树内的所有域共享一个AD DS,也就是在此域树之下只有一个AD DS,不过其数据是分散存储在各个域中的,每一个域中只存储着属于该域的数据。因此在域树中,因此只要拥有任何一个域内的权限,那么就可以访问其他域内的资源。
5.域林(Forest)
由一个或多个没有形成连续名称空间的域树组成,林中每个域树都有唯一的名称空间,之间不连续。域林 指若干个域树通过建立信任关系组成的集合。可以通过域树之间建立的信任关系来管理和使用整个域林中的资源,从而又保持了原有域自身原有的特性。同一个林中,林根域与其他树根域自动建立双向信任关系. 信任关系可传递。因此,在林中,只要拥有其中一个域内的权限,就可以访问其他林中其他域的资源。
Active Directory
林是共享公共架构的多个域树的集合,所有域通过信任连接在一起。林中的每个域都可以有一个或多个域控制器,这些域控制器可以与其他域交互,也可以访问来自其他域的资源。林的名称与根域相同。如果林包含单个域,则该域本身就是根域。
我们可以按如下方式检查Active Directory
中的林名称:
PS C:\Users\HACK> Get-ADForest ApplicationPartitions : {DC=DomainDnsZones,DC=matrix,DC=rootabc,DC=lab, DC=ForestDnsZones,DC=rootabc,DC=lab, DC=DomainDnsZones,DC=rootabc,DC=lab} CrossForestReferences : {} DomainNamingMaster : RDSEDC01.rootabc.lab Domains : {matrix.rootabc.lab, rootabc.lab} ForestMode : Windows2016Forest GlobalCatalogs : {RDSEDC01.rootabc.lab, MTRXDC01.matrix.rootabc.lab} Name : rootabc.lab PartitionsContainer : CN=Partitions,CN=Configuration,DC=rootabc,DC=lab RootDomain : rootabc.lab SchemaMaster : RDSEDC01.rootabc.lab Sites : {Default-First-Site-Name} SPNSuffixes : {} UPNSuffixes : {}
通过从上面的输出请求RootDomain
属性,可以过滤上面的命令以提取林名称。同样,我们可以使用此方法查看任何特定的属性,方法是将整个命令放在括号中,然后键入要查看的属性名称。
PS C:\Users\HACK> (Get-ADForest).RootDomain rootabc.lab
6.域信任(Trusts)
域信任是为了解决多域环境中的跨域资源共享问题而诞生的。两个域之间必须拥有信任关系(trust relationship),才可以访问到对方域内的资源。任何一个新的子域被加入到域树之后,这个域会自动信任其上一层的父域,同时父域也会自动信任新子域,而且这些信任关系具备双向传递性(two-way transitive)。由于此信任工作是通过Kerberos security protocol来完成的,因为也被成为 Kerberos Trust。
在林中,域通过称为信任的连接相互连接。这就是为什么一个域的用户能够访问其他域的资源。在Active Directory
环境中,一旦在两个域之间建立信任关系,它就会向跨实体的用户、组和计算机授予对资源的访问权限。这是通过连接域之间的身份验证系统并允许身份验证流量在它们之间流动来完成的。稍后将详细讨论这一点,以了解当一个域中的用户请求访问另一个域的资源时会发生什么,当前域控制器向用户返回一个特殊的票证(用域间信任密钥签名),该票证指的是另一个域的域控制器。
域信任关系分为单向信任和双向信任:
单向信任是指在两个域之间创建单向的信任路径,即在一个方向上是信任流,在另一个方向上是访问流。在受信任域和信任域之间的单向信任中,受信任域内的用户或计算机可以访问信任域中的资源,但信任域内的用户却无法访问受信任域内的资源。也就是说,若A域信任B域,那么B域内受信任的主体可以访问A域内信任B域的资源。
双向信任是指两个单向信任的组合,信任域和受信任域彼此信任,在两个方向上都有信任流和访问流。这意味着,可以从两个方向在两个域之间传递身份验证请求。活动目录中的所有域信任关系都是双向可传递的。在创建子域时,会在新的子域和父域之间自动创建双向可传递信任关系。在早期的域中,域信任是单向的,从Windows Server2003开始,域信任关系变为双向的。
域之间的信任关系,相当于是不同域之间沟通的桥梁。域信任分为 单向信任 和 双向信任。单向信任只能是受信任域访问信任域,而信任域不能访问受信任域。双向信任是两个域可以互相访问。
在双向信任的情况下,所有域都可以与所有用户共享资源,而不管它们属于哪个域。顾名思义,信任是双向的。当我们在两个域(域一和域二)之间创建信任时,域一中的用户帐户将可以访问域二中的资源,反之亦然。
有各种类型的信任。信任可以是传递性的,也可以是非传递性的。
信任类型 | 属性 | 信任方向 | 验证 | 详情 |
Tree-Root | Transitive | 双向 | Kerberos V5 or NTLM | 将新树添加到林时自动创建 |
Parent-Child | Transitive | 双向 | Kerberos V5 or NTLM | 添加子域时自动创建 |
Shortcut | Transitive | 单向或者双向 | Kerberos V5 or NTLM | 手动创建。在林中使用以缩短信任路径以提高身份验证时间 |
Forest | Transitive | 单向或者双向 | Kerberos V5 or NTLM | 手动创建。用于在AD DS林之间共享资源。 |
域林中的信任是可传递的:
列如:如果域a信任域b,域b信任域c,那么域a信任域c
在这里,信任关系通过每个受信任域。因为它是可传递的信任,所以它允许域1中的用户帐户访问域3中的资源,反之亦然(而不必在域1和域3之间创建额外的信任)
域林中的非传递性信任:
在不可传递信任的情况下,与信任之外的域的关系受到限制。这意味着不允许其他域访问信任之外的资源。他们将无法通过其身份验证信息。
列如:
域a不信任域b,域b不信任域c,则域a不信任域c
7.全局编录 Global Catalog(GC)
全局编录用于执行全林搜索,因为全局编录服务器包含所有对象的完整副本。默认情况下,域中的根域控制器被视为全局编录服务器。为了加快对林中其他域中对象的查询速度,全局编录服务器具有其自己域的副本和其他域对象的只读分区。假设我们必须从当前域以外的域中查询特定用户的描述属性,在这种情况下,全局编录将检索它而无需查询其他域的域控制器。