内网渗透之基础知识

内网渗透系列主要是学习《内网渗透体系建设》的笔记,作为整理和记录。

内网工作环境

工作组和域

工作组(Work Group)是计算机网络的一个概念,也是最常见和最普通的资源管理模式,就是将不同的计算机按照功能或部门分别置于不同的组。

(Domain)是一种比工作组更高级的计算机资源管理模式,既可以用于计算机数量较少的小规模网络环境,也可以用于计算机数量众多的大型网络环境。

在域环境中,所有用户账户、用户组、计算机、打印机和其他安全主体都在一个或多个域控制器的中央数据库中注册。当域用户需要想访问域中的资源时,必须通过域控制器集中进行身份验证。而通过身份验证的域用户对域中的资源拥有什么样的访问权限取决于域用户在域中的身份。

域控制器(Domain Controller,DC)时域环境核心的服务器计算机,用于在域中相应安全身份认证请求,负责允许或拒绝发出请求的主机访问域内资源,以及对用户进行身份验证,存储用户账户信息并执行域的安全策略等。一个域环境可以拥有一台或多台域控制器。

活动目录

活动目录(Active Directory,AD)是指安装在域控制器上,为整个域环境提供集中式目录管理服务的组件。活动目录存储了有关域环境中各种对象的信息,如域、用户、用户组、计算机、组织单位、共享资源、安全策略等。

活动目录提供了计算机集中管理、用户集中管理、资源集中管理、环境集中管理、应用集中管理等功能。

目录数据存储在域控制器的Ntds.dit二进制文件中,文件路径是%SystemRoot%\ntds\ntds.dit。Ntds.dit文件使用存储在系统SYSTEM文件的密钥对这些哈希值进行加密。在非域环境,即工作组环境中,用户的登陆凭据等信息存储在本地SAM文件中。

目录服务与LDAP

活动目录是一种目录服务数据库,区别于关系型数据库,目录数据库实现的是目录服务,是一种可以帮助用户快速、准确的从目录中找到所需要的信息的服务。目录数据库将所有数据组织成一个有层次结构的树状结构,其中的每一个节点是一个对象,有关这个对象的所有信息作为这个对象的属性被存储。用户可以根据对象名称去查找这个对象的有关信息。

LDAP(Lightweight Directory Access Protocol,轻量目录访问协议)是用来访问目录服务数据库的一个协议。活动目录就是利用LDAP名称路径来描述对象在活动目录中的位置的。

一些基本概念:

  1. 目录树:在一个目录数据库中,整个目录中的信息集可以表示为一个目录信息树,书中的每一个节点是一个条目。
  2. 条目:目录数据库中的每个条目就是一条记录。每个条目有自己唯一绝对可辨识名称(DN)。
  3. DN(Distinguish Name,绝对可辨识名称):指向一个LDAP对象的完整路径。DN由对象本体开始,向上延申到域顶级的DNS命名空间。CN代表通用名(Common Name),OU代表组织单位(Organizational Unit),DC代表域组件(Domain Component)。
  4. RDN(Relative Distinguish Name,相对可辨识名称):用于指向一个LDAP对象的相对路径。
  5. 属性:用于描述数据库中每个条目的具体信息。

活动目录分区

活动目录可以支持数以千万计的对象。为了扩大这些对象,微软将活动目录数据库划分为多个分区,以方便进行复制和管理。每个逻辑分区在域林中的域控制器之间分别复制、更改。这些分区被称为上下文命名(Context Name)。
活动目录预定义了域分区、配置分区和架构分区三个分区。

域分区(Domain NC)用于存储与该域有关的对象信息,这些信息是特定于该域的,如该域中的计算机、用户、组、组织单位等信息。在域林中,每个域的域控制器各自拥有一份属于自己的域分区,只会被复制到本域的所有域控制器中。

配置分区(Configuration NC)存储整个域林的主要配置信息,包括有关站点、服务、分区和整个活动目录结构的信息。整个域林共享一份相同的配置分区,会被复制到域林中所有域的控制器上。

架构分区(Schema NC)存储整个域林的架构信息,包括活动目录中的所有类,对象和属性的定义数据。整个域林共享一份相同的架构分区,会被复制到域林中所有域的控制器中。

活动目录的查询

lDAP的按位查询

在LDAP中,有些属性是位属性,它们由一个个位标志构成,不同的位可由不同的数值表示,属性的值为各位值的总和。此时不能再对某属性进行查询,而需要对属性的标志位进行查询。这就是LDAP的按位查询。

1
2
<属性名称>:<BitFilterRule-ID>:=<十进制的位值>
# 其中<BitFilterRule-ID>指的就是位查询规则对应的ID

AdFind是一款C++语言编写的域中信息查询的工具,可以在域中任何一台主机使用。其语法如下:

1
2
3
4
5
Adfind.exe [switches] [-b basedn] [-f filter] [attr list]

# -b 指定一个BaseDN作为查询的根
# -f 为LDAP过滤条件
# attr list为需要显示的属性

例如:

1
2
# 查询hack.com域中所有computer对象,并过滤对象的name和operatingSystem属性
Adfind.exe -b dc=hack, dc=com -f "objectClass=computer" name operatingSystem

域用户域机器用户

域用户,就是域环境中的用户,在域控制器中被创建,并且其所有信息都保存在活动目录中。域用户账户位于域的全局组Domain Users中,而计算机本地账户位于本地User组中。当计算机加入域时,全局组Domain Users会被添加到计算机本地的User组中。因此域用户可以在域中的任何一台计算机上登录。
执行net user /domain可以查看域中的所有域用户。

机器用户其实是一种特殊的域用户。在域环境中,计算机上的本地用户SYSTEM对应域中的机器账户,在域中的用户名就是“机器名+$”。
执行net group "Domain Computers" /domain可以查看域中所有的机器用户。

当获取到一台域中主机的控制权后,发现没有域中用户凭据,此时可以利用一些系统提权方法,将当前用户提升到SYSTEM,以机器账户权限进行域内的操作。

域用户组的分类和权限

在域环境中,为了方便对用户权限进行管理,需要将具有相同权限的用户划分为一组,这样只要对这个用户组赋予了一定的权限,那么该组内的用户就获得了相同的权限。

(Group)是用户账户的集合,按照用途可以分为通讯组和安全组。
通讯组就是一个通讯群组。比如将某个部门所有员工拉进同一个通讯组,当给这个通讯组发送消息时,组内所有成员都可以收到。
安全组是用户权限的集合。

根据组的作用范围,安全组可以分为域本地组、通用组和全局组。
域本地组
域本地组(Domain Local Group),主要用于访问同一个域中的资源。除了本组的用户,域本地组还可以包含域林中的任何一个域和通用组、全局组的用户,但是无法包含其他域中的域本地组。域本地组只能访问本域中的资源,无法访问其他不同域中的资源。

1
2
# 查询所有的域本地组
Adfind.exe -b "dc=hack, dc=com" -bit -f "(&(objectClass=group)(groupType:AND:=4))" cn -dn

常见的系统内置的域本地组机器权限:

  • Administrators:管理员组。
  • Print Operators:打印机操作员组,该组的成员可以管理网络中的打印机,还可以在本地登录和关闭域控制器
  • Backup Operators:备份操作员组,该组的成员可以在域控制器中执行备份和还原操作,还可以在本地登录和关闭域控制器
  • Remote Desktop Users:远程登录组,只有该组的成员才有远程登录服务的权限
  • Account Operators:账号操作员组,该组的成员可以创建和管理域中用户和组,为其设置权限,也可以在本地登录域控制器
  • Server Operators:服务器操作员组,该组的成员可以管理域服务器

通用组
通用组(Universal Group)可以作用于域林的所有域,其成员可以包括域林中任何域的用户账户、全局组和其他通用组,但是无法包含域本地组。通用组可以在域林中的任何域中被指派访问权限,以便于访问所有域中的资源。

1
2
# 查询所有通用组
Adfind.exe -b dc=hack,dc=com -bit -f "(&(objectClass=group)(groupType:AND:=8))" cn -dn

常见的系统内置通用组:

  • Enterprise Admins:组织系统管理员组,该组是域林的根域中的一个组。该组的成员在域林的每个域中都是Administrators组的成员,因此对所有的域控制器都有完全的控制权
  • Schema Admins:架构管理员组,该组是域林根域中的一个组。该组的成员可以修改活动目录,如在架构分区中新增类或属性。

全局组
全局组(Global Group)可以作用于域林的所有域,是介于本地组和通用组的组。全局组只能包含本域的用户。

1
2
# 查询所有的全局组
Adfind.exe -b dc=hack, dc=com -bit -f "(&(ObjectClass=group)(groupType:AND:=2))" cn -dn

常见的系统内置全局组:

  • Domain Admins:域管理员组,该组的成员在所有加入域的服务器上拥有完整的管理员权限
  • Domain Users:域用户组,该组的成员是所有的域用户。在默认情况下,任何新建的用户都是该组的成员
  • Domain Computers:域成员主机组,该组的成员是域中所有的域成员主机,任何新建的计算机账户都是该组的成员
  • Domain Controllers:域控制器组,该组的成员包含域中所有的控制器
  • Domain Guests:域访客用户组
  • Group Policy Creator Owners:新建组策略对象组,该组的成员可以修改域的组策略

访问控制

