购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.5 Windows WMI详解

1.5.1 WMI简介

WMI(Windows Management Instrumentation,Windows管理规范)是Windows 2000/XP管理系统的核心,属于管理数据和操作的基础模块。设计WMI的初衷是达到一种通用性,通过WMI操作系统、应用程序等来管理本地或者远程资源。它支持分布式组件对象模型(DCOM)和Windows远程管理(WinRM),用户可通过WMI服务访问、配置、管理和监视Windows所有资源的功能。对于其他的Win32操作系统来讲,WMI是一个非常不错的插件,同时也是测试人员在攻防实战中的一个完美的“无文件攻击”入口途径。

1.5.2 WQL

WQL也就是WMI的SQL。WQL的全称是WMI Query Language(Windows管理规范查询语言),主要用于查询WMI的所有托管资源。它的语法与SQL相似,但只能执行数据的查询,不能对类或者实例执行创建、删除、修改等操作。

1.基础语法

1)SELECT代表WQL语句开始。

2)properties代表要查询的属性名称。

3)FROM指定包含SELECT语句中所列出属性的类。

4)class代表要查询的类名称。

5)where clause为可选项,代表要过滤的信息,用来定义搜索范围。

2.查询用例

1)在CMD命令行中执行wbemtest命令进入WMI测试器中,如图1-40所示。

图1-40 执行wbemtest命令进入WMI测试器中

2)在使用之前我们发现需要进行连接,选择默认连接选项即可,如图1-41所示。

3)连接默认的命名空间后可以看到如图1-42所示的内容。

图1-41 选择默认连接选项

图1-42 连接默认的命名空间后看到的内容

4)通过单击“查询”模块,可执行WQL语句查询,如图1-43所示。

图1-43 通过“查询”模块执行WQL语句查询

5)在此输入要执行的WQL语句。

6)上述查询语句将会把当前正在运行的进程的可执行文件中名称包含“cmd”的文件返回到查询结果中。更具体地说,此查询语句将返回WIN32_Process类的每个实例的属性中名称包含“cmd”的属性,如图1-44所示。

图1-44 查询当前正在运行的进程的可执行文件中名称包含“cmd”的文件

7)执行以下命令,从任务管理器中查看,如图1-45所示。

图1-45 从任务管理器中查看

8)除了WIN32_Process属性之外,还有很多属性。如需查询更多的WMI属性,可以使用PowerShell中的命令。PowerShell是Windows下功能强大的脚本语言,包含极其丰富的与WMI进行交互的功能。

9)通过PowerShell与WMI进行更多的交互,如图1-46所示。

图1-46 通过PowerShell与WMI进行更多的交互

10)若要通过PowerShell查看当前系统中的所有属性,可以执行如下命令,执行结果如图1-47所示。

图1-47 通过PowerShell查看当前系统中的所有属性

1.5.3 WMI Client

在WMI交互时有很多客户端,实战中可以根据不同的场景选择已有的客户端进行操作。接下来详细介绍可以用于实战的WMI Client。

1.PowerShell

PowerShell是Windows操作系统下非常强大的脚本语言,可以通过PowerShell管理Windows操作系统中的所有功能。PowerShell支持以WMI和CIM两种命令方式与WMI进行交互,这两种命令方式的不同点在于:WMI命令只能用于DCOM协议,而CIM命令不仅支持DCOM协议,还支持WinRM协议。由此可见,CIM命令在与WMI交互时具有更好的灵活性。以下为PowerShell可与WMI交互的功能。

❑Get-WmiObject

❑Get-CimAssociatedInstance

❑Get-CimClass

❑Get-CimInstance

❑Get-CimSession

❑Set-WmiInstance

❑Set-CimInstance

❑Invoke-WmiMethod

❑Invoke-CimMethod

❑New-CimInstance

❑New-CimSession

❑New-CimSessionOption

❑Register-CimIndicationEvent

❑Register-WmiEvent

❑Remove-CimInstance

❑Remove-WmiObject

❑Remove-CimSession

2.wmic.exe

