Windows认证
Windows凭据
- SSPI
SSPI 是 Windows 提供的一个 API 接口,它允许应用程序进行身份验证、消息完整性、数据加密等安全操作。SSPI 是 Windows 上的 GSSAPI(Generic Security Services Application Program Interface) 的实现,主要用于支持各种安全协议(如 Kerberos、NTLM、TLS/SSL 等)。SSPI 允许应用程序通过不同的 SSP(安全支持提供程序)来进行身份验证,而不需要关心底层实现。
- SSP
SSP 是具体的安全协议实现,SSPI 通过它们提供的功能进行身份验证和加密。
- 常见SSP类型
在 Windows 中,常见的 SSP(Security Support Provider,安全支持提供程序) 类型如下,每种 SSP 都提供不同的身份验证和安全功能:
NTLM(NT LAN Manager)
- DLL:
Msv1_0.dll
- 功能: 提供 NTLM 认证,主要用于不支持 Kerberos 的旧系统或无域环境下的身份验证。
- 适用场景:
- 早期 Windows 认证机制
- 在无域环境(Workgroup)下的身份验证
- 远程桌面(如果未启用 Kerberos)
Kerberos
- DLL:
Kerberos.dll
- 功能: Windows 默认的身份验证协议,支持单点登录(SSO),基于票据(Ticket)。
- 适用场景:
- Windows 域(Active Directory)环境
- 现代身份验证(如基于域的网络登录)
- 远程桌面、文件共享等
Negotiate(SPNEGO)
- DLL:
Negotiate.dll
- 功能: 自动选择最合适的身份验证协议(通常在 Kerberos 和 NTLM 之间)。
- 适用场景:
- 需要自动选择身份验证方式的应用
- 网络身份验证(如 HTTP、SMB 协议)
Schannel(Secure Channel)
- DLL:
Schannel.dll
- 功能: 提供 TLS/SSL 协议支持,用于加密通信。
- 适用场景:
- HTTPS(IIS 服务器、Web 浏览器)
- TLS/SSL 安全邮件传输(SMTP、IMAP、POP)
- 远程桌面协议(RDP)
CredSSP(Credential Security Support Provider)
- DLL:
CredSSP.dll
- 功能: 允许将用户凭据从客户端传递到服务器,支持 RDP(远程桌面协议)。
- 适用场景:
- 远程桌面连接(RDP)
- 需要用户凭据委托的场景(如 PowerShell Remoting)
Digest Authentication(摘要认证)
- DLL:
Wdigest.dll
- 功能: 提供基于 MD5 摘要的身份验证,主要用于 Web 认证(如 HTTP Digest)。
- 适用场景:
- Web 服务器身份验证(IIS、Proxy)
- 兼容旧版身份验证
PKU2U(Public Key Universe to Universe)
- DLL:
pku2u.dll
- 功能: 用于 Windows 7 及更高版本的 P2P(点对点)身份验证,支持基于证书的身份验证。
- 适用场景:
- P2P 设备认证
- 跨域环境的身份验证
LiveSSP(Microsoft Online Services Authentication)
- DLL:
LiveSSP.dll
- 功能: 用于 Microsoft 账户(如 Outlook、OneDrive)的身份验证。
- 适用场景:
- Windows 10 及以上的 Microsoft 账户登录
- Office 365 认证
总结
SSP 类型 | 主要用途 | 适用场景 |
---|---|---|
NTLM | 旧版 Windows 认证 | 非域环境、远程桌面 |
Kerberos | 现代 Windows 域身份验证 | Active Directory、单点登录 |
Negotiate | 选择 Kerberos 或 NTLM | 自动身份验证 |
Schannel | TLS/SSL 加密 | HTTPS、邮件安全 |
CredSSP | 远程凭据委托 | RDP、PowerShell Remoting |
Digest | Web 摘要认证 | IIS、代理服务器 |
PKU2U | P2P 设备身份验证 | Windows 7 及以上 |
LiveSSP | Microsoft 账户认证 | Outlook、OneDrive |
这些 SSP 由 SSPI(Security Support Provider Interface) 统一管理,应用程序可以通过 SSPI 调用这些 SSP 进行身份验证和加密。
Windows访问控制模型
- 简介
访问控制模型(Access Control Model)是Windows操作系统中一个关于安全性的概念,由访问令牌和安全描述符两部分构成,其中:访问令牌(Access Token)由当前登录 Windows 账号的用户持有,它包含该账号的基础信息,如用户账户的标识和权限信息;安全描述符由要访问的对象持有,它包含当前对象的安全信息。假设当用户登录时,操作系统会对用户的账户名和密码进行身份验证,则当登录成功时,系统会自动分配访问令牌。 访问令牌包含安全标识符(SID), SID用于标识用户的账户及其所属的任何组账户。当我们创建一个进程,也就是访问一个资源(进程资源)的时候,访问令牌会被复制一份并交给进程,进程根据它的创建者为它设置的安全描述符中的访问控制列表(ACL)来判断我们是否可以访问,是否有权限执行某步操作。
- 访问令牌
Windows 的访问令牌分为两种类型——主令牌(Primary Token)和模拟令牌(Imperson ation Token),它代表某种请求或登录机制的凭据,使用户可以在短时间内执行某种身份认证或权限操作的验证信息。Windows系统中每个用户登录账号都生成一个对应的访问令牌。 当用户使用账号登录操作系统时,系统会将所登录的账号与安全数据库(SAM)中存储的 数据进行对比验证,验证成功后才会生成访问令牌。如果我们打开的进程或线程正在与具有安全描述符的对象交互,则系统将会携带令牌进行访问,以此来表示用户身份。
- 安全标识符
在Windows操作系统中,通常使用安全标识符(Security IDentifier,SID)来标识在系统中执行操作的实体。SID是一个唯一的字符串,可以代表用户、用户组、域、域组、域成 员等角色身份。
- SID组成部分
SID 是一种可变长度的数值,其组成部分如图所示

