活动目录以下简称AD对于系统管理员有着至关重要的作用,下文是介绍常见的AD的攻击以及预防措施,具体内容如下所述。
微软的活动目录AD为大规模的企业系统提供了方便的管理架构,但是,你了解针对AD的攻击吗?你管理的AD安全吗?如何加强AD的安全管理呢?相信本文一定会成为很好的参考。
现在,许多企业在Windows架构中采用活动目录(AD)作为企业目录或者是网络操作系统目录(NOS),AD已经成为企业中一项重要的资产。显然,如此有价值的东西当然要受到重点保护。
对AD的攻击可以来自许多方面——我们来看看五个常用的攻击手段以及如何保护AD以应对攻击。本文提到的前三种攻击可以在AD中提升攻击者的权限,后两种攻击则严重影响了AD架构的可用性。除非特别说明,本文的内容适用于WindowServer2003和Windows2000Server中的AD。
在本文中我不能列出全部的AD攻击,我的主要目的是让AD管理员有危机感,能够用多种方法加固AD,保护AD。
攻击一:基于LMHash破解密码
密码破解实际上是利用操作系统使用的同一个哈希算法对可能的用户密码进行哈希运算,然后把结果和目标操作系统中保存的密码哈希进行对比,从而获得破解的密码。密码破解一般非常耗时,破解者通常要试验大量(有时候是全部)可能的密码。不过,一些免费工具,如JohntheRipper和LCP可以进行自动破解,最新版本的JohntheRipper和LCP可以分别从http://www.openwall.com/john和http://www.lcpsoft.com/english/index.htm下载,这些工具对于破解在AD环境中采用普通的NTLANManager(NTLM)认证协议的密码十分有效。NTLM是WindowsNT4.0的默认认证协议,但是出于向下兼容的考虑,仍然在Windows2000和后续操作系统中使用。NTLM包括两种认证协议:LM和NTLM,分别使用不同的哈希算法,这些哈希值分别被称为LM和NT,或者是Unicode、哈希。
由于Windows创建LM哈希的方法存在漏洞,可以显著加速破解过程。一个漏洞是密码不能长于14个字符,并且LM还在哈希运算中将密码字符全部转换为大写,此外,LM哈希实际上并没有使用哈希函数,而是采用对称加密生成了哈希值。
在图1中显示了用户密码“hpinvent1”是如何生成LM哈希值的过程。首先,密码被转换成大写字母“HPINVENT1”;然后,这些大写字母被分割成两段字符串,每段7个字符,“HPINVEN”和“T1*****”,其中第二段要用空字符补齐;接着,这两段字符串作为密钥,通过DigitalEncryptionStandard(DES)对称加密去加密一个常数,而不是使用哈希函数;最后,把DES加密的结果连接起来就生成了LM哈希值。
攻击一预防措施
要降低LM密码哈希的危害,需要采取以下措施:在AD数据库中取消LM哈希,要求Windows用户采用更为强壮的NTLMv2认证协议,或者要求用户应用特殊的密码创建规则。
在WindowsServer2003、WindowsXP和后续的平台中,可以设置组策略(GPO)或者本地策略禁止AD保存LM哈希:
网络安全:在下次改变密码时不保存LANManager哈希。
在Windows2000,该设置并不能从AD或SAM(本地安全数据库)移除LM哈希,只能确保用户下次更改密码的时候不会保存LM哈希。因此,进行该设置以后,需要强制所有受影响的用户更改密码。在WindowsServer2003和WindowsXP,上述设置则可以清除安全数据库中的LM哈希历史数据。
对于WindowsServer2003、WindowsXP和Windows2000SP2或后续平台,还可以编辑注册表,直接禁止保存LM哈希,即把HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\nolmhash(REG_DWORD)的值改为1。
如果是在域环境中,则必须要设置全部的域控制器(DC)。如果用户仍然在使用Windows98或者Windows95这些没有安装目录服务客户端的系统,则不可以进行上述设置,因为这些客户端只能使用LM认证。关于nolmhash的使用介绍,请参见微软知识库文章“如何防止Windows在活动目录和本地SAM数据库中保存LANManager密码哈希”(http://support.microsoft.com/kb/299656)。
如果是在WindowsServer2003或Windows2000群集环境中,必须确保群集服务的帐号密码长度至少为15个字符。如果小于此长度,使用群集管理工具会出现问题,微软知识库文章“设置NoLMHash策略后必须设置群集服务帐号密码长度不少于15个字符”(http://support.microsoft.com/kb/828861)对此问题有详细的说明。
为了确保用户都使用强壮的NTLMv2认证协议,必须为运行老版本的Windows平台准备好NTLMv2软件。对于Windows98和Windows95用户,可以下载http://download.microsoft.com/download/0/0/a/00a7161e-8da8-4c44-b74e-469d769ce96e/dsclient9x.msi,安装目录服务客户端。WindowsServer2003、WindowsXP、Windows2000或者WindowsNTSP4以上版本都已经内置了NTLMv2支持。
在WindowsServer2003或Windows2000AD环境中强制客户端使用NTLMv2,需要设置网络安全:LANManager认证级别组策略为“只发送NTLMv2应答,拒绝LM”,或者直接修改注册表键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\lmcompatibilitylevel(REG_DWORD)为4,可以参见微软网站上的文章“LmCompatibilityLevel”(http://www.microsoft.com/resources/documentation/Windows/2000/server/reskit/en-us/regentry/76052.asp)。
这样,如果用户遵从下述密码规则,Windows将不再会创建LM哈希:
使用的密码长度超过14个字符;
在密码中使用特定的ALT字符,可以按住ALT键敲四个数字生成ALT字符,在图2中列出了这些防止LM哈希的ALT字符。
攻击二:基于Kerberos预认证数据破解密码
长期以来,我们都认为在WindowsServer2003、WindowsXP或Windows2000中使用默认的Kerberos认证能够保护密码,能有效对付前面所述的那类暴力破解攻击手段,但是在2002年末(发布Windows2000两年后)Internet上出现了名为KerbCrack的工具。KerbCrack包括两个工具,分别为kerbsniff和kerbcrack,能够暴力破解Kerberos数据包,其中Kerbsniff从网络中捕获Kerberos数据包,kerbcrack则利用kerbsniff的输出进行暴力破解。在http://www.ntsecurity.nu/toolbox/kerbcrack可以下载这两个工具。http://www.hut.fi/~autikkan/kerberos/docs/phase1/pdf/LATEST_password_attack.pdf这篇文章则描述了类似的攻击手段,不过是使用了另外的工具。
Kerberos5.0引入了Kerberos预认证功能,由客户端使用预认证数据到Kerberos密钥分发中心(KerberosKeyDistributionCenter,KDC,即每台WindowsServer2003和Windows2000域控制器上运行的Kerberos服务)验证密码,然后客户端可以接收到一个TicketGrantingTicket(TGT)。Kerberos破解攻击的目标就是在其预认证数据中嵌入的加密时间戳,而该时间戳使用用户主密钥加密(例如,基于用户密码的密钥)。
攻击二预防措施
有两种方法可以应对Kerberos预认证攻击:使用Windows智能卡登录,或者在Kerberos客户端和域控制器之间采用IPsec加密网络传输。Windows智能卡登录使用了被称为PKINIT的Kerberos扩展,不使用用户主密钥加密数据包,而使用用户的私有密钥加密。文章“Kerberos初始认证的公共密钥加密”(http://www.ietf.org/proceedings/03mar/I-D/draft-ietf-cat-kerberos-pk-init-16.txt)详细介绍了PKINIT。目前,暴力破解还无法处理使用公共-私有密钥加密的数据包。
攻击三:利用SIDHistory提升权限
在Windows2000的AD用户帐号对象中,微软增加了SIDHistory属性。对于域内的帐号移植和森林域内的帐号移动,SIDHistory简化了资源访问过程。例如,当用户帐号从WindowsNT4.0域迁移到Windows2000域时,Windows2000域创建新的用户帐号,会自动添加SIDHistory属性,包含了该用户帐号在WindowsNT4.0域中的SID。登录时,Windows2000域会收集用户的认证数据(组成员等),域控制器从SIDHistory属性中将用户旧的SID添加到认证数据中,这样,在旧的域中的资源不需要被重新分配许可(例如不用更新ACL),用户使用新的帐号即可以继续正常访问。
而对于心怀恶意的AD管理员来说,就可以通过尝试修改用户帐号对象的SIDHistory属性来提升权限。例如,在一个域信任环境中,被信任域的管理员会尝试将信任域的管理员帐号的SID添加到自己域中一个用户帐号的SIDHistory属性里,如果成功的话,被信任域的该用户将获得信任域的管理员访问权限。
在发布的Windows2000第一版中,信任域的域控制器并不检查来自被信任域的包含有认证数据的资源访问请求,信任域的域控制器会自动认为只包含被信任域的域控制器SID的请求是被授权的资源。
虽然修改AD用户帐号的SIDHistory属性并不容易(只能在AD离线模式时操作),但这是可行的,而且已经出现了这样的修改工具,SHEdit就是一个例证,可以在http://www.tbiro.com/projects/shedit/index.htm下载。
这种攻击在各种Windows域信任环境下都能发生:可以在单一森林的域中间,也可以在存在信任关系的连接外部的域之间或者森林之间。在单一森林中,能够物理接触到域控制器的管理员或用户都可能利用SIDHistory漏洞把自己提升到企业管理员组。
攻击三预防措施
为了避免SIDHistory属性造成危害,必须确保企业管理员组和域管理员组的成员是值得信任的,还需要确保域控制器具有高的物理访问安全级别,防止用户将域控制器离线进行漏洞攻击。
此外,还可以利用不同森林中域之间建立的信任关系的SID过滤功能,防止管理员修改SIDHistory属性。SID过滤可以让管理员隔离域,激活SID过滤时,信任域的域控制器会检查来自被信任域的包含认证数据的资源访问请求是否真实,信任域的域控制器将自动删除不是来自被信任域的SID。因为该操作同时删除了认证数据中由SIDHistory属性增加的SID,所以,SIDHistory和SID过滤是互斥的两个功能。
Windows2000SP2及后续版本都提供了SID过滤功能,用命令行命令netdom.exe可以打开或关闭SID过滤。如微软知识库文章“MS02-001:在Windows2000中伪造SID导致提升权限”(http://support.microsoft.com/kb/289243)所述,在Windows2000中,可以使用trust和/filtersids开关,而在WindowsServer2003中,则使用trust和/quarantine开关。对于WindowsServer2003外部和森林信任关系,SID过滤是默认被打开的。
在同一森林里具有信任关系的域之间,则不应该使用SID过滤,因为这会终止AD的复制和传递信任关系。如果需要隔离一个域,应该把它放到另一个森林中。
欲知更多有关AD的攻击和预防措施的知识,请点击有关AD的攻击及预防措施知识简介二
【编辑推荐】