wmic.exe是一款主要用于与WMI交互的命令行管理工具,它不但可以管理本地计算机,还能够在权限充分的情况下管理域控制器中的其他计算机。WMIC是Windows自带的一个功能,计算机只要支持WMI即可使用WMIC。因功能强大以及在Windows中免安装,WMIC在内网渗透中扮演着重要的角色。

3.WBEMTEST

WBEMTEST是Windows自带的一个与WMI基础结构交互的图形化工具,它支持任何Windows系统,在“运行”窗口中输入wbemtest并单击“确认”按钮即可打开。在弹出的“连接”窗口中选择命名空间(WBEMTEST不会浏览命名空间,需要我们手动选择以连接到指定命名空间),默认选择root\cimv2。这样,通过WBEMTEST工具就可以进行枚举对象实例、查询、创建和修改WMI类与对象等操作。

4.WinRM

WinRM(Windows Remote Management,Windows远程管理)是Windows操作系统的一部分,我们可以以管理员的身份使用该命令。WinRM是WS管理协议的微软实现。WS管理协议是一种基于简单对象访问协议(SOAP)的标准防火墙友好型协议。开启WinRM服务后,占用的端口(默认情况下,WinRM HTTP服务占用5985,HTTPS占用5986)不会被防火墙拦截,因此我们在内网渗透中可以通过WinRM进行横向渗透。

5.Win explorer

Win explorer(Windows资源查看器)是一款图形化查看WMI信息的工具。它与WBEM-TEST类似,不过比WBEMTEST功能更丰富,使用起来更方便。Win explorer允许用户浏览完整的WMI管理类集、对象及其属性,浏览远程计算机上的对象和设置,以及执行任何WQL查询和查看结果集。

6.WSH

VBScript和JScript是微软提供的两种WSH(Windows Script Host)脚本开发语言。这两种脚本开发语言早已过时,但是它们在与WMI交互时仍有很强大的能力。目前市面上已经出现了基于这两种语言开发、使用WMI功能完成基本的命令与控制机制的后门程序。目前只有VBScript和JScript支持调用Event Consumer(事件消费者)接口ActiveScript-EventConsumer(事件消费者组件)来实现无文件写入。

1.5.4 WMI远程交互

当前,WMI支持两种远程交互协议:DCOM协议和WinRM协议。我们可以通过这两种协议对远程计算机进行对象查询、事件注册及WMI类方法的执行等操作。攻击者要有效利用这两种协议,需要具备一定的特权用户凭据,因此大多数安全厂家通常不会对这两种协议所传输的恶意内容及恶意流量进行审查。这就使得这两种协议对于攻击者有了可利用的空间。接下来分别介绍这两种协议。

1.DCOM

DCOM(分布式组件对象模型)是微软基于COM(组件对象模型)推出的一系列概念和程序接口。通过该技术,在局域网、广域网甚至Internet上不同计算机的对象之间能够进行通信,从而在位置上达到分布性,满足客户和应用的需求。

在了解DCOM之前,我们先简单介绍一下COM技术。COM是微软的一套软件组件接口标准,定义了组件和本地客户端之间互相作用的方式。它使组件和客户端不需要任何中介组件就能相互联系。而DCOM是COM的扩展,使用DCOM可以不受本地限制,通过远程过程调用(RPC)技术实现客户端程序实例化和访问远程计算机的COM对象。

DCOM为分布在网络不同节点的两个COM组件提供了互相操作的基础结构。它增强了COM的分布处理性能,支持多种通信协议,加强了组件之间通信的安全保障。DCOM在组件中的作用为:作为PC间通信的PCI和ISA总线,负责各种组件之间的信息传递。如果没有DCOM,则达不到分布式计算环境的要求。

2.WinRM

