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自动身份验证
SchannelTLS/SSL 加密HTTPS、邮件安全
CredSSP远程凭据委托RDP、PowerShell Remoting
DigestWeb 摘要认证IIS、代理服务器
PKU2UP2P 设备身份验证Windows 7 及以上
LiveSSPMicrosoft 账户认证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设置”→“安全设置”→“高级审核策略配置”→“系统审核策略-本地组策略对象”→“详细跟踪”→“审核进程创建
  • 通过事件查看器来查看执行访问令牌尝试操作的记录

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注