For Each objUser in objGroup.Members
If objUser.Name <> "Administrator" and objUser.Name <> _
"fabrikam\Administrator" Then
objGroup.Remove(objUser.ADsPath)
End If
Next
对了:这就是如何使用脚本来增强 Security Analyzer 功能的典型例子。
任务7:检查未过期密码
如果说有什么东西用户会不喜欢的话,那么定时过期的密码肯定名列其中。毕竟,你还没有记住它时,它就已经需要更换了。那么,既然用户们这么憎恨定时过期密码的话,那么干嘛要用他们呢?(我们并不是指为了那些在想密码的时候倒在键盘和鼠标上的无数杯咖啡)。
但是,事实是黑客们和用户们一样憎恨定时过期密码。设想一名黑客想要进行字典穷举攻击。他或者是她也许已经排除了aardvark是密码的可能,而这时候用户恰恰在攻击进行一半的时候将 aardvark更改为系统密码。即使黑客真的猜中了密码,那么这种胜利也是暂时的。也许正当黑客猜中密码的时候,用户马上就将其更改为其它的了。经常更改系统密码是有效提高安全性的途径之一,而经常更改密码最好的办法就是让密码经常过期。
因为用不过期的密码会造成某种安全弱点,所以如果 Security Analyzer 发现任何帐户使用不过期密码的时候,它都会报告这一情况。也许你已经猜到了,我们恰巧也有一段相应的脚本来完成这个相同功能:
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")
For Each objUser In colAccounts
Set usr = GetObject("WinNT://" & strComputer & "/" & _
objUser.Name & ", user")
flag = usr.Get("UserFlags")
If flag AND ADS_UF_DONT_EXPIRE_PASSWD Then
Wscript.Echo usr.Name & ": Password does not expire."
Else
Wscript.Echo usr.Name & ": Password expires."
End If
Next
而且你还以通过以下脚本将密码全部设置为过期密码:
Const ADS_UF_DONT_EXPIRE_PASSWD = &H10000
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")
For Each objUser In colAccounts
Set usr = GetObject("WinNT://" & strComputer & "/" & _
objUser.Name & ", user")
flag = usr.Get("UserFlags")
If flag AND ADS_UF_DONT_EXPIRE_PASSWD Then
usr.UserFlags = flag XOR ADS_UF_DONT_EXPIRE_PASSWD
usr.SetInfo
End If
Next
任务8:进行本地帐户密码测试
蠕虫和病毒得到大家的广泛关注,这个可以理解,但是某些时候真正造成计算机安全威胁的往往是那些最最简单的东西,比如说微不足道的留言便条。在办公室里,职员们经常在留言便条上记录密码,并且将它们贴在显示器上面。现在,你要禁止这种做法了,或者可以严惩那些乱贴这类留言条的家伙这种做法会导致另外一个问题(我们不是指使用走私的便条)。为什么人们会将他们的密码记录下来?因为这些密码太难记了。如果用户不可以记录这些密码,那么他们会倾向于使用他们无需记录就可以记下来的更加简单的密码——例如password。
即使是一个业余黑客或者发泄不满的人使用密码password也可以侵入计算机。虽然 Security Analyzer 不能检测在显示器上是否有记录密码的便条,但是它却可以检查是否有本地用户帐号:
• 使用空密码
• 使用与用户名相同的密码
• 使用与计算机名相同的密码
• 使用password作为密码
• 使用单词admin或administrator作为密码
Security Analyzer 是如何进行这么酷的测试的?毕竟,它不可能检索用户的密码。不然的话这也成了一个安全突破口。好了,告诉你答案,事实上我们也不知道。但是我们怀疑它使用 ADSI ChangePassword 方法(或者某种相当的API)来测试并且修改用户密码。为什么是 ChangePassword ?因为使用这种方法时,如果你不知道当前用户的密码,就不可能顺利实现此项功能,你需要一起提供当前密码以及新密码来完成。因为 Security Analyzer 并没有真正修改密码,所以我们怀疑它只是简单的提供相同的密码(例如password)来同时作为当前密码和新密码,或者与之类似的情况:
objUser.ChangePassword "password", "password"
如果当前密码不是password,这个方法就行不通,系统就会报错。如果当前密码是password,这种方法就会成功,不会产生任何错误,然后密码会被改成password。当然,这一过程的净效果就是密码没有改变,但是系统现在知道当前的密码就是password。这听起来似乎有点混乱,但是先看看这段脚本,看看它到底做些什么。思路其实非常简单。
而且,是的,这也是黑客可能进行的测试。我们现在是借用黑客方法来做正事。
以下就是一段用来检测帐户是否使用的密码是否是password的脚本。这段脚本也可以做简单的修改来检测帐户使用的密码是不是空白的,或者使用登录名作为密码,或者其它。
On Error Resume Next
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
strPassword = "password"
Set colAccounts = GetObject("WinNT://" & strComputer & "")
colAccounts.Filter = Array("user")
For Each objUser In colAccounts
objUser.ChangePassword strPassword, strPassword
If Err = 0 or Err = -2147023569 Then
Wscript.Echo objUser.Name & " is using the password " & _
strpassword & "."
End If
Err.Clear
Next
注意: 你可能注意到了,我们的脚本检测是否出现错误(Err=0);如果没有错误,就说明密码已经被改变,这就说明我们知道这个帐号的密码就是password。但是我们同样检测是否存在错误-2147023569。如果当前的密码是password但是这个密码不能被更改,因为自从上次密码更改以后还没有经过足够长的时间,那么就会产生上述这个错误。(根据默认设置,密码只有每14天才能被更改一次)。
任务9:检测文件系统
如果计算机运行的是 Windows NT、Windows 2000、Windows XP 或者 Windows 2003操作系统,那么将硬盘各个分区格式成NTFS文件系统是非常重要的。(或许会有很少的用户会例外,我们这里暂且不管了。)除非你喜欢将你的硬盘暴露给外界,否则你需要将硬盘格式成为 NTFS 格式,然后就可以享受 NTFS 安全机制了。同样这就好像是家庭的安全一样:除非你想其他人或者他们的狗能够自由出入你家,并且随意使用屋里的东西,否则你就应该在门上加锁,并且在你人不在的时候把锁锁上。
那么你如何检测硬盘上安装的是什么文件系统呢?这里有一个非常简便的方法:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer &
"\root\cimv2")
Set colDisks = objWMIService.ExecQuery _
("Select * from Win32_LogicalDisk Where DriveType = 3")
For Each objDisk in colDisks
Wscript.Echo "Disk drive: "& objDisk.DeviceID & " -- " & objDisk.FileSystem
Next
在前述 WQL 查询中,你可能已经发现我们只是查询 DriveType 等于 3 的逻辑盘。为什么这么做?因为 DriveType 等于 3 代表的是硬盘,通过将返回数据限定在硬盘上,可以省去我们在软盘、CD-ROM 驱动器以及其它我们知道不会(也不可能)安装 NTFS 文件系统的驱动器上花费的时间。
任务10:检测自动登录
可以将 Windows 设置成每当开机就自动使用注册的用户名和密码登录。这听起来很方便,但是的确不适用于那些始终与 Internet 保持连接或者在信息亭中使用的计算机。但是,从另一方面来说,这却有点安全漏洞的嫌疑,至少可以这样说。毕竟它允许任何打开计算机的人以储存在注册表中的用户名和密码登录。正因为如此,Security Analyzer 所执行的一项检查就是查看计算机的自动登录功能是否打开。同样,你也可以使用脚本来完成这项检查:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\WinLogon"
strValueName = "AutoAdminLogon"
objReg.GetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName,
dwValue
If dwValue = 1 Then
Wscript.Echo "Auto logon is enabled."
Else
Wscript.Echo "Auto logon is disabled."
End If
同样,你肯定不希望计算机上的自动登录打开。所以,为什么不用一段脚本来关闭自动登录功能而不是像 Security Analyzer 那样仅仅只是提示自动登录功能的状态呢。可以使用类似以下的脚本:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\WinLogon"
strValueName = "AutoAdminLogon"
dwValue = 0
oReg.SetDWORDValue HKEY_LOCAL_MACHINE, strKeyPath, strValueName,
dwValue
任务11:检查来宾帐户状态
这个问题取决于你如何看待,来宾帐户在不需要证实身份的情况下向他人提供了一种登录你的计算机的途径(我们假设唯一的例外就是,此 Guest 不是指 Christopher Guest)。正因为如此,在 Windows XP 和 Windows 2003 中来宾帐户在默认条件下是关闭的,而且在 Windows 2000 和 Windows NT 4.0 中同样也应该是关闭的。这是一段报告本地计算机上来宾帐户状态的脚本:
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objUser = GetObject("WinNT://" & strComputer & "/Guest")
If objUser.AccountDisabled Then
Wscript.Echo "The Guest account is disabled."
Else
Wscript.Echo "The Guest account is enabled."
End If
看,酷吧。但是假设你决定所有计算机上的来宾帐户都应该关闭。可以修改这段脚本来让它在检查来宾帐户以外多做一两件其它的事。如果来宾帐户已经关闭,那么它只需要报告状态事实;但是如果来宾帐户开启的话,它进一步关闭此帐户:
Set objNetwork = CreateObject("Wscript.Network")
strComputer = objNetwork.ComputerName
Set objUser = GetObject("WinNT://" & strComputer & "/Guest")
If objUser.AccountDisabled Then
Wscript.Echo "The Guest account is already disabled."
Else
objUser.AccountDisabled = True
objUser.SetInfo
Wscript.Echo "The Guest account has been disabled."
End If
任务12:检查匿名登录
在默认设置下,非授权用户是无法连接到任何 Windows 计算机以获得域用户名和共享名列表的。这是什么意思?好的,黑客以你的身份登录需要两条信息:你的用户名和你的密码。他可以简单地通过将便携式电脑接驳到你所在的网络然后向最近的计算机查询就可以获取你的用户名,这样就获得了攻击帐户所需信息的一半。(谢天谢地,还没有人发明无线的 Internet 便条,虽然我们知道有人正在钻研这一技术。)
那么你如何知道自己的计算机是否正在象分发万圣节糖果那样发送信息呢?你可以用 Security Analyzer 或者你也可以使用下面这段脚本:
Const HKEY_LOCAL_MACHINE = &H80000002
strComputer = "."
Set objReg=GetObject("winmgmts:\" & strComputer &
"\root\default:StdRegProv")
strKeyPath = "System\CurrentControlSet\Control\Lsa"
strValueName = "RestrictAnonymous"
objReg.GetDWORDValue HKEY_LOCAL_MACHINE,strKeyPath,strValueName,dwValue
If dwValue = 0 Then
Wscript.Echo "Anonymous access is enabled."
Else
Wscript.Echo "Anonymous access is disabled."
End If
你这样问很有趣;通过脚本
[3] [4]
上一页 [1] [2] [3] [4] 下一页
查看更多与脚本的故事相关内容