WinRM(Windows远程管理)目前已成为Windows建议使用的远程管理协议。WinRM是基于WS管理协议所构建的一种基于SOAP的设备管理协议,它允许使用SOAP通过HTTP(S)远程管理Windows计算机,其后端利用了WMI,我们可以把它看作一个基于HTTP的WMI API。另外,PowerShell Remoting是基于WinRM规范的。当计算机启用了WinRM以后,我们就可以像远程SSH会话一样,通过PowerShell的方式对远程计算机进行管理。在默认情况下,WinRM会监听5985/TCP(HTTP)、5986/TCP(HTTPS)这两个端口中的任意一个,只要其中任意一个端口处于监听状态,都表示WinRM已经配置。

可以通过在PowerShell中使用Test-WSMan函数来验证目标是否已经配置了WinRM。如果Test-WSMan返回了如图1-48所示的信息,则表示目标系统中的WinRM服务处于监听状态。

图1-48 使用Test-WSMan函数来验证目标是否配置了WinRM

1.5.5 WMI事件

1.WMI永久事件订阅组成

(1)事件过滤器

事件过滤器(Event Filter)存储在一个ROOT\subscription:__EventFilter对象的实例里,其主要作用是使用WMI的查询语言来过滤审核特定的事件。一个事件过滤器接收一个WMI事件查询参数,同时可以对内部事件(Intrinsic Event)和外部事件(Extrinsic Event)进行事件查询。

1)内部事件。我们在创建、删除、修改WMI类或类实例以及命名空间时所产生的事件,都可以称为内部事件。每个内部事件类都代表了一种特定类型的更改,内部事件作为系统类存在于每个命名空间中。一般情况下,WMI为存储在WMI存储库中的对象创建内部事件,提供程序为动态类生成内部事件,如果没有可用的提供程序,WMI将会为动态类创建一个实例。以下为WMI用于报告内部事件的系统类。

2)外部事件。外部事件是非系统类预定义事件,WMI使外部事件提供程序直接定义描述事件的事件类(例如当计算机切换到待机模式的事件为外部事件时)。外部事件能够及时响应触发,解决了内部事件时间间隔的问题。虽然外部事件通常不会包含太多的信息,但其事件功能还是极其强大的。以下为常见的外部事件类。

(2)事件消费者

事件消费者(EventConsumer)指的是当事件传递给EventConsumer类时执行的命令动作,也可以理解为我们希望在事件触发时发生的特定操作。事件消费者大体可分为临时事件消费者和永久事件消费者两类。

1)临时事件消费者。只在运行期间关心并处理特定的事件。临时事件消费者必须手动启动,并且不能在WMI重新启动或操作系统重新启动后持续存在。临时事件消费者只能在其运行时处理事件。

2)永久事件消费者。类实例注册在WMI命名空间中,一直有效直至注销。(永久性的WMI事件是持久性驻留的,并且以SYSTEM权限运行,重启后仍然还在。)永久事件消费者一直运行到其注册被显式取消,并会在WMI或系统重新启动时启动。永久事件消费者是系统上WMI类、过滤器和COM对象的组合。

在事件消费者中,系统提供了如下WMI预安装的永久事件消费者的类,它们都属于Root\CTMV2以及ROOT\DEFAULT这两个命名空间。我们可以创建这些类的实例以提供永久事件消费者类,提供在过滤器中指定的事件触发时响应的逻辑消费者。例如,使用ActiveScriptEventConsumer类执行VBScript/JScript脚本代码程序。

从红队的角度来看,我们比较关注两个类:可以执行VBScript/JScript脚本代码程序的ActiveScriptEventConsumer类,以及可以运行任意命令的CommandLineEventConsumer类。这两个类为我们提供了很大的灵活性,供我们执行任何的有效载荷(payload),完美实现无文件写入。

(3)FilterToConsumerBinding

FilterToConsumerBinding(消费者绑定筛选器)将EventConsumer实例与EventFilter实例相关联,以明确什么事件由什么消费者处理和负责。如下代码通过创建FilterToConsumer-Binding类的实例来将EventFilter和EventConsumer这两个实例连接绑定在一起。

2.创建永久事件订阅

永久事件订阅是存储在CIM存储库中的一组静态WMI类,我们可以通过MOF的方式分4个步骤来创建永久事件订阅。如下是具体步骤以及创建永久事件订阅模板的MOF示例。

1.5.6 WMI攻击

