购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 Windows认证基础知识

1.1.1 Windows凭据

1.SSPI

SSPI(Security Support Provider Interface,安全支持提供程序接口)是Windows操作系统中用于执行各种安全相关操作的公用API。SSPI的功能比较全面,可以用来获得身份验证、信息完整性校验、信息隐私保护等集成的安全服务。它是众多安全支持提供程序的调用接口。

2.SSP

SSP(Security Support Provider,安全支持提供程序)是一个用于实现身份验证的DDL文件。当操作系统启动时,SSP会被加载到LSA(Local Security Authority,本地安全机构)中。SSP的主要作用是扩展Windows的身份安全验证功能。可以这样简单理解:SSP就是一个DLL文件,用来实现身份认证并维持系统权限。下面介绍一下Windows系统中的常见SSP类型。

3.常见SSP类型

1)NTLM:一种Windows网络认证协议,基于挑战/响应(Challenge/Response)验证机制,用于对主机进行身份验证。

2)Kerberos:一种网络身份验证协议。作为一种可信任的第三方认证服务,它的主要优势在于可以提供强大的加密和单点登录(SSO)机制。

3)Negotiate:用于在SSPI和其他SSP之间进行安全支撑的应用程序层。当某个应用程序调入SSPI以登录到网络时,该应用程序会指定一个SSP来处理请求。如果指定Kerberos或NTLM SSP,则Negotiate将会分析请求并选取最佳SSP,以便基于客户配置的安全策略处理请求。

4)安全通道:也称SChannel,它使用SSL/TLS记录来加密数据有效载荷,主要用于需要进行安全超文本传输协议(HTTP)通信的Web应用程序。

5)摘要身份验证:基于HTTP和SASL(简单认证与安全层)身份验证的质询/响应协议。

6)Cred SSP:用于传输安全凭据的网络协议,通常在RDP或WinRM远程管理中用于提供单点登录和网络级身份验证。

7)分布式密码验证(DPA):提供使用数字证书完成的互联网身份验证。

8)用户对用户的公开密钥加密技术(Public Key Cryptography User-to-User,PKU2U):在不隶属于域的系统之间提供使用数字证书的对等身份验证。

1.1.2 Windows访问控制模型

1.访问控制模型简介

访问控制模型(Access Control Model)是Windows操作系统中一个关于安全性的概念,由访问令牌和安全描述符两部分构成,其中:访问令牌(Access Token)由当前登录Windows账号的用户持有,它包含该账号的基础信息,如用户账户的标识和权限信息;安全描述符由要访问的对象持有,它包含当前对象的安全信息。假设当用户登录时,操作系统会对用户的账户名和密码进行身份验证,则当登录成功时,系统会自动分配访问令牌。访问令牌包含安全标识符(SID),SID用于标识用户的账户及其所属的任何组账户。当我们创建一个进程,也就是访问一个资源(进程资源)的时候,访问令牌会被复制一份并交给进程,进程根据它的创建者为它设置的安全描述符中的访问控制列表(ACL)来判断我们是否可以访问,是否有权限执行某步操作。

2.访问令牌

Windows的访问令牌分为两种类型——主令牌(Primary Token)和模拟令牌(Imperson-ation Token),它代表某种请求或登录机制的凭据,使用户可以在短时间内执行某种身份认证或权限操作的验证信息。Windows系统中每个用户登录账号都生成一个对应的访问令牌。当用户使用账号登录操作系统时,系统会将所登录的账号与安全数据库(SAM)中存储的数据进行对比验证,验证成功后才会生成访问令牌。如果我们打开的进程或线程正在与具有安全描述符的对象交互,则系统将会携带令牌进行访问,以此来表示用户身份,如图1-1所示。

图1-1 访问令牌流程

创建进程时,Windows操作系统的内核都会为进程创建并分配一个主令牌。每个进程都含有一个主令牌,主令牌描述了进程相关用户账号的安全上下文。同时,一个线程可以模拟一个客户端账号,允许此线程在与安全对象交互时使用客户端的安全上下文。一个正模拟客户端的线程拥有一个主令牌和一个模拟令牌。(主令牌是与进程相关的,而模拟令牌是与线程相关的。)

(1)主令牌

主令牌也叫授权令牌(Delegation Token),是一种认证机制,用于交互式登录,是为了减少不必要的认证工作而出现的,由Windows操作系统的内核创建并分配给进程的默认访问令牌。主令牌描述了登录进程返回的安全标识SID,与当前进程相关的用户账户的安全组的权限列表,代表系统可以使用令牌控制用户可以访问哪些安全对象、执行哪些相关系统操作。主令牌通常用于本地登录及通过RDP远程登录的场景。

一个完整的主令牌包含如下内容:

❑当前账号SID

❑当前账户所处安全组的SID

❑该令牌的来源,即它是由哪个进程创建的

❑所有者的SID

❑主要组的SID

❑访问控制列表

❑用户或组拥有的权限列表

❑模拟级别

❑统计信息

❑限制SID

(2)模拟令牌