其中:
48位标识符机构值一般代指颁发机构,主要用于标识发布SID授权,通常为本地系统或域;子机构代表该颁发机构的委托人
RID 即相对标识符,是Windows 在一个通用基准SID的基础上创建这个SID的唯一 方法
在Windows系统中,SID采用标识符机构值和子机构值的组合,即使不同的SID颁发机构颁发出相同的RID的值,其SID也不会相同,因此在任何计算机或域中,Windows都不会颁发出两个相同的SID
- SID结构分析
每个SID都包含一个前缀S,不同的部分使用连字符-
进行分隔。
S-1-5-21-1315137663-3706837544-1429009142-502
S:表示字符串为SID
1:表示修订级别,开始值为1
5:NT Authority,表示标识符颁发机构
21-1315137663-3706837544-1429009142:表示域标识符
502:表示RID(密钥分发中心服务所使用的krbtgt账 户)
- 常见SID




- 安全描述符
安全描述符(Security Descriptor)包含DACL(任意访问控制列表)和SACL(系统访问控制列表),其中SACL用来记载对象访问请求的日志,DACL又包含ACE(访问控制项), 该项设置了用户的访问权限。安全描述符绑定在每个被访问对象上,当我们携带访问令牌去 访问一个带有安全描述符的对象时,安全描述符会检测我们的访问令牌是否具有访问权限。 安全描述符包含安全描述组织架构及其关联的安全信息。下面来详细介绍安全描述符 的组织结构以及它包含的安全信息。
- 安全描述符的组织结构
在 Windows API 中,安全描述符的结构体是 SECURITY_DESCRIPTOR
,它定义在 <windows.h>
头文件中,结构如下:
typedef struct _SECURITY_DESCRIPTOR {
BYTE Revision; // 版本号,一般为 SECURITY_DESCRIPTOR_REVISION
BYTE Sbz1; // 保留字段,必须为 0
WORD Control; // 控制标志,指示安全描述符的属性,如 SE_DACL_PRESENT
PSID Owner; // 指向所有者的 SID
PSID Group; // 指向主组的 SID(通常未使用)
PACL Sacl; // 指向 SACL(审计控制列表)
PACL Dacl; // 指向 DACL(自由访问控制列表)
} SECURITY_DESCRIPTOR, *PSECURITY_DESCRIPTOR;
- 安全描述符包含的安全信息
安全描述符包含如下安全信息。
❑ 对象的所有者和所属组的SID。
❑ DACL:包含ACE,每个ACE的内容描述了允许或拒绝特定账户对这个对象执行特定操作。
❑ SACL:主要用于系统审计,它的内容指定了当特定账户对这个对象执行特定操作时,将其记录到系统日志中。
❑ 控制位:一组限制安全描述符或各个成员的含义控制位。
- 安全描述符查看
当我们需要查看某个对象具有什么安全描述符时,可以右击该对象,选择“属性”选 项,并进一步查看“安全”选项卡