1.信息收集

在拿到内网某一台计算机的权限后,红队第一时间要做的就是收集信息。WMI中的各种类为内网信息收集提供了十分有利的条件,红队可以利用如下WMI中各种类的子集来对目标进行全方位的信息收集。

❑主机/操作系统信息:Win32_OperatingSystem、Win32_ComputerSystem。

❑文件/目录列举:CIM_DataFile。

❑磁盘卷列举:Win32_Volume。

❑注册表操作:StdRegProv。

❑运行进程:Win32_Process。

❑服务列举:Win32_Service。

❑事件日志:Win32_NtLogEvent。

❑登录账户:Win32_LoggedOnUser/Win32_LogonSession。

❑共享:Win32_Share。

❑已安装补丁:Win32_QuickFixEngineering。

❑网络信息:Win32_IP4RouteTable。

❑用户账户:Win32_UserAccount。

❑用户组:Win32_Group。

2.杀毒引擎检测

默认情况下,杀毒引擎会自动注册在WMI的AntiVirusProduct类中的root\SecurityCenter或root\SecurityCenter2命名空间中,可以执行SELECT*FROM AntiVirusProduct查询语句来查询当前已安装的杀毒引擎。

3.代码执行及横向移动

在内网中,可以利用事件订阅和win32_process类的Create方法来实现代码执行及横向移动。

(1)事件订阅

可以使用WMI的功能来订阅事件并在该事件发生时执行任意代码,从而在系统上提供持久化。例如:利用ActiveScriptEventConsumer(事件消费者组件类)来实现无文件写入,或者利用_IntervalTimerInstruction类,让其在往后特定的几秒触发运行,让其作为我们的攻击向量,又或者将Win32_ProcessStartTrace的外部事件作为创建LogonUI.exe的触发器,实现在屏幕锁定后执行特定的操作。可以选择Windows系统中的任意一个事件筛选器来实现想要的操作。

(2)win32_process类的Create方法

win32_process类的Create方法是最经典的代码执行技术场景,通过运行进程win32_process类的Create方法来直接与本地或者远程计算机进行交互。

1.5.7 WMI攻击检测

WMI拥有极其强大的事件处理子系统,因在操作系统中的所有操作行为都可以触发WMI事件,我们可以将WMI理解成Windows操作系统自带的一个免费IDS(入侵流量检测)。WMI的定位就是实时捕获攻击者的攻击操作,而利用WMI所产生的事件可进一步判断一个操作是不是攻击者的操作。以下是攻击者常用的攻击利用手法以及所触发的事件。

❑攻击者使用WMI作为持久性机制,EventFilter、EventConsumer、FilterToConsumer被绑定创建,__InstanceCreationEvent事件被触发。

❑WMI Shell工具集被用作C2通道,会创建和修改命名空间对象的实例,因此会触发NamespaceCreationEvent和NamespaceModificationEvent事件。

创建WMI类存储攻击者数,__ClassCreationEvent事件会被触发。

❑当攻击者安装恶意WMI提供程序时,一个Provider类的实例会被创建,InstanceCreation-Event事件会被触发。

❑当攻击者使用开始菜单或注册表做持久化时,一个Win32_StartupCommand类的实例会被创建,__InstanceCreationEvent事件会被触发。

❑当攻击者安装服务时,一个Win32_Service实例会被创建,InstanceCreationEvent事件会被触发。 80Q50CuVuXhk/DvFG316e4sjDpteq37Y2fAsyjgwbd+vrpOA2/Psn4Jbw9Xrju1O



1.6 域

1.6.1 域的基础概念

1.工作组和域

在介绍域之前,我们先了解一下什么是工作组。工作组是在Windows 98系统中引入的。一般按照计算机的功能划分工作组,如将不同部门的计算机划分为不同工作组。虽然对计算机划分工作组使得访问资源具有层次感,但还是缺乏统一的管理和控制机制,因此引入“域”。