在默认情况下,当线程开启的时候,其所在进程的主令牌会自动附加到该线程上作为它的安全上下文。而线程可以在另一个非主令牌的访问令牌下执行,这个令牌被称为模拟令牌,通常会用于客户端/服务器之间的通信。假设在文件共享的时候,服务器需要访问令牌来验证用户的权限,但它无法直接获取用户的访问令牌(该令牌是锁死在内存中的,无法访问),所以它就需要生成一个模拟令牌。

3.安全标识符

在Windows操作系统中,通常使用安全标识符(Security IDentifier,SID)来标识在系统中执行操作的实体。SID是一个唯一的字符串,可以代表用户、用户组、域、域组、域成员等角色身份。

(1)SID组成部分

SID是一种可变长度的数值,其组成部分如图1-2所示。

图1-2 SID的组成部分

其中:48位标识符机构值一般代指颁发机构,主要用于标识发布SID授权,通常为本地系统或域;子机构代表该颁发机构的委托人;

RID即相对标识符,是Windows在一个通用基准SID的基础上创建这个SID的唯一方法。

在Windows系统中,SID采用标识符机构值和子机构值的组合,即使不同的SID颁发机构颁发出相同的RID的值,其SID也不会相同,因此在任何计算机或域中,Windows都不会颁发出两个相同的SID。接下来以实际的SID为例。

(2)SID结构分析

每个SID都包含一个前缀S,不同的部分使用连字符“-”进行分隔。以下述SID为例,详细为大家介绍SID在Windows操作系统中的组成部分,如图1-3所示。

❑S:表示字符串为SID。

❑1:表示修订级别,开始值为1。

❑5:NT Authority,表示标识符颁发机构。

❑21-1315137663-3706837544-1429009142:表示域标识符。

❑502:表示RID(密钥分发中心服务所使用的krbtgt账户)。

图1-3 SID结构分析

(3)常见SID

通过上述对SID的结构分析,我们知道SID结构是一组标识通用用户或通用组的SID,它们的值在所有操作系统中保持不变。Windows操作系统其实内置了一些本地SID和域SID,例如:Domain User组,用于代表域中所有的用户账户,其SID为S-1-5-21-domain-513;Everyone组,代表所有的用户账户,该组的SID为S-1-1-0。表1-1列举出了当前Windows操作系统中的常见SID及其所属的名称和具体作用。

表1-1 常见SID及其所属的名称和具体作用

(4)SID构建方式

在Windows操作系统中,因常见的SID名称可能会有所不同,我们应该通过使用API函数来从预定义的标识符授权和RID定义的常量中构建SID,例如:通过SECURITY_WORLD_SID_AUTHORITY和SECURITY_WORLD_RID这两个常量来显示代表所有用户的特殊组的通用SID——S-1-1-0,其中S表示SID,1表示SID的修订级别,剩下的1和0分别是S E C U R I T Y_WORLD_SID_AUTHORITY与SECURITY_WORLD_RID的值。如果要确认登录用户是不是特定已知组的成员,就需要使用AllocateAndInitializeSid函数为已知组构建SID,用于标识本地计算机的管理员组的众多所知SID,然后使用EqualSid函数将SID与用户所在组的组SID进行比较。如果需要释放由AllocateAndInitializeSid分配的SID,只需要调用FreeSid函数即可,而不能直接使用其SID名称(考虑到不同版本的操作系统上有不同的名称)。如果需要使用SID,可以调用其已有的Windows API。表1-2是可供调用的API函数列表。

表1-2 可供调用的API函数列表

(5)构建常见的SID表以及标识符权限和子权限的常量表

接下来将介绍可用于构建常见的SID表以及标识符权限和子权限的常量表。表1-3列出了预定义的标识符颁发机构。

表1-3 预定义的标识符颁发机构

(续)

表1-4中的RID值与通用已知SID一起使用。标识符颁发机构列显示标识符颁发机构前缀,可以使用该前缀组合RID来创建通用已知SID。

表1-4 RID颁发机构

RID所对应的每一个域如表1-5所示。

表1-5 RID所对应的每一个域

(续)

4.安全描述符

安全描述符(Security Descriptor)包含DACL(任意访问控制列表)和SACL(系统访问控制列表),其中SACL用来记载对象访问请求的日志,DACL又包含ACE(访问控制项),该项设置了用户的访问权限。安全描述符绑定在每个被访问对象上,当我们携带访问令牌去访问一个带有安全描述符的对象时,安全描述符会检测我们的访问令牌是否具有访问权限。

安全描述符包含安全描述组织架构及其关联的安全信息。下面来详细介绍安全描述符的组织结构以及它包含的安全信息。

(1)安全描述符的组织结构

安全描述符由SECURITY_DESCRIPTOR结构及其关联的安全信息组成,其结构体如下:

(2)安全描述符包含的安全信息

安全描述符包含如下安全信息。

❑对象的所有者和所属组的SID。

❑DACL:包含ACE,每个ACE的内容描述了允许或拒绝特定账户对这个对象执行特定操作。

❑SACL:主要用于系统审计,它的内容指定了当特定账户对这个对象执行特定操作时,将其记录到系统日志中。

