主题 : 详述Windows验证机制的安全测试
金秋果實豐 金風吹黃葉
级别: 七朵秋菊
UID: 33333
精华: 0
发帖: 7917
威望: 34658 点
无痕币: 605 WHB
贡献值: 0 点
在线时间: 3192(时)
注册时间: 2007-12-25
最后登录: 2022-08-05

0 详述Windows验证机制的安全测试

作者: 菲儿,  出处:IT专家网

  【IT专家网独家】身份验证机制是用户登录操作系统必须要过的一个“关卡”,只有通过验证用户才能登录系统。Windows的身份验证是非常严密和复杂的,这也是保证系统安全的基础。那么,是否意味着Windows的身份验证机制就无懈可击呢?笔者最近对Windows的验证机制进行了一番测试,测试中发现了其身份验证的一些缺陷。下面笔者将再现测试过程,然后结合实验分析其验证机制,揭示其验证过程中存在的问题。
  一、实验探索Windows验证机制
  (一)环境描述
  有两台测试主机,Test1和Test2,其IP地址分别为192.168.1.10和192.168.1.20。在它们上创建同一用户名Fr,并且为其设置同样的密码,另外还有用户名相同但密码不同的administrator帐户。同时在Test2上创建了共享文件夹share,通过帐户的改变来访问该文件夹用以研究Windows的难机制。
  (二)关于帐户验证
  1.帐户验证机制
  Windows的帐户验证机制称为LSA,具体的实现过程依靠的是lasaa.exe。Windows的认证机制是基于Principal(角色)验证的,它是Windows验证的主体,可以是单个的帐户,也可以是一用户组还可以是一台计算机。比如对我的计算机来说我就是一个Principal,是计算机要难的一个主体,当系统启动后我们通过winlogon.exe提交的帐户和密码称之为Credential(证据),就是证明Principal的证据,当我们提交了Credential后,系统就会调用lsass,exe将提交信息与本地计算机SAM数据库中的信息进行比较,来完成验证。
  2.验证实验
  为了更好地管理帐户,我们可以使用域进行帐户管理,当使用域来进行帐户管理时时,每次都是
  通过Windows系统中的netlogon服务来完成的,具体的实现是依靠lsass.exe启动本地计算机的netlogon服务,与远程域控制器上的netlogon服务建立连接,来实现验证。我们下面要进行的所有实现都是基于LAS的本地验证机制的。
  (1).启动Test1和Test2电脑,都使用Fr帐户来登录系统,然后在Test1计算机的“运行”栏中输入“\\192.168.1.20\share”,Test1可以直接访问到Test2。测试结果说明:两台计算机使用相同的帐户和密码登录系统后,可以实现共享的直接访问。(图1)

  (2).重新启动计算机Test1和Test2,都使用administrator帐户进行登录,同样在“运行”栏中执行刚才的命令,Test1电脑在访问Test2的时候弹出了如图2所示的对话框,需要输入帐户和密码才行,我们输入帐户administrator和密码test后成功访问。测试结果说明:使用不同的帐户进行登录,即便是计算机上存在相同的帐户,但由于密码不同也不可以直接访问共享。(图2)

  总结:由实验1和实验2我们得出了一个结论,只有两台计算机上的登录帐户和密码完全相同才可以实现直接访问。这个实验结论其实就是LSA验证的一个特点,在网络中不使用的域这两台计算机,只要登录帐户和密码完全相同,就可以实现互访,而不需要输入帐户和密码。

  (3).在实验2的基础上当访问成功后,不做任何设置关闭共享窗口,使用Test1再次访问Test2的共享,可以直接访问。测试结果说明:当通过网络访问需要输入帐户和密码的时候,一旦输入帐户和密码验证成功了,而两台计算机一直于开机状态下再次进行访问,就可以直接访问。
  (4).注销Test2,使用Test1不进行任何设置现次访问Test2,可以直接访问。测试结果说明:当通过网络访问需要输入帐户和密码的时候,一旦输入帐户和密码验证成功了,Test1不做任何操作,注销Test2后,再次访问共享资源,可以直接访问共享。
  (5).重启Test2,使用Test1再次访问Test2,可以直接访问。测试结果说明:当通过网络访问需要输入帐户和密码的时候,一旦输入帐户和密码验证成功了,Test1不做任何操作,重启Test2后再次访问共享资源,也可以直接访问共享。
  (6).注销Test1,再次访问Test2,不可以直接访问,要求输入帐户和密码。测试结果说明:当通过网络访问需要输入帐户和密码的时候,一旦输入帐户和密码验证成功了,注销Test1后,Test2不做任何操作,当再次访问共享资源时,不可以直接访问共享。
  (7).重启Test1,再次访问Test2,也不可以直接访问,要求输入帐户和密码。测试结果说明:当通过网络访问需要输入帐户和密码的时候,一旦输入帐户和密码验证成功了,重启Test1,使用Test2不做任何操作,再次访问共享资源,不可以直接访问共享。
  (8).在实验2的基础上,更改Test2的administrator帐户的密码为123456,然后使用Test1再次访问Test2。结论如下:Test1可以直接访问Test2的共享文件夹。
  (9).在实验8的基础上,注销Test2,然后使用Test1再次访问Test2。结论如下:Test2更改了administrator的密码并注销后,Test1可以直接访问Test2的共享文件夹。
  (10).在实验8的基础上,重启Test2,然后使用Test1再次访问Test2。结论如下:Test2更改了dministrator的密码并重启后,Test1不可以直接访问Test2的共享文件夹,出现了如图3提示的错误。(图3)
  

  (11).注销或者重启Test1,再次访问Test2。 结论如下:注销或者重启Test1后,再次访问Test2时,需要重新进行验证。
  3.实验总结
  上面所做的实验以及得出的种种结论很大程度上在于登录会话(logon session)在Windows中的很多验证不是基于LSA,而是基于logon session的,这是一种由内核维护的数据结构存储的是network credential(网络验证的证据),上面的实验1,实验2以及实验11都是基于Windows的LSA验证,而从实验3到实验10则都是基于logon session的验证。
  4.结论分析
  logon session分为系统登录会话(system logon session)、网络登录会话(network logon session)、服务登录会话(service logon session)和交互式登录会话(interactive logon session)。系统登录会话是最早建立的会话它就是我们经常说的system权限或者system帐户,在Windows中大部分的服务都运行在系统登录会话里,在Windows中大部分的服务都运行在系统登录会话里,但在WindowsXP系统中微软出于对安全的考虑让某些服务以LocalService和NetworkService权限启动,而并不是都以system权限运行。

  (三)关于帐户测试
  1.帐户权限实验
  (1).以system权限运行注册表
  我们可以使用at命令添加一个运行注册表编辑器的任务“at time /interactive regedit.exe”,当系统按照时间设置来启动注册表编辑后,我们会发现这时候已经可以访问HKEY_LOCAL_MACHINE\SAM\SAM这个键值,而在普通用户登录的时候是无法正常访问的。我们查看“任务管理器”,可以看到它是以system权限运行的。(图4)
  


  (2).设置系统服务的运行权限
  我们在“开始”-“运行”栏中输入services.msc,打开“服务”,从中随便选择一个服务,点右键,选择“属性”,选择“登录”项,如果我们勾选“此帐户”,让某个服务以某个帐户动行,那么系统就会给该服务创建一个新的登录会话,这个登录会话就是服务登录会话(service logon session)如图5。(图5)
  

  2.实验分析
  上面的两例测试也interactive logon session和network logon session相关,当我们开机启动后,输入正确的帐户和密码,系统会首先建立interactive logon session,这样以后所有的进程比如explorer.exe等都会通过token与interactive logon session建立连接,所谓的token就是进程与logon session之间的一个桥梁,因为在Windows中每个应用程序的启动过程都是由explorer.exe调用,然后确定其函数入口并实现运行的,启动计算机后所有的应用程序都是explorer.exe的子进程,而子进程是继承父进程的 logon session的,当然为了某些特殊的需要我们可以改变token关联,使某个应用程序进程关联到其它的logon session里,最常见的就是关联到system logon session里,方法有很多。
  我们在看实验3的过程之前,先来看实验2的过程,Test1的lsass.exe会与远程Test2计算机上的lsass.exe进行通信,Test2上的lsass.exe通过SAM数据库进行验证,当验证成功后,首先Test1上会建立一个logon session存储于interactive logon session,同时Test2上届会建立一个logon session,它存储于network logon session,在前面我们已经提到,logon session存储的是network logon session,这句话其实不够确切,因为在network logon session里根本就不缓存任何credential,它是验证信息与安全数据库(SAM)之间在logon session中的一个桥梁。通过实验3-7我们可以分析出logon session的种种特点。
  3.分析结论
  (1).logon session具有本地性,即使有建立的logon session都在本地计算机上,当实验2完成操作后,logon session就在Test1上,所以当我们注销或启动Test2后,我们依然可以直接访问Test2,但是注销或者重启Test1,再次访问Test2时就需要重新验证了。
  (2).logon session具有暂时性,只要我们注销或者重新启动Test1后,都无法直接访问Test2。因为注销或者重新启动导致了logon session的消失,这里牵涉到了logon session生存期问题。
  (3).logon session具有唯一性,其实这个特性是正常的,如果不唯一,那么Windows的验证也冰没有意义了,这点通过实验10最能证明,当Test2更改密码并重新启动后,正是因为Test1上的logon session具有唯一性,才出现了访问期间错误。