域(domain)是在本地网络上的Windows计算机集合。与工作组的平等模式不同,域是严格的管理模式。在一个域中至少有一台域控制器(Domain Controller,DC),通过域控制器对域成员,即加入域的计算机、用户进行集中管理,对域成员下发策略、分发不同权限等。域控制器包含整个域中的账号、密码以及域成员的资料信息。当计算机接入网络时,要鉴别它是不是域成员,账户和密码是否在域中,这样能在一定程度上保护网络资源。

2.活动目录

活动目录(Active Directory,AD)是域中提供目录服务的组件,它既是一个目录,也是一个服务。活动目录中存储着域成员的信息,其作用就是帮助用户在目录中快速找到需要的信息。

活动目录可以集中管理账号、密码、软件、环境,增强安全性,缩短的宕机时间。其优势主要表现在以下几点。

1)集中管理。活动目录集中管理网络资源,类似于一本书的目录,涵盖了域中组织架构和信息,便于管理各种资源。

2)便捷访问。用户登录网络后可以访问拥有权限的所有资源,且不需要知道资源位置便可快速、方便地查询。

3)易扩展性。活动目录具有易扩展性,可以随着组织的壮大而扩展成大型网络环境。

3.域控制器

域控制器类似于指挥调度中心,所有的验证、互访、策略下发等服务都由它统一管理。安装了活动目录的计算机即域控制器。

4.域树

域树是多个域之间为建立信任关系而组成的一个连续的命名空间。域管理员不能跨域管理其他域成员,他们相互之间需要建立信任关系。不仅此信任关系是双向信任,而且信任属性可以传递。例如A和B之间是信任关系,B和C之间是信任关系,则A和C因为信任关系的传递而相互信任。他们之间可以自动建立信任关系并进行数据共享等。

命名空间是类似于Windows文件名的树状层级结构,如一个域树中父域名称为a,它的子域即为aa.a,以此类推,之后的子域为xxx.aa.a,如图1-49所示。

图1-49 域树

5.域林

域林由没有形成连续命名空间的域树组成。域林中各个域树之间命名空间不是连续的,但是它们仍共享同一个表结构、配置和全局目录。和域树类似,域林之间也有信任关系,每个域树通过建立信任关系可以交叉访问其他域中资源。如图1-50所示。

域林的根域是第一个创建的域,与此同时第一个林也就诞生了。

图1-50 域林

6.信任关系

信任关系是指两个域之间的通信链路。一个域控制器因为信任关系可以验证其他域的用户,使域用户可以互相访问。

(1)信任的方向

信息关系有两个域:信任域和受信任域。

两个域建立信任关系后,受信任域方用户可以访问信任域方资源,但是信任域方无法访问受信任域方资源。这个信任关系虽然是单向的,但是可以通过建立两次信任关系使双方能够互访。

(2)信任的传递

信任关系分为可传递和不可传递。

如果A和B、B和C之间都是信任可传递的,那么A和C之间是信任关系,可以互访资源。

如果A和B之间、B和C之间都是信任不可传递的,那么A和C之间不是信任关系,无法互访资源。

(3)信任的类型

信任关系分为默认信任和其他信任,默认信任包括父子信任、域间信任,其他信任包括快捷信任、外部信任、森林信任、领域信任,如图1-51所示。

图1-51 信任关系

默认信任是系统自行建立的信任关系,不需要手动创建。

❑父子信任:在现有的域树中增加子域时,子域和父域建立信任关系,并继承父域信任关系。

❑域间信任:在现有的域林中建立第二个域树时,将自动创建它与第一个域树的信任关系。

其他信任是非系统自行建立的信任关系,需要手动创建。

❑快捷信任:在域树或域林中通过默认信任建立的信任关系有时会因信任路径很长、访问资源容易,造成网络流量增加或访问速度变慢,访问效率低下。这种情况下,可以建立访问者与被访问者之间的快捷信任关系,提高访问效率。

❑外部信任:构建在两个不同的森林或者两个不同的域(Windows域和非Windows域)之间的信任关系。这种信任是双向或单向的、不可传递的信任关系。

