网络攻击与防御技术
上QQ阅读APP看书,第一时间看更新

2.3 针对账户的攻防

利用操作系统的漏洞,攻击者可以对目标计算机进行远程控制,让其执行各种操作和命令。但对于任何一个操作系统来说,出于安全考虑,对其访问账户的权限都进行了严格管理。例如,攻击者利用权限提升漏洞可以提升入侵账号的权限(直至系统管理员权限),进而对计算机进行控制或进行恶意操作。账户管理尤其是账户权限的管理,对防范网络攻击具有重要的意义。

2.3.1 账户和组

账户是用户登录系统时的凭证,一般由用户名和对应的口令组成,账户也称为用户账户。组是对用户进行分类管理的基本单位,同一组中的用户具有相同的权限。

1. 安全主体

在Windows操作系统中,可以将用户、组、计算机或服务都看作是一个安全主体。根据系统架构的不同,账户的管理方式也有所不同,其中本地账户由本地SAM文件来管理,而域账户由活动目录(Active Directory,AD)管理。

用户是登录计算机的一个独立安全主体。Windows中存在本地用户和域用户两种类型,其中本地用户是在计算机的本地安全账户管理器(SAM)数据库中定义的,每一台Windows计算机都有一个本地SAM,用于管理该计算机上的所有用户。本地SAM至少包含Administrator和Guest两个账户。

需要说明的是,对于活动目录域控制器来说仍然存在本地的SAM,只不过该SAM中的账户只能在目录服务还原模式下使用。

在操作系统发展早期,设计者已经意识到将每个对象的权限分配给需要它的每个用户,在管理上是非常困难的。为此,设计者提出了组的概念,即将拥有相同权限的用户置于同一个组进行管理。组也是一种安全主体,在Windows中用户可以是多个组的成员,并且对象可将权限分配给多个组,组可以嵌套。

2. 常用账户

Windows操作系统中有两个常用账户:Administrator和Guest。这两个账户是网络攻击者经常关注和获取的目标,加强对这两个账户的安全管理是实现防范的有效方法。

(1)Administrator。Administrator是Windows操作系统内置的具有最高管理权限的系统管理员账户,也称为超级用户。Administrator对系统拥有全部的控制权,可以管理计算机内置账户,通过该账户可以对计算机进行全部的操作,包括安装程序、读取或删除计算机上所有的文件等。

只有拥有Administrator账户的用户,才拥有对计算机上其他用户账户的完全控制权,包括创建和删除计算机上的用户账户;为其他用户账户设置密码;更改其他用户的账户类型等。需要说明的是,Administrator无法将自己更改为受限制的账户类型,除非在该计算机上有多个拥有Administrator权限的用户账户。

(2)Guest。Guest(来宾)没有预设的密码,是供那些在系统中暂时没有个人账户的用户,在访问计算机时使用的临时账户。出于安全起见,系统默认Guest处于禁用状态。Guest可以更名和禁用,但不能被删除。

当用户通过Guest登录系统时,可以访问已经安装在计算机上的程序,但无法更改其账户类型。

3. 常用组

Windows操作系统中常见的组有Administrators、Users和Guests。其中,位于Administrators组中的用户拥有修改、控制系统的权利,主要包括安装操作系统和组件、升级操作系统和安装补丁程序、修复操作系统、配置操作系统的主要参数、管理安全和审计日志、备份和还原系统等。位于Users组中的成员不允许修改操作系统的设置或其他用户的参数,仅可以从事一些有限的操作,主要包括创建和管理本地组、运行经认证的程序(这些程序由管理员安装或部署)等。Guests组是微软公司为了提升系统的安全性,为特殊情况下的应用设计的,如局域网中的文件共享就是利用Guests组来实现的。

需要说明的是,在Windows活动目录域控制器中,出于对不同用户的细精度(权限管理等级)管理,提供了大量的组,有些组的功能随着操作系统版本的升级而变化。由于目前Windows操作系统的版本较多,所以在此不再一一赘述,需要时可查阅对应版本的操作说明。

2.3.2 用户的登录认证

Windows提供了NTLM(NT LAN Manager)和Kerberos,前者主要应用于Windows Server的工作组(workgroup)环境,后者主要用于Windows Server的域(domain)环境。

1. NTLM

