# LDAP篇

## LDAP篇

### 简介

#### LDAP

```
1.LDAP是轻量目录访问协议，是用来访问目录数据库的协议
2.目录数据库是有目录服务数据库何一套访问协议组成
3.目录数据库有以下特点
	1.它是树状结构组织数据，雷素与文件目录
	2.是为了查询，浏览，搜索而优化的数据库，写的能力较差，不支持事务处理，回滚等功能
4.类和继承
	1.域内每个条目都是类的实例。而类是一组属性的集合
	2.类是可继承的。子类继承父类的所有属性，Top类是所有类的父类
	类有三种类型：
		1.结构类
			结构类规定了对象实例的基本属性，每个条目属于且仅属于一个结构型对象类
		2.抽象类
			抽象类型是结构类或其他抽象类的父类,它将对象属性中公共部分组织在一起,没有实例
		3.辅助类
			辅助类型规定了对象实体的扩展属性
```

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FvXZB5DJ8uc9XiR77rHnw%2Ft01781f2de2d2707237.png?alt=media&#x26;token=85ea34c8-fb0a-4ff2-89a0-8c5274bdb846" alt=""><figcaption></figcaption></figure>

```
上图就是一个目录服务数据库，成树状
一些基本概念：
1.目录树：整个目录信息集都可以表示为一个目录信息树，树的每个阶段就是一个条目
2.条目：每个条目就是一个记录，它都有唯一可区别的名称(DN)，每个圈就是一个条目
3.DN:uid=bob,ou=people,dc=acme,dc=org。类似于文件目录的相对路径绝对路径，他除了有个DN之外，还有个RDN，比如uid=bob,ou=people,dc=acme,dc=org，RDN就是uid=bob
4.属性：描述条目的具体信息
```

#### AD

```
1.AD是目录服务数据库的实现，LDAP是访问AD的协议
2.访问AD
	1.域内每个域控都有完整的本域AD，可通过理解域控的389/636(636是LDAPS)端口连接查看
	2.通过GC(全局编录服务器，保存林中所有域的所有对象的属性)搜索，连接域控的3268/3269端口
3.一个林中有若干个域，域内也有若干个域控，如果不隔离数据到多个分区，每台域控就会复制林中所有数据，隔离分区后就可以选择性的复制某几个分区数据。微软将Active Directory划分为若干个分区(称为Naming Context，简称NC)，每个Naming Context都有其自己的安全边界
4.Active Directory预定义了三个Naming Context：
	1.Configuration NC(Configuration NC)
	2.Schema NC(Schema NC)
	3.Domain NC(DomainName NC)
```

#### Naming Context

```
Configuration NC(Configuration NC)
配置NC,林配置信息的主要存储库，包含有关站点，服务，分区和Active DirectorySchema 的信息，并被复制到林中的每个域控制器。配置NC的根位于配置容器中，该容器是林根域的子容器。例如，test.local林将为CN=Configuration,DC=test,DC=local
该NC的顶级容器：
CN=DisplaySpecifiers
定义了Active Directory管理单元的各种显示格式

CN=Extended-Rights
扩展权限对象的容器，我们将在域内ACL那篇文章里面详解

CN=ForestUpdates
包含用于表示森林状态和与域功能级别更改的对象

CN=Partitions
包含每个Naming Context，Application Partitions以及外部LDAP目录引用的对象

CN=Physical Locations
包含位置对象，可以将其与其他对象关联 以表示该对象的位置。

CN=Services
存储有关服务的配置信息，比如文件复制服务

CN=Sites
包含所有站点拓扑和复制对象

CN=WellKnown Security Principals
包含常用的外部安全性主题的对象，比如Anonymous，Authenticated Users，Everyone等等
```

```
Schema NC(Schema NC)
包含Schema 信息，该Schema 信息定义Active Directory中使用的类，对象和属性。与域NC和配置 NC 不同，模式 NC 不维护容器或组织单位的层次结构。相反，它是具有 classSchema ，attributeSchema 和 subSchema 对象的单个容器。
```

```
Domain NC(DomainName NC)
每个域都有一个域Naming Context，不同的域内有不同的域Naming Context，其中包含特定于域的数据。这个域Naming Context(的根由域的专有名称(DN)表示，比如corp.test.local域的DN将为dc=corp,dc=test,dc=local
该NC的顶级容器：
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
用户和组对象的默认容器
```

#### Application Partitions

```
从 Windows Server 2003 开始，微软允许用户自定义分区来扩展Naming Context的概念。Application Partitions其实就是Naming Context的一个扩展，它本质上还是属于Naming Context
Application Partitions主要有以下特点:
1.如果用户想要定义一个分区，可以通过Application Partitions
2.Application Partitions可以存储动态对象。动态对象是具有生存时间(TTL) 值的对象，该值确定它们在被Active Directory自动删除之前将存在多长时间
```

#### 搜索AD

查询目录指定的两个要素

* BaseDN
* 过滤规则

**BaseDN**

```
BaseDN指定了这棵树的根
比如指定BaseDN为DC=test,DC=local就是以DC=test,DC=local为根往下搜索
```

**过滤规则**