❑森林信任:如果在Windows Server 2003功能级别,可以在两个森林之间创建一个森林信任关系。这个信任是单向或双向的、可传递的信任关系。注意:森林信任只能在两个林的根域上建立。

❑领域信任:使用领域信任可建立非Windows Kerberos领域和Windows Server 2003或Windows Server 2008域之间的信任关系。

1.6.2 组策略

组策略(Group Policy)用来控制应用程序、系统设置和网络资源,通过组策略可以设置各种软件、计算机、用户策略。其主要意义在于对计算机账户及用户账户在当前计算机上的行为操作进行管控。组策略可分为本地组策略和域组策略。

1.本地组策略

本地组策略(Local Group Policy)是组策略的基础版本,它面向独立且非域的计算机,包含计算机配置及用户配置策略,如图1-52所示。可以通过本地组策略编辑器更改计算机中的组策略设置。例如:管理员可以通过本地组策略编辑器为计算机或特定组策略用户设置多种配置,如桌面配置和安全配置等。

图1-52 本地组策略

2.本地组策略编辑器

1)通过按下Windows+R组合键调出“运行”窗口并输入gpedit.msc以运行本地组策略编辑器,如图1-53所示。

图1-53 运行本地组策略编辑器

2)进入本地组策略编辑器,如图1-54所示。

图1-54 本地组策略编辑器

3)依次选择“计算机配置”→“Windows设置”→“脚本(启动/关机)”,然后选择“启动”选项,如图1-55所示。

4)单击“脚本(启动/关机)”界面中的“属性”链接,如图1-56所示。

5)在这里可以设置开机时启动的脚本,如图1-57所示。

6)单击“显示文件”按钮(见图1-58)就会打开一个目录,可以向该目录投放后门木马,实现权限维持,如图1-59所示。

图1-55 选择“脚本(启动/关机)”界面中的“启动”选项

图1-56 在“脚本(启动/关机)”界面中单击“属性”链接

图1-57 设置开机启动脚本

图1-58 “显示文件”按钮

图1-59 打开目录文件

3.域组策略

域组策略(Domain Policy)是一组策略的集合,可通过设置整个域的组策略来影响域内用户及计算机成员的工作环境,以降低用户单独配置错误的可能性。

4.域组策略实现策略分发

1)在DC中打开组策略管理,如图1-60所示。

图1-60 打开组策略管理

2)新建组策略对象,利用组策略对内网中的用户批量执行文件,如图1-61所示。

图1-61 新建组策略对象

3)右击编辑新建的组策略,如图1-62所示。

图1-62 编辑新建的组策略

4)使用组策略管理用户登录配置,如图1-63所示。

图1-63 使用组策略管理用户登录配置

5)双击“登录”项目后打开显示文件,如图1-64所示。

6)如图1-65所示,在显示的文件夹中手动创建一个test.bat文件。(此文件主要用于在启动时自己打开计算器。)

7)将test.bat批处理文件添加到登录脚本中,如图1-66所示。

8)将当前域组策略链接到现有GPO,如图1-67、图1-68所示。

图1-64 登录属性文件

图1-65 创建test.bat批处理文件

图1-66 将test.bat批处理文件添加到登录脚本中

图1-67 将当前域组策略链接到现有GPO(一)

图1-68 将当前域组策略链接到现有GPO(二)

9)使用gpupdate/forCE命令强制更新刚才创建的策略,如图1-69所示。

10)登录域账号进行策略验证。通过验证发现,当域账号登录成功时,会自动弹出我们创建的“启动计算器”策略,如图1-70所示。

图1-69 使用gpupdate/forCE命令强制更新组策略

图1-70 登录域账号验证策略

1.6.3 LDAP

1.LDAP简介

LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)是在X.500标准基础上产生的一个简化版本的目录访问协议,用来访问目录数据库。LDAP目录服务是由目录数据库和一套访问协议组成的系统。可以把LDAP理解为一个关系型数据库,其中存储了域内主机的各种配置信息。当我们想要查找和管理某个对象时,可以通过查找LDAP层次结构实现,如图1-71所示。

图1-71 LDAP层次结构

2.LDAP组成