访问控制是指Windows使用内置授权和访问控制技术,确定经过身份验证的用户是否具有访问资源的正确权限,以控制主体(Principal)操作(读取、写入、删除、更改)对象(Object)的行为是否具有合法权限。

  • 在Windows中,访问主体通常是指安全主体。安全主体是任何可通过操作系统进行身份认证的实体,如用户账户、计算机账户、在计算机活用户账户的安全上下文中运行的线程或进程,以及这些账户的安全组等。
  • 被访问的对象通常指安全对象。可能是文件、文件夹、打印机、注册表项、共享服务、活动目录域服务对象等。
  • 当经过身份验证的安全主体想访问安全对象时,windows会为安全主体创建一个访问令牌(Access Token),其中包含验证过程返回的SID和本地安全策略分配给用户的用户权限列表。
  • 当安全对象被创建时,windows会为其创建一个安全描述符(Security Descriptor)

Windows的访问控制正是将安全主体的访问令牌中的信息安全对象的安全描述符中的访问控制项进行比较做出访问决策的。

Windows访问控制模型

Windows访问控制模型主要由访问令牌(Access Token)和安全描述符(Security Descriptor)两部分构成,分别由访问者和被访问者持有。通过比较访问令牌和安全描述符的内容,Windows可以对访问者是否拥有访问资源对象的能力进行判定。

访问令牌主要包含如下信息:

  • 标识用户账户的SID(Security ID,安全标识)
  • 标识用户所属的组的SID
  • 标识当前登录会话的SID
  • 用户或用户所处的用户组持有的特权列表
  • 标识对象所有者的SID
  • 标识对象所有者组的SID
  • 标识用户主安全组的SID
  • 用户创建安全对象而不指定安全描述符时系统使用的默认DACL(Discretionary Access Control List,自主访问控制列表)
  • 访问令牌的来源
  • 访问令牌的类型,主令牌还是模拟令牌
  • 限制SID的可选列表
  • 当前模拟等级
  • 其他信息

访问控制列表

访问控制列表(ACL)时访问控制项(Acess Control Entry,ACE)的列表。访问控制列表中的每个访问控制项指定了一系列访问权限。

DACL(自主访问控制列表)是安全对象的访问控制策略,其中定义了该安全对象的访问控制策略,用于指定允许或拒绝特定安全主体对该安全对象的访问。DACL是由一条条的访问控制项(ACE)条目构成的,每条ACE定义了哪些用户或组对该用户拥有怎样的访问权限。

SACL(System Access Control List,系统访问控制列表)是安全主体对安全对象的访问行为的审计策略。SACL也由一条条的ACE条目构成,每条ACE定义了对哪些安全主体的哪些访问行为进行日志记录,如对指定用户的访问成功、失败行为进行审计记录日志。安全主体的访问行为满足这条ACE时就会被记录。

使用Icacls查看与修改访问控制列表

lcacls是一种命令行工具,使用icalcs命令可以查看或修改指定文件上的访问控制列表(ACL),并将存储的DACL应用于指定目录的文件。

1
2
# 查看指定文件的ACL
icacls C:\Users\Dar1in9\Desktop\tmp\

icacls可以查询到的权限说明:

  • 简单权限序列:N,无访问权限;F,完全访问权限;M,修改权限;RX,读取和执行权限;R,只读权限;W,只写权限;D,删除权限
  • 在”()”中以”,”分隔的特定权限列表:DE,删除;RC,读取控制;WDAC,写入DAC;WO,写入所有者;S,同步;AS,访问系统安全性;MA,允许的最大值;GR,一般性读取;GW,一般性写入;GE,一般性执行;GA,全为一般性;RD,读取数据/列出目录;WD,写入数据/添加文件;AD,附加数据/添加子目录;REA,读取扩展属性;WEA,写入扩展属性;X,执行/遍历;DC,删除子项;RA,读取属性;WA,写入属性
  • 继承权限可以优先于每种格式,但只应用于目录:OI,对象继承;CI,容器继承;IO,仅继承;NP,不传播继承;I,从父容器继承的权限

常用命令:

1
2
3
4
5
6
7
8
9
10
11
# 将指定目录及子目录的所有文件的ACL备份到AclFile.txt中。  /T 为递归遍历所有子目录
icacls C:\Users\Dar1in9\Desktop\tmp\* /save AclFile.txt /T

# 将AclFile.txt内所有备份的文件ACL还原到指定目录及其子目录
icacls C:\Users\Dar1in9\Desktop\tmp\ /restore AclFile.txt

# 给用户Hacker添加指定文件或目录(及其子目录)的完全访问权限
icacls C:\Users\Dar1in9\Desktop\tmp\ /grant Hacker:(OI)(CI)(F) /t

# 删除用户Hacker对指定文件夹或目录(及其子目录)的完全访问权限
icacls C:\Users\Dar1in9\Desktop\tmp\ /remove /t
文章作者: Dar1in9
文章链接: http://dar1in9s.github.io/2023/04/01/内网渗透/基础知识/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dar1in9's Blog