```
LDAP 搜索过滤器语法有以下子集：
用与号 (&) 表示的 AND 运算符
用竖线 (|) 表示的 OR 运算符
用感叹号 (!) 表示的 NOT 运算符
用名称和值表达式的等号 (=) 表示的相等比较
用名称和值表达式中值的开头或结尾处的星号 (*) 表示的通配符
```

**搜索**

```
使用adfind实现ldap查询，列如
查询域用户
Adfind.exe -b dc=ice,dc=com -f "(&(objectCategory=person)(objectClass=user))" -dn
```

### 组和OU

#### 组

组分为通讯组和安全组，但是重要的还是安全组

安全组是权限的集合，我们可以对某个组配置权限，然后把对于用户拉进该组就拥有了该权限

安全组分为：

* 全局组 (Global group)
* 通用组(Universal group)
* 域本地组(Domain Local group)

| 组类型  | 可以授予权限            | 可包含                                                             | 可包含于                                              | 成员是否在全局编录复制 |
| ---- | ----------------- | --------------------------------------------------------------- | ------------------------------------------------- | ----------- |
| 全局组  | 在同一林中或信任域或林中的任何域上 | 来自同一域的帐户。 来自同一域的其他全局组                                           | 来自同一林中任何域的通用组。 来自同一域的其他全局组。 来自同一林中任何域或任何信任域的域本地组。 | 无           |
| 通用组  | 在同一林或信任林中的任何域上    | 来自同一林中任何域的帐户。 来自同一林中任何域的全局组。 来自同一林中任何域的其他通用组。                   | 同一林中的其他通用组。 在同一个林或信任林中域本地组。                       | 是           |
| 域本地组 | 在同一个域中            | 来自任何域或任何受信任域的帐户。 来自任何域或任何受信任域的全局组。 来自同一林中任何域的通用组。 来自同一域的其他域本地组。 | 来自同一域的其他域本地组。                                     | 无           |

**常见域本地组**

* Administrator：管理员组，该组可以不受限制的访问域中资源，是域林强大的服务管理组
* Print Operators：打印机操作组员，该组可以管理网络中的打印机，还可以**在本地登录和关闭域控制器**
* Backup Operators：备份操作组，该组可以在域控制器中国执行备份和还原，还可以**在本地登录和关闭域控制器**
* Remote Desktop Users：远程登录组，只有该组成员才可以有远程登录服务权限
* Account Operators：服务器操作组员，该组的成员可以**管理域服务器**

`adfind.exe -b "dc=ice,dc=com" -bit -f "(&(objectClass=group)(grouptype:AND:=4))" cn -dn`来查找域本地组

**常见通用组**

* Enterprise Admins：组织系统管理员组，是域林中的根域的一个组，该组的成员在每个域中都是Administrator组的成员，因此**对所有域控制器都有完全控制权限**
* Schema Admins：架构管理员组，，是域森林的根域中的一个组，该组**可以修改活动目录**

`adfind.exe -b "dc=ice,dc=com" -bit -f "(&(objectClass=group)(grouptype:AND:=8))" cn -dn`来查找通用组

**常见全局组**

* Domain Admins：域管理员组，该组成员在所有加入域的服务器上拥有完整的管理员权限，该组会默认加入域中每台计算机的本地Administrator组中，所有获得所有计算机的控制权
* Domain Users：域用户组，默认情况所有新建域用户都是该组成员
* Domain Computers：域成员主机组，该组成员包含域中所有主机，任何新建的计算机账户都是该组成员
* Domaim Controllers：域控制器组，该组成员包含域中所有域控制器
* Domain Guests：域访客用户组，该组的成员默认为域访客用户
* Group Policy Creator Owners：薛佳凝组策略对象组，该主机成员可以修改域的组策略

`adfind.exe -b "dc=ice,dc=com" -bit -f "(&(objectClass=group)(grouptype:AND:=2))" cn -dn`来查找通用组

**AGDLP策略**

A表示用户账号，Account

G表示全局组，Global group

U表示通用组，Universal Group

L表示本地组， local group

DL表示域本地组，Domain local group

P表示资源权限，Resource Permissions

常见的权限划分方式

* AGP，将用户账户添加到全局组，然后赋予全局组权限
* AGLP，将用户账户添加到全局组，将全局组添加到本地组， 然后赋予本地组权限
* ADLP 将用户账户添加到域本地组，然后赋予域本地组权限
* AGDLP，将用户账户添加到全局组，将全局组添加到域本地组， 然后赋予域本地组权限
* AGUDLP，将用户账户添加到全局组，将全局组添加到通用组，将通用组添加到域本地组， 然后赋予域本地组权限

#### OU

组织单位(Organization Unit)，简称OU，是一个容器对象，将域中的对象组织成逻辑组，帮助网络管理员简化管理组。组织单位包含下列类型的对象：用户，计算机，工作组，打印机，安全策略，其他组织单位等。可以在组织单位基础上部署组策略，统一管理组织单位中的域对象

组是权限的集合，OU是管理对象的集合，两者不同