LDAP是为了实现目录服务信息访问而构建的一种协议,由<LDAP>、<Domain>、<DN>三部分组成。客户端通常会通过LDAP发起会话以连接到请求服务器,在请求时客户端无须等待服务器响应即可发送下一条请求,服务器会按照请求顺序依次对客户端进行响应。以下是LDAP的格式及组成部分。

❑<LDAP>:LDAP。

❑<Domain>:所要连接的域控制器的域名或者IP地址。

❑<DN>:标识名称(Distinguished Name),用户标识对象在活动中的完整路径。

3.LDAP目录结构

LDAP目录服务是由目录数据库和一套访问协议组成的系统。Microsoft Active Dire-ctory是微软对目录数据库的实现,里面存放着整个域里的所有配置信息(用户、计算机等),而LDAP则是对整个目录数据库的访问协议。图1-72所示为LDAP中的目录结构组织图。

❑目录树:整个目录信息集可以表示为一棵目录树,树中每个节点就是一个条目。

❑条目:条目是具有DN的属性-值对的集合,每个条目就是一条记录。例如,图1-72中的每一个圆圈为一条记录。

图1-72 LDAP目录结构组织图

❑DN:一个条目的标识名称叫作DN。DN相当于关系型数据库表中的主键,通常用于检索。

❑属性:通常用于描述条目的具体信息,例如uid=UserA,ou=sales,dc=ex ample,dc=com,则它有属性name为UserA,属性age为32。

4.LDAP名称路径

通常情况下,Active Directory会利用LDAP命名路径来表明要访问的对象在Active Directory中的位置,以便客户端在通过LDAP访问时能够快速查找到此对象。图1-73为LDAP名称路径图。

5.DN

DN是对象在Active Directory内的完整路径,它有3个属性,分别是CN(公共通用名称)、OU(组织单位)、DC(域名组件)。对DN的3个属性的解读见表1-8。

表1-8 DN的3个属性

图1-73 LDAP名称路径图

图1-74所示为一个DN。其中,“CN=yunwei01”代表一个用户名,“OU=安全运维组,OU=运维管理部”代表一个目录服务中的组织单位。这个DN的含义是,yunwei01这个对象处在testfirest.com域的运维管理部安全运维组中。

图1-74 DN

用户yunwei01的完整路径为testfirest.com域中运维管理部下面的安全运维组,如图1-75所示。

图1-75 用户yunwei01的完整路径

接下来介绍几个常见的术语。

❑相对标识名称(Relative Distinguished Name,RDN):类似于文件系统中的相对路径,与目录树结构无关的部分。例如,上述路径中的CN=yunwei01与OU=运维管理部等都是RDN。

❑全局唯一标识符(Global Unique IDentifier,GUID):GUID是一个128位的数值,系统会自动为每个对象指定一个唯一的GUID。虽然可以改变对象的名称,但是其GUID永远不会改变。

❑Base DN:LDAP的数据作为树形结构存储,LDAP目录树的顶部就是根,也就是所谓的Base DN,如DC=testfirest, DC=com。

❑用户主体名称(User Principal Name,UPN):可以理解成DN的简称。比如yunwei01属于testfirest.com,那么其简称就是yunwei01@testfirest.com。

1.6.4 SPN

1.SPN简介

SPN(Service Principal Name,服务主体名称)是服务实例的唯一标识符。当域内存在大量的服务器时,为了方便管理,管理员会对服务器进行标识,而他所用的方法就是SPN。

2.SPN类型分类

SPN分为两种类型,一种注册在活动目录的机器账户Computers下,另一种注册在活动目录的域账号Users下,如图1-76所示。

图1-76 SPN类型

1)注册在活动目录的机器账户(CN=Computers)下。当某一个服务的权限为Local System或者Network Service时,SPN会注册在机器账户下,同时它所加入域的每台机器都会自动注册两个SPN——“Host/主机名”和“Host/主机名.DC名”,如图1-77所示。

2)注册在活动目录的域账号(CN=Users)下。当某一个服务的权限为一个域用户时,SPN会注册在活动目录的域账号下,如图1-78所示。