NTLM使用了基于挑战/应答(challenge/response)机制的鉴别方法。在该机制中,客户端能够在不发送自己用户密码给服务器的情况下实现用户的身份鉴别。NTLM通常由协商(negotiation)、挑战(challenge)和鉴别(authentication)三类消息组成。NTLM身份鉴别机制的基本原理如图2-12所示,主要认证过程如下。

图2-12 NTLM身份鉴别机制的基本原理

①用户通过输入Windows账户的用户名和密码登录客户端主机。在登录之前,客户端计算输入密码的Hash值,并保存在本地缓存中,同时将原始密码丢弃。客户端用户在成功登录Windows后,如果要访问服务器资源,需要向对方发送一个请求报文。其中,用户在登录客户端时使用的用户名以明文形式包含在该请求报文中。

②服务器在接收到请求报文后,生成一个16位的随机数,这个随机数被称为Challenge或者Nonce。服务器在将该Challenge发送给客户端之前先将其保存起来。Challenge也是以明文的形式发送的。

③客户端在接收到服务器返回的Challenge后,用在步骤①中保存的密码Hash值对其加密,然后再将加密后的Challenge发送给服务器。

④服务器接收到客户端发送回来的加密后的Challenge后,会向域控制器(Domain Controller,DC)发送针对客户端的验证请求报文。该请求报文主要包含三方面的内容:客户端用户名、原始的Challenge和经客户端密码Hash值加密的Challenge。

⑤和⑥DC根据用户名获取该账户的密码Hash值,对原始的Challenge进行加密。如果加密后的Challenge和服务器发送的一致,则意味着用户拥有正确的密码,验证通过;否则验证失败。DC将验证结果发给服务器,并最终反馈给客户端。

2. Kerberos

Kerberos协议是MIT(麻省理工学院)开发的基于TCP/IP网络设计的可信第三方认证协议,它是目前分布式网络计算环境中应用最为广泛的认证协议。Kerberos工作在Client/Server模式下,利用可信赖的第三方KDC(Key Distribution Center,密钥分配中心)实现用户身份认证。在认证过程中,Kerberos使用对称密钥加密算法,提供了计算机网络中通信双方之间的身份认证。

设计Kerberos的目的是解决分布式网络环境中用户访问网络资源时的安全问题。Kerberos的安全性不依赖于用户端计算机或者要访问的主机(如服务器),而是依赖于KDC。Kerberos协议中每次通信过程都有3个通信参与方:需要验证身份的通信双方和一个双方都信任的第三方KDC。将发起认证服务的一方称为客户端,客户端需要访问的对象称为服务器端。在Kerberos中,客户端是通过向服务器端提交自己的“凭据”(Ticket)来证明自己身份的,该凭据是由KDC专门为客户端和服务器端在某一阶段内通信而生成的。Kerberos保存一个它的客户端及密钥的数据库,这些密钥是KDC与客户端之间共享的,是不能被第三方知道的。

由于Kerberos是基于对称加密算法来实现认证的,这就涉及加密密钥对的产生和管理问题。在Kerberos中会对每一个用户分配一个密钥对,如果网络中存在N个用户,则Kerberos系统会保存和维护N个密钥对。同时,在Kerberos系统中只要求使用对称密码,而没有对具体算法和标准做限定,这样便于Kerberos协议的推广和应用。

Kerberos系统认证过程示意图如图2-13所示,下面介绍Kerberos的基本认证过程。

图2-13 Kerberos系统认证过程示意图

①客户端在需要访问某一资源服务器时,首先需要向票据分配服务器(Ticket Granting Server,TGS)申请本次访问所需要的票据(ticket)。该访问请求以明文方式发给认证服务器(Authentication Server,AS),请求的主要内容包含客户端名称(登录操作系统时使用的用户账号名称)和资源服务器名称等认证信息。在KDC中,由AS为用户提供身份认证,AS将用户密钥保存在KDC的数据库中。

②AS验证客户端的真实性访问权限后,以证书(credential)作为应答,证书中包含访问TGS的票据和用户与TGS间的会话密钥。其中,会话密钥通过用户的密钥加密后传输。

③客户端解密得到访问TGS的票据和用户与TGS之间通信的会话密钥,然后利用访问TGS的票据向TGS申请访问资源服务器所需要的票据。该申请包括TGS的票据和一个带有时间戳的认证符(authenticator)。认证符通过用户与TGS之间的会话密钥加密。