组织单位可以添加组策略之后还可以在组织单位里面新建用户，组，计算机等等

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FGpky8snrH3XyvFoBNHmu%2Fasvbaiuvasuivgauisfgasigfasif.png?alt=media&#x26;token=8a727840-f74b-415d-8451-f1175c55b0aa" alt=""><figcaption></figcaption></figure>

### 域用户

#### 域用户

```
1.域用户账户位于域的全局组 Domain Users 中，计算机本地用户在本地的Users组中，使用 net localgroup users 可查看
2.计算机加入域后，全局组Domain Users 会被添加到本地计算机的Users组，所以可以在任何加入域的普通计算机上登录任何域用户，可以查询指定域用户能够登录的主机
Adfind.exe -b dc=ice,dc=com -sc u:username userWorkstations
3.机器用户是特殊的域用户，但是域用户有点机器用户都有，机器用户是本地用户SYSTEM，在域中是"机器名+$"
```

**查询域用户**

```
net user /domain
or
adfind.exe -b dc=ice,dc=com -f "(&(objectCategory=person)(objectClass=user))" -dn
```

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2F3uK6mNlkmJ47fn0wjCRE%2Ft014df9519f018df4a7.png?alt=media&#x26;token=7f3415ba-79bd-40cb-bf90-c7a4fa1c264b" alt=""><figcaption></figcaption></figure>

![](D:%5Cphpstudy_pro%5CWWW%5Cwww%5C%E5%9B%BE%E7%89%87%5Ct014df9519f018df4a7.png)

可以根据上面的userAccountControl字段查询不同的用户例如查询密码不过期的用户：

`Adfind.exe -b dc=ice,dc=com -f "(userAccountControl:AND:=65536)" -bit -dn`

查询设置了约束委派的用户：

`Adfind.exe -b dc=ice,dc=com -f "(userAccountControl:AND:=524288)" -bit -dn`

**查询机器用户**

查询域内所有机器：

`Adfind.exe -b dc=ice,dc=com -f "(objectclass=Computer)" -dn`

#### 本地账户

**管理员(Administrators)**

```
每台计算机都有一个管理员账户,管理员账户是在 Windows 安装过程中创建的第一个账户。

管理员帐户可以完全控制本地计算机上的文件、目录、服务和其他资源。管理员帐户可以创建其他本地用户、分配用户权限和分配权限。

默认管理员帐户无法删除或锁定，但可以重命名或禁用。

在 Windows 10和 Windows Server 2016中，Windows 安装程序禁用内置管理员账户并创建另一个本地账户，该账户是管理员组的成员
```

**默认本地系统账户(SYSTEM)**

```
SYSTEM 账户由操作系统和在 Windows下运行的服务使用。Windows 操作系统中有许多服务和进程需要能够在内部登录，例如在 Windows 安装期间。

SYSTEM 账户就是为此目的而设计的。它是一个内部帐户，不会显示在用户管理器中，并且无法添加到任何组中。

默认情况下，SYSTEM 账户被授予对 NTFS 卷上所有文件的完全控制权限。因此 SYSTEM 账户包含管理员账户所具有的功能和权限
```

**网络服务账户**

```
NETWORK SERVICE 是服务控制管理器( SCM )使用的预定义本地账户, 以这个账户运行的服务，允许把访问凭据提交给远程的计算机
```

**本地服务账户**

```
LOCAL SERVICE 账户是服务控制管理器使用的预定义本地账户,它在本地计算机上具有最低权限，并在网络上提供匿名凭据。

类似于Sqlserver、IIS等都属于本地服务账户，本地服务账户具有 SeImpersonatePrivilege 这个特殊访问权限,至于为何强调该权限，下一篇会展开叙述
```

**TrustedInstaller**

```
从Windows vista开始内置了一个TrustedInstaller安全主体，拥有修改系统权限，专用于系统维护，更新等操作，它以一个账户组的形式出现，即NT SERVICE\TrustedInstaller
```

#### 其他搜索用户的命令

```
查询域用户
net user /domain
or
Adfind.exe -b dc=ice,dc=com -f "(&(objectCategory=person)(objectClass=user))" -dn

查询所有机器
Adfind.exe -b dc=ice,dc=com -f "(objectclass=Computer)" -dn
-sc computers_disabled    # 查询已禁用的计算机
-sc computers_pwdnotreqd    # 查询不需要设置密码的计算机
-sc computers_active    # 查询已启用且最后输入密码的计算机
-sc computers_inactive    # 查询已被禁用或密码最后设置的计算机
例如 Adfind.exe -b dc=ice,dc=com -sc computers_pwdnotreqd -dn

查询指定域用户能够登录的主机
Adfind.exe -b dc=ice,dc=com -sc u:username userWorkstations  #改username何dc部分

查询设置了约束委派的用户
Adfind.exe -b dc=ice,dc=com -f "(userAccountControl:AND:=524288)" -bit -dn

查询所有域控
Adfind.exe -b "OU=Domain Controllers,DC=ice,DC=com" -f "(objectclass=Computer)" -dn

查询机器上正在登录的域用户
PVEFindADUser.exe -current  #查询所有主机是的域用户，可以使用-target ace.ice.com来指定查询主机
psloggedon.exe \\DC   #查询dc上登录的用户 \\机器名

查询域用户正在登录的主机
PVEFindADUser.exe -current   
psloggedon.exe ice\administrator   

查询域用户登陆过的主机
1.导出日志，需要域管权限
wevtutil epl Security C:\Users\Administrator\Desktop\1.evtx /q:"*[System[(EventID=4624)] and EventData[Data[@Name='LogonType']='3']]"
2.使用LogParser提取日志
LogParser.exe -i:EVT -o:CSV "SELECT TO_UPPERCASE(EXTRACT_TOKEN(Strings,5,'|')) as USERNAME,TO_UPPERCASE(EXTRACT_TOKEN(Strings,18,'|')) as SOURCE_IP FROM 1.evtx" >log.csv
```

