LDAP Overview

1. LDAP介绍

1.1. 概述

LDAP(轻量目录访问协议)是AD的组成部分,LDAP目前的最新规范是第三版。发布于 RFC 4511。无论是对攻击者还是防御者,深入理解LDAP都非常重要

LDAP 是一种开源且跨平台的协议,用于针对各种目录服务(例如 AD)进行身份验证。 LDAP 就是网络环境中的系统与 AD 进行“对话”的一种方式。

LDAP 会话始于连接到 LDAP 服务器,后者也被称为 Directory System Agent,域控会主动监听LDAP请求,比如身份验证的请求
Pasted image 20260306235405.png

AD 与 LDAP 之间的关系,可以比作 Apache 与 HTTP。正如 Apache 是使用 HTTP 协议的 Web 服务器,Active Directory 则是使用 LDAP 协议的目录服务器。

还有一些比较少见的情况:就是有LDAP但是没有AD,可能是因为其部署了另类LDAP服务器,比如OpenLDAP

1.2. AD LDAP身份认证

LDAP 被配置为使用“BIND”操作针对 AD 验证凭证,从而为 LDAP 会话设置身份验证状态。 LDAP 身份验证有两种类型。

  • 简单身份验证: 包括匿名身份验证、未认证身份验证以及用户名/密码身份验证。简单身份验证是指使用用户名和密码生成 BIND 请求,从而向 LDAP 服务器进行认证。
  • SASL 身份验证简单认证和安全层 (SASL) 框架利用其他认证服务(例如 Kerberos)绑定到 LDAP 服务器,随后使用该认证服务( 如Kerberos)对 LDAP 进行认证。LDAP 服务器使用 LDAP 协议向授权服务发送 LDAP 消息,从而启动一系列质询/响应(Challenge/Response)消息交互,最终导致认证成功或失败。由于实现了认证方法与应用协议的分离,SASL 能够提供更强的安全性。

默认情况下,LDAP 认证消息以明文形式发送,因此任何人都可以在内部网络中嗅探到这些消息。建议使用 TLS 加密或类似技术来保护传输中的此类信息

1.3. LDAP 查询

我们可以通过 LDAP 查询与目录服务进行交互,以获取所需信息。

例如,使用以下查询可以查找网络中的所有工作站 (objectCategory=computer) ,而使用此查询则可以查找所有域控制器: (&(objectCategory=Computer)(userAccountControl:1.2.840.113556.1.4.803:=8192))

还可以查询用户,比如

PS C:\htb> Get-ADObject -LDAPFilter '(objectClass=group)' | select name

name
--
Administrators
Users
Guests
Print Operators
Backup Operators
Replicator
Remote Desktop Users
Network Configuration Operators
Performance Monitor Users
Performance Log Users
Distributed COM Users
IIS_IUSRS
Cryptographic Operators
Event Log Readers
Certificate Service DCOM Access
RDS Remote Access Servers
RDS Endpoint Servers
RDS Management Servers
Hyper-V Administrators
Access Control Assistance Operators
Remote Management Users

<SNIP>

更多的查询参考:

1.4. Ldap 过滤

1.4.1. Filter

Filter参数可以用来过滤,

PS C:\htb> get-ciminstance win32_product | fl


IdentifyingNumber : {7FED75A1-600C-394B-8376-712E2A8861F2}
Name              : Microsoft Visual C++ 2017 x86 Additional Runtime - 14.12.25810
Vendor            : Microsoft Corporation
Version           : 14.12.25810
Caption           : Microsoft Visual C++ 2017 x86 Additional Runtime - 14.12.25810

IdentifyingNumber : {748D3A12-9B82-4B08-A0FF-CFDE83612E87}
Name              : VMware Tools
Vendor            : VMware, Inc.
Version           : 10.3.2.9925305
Caption           : VMware Tools

IdentifyingNumber : {EA8CB806-C109-4700-96B4-F1F268E5036C}
Name              : Local Administrator Password Solution
Vendor            : Microsoft Corporation
Version           : 6.2.0.0
Caption           : Local Administrator Password Solution

IdentifyingNumber : {2CD849A7-86A1-34A6-B8F9-D72F5B21A9AE}
Name              : Microsoft Visual C++ 2017 x64 Additional Runtime - 14.12.25810
Vendor            : Microsoft Corporation
Version           : 14.12.25810
Caption           : Microsoft Visual C++ 2017 x64 Additional Runtime - 14.12.25810

<SNIP>

1.4.2. 运算符

使用运算符可以更精准的进行过滤
下面是一些常用运算符

Filter 含义
-eq 等于
-le 小于或等于
-ge 大于或等于
-ne 不等于
-lt 小于
-gt 大于
-approx 约等于
-bor 按位或运算
-band 按位与运算
-recursivematch 递归匹配
-like 像(通配符匹配)
-notlike 不像
-and 布尔与
-or 布尔或
-not 布尔非

1.4.3. 过滤属性

过滤器可以用大括号、单引号、圆括号或双引号包裹。例如,下面这个使用 Get-ADUser 的简单搜索过滤器,用于查找用户 Sally Jones 的相关信息

Get-ADUser -Filter "name -eq 'sally jones'"
Get-ADUser -Filter {name -eq 'sally jones'}
Get-ADUser -Filter 'name -eq "sally jones"'

如上所示,属性值sally jones 可以用单引号或双引号括起来。星号( * )用作通配符。

使用通配符的命令 Get-ADUser -filter {name -like "joe*"} 会返回所有名字以 joe (如 joe、joel 等)开头的域用户。在使用过滤器时,某些字符必须进行转义:

字符 转义为
`” 仅当数据被包含在双引号内时才需要。
\’ 或 ’ 仅当数据被单引号括起来时才需要。
NUL \00 或 "\00" 标准 LDAP 转义序列。
| \5c 标准 LDAP 转义序列。
* \2a -eq-ne 比较中会自动转义。若需通配符匹配,请使用 -like-notlike
( /28 已自动转义。
) /29 已自动转义。
/ /2f 已自动转义。