④TGS从票据中取出会话密钥,解密得到认证符,并验证认证符中时间戳的有效性,从而确定用户的请求是否合法。TGS确认用户的合法性后,生成所要求的资源服务器的访问票据,票据中包含有新产生的用户与资源服务器之间的会话密钥。TGS将资源服务器的票据和会话密钥传回给客户端。

⑤客户端向资源服务器提交资源服务器的访问票据和用户新产生的带有时间戳的认证符。认证符通过用户与资源服务器之间的会话密钥进行加密。

⑥资源服务器从票据中取出会话密钥,解密得到认证符,取出时间戳并检验有效性。然后向客户端返回一个带有时间戳的认证符,该认证符通过用户与资源服务器之间的会话密钥进行加密。据此,客户端可以验证资源服务器的合法性。

至此,双方完成了身份认证,并拥有了会话密钥。在此后的操作过程中,数据传输将此以会话密钥进行加密。因为从TGS获得的票据是有时间标记的,所以客户端可以用这个票据在一段时间内请求访问相应的资源,而不要求再次认证。

Kerberos将用户身份认证集中到了AS上,在开放网络中提供客户端与资源服务器之间的相互认证,并通过会话密钥对通信进行加密。

需要说明的是,从Windows Server 2000开始默认的认证协议为Kerberos,NTLM逐步被Kerberos所替代。

2.3.3 账户密码的安全

在Windows操作系统中,用户账户的安全管理使用了安全账户管理器(Security Account Manager,SAM)的机制,实现对SAM文件的管理是确保Windows系统账户安全的基础。

1. SAM文件的存放位置

SAM是Windows的用户账户数据库,所有系统用户的账户名称和对应的密码等相关信息都保存在这个文件中。其中,用户名和口令经过Hash变换后以Hash列表形式保存在“%SystemRoot\system32\config”文件夹下的SAM文件中。在注册表中,SAM文件的数据保存在“HKEY_LOCAL_MACHINE\SAM\SAM”和“HKEY_LOCAL_MACHINE\Security\SAM”分支下,默认情况下被隐藏。

由于SAM文件的重要性,系统默认会对SAM文件进行备份。对于Windows Vista之前的系统,SAM备份文件存放在“%SystemRoot%\repair”文件夹下。对于Windows Vista及其之后的系统,SAM备份文件存放在“%SystemRoot%\system32\config\RegBack”文件夹下。

2. 获取SAM文件的内容

在Windows操作系统启动后,因SAM文件开始被系统调用而无法直接复制,但可以复制其备份文件,或者使用“reg save hklm\sam sam.hive”命令将SAM文件备份出来。再利用一些工具软件来破解SAM文件的内容,常用的工具软件有LC5、10phtCrack、WMICrack、SMBCrack等。

当用户忘记了Windows的登录密码时,可以先进入Windows安全模式或借助Windows PE工具进入系统;然后删除系统盘目录下的SAM文件;最后重新启动系统时可重置Windows的登录密码。也可以使用第三方工具直接恢复密码,如PasswareKit5.0、深山红叶工具箱自带的密码恢复工具等。

2.3.4 权限管理

一般来说,权限管理过程实际上就是为某个资源指定安全主体(用户或组)可以拥有怎样的操作的过程。权限管理可以理解为:谁(用户)能够对什么(资源)进行哪些(权限)操作。出于安全要求,针对不同的应用,需要为相应的用户分配不同的权限。权限逻辑配合业务逻辑,即权限管理以为业务逻辑提供服务为目标。

1. 安全标识符

安全标识符(Security Identifiers,SID)是标识用户、组和计算机账户的唯一的号码。在第一次创建用户账户时,系统会给每一个账户分配一个唯一的SID。Windows内部进程将引用账户的SID而不是账户的用户或组名。如果创建了一个账户后再将其删除,然后再创建一个同名账户,则新账户将不具有授权给前一个同名账户的权力或权限,原因是该后建的账户与前一个账户具有不同的SID号。

(1)SID的作用。用户通过身份验证后,登录进程会给其分配一个访问令牌,该令牌相当于用户访问系统资源的票证。当用户试图访问系统资源时,将访问令牌提供给操作系统,然后操作系统检查用户要访问对象上的访问控制列表。如果用户被允许访问该对象,操作系统将会分配给该用户适当的访问权限。