- DACL(Discretionary Access Control List,自由访问控制列表)
DACL 定义了对象的访问权限,决定哪些用户或组可以访问该对象以及允许或拒绝哪些操作。它由一系列 ACE(Access Control Entry,访问控制项)组成,每个 ACE 包含一个用户或组的 SID 以及相应的访问权限。如果对象的 DACL 为空(即 NULL
),则所有用户都拥有完全访问权限;如果 DACL 存在但不包含任何 ACE,则没有用户可以访问该对象。DACL 主要用于访问控制,在文件系统、注册表、进程等 Windows 资源的安全管理中至关重要。
- SACL(System Access Control List,系统访问控制列表)
SACL 主要用于安全审核,定义了哪些访问尝试应该被记录到系统安全日志中。与 DACL 类似,SACL 也由多个 ACE 组成,但 ACE 记录的不是访问权限,而是触发审计的规则,例如记录某用户的文件读取操作
。SACL 需要管理员或特定权限(如 SeSecurityPrivilege
)才能修改,在 Windows 服务器环境中常用于监控安全事件和满足合规性要求。
- 安全描述符字符串
安全描述符字符串是指在安全描述符中存储或传输信息的文本格式。安全描述符包含 二进制格式的安全信息,Windows API提供了在二进制安全描述符与文本字符串之间进行 相互转换的功能。字符串格式的安全描述符不起作用,但是对于存储或传输安全描述符信 息很有用。要将安全描述符转换为字符串格式,需要调用ConvertSecurityDescriptorToStrin gSecurityDescriptor
函数;要将字符串格式的安全描述符转换回有效的功能性安全描述符, 需要调用ConvertStringSecurityDescriptorToSecurityDescriptor
函数。
令牌安全防御
Windows 使用访问令牌来记录用户身份,验证用户权限,每个用户都有一个访问令牌。一般的攻击者都会利用DuplicateTokenEx API来对令牌进行模拟盗窃。他们会使用 DuplicateTokenEx 函数创建一个新令牌,并对现有的令牌进行复制,将新令牌用于Impersonate LoggedOnUser 函数中,允许调用线程模拟已登录用户的安全上下文,同时也可以通过 DuplicateTokenEx 复制令牌,并使用CreateProcessWithTokenW 把复制的令牌用于创建在模 拟用户的安全上下文中运行的新进程
对令牌窃取攻击进行有效的安全防御
- 禁止域管理员异机登录
域管理员是在整个域控中管理权限最高的,为了防止域管理员的令牌被恶意窃取,必 须禁止域管理员异机登录。如果因一些特殊情况域管理员登录了其他机器,应及时将令牌 清除,以防止令牌被窃取。
- 开启审核进程创建策略
通过开启审核进程创建策略来监视令牌操作时所需使用的Windows函数的动作
- 进入组策略编辑器
- 依次选择“计算机配置”→“Windows设置”→“安全设置”→“高级审核策略配置”→“系统审核策略-本地组策略对象”→“详细跟踪”→“审核进程创建

- 通过事件查看器来查看执行访问令牌尝试操作的记录