图1-77 注册在活动目录的机器账户下

图1-78 注册在活动目录的域账号下

3.SPN格式定义

如下为SPN格式定义,其中<serviceclass>服务类和<host>主机名为必要参数,<port>、<servername>、<Domain user>为可选参数。

❑<serviceclass>:服务的名称,如LDAP、MSSQL等。

❑<host>:系统的名称,可以是FQDN、NetBIOS名这两种形式中的任意一种。

❑<port>:服务器的端口号,如果使用的是默认端口,可以省略。

❑<servername>:服务器的专有名称、主机名、FQDN。

❑<Domain user>:域中的用户。

4.SPN实例名称

表1-9列举了一些常见的SPN实例名称。

表1-9 常见SPN实例名称

5.SPN服务注册

前面讲过Kerberos协议关于PC1请求server1的某种服务,假设我们需要请求server1的HTTP服务并且还想经过Kerberos协议的认证,那么就需要给server1注册一个SPN。注册之后,Kerberos就会将服务器实例和服务登录账号关联。在SPN服务注册方面,我们使用本地Windows自带的二进制文件Set SPN。操作流程如下。

1)以域管理员的身份登录域控制器,如图1-79所示。

2)打开PowerShell管理命令行,如图1-80所示。

图1-79 以域管理员的身份登录域控制器

图1-80 打开PowerShell管理命令行

3)以z3用户的身份进行SPN服务注册(假设z3是一个HTTP服务的登录账号),如图1-81所示。

图1-81 以z3用户的身份进行SPN服务注册

4)通过setspn-T命令查看验证注册状态,如图1-82所示。

图1-82 通过setspn-T命令查看验证注册状态

注意:以普通域用户注册SPN服务主体时,需要域管理员的权限,否则会提示权限不够,如图1-83所示。

图1-83 普通域账号SPN注册

6.SPN服务主体配置

一般情况下,我们都是通过Set SPN的方式对SPN进行手动注册的,但手动注册的SPN存在一定的丢失问题。解决SPN丢失的最好办法是让一些“服务”的启动域账号拥有自动注册SPN的权限,而这需要在域控制器上对其开放读写“ServicePrincipalName”的权限。操作流程如下。

1)在域控制器上打开“Active Directory用户和计算机”,方法是依次选择“开始”→“所有程序”→“管理工具”→“Active Directory用户和计算机”,如图1-84所示。

2)在Computers中找到一个计算机账户,右击并选择“属性”,如图1-85所示。

图1-84 打开Active Directory用户和计算机

图1-85 选择计算机属性

3)在“属性”窗口中选择“安全”选项卡并单击“高级”按钮,如图1-86所示。

4)选择要添加的网络控制器计算账户或组,单击“编辑”按钮,在“属性”中勾选读取和写入servicePrincipalName两项,如图1-87所示。

图1-86 配置“安全”选项卡

图1-87 设置读取和写入servicePrincipalName权限

5)单击“确认”按钮即可确定权限,如图1-88所示。

7.SPN服务查询

在内网域环境中进行信息收集的最好方式是通过SPN扫描。对于红队来讲,通过SPN扫描进行信息收集的方式比通过端口扫描的方式更加隐蔽,因为SPN扫描查询实际上就是对LDAP中存储的内容进行查询,并不会对网络上的每个IP进行端口扫描。而对域控制器发起的LDAP查询是正常Kerberos票据行为中的一部分,其查询操作很难被检测出来,由此以来可以规避端口扫描带来的“风险”,提高红队自身的隐蔽性。以下是通过setspn进行信息收集的常见用法。

图1-88 确认当前权限

1)查看当前域内的所有SPN。

2)查看指定用户或者主机名注册的SPN。

3)查找本域内重复的SPN。

4)删除指定用户或者主机名。 tlhtOLXEGk1EQqKFvF5RT9JNDBrbLrlOkV6I7Lh5E1JO6erHt0x9RkfblAJVDPaB

点击中间区域
呼出菜单
上一章
目录
下一章
×