访问令牌是用户在通过验证的时候由登录进程提供,所以改变用户的权限需要注销后重新登录,以便重新获取访问令牌。

(2)SID的组成。SID用于鉴别用户账户的唯一性,一个完整的SID包括以下几方面。

①用户和组的安全描述。

②48位的颁发机构(ID authority)。

③修订版本。

④可变的子验证值(variable sub-authority values)。

下面以Windows中一个重要的SID即S-1-5-21-310440588-250036847-580389505-500为例进行介绍。其中,第一项S表示该字符串是SID;第二项是SID的版本号,1表示是Windows 2000操作系统;第三项是标识符的颁发机构(identifier authority),对于Windows 2000内的账户,该值为5;然后表示一系列的子颁发机构,前面几个是标识域的,最后一个标识域内的账户和组;最后一项为500,说明是系统自建的内置管理员账户Administrator(Guest账户的值为501等)。

在注册表的“HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Builtin\Aliases\Members”中保存着本地账户的所有SID列表。

2. 访问控制列表(ACL)

访问控制列表(Access Control Lists,ACL)几乎应用于所有的授权访问系统中,用于判断某一账户是否对指定的资源具有访问权限。在ACL中,每一个用户或组都对应一组访问控制项(Access Control Entry,ACE)。在授权访问系统中,可以将节点分为资源节点和用户节点两大类,其中资源节点提供服务或数据,用户节点则访问资源节点所提供的服务与数据。ACL的主要功能为:一方面保护资源节点,阻止非法用户对资源节点的访问;另一方面限制特定的用户节点对资源节点的访问权限。

ACL的访问规则是:当某一用户要访问某一资源或调用某一服务时,将从ACL的开始语句中逐条进行匹配,如果有一条匹配成功,将结束匹配操作,并转向相应的资源访问或服务调用过程;如果所有语句都没有成功匹配,则访问请求将被拒绝。

3. 权限管理设置原则

在Windows中,针对权限的管理有4项基本原则:拒绝优于允许原则、权限最小化原则、权限累加原则和权限继承性原则。

(1)拒绝优于允许原则。拒绝优于允许原则是指当同一用户分属于不同组时,如果在不同组中为该用户设置了不同的权限,则拒绝权限优先于允许权限。例如,用户wangqun同时属于jspi和njust两个不同的组。针对某一资源,在jspi组中为用户wangqun分配了“写入”权限;而在njust组为用户wangqun分配了“拒绝写入”权限。根据拒绝优于允许原则,用户wangqun对该资源实际拥有的权限是“拒绝写入”。

(2)权限最小化原则。出于安全考虑,尽量让用户不能访问或不必要访问与自己无关的资源,或者不能对指定的资源进行越权操作。

(3)权限累加原则。针对某一资源,假设用户wangqun在jspi组中拥有“读取”权限;而在njust中拥有“写入”权限。根据“权限累加原则”,用户wangqun实际对该资源拥有的权限是“读取+写入”。

(4)权限继承性原则。假设在Data目录下同时存在Data1、Data2、Data3……多个子目录,现在需要对Data目录及其下的子目录均设置wangqun用户拥有“写入”权限,根据权限继承性原则,只需要对Data目录设置即可,其下所有子目录自动继承了这个权限的设置。

4. 账户安全防范措施

针对不同的用户和组账户,在权限设置的基础上,还可以利用Windows操作系统提供的一些策略对其安全性进一步设置,以防范利用用户和组账户的攻击。下面介绍几个典型的应用。

(1)更改密码复杂度。首先要启动“密码必须符合复杂性要求”设置,同时在设置密码时遵循:口令长度至少为8位,并由数字、大小写字母与特殊字符组成;口令中不允许使用admin、root、password等;口令中键盘顺序连接字符不超过3个(横、竖排)(如ASD、ZXC、QAZ等)等。

(2)登录失败次数限制。合理设置账户锁定策略中的“账户锁定阈值”和“账户锁定时间”,可有效防止对操作系统的尝试性登录攻击。

(3)重要操作的权限设置。打开如图2-14所示的“本地组策略编辑器”管理界面,在“用户权限分配”列表中可以对一些重要操作的权限进行设置,如从远程系统强制关机、更改系统时间、拒绝从网络访问这台计算机、从网络访问此计算机等。

图2-14 用户权限分配操作界面