❑控制位:一组限制安全描述符或各个成员的含义控制位。

(3)安全描述符查看

当我们需要查看某个对象具有什么安全描述符时,可以右击该对象,选择“属性”选项,并进一步查看“安全”选项卡,如图1-4所示。

图1-4 当前对象具有的安全描述符

(4)DACL

DACL包含ACE,决定当前用户以哪种权限访问对象。系统使用以下方式为新对象构建DACL。

1)对象当前的DACL是对象创建者指定的安全描述符中的DACL。除非在安全描述符的控制位中设置了SE_DACL_PROTECTED位,否则系统会将所有可继承的ACE合并到指定的DACL中。

2)如果创建者未指定安全描述符,则系统将从可继承的ACE构建对象的DACL。

3)如果未指定安全描述符,并且没有可继承的ACE,则对象的DACL是来自创建者的主令牌或模拟令牌的默认DACL。

4)如果没有指定的、继承的或默认的DACL,则系统将创建不具有DACL的对象,从而允许所有人完全访问该对象。

(5)SACL

SACL主要用于系统审计,同时可以指定哪些用户的行为操作记录会被保存到系统日志中。系统使用以下方式为新对象构建SACL。

1)对象的SACL是对象创建者指定的安全描述符中的SACL。除非在安全描述符的控制位中设置了SE_SACL_PROTECTED位,否则系统会将所有可继承的ACE合并到指定的SACL中。即使SE_SACL_PROTECTED位置已经设置,来自父对象的SYSTEM_RESOURCE_ATTRIBUTE_ACE和SYSTEM_SCOPED_POLICY_ID_ACE也将合并到新对象。

2)如果创建者未指定安全描述符,则系统将从可继承的ACE构建对象的SACL。

3)如果没有指定的或继承的SACL,则该对象没有SACL。

4)要为新对象指定SACL,对象的创建者必须启用SE_SECURITY_NAME特权。如果为新对象指定的SACL仅包含SYSTEM_RESOURCE_ATTRIBUTE_ACE,则不需要SE_SECURITY_NAME特权。如果对象的SACL是从继承的ACE构建的,则创建者不需要此特权。应用程序不能直接操纵安全描述符的内容。Windows API提供了在对象的安全描述符中设置和检索安全信息的功能。此外,还有用于创建和初始化新对象的安全描述符的函数。

(6)安全描述符字符串

安全描述符字符串是指在安全描述符中存储或传输信息的文本格式。安全描述符包含二进制格式的安全信息,Windows API提供了在二进制安全描述符与文本字符串之间进行相互转换的功能。字符串格式的安全描述符不起作用,但是对于存储或传输安全描述符信息很有用。要将安全描述符转换为字符串格式,需要调用ConvertSecurityDescriptorToStrin gSecurityDescriptor函数;要将字符串格式的安全描述符转换回有效的功能性安全描述符,需要调用ConvertStringSecurityDescriptorToSecurityDescriptor函数。

1.1.3 令牌安全防御

Windows使用访问令牌来记录用户身份,验证用户权限,每个用户都有一个访问令牌。一般的攻击者都会利用DuplicateTokenEx API来对令牌进行模拟盗窃。他们会使用DuplicateTokenEx函数创建一个新令牌,并对现有的令牌进行复制,将新令牌用于Impersonate-LoggedOnUser函数中,允许调用线程模拟已登录用户的安全上下文,同时也可以通过DuplicateTokenEx复制令牌,并使用CreateProcessWithTokenW把复制的令牌用于创建在模拟用户的安全上下文中运行的新进程。

那么怎样才能对令牌窃取攻击进行有效的安全防御呢?有如下两种方法。

1.禁止域管理员异机登录

域管理员是在整个域控中管理权限最高的,为了防止域管理员的令牌被恶意窃取,必须禁止域管理员异机登录。如果因一些特殊情况域管理员登录了其他机器,应及时将令牌清除,以防止令牌被窃取。

2.开启“审核进程创建”策略

可以通过开启“审核进程创建”策略来监视令牌操作时所需使用的Windows函数的动作。

1)输入gpedit.msc命令,进入组策略中,如图1-5所示。

图1-5 输入gpedit.msc命令

2)依次选择“计算机配置”→“Windows设置”→“安全设置”→“高级审核策略配置”→“系统审核策略-本地组策略对象”→“详细跟踪”→“审核进程创建”,如图1-6所示。

图1-6 审核进程创建

3)双击打开“审核进程创建”界面,配置无论成功还是失败都进行审核(在创建进程时会生成审核事件,成功审核记录成功的尝试,而失败审核记录不成功的尝试),如图1-7所示。

图1-7 审核进程创建配置

4)可以通过事件查看器来查看执行访问令牌尝试操作的记录,如图1-8所示。

图1-8 通过事件查看器查看令牌尝试操作记录 IFI7cJg+xEzNdck/pCdMJun6QW7SCzxrewP8sXGbuIJDnwhRQCfjM7tkuxDlGNpd

点击中间区域
呼出菜单
上一章
目录
下一章
×