(三)生存周期实验
  logon session的生存期是从登录计算机开始到系统调用其所长Windows API函数Exit WindowsEx重新启动计算机结束。这个说法太笼统了,因为logon session分很多种,每种的生存期也存在微妙的差异,但正是这些微妙的差异却可以解决很多问题。
  1.实验测试
  我们来做一个实验以探索system logon session的生存期,system logon session是系统启动过程中建立的,我们以notepad.exe为例,首先使用“mt -susession.exe”将notepad.exe的token与system logon session建立连接,我们注销计算机并看notepad.exe的进程是否结束就可以了。当我们提升notepad.exe的权限为system的时候,注销计算机后以administrator帐户和Fr帐户分别登录计算机,notepad.exe依然运行,重新启动计算机后发现程序结束,所以system logon session的生存期是到计算机重新启动并肯注销不会消失。
  2.分析
  联系前面的实验3到实验5可以清楚地看到,不管Test2进行如何Test1都可以直接访问到Test2,从实验8到实验10我们可以看出network logon session的具体作用前面已经提到network logon session里不存在任何的credential,它的作用就是network credential和本地安全数据库进行难的桥梁。也许有人会问当Test2重启后,会话结束了,为什么Test1还可以直接访问Test2呢?这里面我们忽略了一个登录会话的验证过程,登录会话的过程本质上也是将logon session里面缓存的credential与计算机中安全数据库(SAM)进行对比验证。它的生存期可以理解为网络验证的时候建立,计算机重新启动后消失,在实验5中我们重新Test2,network logon session消失,但是当Test1访问Test2的时候,依然会建立network logon session。在实验10中,更改密码并重新Test2,Test1访问Test2同样建立了一个network logon session,但是这时候Test1电脑中interactive logon session里的credential经Test2电脑上的network logon session与本地安全数据库发现是不相同的,所以访问就出错了,而注销或者重启Test1,随着interactive logon session的消失,必然要求我们重新验证,这就是实验11中需要重新难的原因。通过实验6和实验7我们可以得出interactive logon session的生存期为输入帐户和密码登录成功开始,重新启动计算机后消失,并肯注销也会消失。经过以上的分析我们得出三个logon session的生存期。
  3.结论
  (1).system logon session的生存期建立于系统登录之前,结束于系统重新启动或者关机,但是注销后会话不会结束。
  (2).interactive logon session的生存期建立于系统登录之后,结束于系统重新启动或者关机,注销后会话也同样结束。
  (3).network logon session的生存期是网络访问杨功后建立,结束于系统重新启动或者关机,注销后不会消失。
  二、Windows验证机制的缺陷
  1、绕过验证
  根据上面的测试,我们可以目标电脑和本地电脑上建立了完全相同的帐户(用户名和密码都相同),然后使用runas命令实现telnet远程登录。
  2、登录会话带来的问题。
  在Windows中有很多难基于logon session,这在带来方便的同时,也带来了权限滥用的问题,比如Task Scheduler(动行于system logon session)服务是at命令运行的基础,这导致了所有at命令运行的应用程序都是以system权限运行的,另外对于局域网安全也带来了威胁,人们知道Windows系统对服务的管理是通过服务控制管理器(SCM)来完成,它的本质是Windows启动过程中winlogon.exe启动的sevices.exe,因为它是一个RPC服务器,所以我们可以行程管理服务,这样就可以让我们有一定的几率来开启目标电脑上的危险服务,比如telnet服务。
  我们来做个简单的所实验的局域网环境,重新启动Test1和Test2,都以administrator帐户登录,但是密码不一样,在Test1上运行,在服务中选择“操作”→“连接到另一台计算机”,默认选择“另一台计算机”,我们填入Test2的IP地址192.168.1.20,点击确定后,出现了如图6所示的错误提示信息,这个错误信息通过上面知识的学习可以很容易理解。(图6)


  我们继续在Test1的“开始”-“运行”栏中输入“\\192.168.88.143\share”,输入帐户和密码成功访问Test2上的共享后,再次重复services.msc中的操作就可以管理Test2的服务了见图7。 (图7)
  

  总结:上面关于Windows验证机制的实验测试,证明其验证机制存在一定的缺陷。也许,这些结果对于一般用户意义不大。不过,对于系统爱好者来说了解这些是大有裨益的。
秂生完整在于學繪勇敢麵對人生悲劇而繼續活下去
Total 5.580930(s) query 3, Time now is:05-05 20:35, Gzip enabled 粤ICP备07514325号-1
Powered by PHPWind v7.3.2 Certificate Code © 2003-13 秋无痕论坛