```
查询用户创建时间
Adfind.exe -b "CN=username,CN=Users,DC=ice,DC=com" whenCreated   #修改username部分

查询用户设置密码对应时间
Adfind.exe -b "CN=username,CN=Users,DC=ice,DC=com" pwdLastSet

查询用户上次登录时间
Adfind.exe -b "CN=username,CN=Users,DC=ice,DC=com" Lastlogon

查询密码永不过期的用户
Adfind.exe -b dc=ice,dc=com -f "(userAccountControl:AND:=65536)" -bit -dn

```

```
工具
https://learn.microsoft.com/en-us/sysinternals/downloads/psloggedon
https://github.com/chrisdee/Tools/tree/master/AD/ADFindUsersLoggedOn
https://softpedia-secure-download.com/dl/80904aa9b13beded7c6ad20d6f2b57d5/635235d1/100082096/software/programming/AdFind.zip
```

### 域权限

#### Windows访问控制模型

主要有两部分组成

* 访问令牌，包含用户的标识(User SID,Group SID**S**)，特权列表
* 安全描述符，包含被访问的安全对象的相关安全信息，安全描述符可以包含以下安全信息：
  * 对象所有者和主组[的安全标识符](https://learn.microsoft.com/zh-cn/windows/win32/secauthz/security-identifiers) (SID) 。
  * 指定允许或拒绝特定用户或组的访问权限的 [DACL](https://learn.microsoft.com/zh-cn/windows/win32/secauthz/access-control-lists) 。
  * 一个 [SACL](https://learn.microsoft.com/zh-cn/windows/win32/secauthz/access-control-lists) ，指定为对象生成审核记录的访问尝试的类型。
  * 一组控制位，用于限定安全描述符或其单个成员的含义。

**文件访问权限**

使用icacls查看的文件权限有下面几种

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FSj52JJZBITTlI83lOoaj%2Fsahfuasivbq2ws.png?alt=media&#x26;token=3f8a5daa-28e0-4e21-83ec-ce44c6ed5960" alt=""><figcaption></figcaption></figure>

简单权限序列 (基本权限) ：

* **F** - 完全访问权限
* **M**- 修改访问权限
* **RX** - 读取和执行访问权限
* **R** - 只读访问权限
* **W** - 仅写访问权限

特定权限的括号中的逗号分隔列表 (高级权限) ：

* **D** - 删除
* **RC** - 读取控制 (读取权限)
* **WDAC** - 写入 DAC (更改权限)
* **WO** - 写入所有者 (获取所有权)
* **S** - 同步
* **AS** - 访问系统安全性
* **MA** - 允许的最大数量
* **GR** - 泛型读取
* **GW** - 泛型写入
* **GE** - 泛型执行
* **GA** - 全部通用
* **RD** - 读取数据/列表目录
* **WD** - 写入数据/添加文件
* **AD** - 追加数据/添加子目录
* **REA** - 读取扩展属性
* **WEA** - 编写扩展属性
* **X** - 执行/遍历
* **DC** - 删除子级
* **RA** - 读取属性
* **WA** - 写入属性

[icacls命令行参考](https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/icacls)

**访问令牌**

```
1.访问令牌是描述进程或线程安全上下文的对象，包含与进程或线程关联的用户账户的标识和特权等信息

2.系统使用访问令牌来控制用户可以访问的安全对象，不限制用户执行相关操作系统的能力

3.Windows中的令牌分为主令牌(Primary Token)和模拟令牌(Impersonation Token)

4.主令牌与进程相关，默认情况下，当进程的线程与安全对象交互时，系统使用主令牌。线程可以模拟客户端用户。

5.模拟是指线程在安全对象上下文执行能力，并且该上下文不同于拥有该线程的进程上下文。当线程模拟模拟客户端时，模拟线程将拥有主令牌和模拟令牌，可以理解为线程可以以客户端身份和服务端交互且是有模拟客户端权限

6.当用户注销后，系统将会使主令牌切换为模拟令牌，而模拟令牌不会被清除，只有在重启机器后才会清除
```

**令牌的组成主要有如下部分:**

* TokenID (标识 token 的唯一ID)
* Privileges (当前 token 的权限，具体可查看官方文档)
* UserAndGroups (当前用户及所属的组，实际是一个 SID 数组)
* RestrictedSids (如果该值不为空，则表示令牌属于受限令牌，同样是一个 SID 数组)
* TokenType (当前令牌的类型)
* ImpersonationLevel (模拟令牌的等级)

**令牌创建：**

```
使用凭据(用户密码)进行认证
登录  Session  创建
Windows  返回用户 sid 和用户组  sid
LSA(Local Security Authority)创建一个  Token
依据该 token  创建进程、线程(如果 CreaetProcess 时，自己指定了 Token, LSA会用该 Token， 否则就继承父进程  Token 进行运行)
```

**令牌模拟等级**

模拟等级通过如下所示的 SECURITY\_IMPERSONATION\_LEVEL 枚举表示

```
typedef enum _SECURITY_IMPERSONATION_LEVEL {
SecurityAnonymous,
SecurityIdentification,
SecurityImpersonation,
SecurityDelegation
} SECURITY_IMPERSON
```

| 模拟级别                   | 说明                               |
| ---------------------- | -------------------------------- |
| SecurityAnonymous      | 无法获取有关客户端的标识信息且无法模拟客户端；          |
| SecurityIdentification | 可以获取有关客户端的信息（如安全标识符和特权）但是无法模拟客户端 |
| SecurityImpersonation  | 可以在本地模拟客户端但无法在远程系统上模拟客户端         |
| SecurityDelegation     | 可以在本地和远程系统上模拟客户端                 |

三个通过用户身份创建进程的函数:

| 函数                     | 需要特权                                                   | 输入        |
| ---------------------- | ------------------------------------------------------ | --------- |
| CreateProcessWithLogon | null                                                   | 域/用户名/密码  |
| CreateProcessWithToken | SeImpersonatePrivilege                                 | Primary令牌 |
| CreateProcessAsUser    | SeAssignPrimaryTokenPrivilege和SeIncreaseQuotaPrivilege | Primary令牌 |

从这三个 Win API 中我们可以很容易的发现，当拥有 SeAssignPrimaryTokenPrivilege和或者SeImpersonatePrivilege权限时，我们可以通过模拟 Primary 令牌的方式来创建新进程从而提升权限，换句话说只有当令牌级别具有 SecurityImpersonation和 SecurityDelegation级别的时候才可以进行模拟，因此如果想通过**模拟令牌**的方式来进行提权，一个非常重要的前提就是用户具有 SeImpersonatePrivilege权限。

**SID**

安全标识符（Security Identifiers，SID），是标识用户、组和计算机帐户的唯一的号码。每个账户都有一个由权威机构（例如 Windows 域控制器）颁发的唯一 SID，并存储在安全数据库中。每次用户登录时，系统都会从数据库中检索该用户的 SID，并将其放在该用户的访问令牌中。在与 Windows 安全性相关的所有后续交互中，系统使用访问令牌中的 SID 识别用户。当 SID 用作用户或组的唯一标识符时，就不能再使用它来标识另一个用户或组

**常见SID列表**

* S-1-5-18 (LocalSystem)
* S-1-5-19 (LocalService)
* S-1-5-20 (NetworkService)
* S-1-5-32-544 (Administrators)
* S-1-5-32-545 (Users)
* S-1-5-32-550 (PrintOperators)

[常见sid](https://learn.microsoft.com/zh-cn/windows/win32/secauthz/well-known-sids)

SID简化：

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FE6jlU7SqGnkv7iF2NnDa%2F%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220729200616.png?alt=media&#x26;token=d0e8d41a-26aa-447a-aaf8-cd6209bb4c24" alt=""><figcaption></figcaption></figure>

![](D:%5Cphpstudy_pro%5CWWW%5Cwww%5C%E5%9B%BE%E7%89%87%5C%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220729200616.png)

第一位 S 是默认位，第二位 R 代表 SID 版本号，第三位 A 代表主标识值，后面的SA 则代表子标识值，其中 SA1 到 SAn-1代表域相关的标识值， SAn （最后一个）则是 RID(relative identifier)，代表相对标识值

针对 S-1-5-21-1004336348-1177238915-682003330-512进行解析，可以知道

* SID 的版本号是 1
* 主标识值是 5，代表 NT 权限
* 域相关的子标识值是 21-1004336348-1177238915-682003330
* RID 是 512，代表 DomainAdmins

可以使用 windbg 来查看进程的 Token，Token 中包含了用户 SID 以及所属组SID的信息

**ACL**

**ACL主要作用：**

1.访问权限控制 --能不能访问安全对象

2.日志记录功能 --访问是否成功

**ACL包括DACL和SACL**

```
DACL
判断用户是否能访问安全对象，其有若干个ACE组成
注:DACL就是ACE链表,一种数据结构,每一个节点存放着访问权限等信息(这种链表查找起来比数组快)来决定是否赋予访问权限。如果对象没有DACL,系统赋予完全的访问权限

SACL
记录访问日志
```

**ACE**

```
ACE 是ACL 中的访问控制实体，一个 ACL 可能包含0到多个 ACE
ACE记录了四个方面：
  谁对你有权限
  是允许还是拒绝
  有什么权限（通用权限，对某个属性的权限，扩展权限）
  这个权限能不能被继承 （CN=it-1可以继承）
```

当访问文件时系统做出判断

1. 如果没有 DACL，系统将允许访问
2. 如果存在 DACL，但没有 ACE，系统将拒绝所有访问
3. 如果存在 DACL，也存在 ACE，那么会按照每个 ACE 指定允许或拒绝

windbg 中启动内核调试,使用!sd 可以查看安全描述符信息

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FzpIg5OgXp5eSzgXuPnEK%2F%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20220729214749.png?alt=media&#x26;token=ffab1f99-441f-49bd-9c4a-9de09407e713" alt=""><figcaption></figcaption></figure>

可以看到该 DACL 存在3个 ACE，ACE 的类型为 ACCESS\_ALLOWED\_ACE\_TYPE，Mask 是权限掩码，用来指定对应的权限

**可利用权限**

**对某些属性的WriteProperty ，有以下属性**

* member(bf9679c0-0de6-11d0-a285-00aa003049e2)
* servicePrincipalName(28630EBB-41D5-11D1-A9C1-0000F80367C1)
* GPC-File-Sys-Path(f30e3bc1-9ff0-11d1-b603-0000f80367c1)

**扩展权限有**

* User-Force-Change-Password(0299570-246d-11d0-a768-00aa006e0529)

  可以在不知道当前目标用户的密码的情况下更改目标用户的密码
* DS-Replication-Get-Changes(1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) 和 DS-Replication-Get-Changes-All(1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)

  对域对象具有这两个扩展权限的用户具备dcsync 权限

**通用权限有**

* WriteDacl
* AllExtendedRights
* WriteOwner
* GenericWrite
* GenericAll
* Full Control

**AddMembers**

可以将任意用户，组或计算机添加到目标组

**servicePrincipalName**

将一个对象写入spn

**GPC-File-Sys-Path**

这个是一个跟组策略有关的属性，GPC-File-Sys-Path这个属性，这个属性将GPO与GPT链接起来，GPT是组策略具体的策略配置信息，其位于域控制器的SYSVOL共享目录下，如果我们能够控制GPC-File-Sys-Path的话，可以将ad活动目录里面的gpo指向我们自定义的GPT，而GPT里面包含的是组策略具体的策略配置信息，也就是说我们可以修改组策略配置信息的内容

**User-Force-Change-Password**

可以在不知道当前目标用户的密码的情况下更改目标用户的密码

**DS-Replication-Get-Changes**

对域对象具有这两个扩展权限的用户具备dcsync 权限

**WriteDACL**

将新ACE写入目标对象的DACL的功能。可以向目标对象DACL写入新的ACE，从而使攻击者可以“完全控制”目标对象

**AllExtendedRights**

所有扩展权限。比如，User-Force-Change-Password权限

**WriteOwner**

这个权限这个修改Owner为自己

而Owner 默认拥有WriteDacl 和 RIGHT\_READ\_CONTROL权限

**GenericWrite**

可以修改所有参数，因此包括对某些属性的WriteProperty，比如member。

**GenericAll**

这包括writeDacl和WriteOwner，WRITE\_PROPERTY等权限

**Full Control**

这个权限就具备以上所有的权限

**AdminSDHolder**

AdminSDHolder是位于Active Directory中的系统分区（CN=AdminSDHolder,CN=System,DC=test,DC=loca）中的一个对象

这个的作用就是，他会作为域内某些特权组的安全模版。所谓安全模版，就是说有一个进程(SDProp),每隔60分钟运行一次，将这个对象的ACL复制到某些特权组成员的对象的ACL里面去\*\*（可用做后门）\*\*。 这些特权组和用户默认有 `Account Operators Administrator Administrators` `Backup Operators Domain Admins Domain Controllers Enterprise Admins` `Krbtgt Print Operators` `Read-only Domain Controllers` `Replicator Schema Admins` `Server Operators`

默认这个时间是60分钟是可以更改的，通过更改注册表项

`HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\AdminSDProtectFrequency`

属性adminCount在Active Directory中标记特权组和用户，对于特权组和用户，该属性将设置为1。一旦用户从特权组中删除，他们仍将adminCount值保持为1，但Active Directory不再将其视为受保护的对象。因此通过admincount=1匹配到的所有对象（`adfind -f "admincount=1" -dn`），不一定都是特权组

**UAC**

**UAC**

```
1.用户账户控制(UAC)是Windows操作系统采用的一种控制机制，可以阻止自动安装未授权的应用
2.用户账户控制使应用程序和任务始终再非管理员账户的安全上下文中运行，除非管理员特别授权
3.开启用户账户控制后，每个需要使用管理员访问令牌的应用必须得到同意
4.UAC限制所有用户，包括管理员(除了RID为500的管理员也就是Administrator)
5.非Administrator用户登录之后要执行高权限任务时，会弹窗提示用户基于批准
6.bypass UAC就是将非Administrator的管理员用户不需要批准获得全部管理权限
```

**需要UAC的授权才能进行的操作**

```
配置Windows upadte
增加删除账户
更改账户类型
安装ActiveX
安装卸载程序
安装设备去掉程序
将文件移动复制到program files或Windows目录
查看其他用户的文件夹
```

**UAC设置**

```
1.始终通知
2.仅在程序试图更改我的计算机时通知我(默认设置)
3.仅在程序试图更改我的计算机时通知我(不降低桌面亮度)
4.从不提示(当用户以系统管理员时所有程序都会以最高权限运行)
```

### 组策略

组策略可以控制用户帐户和计算机帐户的工作环境。他提供了操作系统、应用程序和活动目录中用户设置的集中化管理和配置。有本机组策略和域的组策略。本机组策略用于计算机管理员统一管理本机以及所有用户，域内的组策略用于域管统一管理域内的所有计算机以及域用户，通过运行`gpedit.msc`打开本地组策略，`gpmc.msc`打开域组策略。

组策略包括但不限于：

* 账户策略的配置，如账户的密码长度，复杂程度，使用期限，账户锁定策略等等
* 脚本的配置：如登录与注销，启动与关机脚本设置
* 应用程序的安装与删除
* 文件重定向
* 限制访问可移动存储设备
* 用户工作环境配置
* 其他系统设置

#### 组策略对象

组策略对象(GPO)即组策略设置集合，其中包含应用于特点用户或计算机的策略信息和具体配置。在设置组策略时，只需要将组策略对象链接到指定的站点，域和组织单位，其中的策略值便会应用到该站点，域和组织单位的所有用户和计算机

组策略对象包括组策略容器(GPC)和组策略模板(GPT)组成

组策略容器存储在活动目录的域分区，组策略模板被存放在域控制器下的如下文件夹`%SYSTEMROOT%\SYSVOL\sysvol\域名\Policies`

**Default Domain Policy**

默认组策略对象，应用到其所在域的所有用户和计算机

**Default Domain Controller Policy**

默认组策略对象，应用到`Domain Controllers`中所有用户和计算机

**组策略容器（GPO）**

组策略容器(GPC)记录着该组策略对象的策略名称，标识组策略的GUID，组策略链接到哪个作用域，组策略模板路径，组策略版本信息等数据

组策略容器位于LDAP数据库中的“CN=Policies, CN=System, DC=<域名>, DC=com” ，该节点下是以GUID命名的各个组策略容器

运行`adsiedit.msc`打开ADSI编辑器，链接之后找到该路径

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2Fi2zcfFxmYN312294Q1bV%2Fsadsaasdasd13515.png?alt=media&#x26;token=9347e617-69ae-4107-b8d2-9585d6473497" alt=""><figcaption></figcaption></figure>

右击点开某一个属性

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FrBrwqEwCVgjDWVcfpuWV%2Fsadguasigd.png?alt=media&#x26;token=aaf768b8-d1cc-4f73-8d4f-3cf1361956b2" alt=""><figcaption></figcaption></figure>

有几个重要的属性

* displayname:组策略的可读名称
* gPCFileSysPath：组策略模板（GPT）所在的具体路径，即客户端查找具体的配置信息的物理路径，位于域控的SYSVOL共享中
* gPCMachineExtensionNames：客户端执行该组策略所需的客户端扩展程序

当某个对象应用了某个指定的组策略，该对象的gPLink属性及那个包含指向该组策略的完整DN

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2F78HV3J6fvcVZfLF4Y9hi%2Fsafguiasgfiuas2.png?alt=media&#x26;token=b6355bc1-ca7a-465b-adcb-f5e91dd96cb1" alt=""><figcaption></figcaption></figure>

`[LDAP://CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=fbi,DC=gov;0]`

最后的0或者1表示该条策略应用时是否强制，0表示非强制，1表示强制

**组策略模板（GPT）**

组策略模板是组策略具体的策略配置信息

主要涉及两个文件夹：

* SYSVOL目录是AD域中的一个共享文件夹，在AD活动目录安装时创建。通常用来存放组策略数据和 一些脚本 配置文件，这些策略和脚本将用于传递给域成员机器。
  * 域控机器之间要自动同步域数据，SYSVOL文档允许该域内的所有DC机之间进行复制，并且所有的AD用户都可以访问它
  * 域中用户登录计算机会首先在SYSVOL文件查找GPO和启动脚本
  * 该目录由于针对的是域内所有机器和用户，所以域内中的合法用户均可以访问和执行该目录的文件
  * NETLOGON目录的挂载点位于SYSVOL\domain\SCRIPTS，主要存放的是一些脚本信息，是AD活动目录安装时候自动创建的，是在sysvol下面的一个子目录文件夹
*

```
<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FmPYHtpjK0B3oxzk1Vzm9%2Fsavnibasiofbas.png?alt=media&#x26;token=af3c7413-07d9-4b8a-bfc1-1f953a022406" alt=""><figcaption></figcaption></figure>
```

* GPT位于SYSVOL共享下的DOMAIN\_NAME\Policies目录下的各个GUID文件夹内，GPT在SYSVOL共享中以容器的形式组织目录结构，以GUID标识为目录名的各个组策略配置目录包含以下内容
  * **Macheine目录**：包含针对计算机的策略配置
  * **User目录**：包含针对用户的策略配置
  * **gpt.ini文件**：该组策略对象的一些配置信息（如版本信息、策略名称）

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FwZABfVntF9qGthcVqIFw%2Fasfbsiafbiasfbasoifbasbfasfb.png?alt=media&#x26;token=5fbcf2be-7d52-4578-a7c5-21c1c3de4d0f" alt=""><figcaption></figcaption></figure>

#### 创建组策略

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FDbeeYC8w95hTyIaOZvdr%2Fsafbiasobviasobvasoibva.png?alt=media&#x26;token=701beaff-583c-4693-9c68-31aeee2b9fc1" alt=""><figcaption></figcaption></figure>

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FOFgLxjgOLQKMjllXWGLo%2Fsdgdgdsdsggsdgdgsdgsd.png?alt=media&#x26;token=6e0f370d-fc9e-4bd9-9a8b-14eb7ae4e166" alt=""><figcaption></figcaption></figure>

选择某组织单位(OU)，右击选择，链接创建的GPO

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FTTOrQsHGGjMoL11at0Lw%2Fzxcmxzlvmad.png?alt=media&#x26;token=1e24cf30-d680-4a63-9d65-25bac3f6c021" alt=""><figcaption></figcaption></figure>

链接成功

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2F3QCKtYafXNFNsQGtB69g%2Fasbvuaibiu12qbwfas.png?alt=media&#x26;token=7678cdc1-5aec-4f5c-8628-bcf3272bacc6" alt=""><figcaption></figcaption></figure>

右击该策略点击编辑即可配置该组策略

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2F7iXSbDx6L9PdsdtU5kQY%2Fasvbaiasbvoiasvnoidfboi.png?alt=media&#x26;token=e58ed4a1-d824-46be-9a3a-ba4cb00698ed" alt=""><figcaption></figcaption></figure>

#### 组策略相关的ACL

拥有(WriteDacl，WriteOwner，GenericWrite，GenericAll，Full Control)这 些权限，都包括了对某个属性的WriteProperty

**创建GPO的权限**

对`CN=Policies,CN=System,<BaseDn>`具备CreateChild的权限

```
adfind.exe -b CN=Policies,CN=System,DC=fbi,DC=gov -sddl+++ -s base -sdna -sddlfilter ;;"CR CHILD";;;
```

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FEtSNnraPFrlo2tTdAxXQ%2Fasfuiscvbzxjkndbsu.png?alt=media&#x26;token=48c63e21-2db6-4644-ad00-afe0f17325b3" alt=""><figcaption></figcaption></figure>

**GPO链接的权限**

如果有对gPLink属性或者gPOpptions属性的修改权限，就可以修改这个这个域/站点/OU链接的OU

遍历站点：

```
adfind -b CN=Configuration,DC=fbi,DC=gov -f "(objectCategory=site)" -s subtree -dn
adfind -sites -f "(objectCategory=site)"  -dn
```

遍历OU：

```
adfind -b DC=fbi,DC=gov -f "(objectCategory=organizationalUnit)" dn
```

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2Fe3f0jqqpBi91oCsilQU1%2Fasvcbaucssbasf3oiqw.png?alt=media&#x26;token=e5254671-dde6-426f-93b6-ce9e3a280a79" alt=""><figcaption></figcaption></figure>

对gLink或者gPOpptions的WriteProperty权限

```
adfind -b OU=test,DC=fbi,DC=gov -sddl+++ -s base  -sdna -sddlfilter ;;;gPlink;;
adfind -b OU=test,DC=fbi,DC=gov -sddl+++ -s base -sdna -sddlfilter ;;;gPOpptions;;
```

**修改现有GPO权限**

```
adfind -b CN=Policies,CN=System,DC=fbi,DC=gov nTSecurityDescriptor -sddl+++ -s subtree -sdna -sddlfilter ;;;gPCFileSysPath;; -recmute
```

查看文件夹ACL

```
icacls \\fbi.gov\sysvol\fbi.gov\scripts\*
icacls \\fbi.gov\sysvol\fbi.gov\policies\*
```

<figure><img src="https://2474992116-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fo0gnu7SjwiL85l4AHJtG%2Fuploads%2FSj52JJZBITTlI83lOoaj%2Fsahfuasivbq2ws.png?alt=media&#x26;token=3f8a5daa-28e0-4e21-83ec-ce44c6ed5960" alt=""><figcaption></figcaption></figure>

对某条策略查看名字

```
adfind -b CN={5962D717-BEF1-4867-9700-76AA98262A8A},CN=Policies,CN=System,DC=fbi,DC=gov -s base displayName
```

#### 安全问题

* MS14-025

#### 参考

[windows protocol (gitbook.io)](https://daiker.gitbook.io/windows-protocol/ldap-pian)

[组策略学习和研究](https://mp.weixin.qq.com/s/C8ppYRF6Pt4dwyUNjUKSlg)

[《内网渗透体系建设》](https://rain1-lce.gitbook.io/web/windowsad-ji-chu/broken-reference)

[主机安全技术剖析 - Windows 本地提权（基础篇） (qq.com)](https://mp.weixin.qq.com/s/GuCCdVWV2KjzTB2Br1T28A)
