Win2k系统安全(1)胡建斌北京大学网络与信息安全研究室E-mail:hjbin@infosec.pku.edu.cn~hjbin目录1.Win2K安全架构2.针对Win2K的安全扫描3.针对Win2K的攻击Win2K的安全架构Win2K安全子系统WindowsNT的设计从最初就考虑了安全问题:获得了TCSECC2认证,这在竞争激烈的商业操作系统市场中是一个不错的业绩Windows2000正处于一个类似的标准评估过程中,使用通用标准(CommonCriteria,CC)为了获得更高的级别(B级),Windows2000需要在它的设计中融入一些关键的元素,包括(但不限于):•用于认证的安全登录工具•可自由设定的访问控制•审核Windows2000通过它的安全子系统实现了这些功能。图2.1显示了Windows2000的安全子系统SRM(SecurityRefrenceMonitor)SRM处于内核模式监视用户模式中的应用程序代码发出的资源访问请求并进行检查所有的安全访问控制应用于所有的安全主体(securityprinciple)安全主体用户组计算机用户帐户账户是一种参考上下文,操作系统在这个上下文描述符运行它的大部分代码。换一种说法,所有的用户模式代码在一个用户账户的上下文中运行。即使是那些在任何人都没有登录之前就运行的代码(例如服务)也是运行在一个账户(特殊的本地系统账户SYSTEM)的上下文中的如果用户使用账户凭据(用户名和口令)成功通过了登录认证,之后他执行的所有命令都具有该用户的权限。于是,执行代码所进行的操作只受限于运行它的账户所具有的权限。恶意黑客的目标就是以尽可能高的权限运行代码。那么,黑客首先需要“变成”具有最高权限的账户系统内建帐户用户帐户攻击本地Administrator或SYSTEM账户是最有权力的账户相对于Administrator和SYSTEM来说,所有其他的账户都只具有非常有限的权限因此,获取Administrator或SYSTEM账户几乎总是攻击者的最终目标组组是用户账户集合的一种容器Windows2000具有一些内建的组,它们是预定义的用户容器,也具有不同级别的权限放到一个组中的所有账户都会继承这些权限。最简单的一个例子是本地的Administrators组,放到该组中的用户账户具有本地计算机的全部权限系统内建组域中的组当Windows2000系统被提升为域控制器时,同时还会安装一系列预定义的组权限最高的预定义组包括域管理员(DomainAdmins),它具有域中的所有权限还有企业管理员(EnterpriseAdmins),它具有域森林的全部权限域内建组组攻击本地Administrator或SYSTEM账户是最有权力的账户本地Windows2000系统中的本地Administrators组是最有吸引力的目标,因为这个组的成员继承了相当于管理员的权限DomainAdmins和EnterpriseAdmins是Windows2000域中最有吸引力的目标,因为用户账户加入到它们当中后将会提升为具有域中的全部权限相对于Administrators、DomainAdmins和EnterpriseAdmins,所有其他的组都只具有非常有限的权限获取Administrators、DomainAdmins和EnterpriseAdmins组中的账户几乎总是攻击者的最终目标特殊用户WindowsNT/2000具有一些特殊身份,它们是处于特定传输状态的账户(例如通过网络登录)或来自于特定位置的账户(例如在键盘上进行交互式登录)的容器这些身份能够用来调节对资源的访问控制。例如,NT/2000中对特定进程的访问受限于INTERACTIVE(交互)用户特殊用户SAM(SecurityAccountsManager)在独立的Windows2000计算机上,安全账户管理器负责保存用户账户名和口令的信息口令通过散列并被加密,现有的技术不能将打乱的口令恢复(尽管如此,散列的口令是可以被猜出的)SAM组成了注册表的5个配置单元之一,它在文件%systemroot%\system32\config\sam中实现在Windows2000域控制器上,用户账户和散列的数据保存在活动目录中(默认为%systemroot%\ntds\ntds.dit)。散列是以相同的格式保存的,但是要访问它们必须通过不同的方法SYSKEY从NT4ServicePack3开始,Microsoft提供了对SAM散列进行进一步加密的方法,称为SYSKEYSYSKEY是SystemKEY的缩写,它生成一个随机的128位密钥,对散列再次进行加密(不是对SAM文件加密,而是对散列)为了启用SYSKEY,你必须运行SYSKEY命令,SYSKEY森林、树、域作用域信任边界管理域通过将一台或几台Windows2000服务器提升为域控制器,就可以很容易地创建Windows2000域域控制器(DomainController,DC)是共享的域信息的安全存储仓库,同时也作为域中认证的中央控制机构域定义了共享账户的一种分布边界。域中的所有系统都共用一组账户。在NT中,共享的域信息从主域控制器(PrimaryDC,PDC)向备份域控制器(BackupDC,BDC)进行复制,称为单主机复制在Windows2000域中,所有的域控制器都是对等的,它们之间进行的域信息复制称为多主机复制树和森林由于Windows2000活动目录的实现,域已经不再像NT中那样是逻辑上的管理边界,在活动目录层次中,在域之上还存在“树”和“森林”的结构树在很大程度上只是命名上的约定,没有太多安全上的含义,但是森林划分了Windows2000目录服务的边界,它是管理控制的根本界限作用域信任关系Windows2000可以在域间形成信任关系。信任关系只是创建了域间的隐含访问能力,但是并没有显式地启用信任可以是单向的或双向的。单向信任意味着一个域信任另一个域,反过来不存在信任。双向信任定义了两个域之间相互信任。单向信任通常用于允许一个域中的管理员定义对所在域的访问控制规则,而相反则不行信任关系信任可以是可传递的和不可传递的。可传递的信任意味着如果域A传递信任域B,而域B传递信任域C,则域A就传递信任域C在默认情况下,Windows2000森林中的所有域之间都存在可传递的、双向的信任Windows2000可以对森林外的域或NT4域建立单向的、不可传递的信任安全边界由于森林中各个域之间自动建立的双向可传递的信任,导致了可以分配森林中各个域的权限的通用组的存在同一森林中其他域的管理员有夺取活动目录的Configuration容器的所有权并对其进行修改的潜在能力。这种修改将会在森林中的所有域控制器上传播。于是,对于任何加入到该森林的域来说,你必须保证该域的域管理员能够像其他域管理员一样可信Windows2000森林内部实际的安全边界是森林域入侵的威胁假设一个黑客占领了一个域控制器,森林中的其他域都具有潜在的危险,因为森林中任何域的DomainAdmins都能够获取活动目录的Configuration容器的所有权并修改其中的信息,并可以将对该容器的修改复制到森林中其他的域控制器上如果任何外部域的账户在被攻入的域进行认证,那么攻击者可以通过LSA口令缓存来偷取这些账户的口令,这使得他的影响扩大到森林中的其他域如果根域被攻入,那么EnterpriseAdmins和SchemaAdmins组的成员可以对森林中的所有域进行全面的控制,除非在此之前你已经手动限制了这些组的权限SIDSIDWindowNT/2000内部对安全主体的操作是通过一个称为安全标识符(SecurityIdentifier,SID)的全局惟一的48位数字来进行的SID能够防止系统将来自计算机A的Administrator账户与来自计算机B的Administrator账户弄混SIDS-1-5-21-1507001333-1204550764-1011284298-500SID带有前缀S,它的各个部分之间用连字符隔开第一个数字(本例中的1)是修订版本编号第二个数字是标识符颁发机构代码(对Windows2000来说总是为5)然后是4个子颁发机构代码(本例中是21和后续的3个长数字串)和一个相对标识符(RelativeIdentifier,RID,本例中是500)SID的生成SID中的一部分是各系统和域惟一具有的,而另一部分(RID)是跨所有系统和域共享的当安装Windows2000时,本地计算机会颁发一个随机的SID。类似的当创建一个Windows2000域时,它也被指定一个惟一的SID。于是对任何的Windows2000计算机或域来说,子颁发机构代码总是惟一的(除非故意修改或复制,例如某些底层的磁盘复制技术)RIDRID对所有的计算机和域来说都是一个常数。例如,带有RID500的SID总是代表本地计算机的真正的Administrator账户。RID501是Guest账户在域中,从1000开始的RID代表用户账户(例如,RID1015是在该域中创建的第14位用户)Windows2000(或者使用适当工具的恶意黑客)总是将具有RID500的账户识别为管理员其它的SIDS-1-1-0EveryoneS-1-2-0Interactive用户S-1-3-0CreatorOwnerS-1-3-1CreatorGroup为什么不能总是使用Administrator登录C:\netuse\\192.168.234.44\ipc$password/u:AdministratorSystemerror1326hasoccurred.Logonfailure:unknownusernameorbadpassword.Windows会自动将当前登录用户的凭据提交给网络登录企图如果用户在客户端上是使用Administrator登录的,这个登录企图就会被解释为客户端希望使用本地Administrator账户登录到远程系统当然,这个账户在远程服务器上没有上下文你可以使用netuse命令来手动指定登录上下文,给出远程域、计算机名称或IP地址和用户名,并在用户名前加上反斜线,例如:C:\netuse\\192.168.234.44\ipc$password/u:domain\AdministratorThecommandcompletedsuccessfully.查看SIDC:\user2sidAdministratorS-1-5-21-1507001333-1204550764-1011284298-500Numberofsubauthoritiesis5DomainisCORPC:\sid2user521150700133312045507641011284298500NameisAdministratorDomainisCORPTypeofSIDisSidTypeUser认证、授权和审核令牌网络认证审核登录认证过程首先,Windows2000必须确定自己是否在与合法的安全主体打交道。这是通过认证实现的最简单的例子是通过控制台登录到Windows2000的用户。用户按下标准的CTRL+ALT+DEL组合键以打开Windows2000安全登录窗口,然后输入账户名称和口令。安全登录窗口将输入的凭据传递给负责验证的用户模式组件,如Winlogon和LSASS。假设凭据是有效的,Winlogon将创建一个令牌(或称访问令牌),并将之绑定到用户登录会话上,稍后访问资源时需要提供令牌令牌令牌中含有与用户账户有关的所有SID,包括账户的SID,还有该用户所属的所有组和特殊身份(如DomainAdmins和INERACTIVE)的SID可以使用whoami这样的工具(包含在Win