Board logo

标题: [分享]NT/2000服务器终极安全设置与效率优化指南 [打印本页]

作者: 久木    时间: 2005-4-7 20:28     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

1.初级篇:NT/2000系统本身的定制安装与相关设置
用NT(2000)建立的WEB站点在所有的网站中占了很大一部分比例,主要因为其易用性与易管理性,使该公司不必再投入大量的金钱在服务器的管理上,这一点优于nix系统,不必请很专业的管理员,不必支付一份可以节省的高薪,呵呵,当然nix的管理员也不会失业,因为其开放源码和windows系统无与伦比的速度,使得现在几乎所有的大型服务器全部采用nix系统。但对于中小型企业来说windows已经足够,但NT的安全问题也一直比较突出,使得一些每个基于NT的网站都有一种如履薄冰的感觉,在此我给出一份安全解决方案,算是为中国的网络安全事业做出一份贡献吧 (说明:本方案主要是针对建立Web站点的NT、2000服务器安全,对于局域网内的服务器并不合适。)
一、 定制自己的NT/2000 SERVER
1. 版本的选择:
WIN2000有各种语言的版本,对于我们来说,可以选择英文版或简体中文版,我强烈建议:在语言不成为障碍的情况下,请一定使用英文版。要知道,微软的产品是以Bug &Patch而著称的,中文版的Bug远远多于英文版,而补丁一般还会迟至少半个月(也就是说一般微软公布了漏洞后你的机子还会有半个月处于无保护状况)
2. 组件的定制:
win2000在默认情况下会安装一些常用的组件,但是正是这个默认安装是极度危险的你应该确切的知道你需要哪些服务,而且仅仅安装你确实需要的服务,根据安全原则,最少的服务+最小的权限=最大的安全。典型的WEB服务器需要的最小组件选择是:只安装IIS的Com Files,IIS Snap-In,WWW Server组件。如果你确实需要安装其他组件,请慎重,特别是:Indexing Service, FrontPage 2000 Server Extensions, Internet Service Manager (HTML)这几个危险服务。
二、 正确安装NT/2000 SERVER

不论是NT还是2000,硬盘分区均为NTFS分区;
说明:
(1) NTFS比FAT分区多了安全控制功能,可以对不同的文件夹设置不同的访问权限,安全性增强。
(2) 建议最好一次性全部安装成NTFS分区,而不要先安装成FAT分区再转化为NTFS分区,这样做在安装了SP5和SP6的情况下会导致转化不成功,甚至系统崩溃。
(3) 安装NTFS分区有一个潜在的危险,就是目前大多数反病毒软件没有提供对软盘启动后NTFS分区病毒的查杀,这样一旦系统中了恶性病毒而导致系统不能正常启动,后果就比较严重,因此及建议平时做好防病毒工作。
(4)分区和逻辑盘的分配
有一些朋友为了省事,将硬盘仅仅分为一个逻辑盘,所有的软件都装在C驱上,这是很不好的,建议最少建立两个分区,一个系统分区,一个应用程序分区,这是因为,微软的IIS经常会有泄漏源码/溢出的漏洞,如果把系统和IIS放在同一个驱动器会导致系统文件的泄漏甚至入侵者远程获取ADMIN。推荐的安全配置是建立三个逻辑驱动器,第一个大于2G,用来装系统和重要的日志文件,第二个放IIS,第三个放FTP,这样无论IIS或FTP出了安全漏洞都不会直接影响到系统目录和系统文件。要知道,IIS和FTP是对外服务的,比较容易出问题。而把IIS和FTP分开主要是为了防止入侵者上传程序并从IIS中运行。
(5)安装顺序的选择:
win2000在安装中有几个顺序是一定要注意的: 首先,何时接入网络:Win2000在安装时有一个漏洞,在你输入Administrator密码后,系统就建立了ADMIN$的共享,但是并没有用你刚刚输入的密码来保护它,这种情况一直持续到你再次启动后,在此期间,任何人都可以通过ADMIN$进入你的机器;同时,只要安装一完成,各种服务就会自动运行,而这时的服务器是满身漏洞,非常容易进入的,因此,在完全安装并配置好win2000 SERVER之前,一定不要把主机接入网络。 其次,补丁的安装:补丁的安装应该在所有应用程序安装完之后,因为补丁程序往往要替换/修改某些系统文件,如果先安装补丁再安装应用程序有可能导致补丁不能起到应有的效果,例如:IIS的HotFix就要求每次更改IIS的配置都需要安装
 三、 安全配置NT/2000 SERVER
即使正确的安装了WIN2000 SERVER,系统还是有很多的漏洞,还需要进一步进行细致地配置。
1.端口:
端口是计算机和外部网络相连的逻辑接口,也是计算机的第一道屏障,端口配置正确与否直接影响到主机的安全,一般来说,仅打开你需要使用的端口会比较安全,配置的方法是在网卡属性-TCP/IP-高级-选项-TCP/IP筛选中启用TCP/IP筛选,不过对于win2000的端口过滤来说,有一个不好的特性:只能规定开哪些端口,不能规定关闭哪些端口,这样对于需要开大量端口的用户就比较痛苦。
2.IIS:
IIS是微软的组件中漏洞最多的一个,平均两三个月就要出一个漏洞,而微软的IIS默认安装又实在不敢恭维,所以IIS的配置是我们的重点,现在大家跟着我一起来:首先,把C盘那个什么Inetpub目录彻底删掉,在D盘建一个Inetpub(要是你不放心用默认目录名也可以改一个名字,但是自己要记得)在IIS管理器中将主目录指向D:\Inetpub;其次,那个IIS安装时默认的什么scripts等虚拟目录一概删除,如果你需要什么权限的目录可以自己慢慢建,需要什么权限开什么。(特别注意写权限和执行程序的权限,没有绝对的必要千万不要给)第三,应用程序配置:在IIS管理器中删除必须之外的任何无用映射,必须指的是ASP,ASA和其他你确实需要用到的文件类型,例如你用到stml等(使用server side include),实际上90%的主机有了上面两个映射就够了,其余的映射几乎每个都有一个凄惨的故事:htw, htr, idq, ida……想知道这些故事?去查以前的漏洞列表吧。在IIS管理器中右击主机->属性->WWW服务 编辑->主目录配置->应用程序映射,然后就开始一个个删吧(里面没有全选的,嘿嘿)。接着在刚刚那个窗口的应用程序调试书签内将脚本错误消息改为发送文本(除非你想ASP出错的时候用户知道你的程序/网络/数据库结构)错误文本写什么?随便你喜欢,自己看着办。点击确定退出时别忘了让虚拟站点继承你设定的属性。安装新的Service Pack后,IIS的应用程序映射应重新设置。(说明:安装新的Service Pack后,某些应用程序映射又会出现,导致出现安全漏洞。这是管理员较易忽视的一点。)
为了对付日益增多的cgi漏洞扫描器,还有一个小技巧可以参考,在IIS中将HTTP404 Object Not Found出错页面通过URL重定向到一个定制HTM文件,可以让目前绝大多数CGI漏洞扫描器失灵。其实原因很简单,大多数CGI扫描器在编写时为了方便,都是通过查看返回页面的HTTP代码来判断漏洞是否存在的,例如,著名的IDQ漏洞一般都是通过取1.idq来检验,如果返回HTTP200,就认为是有这个漏洞,反之如果返回HTTP404就认为没有,如果你通过URL将HTTP404出错信息重定向到HTTP404.htm文件,那么所有的扫描无论存不存在漏洞都会返回HTTP200,90%的CGI扫描器会认为你什么漏洞都有,结果反而掩盖了你真正的漏洞,让入侵者茫然无处下手,不过从个人角度来说,我还是认为扎扎实实做好安全设置比这样的小技巧重要的多。
最后,为了保险起见,你可以使用IIS的备份功能,将刚刚的设定全部备份下来,这样就可以随时恢复IIS的安全配置。还有,如果你怕IIS负荷过高导致服务器满负荷死机,也可以在性能中打开CPU限制,例如将IIS的最大CPU使用率限制在70%。
3.帐号策略:
(1)帐号尽可能少,且尽可能少用来登录;
说明:网站帐号一般只用来做系统维护,多余的帐号一个也不要,因为多一个帐号就会多一份被攻破的危险。
(2)除过Administrator外,有必要再增加一个属于管理员组的帐号;
说明:两个管理员组的帐号,一方面防止管理员一旦忘记一个帐号的口令还
有一个备用帐号;另方面,一旦黑客攻破一个帐号并更改口令,我们还有
有机会重新在短期内取得控制权。
(3)所有帐号权限需严格控制,轻易不要给帐号以特殊权限;
(4)将Administrator重命名,改为一个不易猜的名字。其他一般帐号也应尊循这一原则。
说明:这样可以为黑客攻击增加一层障碍。
(5)将Guest帐号禁用,同时重命名为一个复杂的名字,增加口令,并将它从
Guest组删掉;
说明:有的黑客工具正是利用了guest 的弱点,可以将帐号从一般用户提
升到管理员组。
(6)给所有用户帐号一个复杂的口令(系统帐号出外),长度最少在8位以上, 且必须同时包含字母、数字、特殊字符。同时不要使用大家熟悉的单词(如microsoft)、熟悉的键盘顺序(如qwert)、熟悉的数字(如2000)等。
说明:口令是黑客攻击的重点,口令一旦被突破也就无任何系统安全可言了,而这往往是不少网管所忽视的地方,据我们的测试,仅字母加数字的5位口令在几分钟内就会被攻破,而所推荐的方案则要安全的多。
(7)口令必须定期更改(建议至少两周该一次),且最好记在心里,除此以外不要在任何地方做记录;另外,如果在日志审核中发现某个帐号被连续尝试,则必须立刻更改此帐号(包括用户名和口令);
(8)在帐号属性中设立锁定次数,比如改帐号失败登录次数超过5次即锁定改帐号。这样可以防止某些大规模的登录尝试,同时也使管理员对该帐号提高警惕。
4.安全日志:
Win2000的默认安装是不开任何安全审核的!
那么请你到本地安全策略->审核策略中打开相应的审核,推荐的审核是:
账户管理 成功 失败
登录事件 成功 失败
对象访问 失败
策略更改 成功 失败
特权使用 失败
系统事件 成功 失败
目录服务访问 失败
账户登录事件 成功 失败
审核项目少的缺点是万一你想看发现没有记录那就一点都没辙;审核项目太多不仅会占用系统资源而且会导致你根本没空去看,这样就失去了审核的意义。 与之相关的是:
在账户策略->密码策略中设定:
密码复杂性要求 启用
密码长度最小值 6位
强制密码历史 5次
最长存留期 30天
在账户策略->账户锁定策略中设定:
账户锁定 3次错误登录
锁定时间 20分钟
复位锁定计数 20分钟
同样,Terminal Service的安全日志默认也是不开的,我们可以在Terminal Service Configration(远程服务配置)-权限-高级中配置安全审核,一般来说只要记录登录、注销事件就可以了。
5.目录和文件权限:
为了控制好服务器上用户的权限,同时也为了预防以后可能的入侵和溢出,我们还必须非常小心地设置目录和文件的访问权限,NT的访问权限分为:读取、写入、读取及执行、修改、列目录、完全控制。在默认的情况下,大多数的文件夹对所有用户(Everyone这个组)是完全敞开的(Full Control),你需要根据应用的需要进行权限重设。
在进行权限控制时,请记住以下几个原则:
1>限是累计的:如果一个用户同时属于两个组,那么他就有了这两个组所允许的所有权限;
2>拒绝的权限要比允许的权限高(拒绝策略会先执行)如果一个用户属于一个被拒绝访问某个资源的组,那么不管其他的权限设置给他开放了多少权限,他也一定不能访问这个资源。所以请非常小心地使用拒绝,任何一个不当的拒绝都有可能造成系统无法正常运行;
3>文件权限比文件夹权限高
4>利用用户组来进行权限控制是一个成熟的系统管理员必须具有的优良习惯之一;
5>仅给用户真正需要的权限,权限的最小化原则是安全的重要保障;
6.只安装一种操作系统;
说明:安装两种以上操作系统,会给黑客以可乘之机,利用攻击使系统重启到另外一个没有安全设置的操作系统(或者他熟悉的操作系统),进而进行破坏。
7.安装成独立的域控制器(Stand Alone),选择工作组成员,不选择域;
说明:主域控制器(PDC)是局域网中队多台联网机器管理的一种方式,用于网站服务器包含着安全隐患,使黑客有可能利用域方式的漏洞攻击站点服务器。

8.将操作系统文件所在分区与WEB数据包括其他应用程序所在的分区分开,并在安装时最好不要使用系统默认的目录,如将\WINNT改为其他目录;
说明:黑客有可能通过WEB站点的漏洞得到操作系统对操作系统某些程序的执行权限,从而造成更大的破坏。同时如果采用IIS的话你应该在其设置中删除掉所有的无用的映射,同时不要安装索引服务,远程站点管理与服务器扩展最好也不要要,然后删掉默认路径下的www,整个删,不要手软,然后再硬盘的另一个硬盘建立存放你网站的文件夹,同时一定记得打开w3c日志纪录,切记(不过本人建议采用apache 1.3.24)
系统安装过程中一定本着最小服务原则,无用的服务一概不选择,达到系统的最小安装,多一个服务,多一份风险,呵呵,所以无用组件千万不要安装!
9.关于补丁:在NT下,如果安装了补丁程序,以后如果要从NT光盘上安装新的Windows程序,都要重新安装一次补丁程序, 2000下不需要这样做。
说明:

(1) 最新的补丁程序,表示系统以前有重大漏洞,非补不可了,对于局域网内服务器可以不是最新的,但站点必须安装最新补丁,否则黑客可能会利用低版本补丁的漏洞对系统造成威胁。这是一部分管理员较易忽视的一点;
(2) 安装NT的SP5、SP6有一个潜在威胁,就是一旦系统崩溃重装NT时,系统将不会认NTFS分区,原因是微软在这两个补丁中对NTFS做了改进。只能通过Windows 2000安装过程中认NTFS,这样会造成很多麻烦,建议同时做好数据备份工作。
(3) 安装Service Pack前应先在测试机器上安装一次,以防因为例外原因导致机器死机,同时做好数据备份。

尽量不安装与WEB站点服务无关的软件;
说明:其他应用软件有可能存在黑客熟知的安全漏洞。


10.解除NetBios与TCP/IP协议的绑定
说明:NetBois在局域网内是不可缺少的功能,在网站服务器上却成了黑客扫描工具的首选目标。方法:NT:控制面版——网络——绑定——NetBios接口——禁用 2000:控制面版——网络和拨号连接——本地网络——属性——TCP/IP——属性——高级——WINS——禁用TCP/IP上的NETBIOS

11.删除所有的网络共享资源,在网络连接的设置中删除文件和打印共享,只留下TCP/IP协议
说明:NT与2000在默认情况下有不少网络共享资源,在局域网内对网络管理和网络通讯有用,在网站服务器上同样是一个特大的安全隐患。(卸载“Microsoft 网络的文件和打印机共享”。当查看“网络和拨号连接”中的任何连接属性时,将显示该选项。单击“卸载”按钮删除该组件;清除“Microsoft 网络的文件和打印机共享”复选框将不起作用。)
方法:
(1)NT:管理工具——服务器管理器——共享目录——停止共享;
2000:控制面版——管理工具——计算及管理——共享文件夹———停止共享
但上述两种方法太麻烦,服务器每重启一次,管理员就必须停止一次
(2)修改注册表:
运行Regedit,然后修改注册表在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters下增加一个键
Name: AutoShareServer
Type: REG_DWORD
value: 0
然后重新启动您的服务器,磁盘分区共享去掉,但IPC共享仍存在,需每次重启后手工删除。

12.改NTFS的安全权限;
说明:NTFS下所有文件默认情况下对所有人(EveryOne)为完全控制权限,这使黑客有可能使用一般用户身份对文件做增加、删除、执行等操作,建议对一般用户只给予读取权限,而只给管理员和System以完全控制权限,但这样做有可能使某些正常的脚本程序不能执行,或者某些需要写的操作不能完成,这时需要对这些文件所在的文件夹权限进行更改,建议在做更改前先在测试机器上作测试,然后慎重更改。

13.加强数据备份;
说明:这一点非常重要,站点的核心是数据,数据一旦遭到破坏后果不堪设想,而这往往是黑客们真正关心的东西;遗憾的是,不少网管在这一点上作的并不好,不是备份不完全,就是备份不及时。数据备份需要仔细计划,制定出一个策略并作了测试以后才实施,而且随着网站的更新,备份计划也需要不断地调整。


14.只保留TCP/IP协议,删除NETBEUI、IPX/SPX协议;
说明:网站需要的通讯协议只有TCP/IP,而NETBEUI是一个只能用于局域网的协议,IPX/SPX是面临淘汰的协议,放在网站上没有任何用处,反而会被某些黑客工具利用。

15.不要起用IP转发功能,控制面板->网络->协议->TCP/IP协议->属性,使这个选框为空。(NT)
说明:缺省情况下,NT的IP转发功能是禁止的,但注意不要启用,否则它会具有路由作用,被黑客利用来对其他服务器进行攻击。

16.安装最新的MDAC(http://www.microsoft.com/data/download.htm)
说明:MDAC为数据访问部件,通常程序对数据库的访问都通过它,但它也是黑客攻击的目标,为防止以前版本的漏洞可能会被带入升级后的版本,建议卸载后安装最新的版本。注意:在安装最新版本前最好先做一下测试,因为有的数据访问方式或许在新版本中不再被支持,这种情况下可以通过修改注册表来档漏洞,祥见漏洞测试文档。

17.设置IP拒绝访问列表
说明:对于WWW服务,可以拒绝一些对站点有攻击嫌疑的地址;尤其对于FTP服务,如果只是自己公司上传文件,就可以只允许本公司的IP访问改FTP服务,这样,安全性大为提高。

18.禁止对FTP服务的匿名访问
说明:如果允许对FTP服务做匿名访问,该匿名帐户就有可能被利用来获取更多的信息,以致对系统造成危害。

19.建议使用W3C扩充日志文件格式,每天记录客户IP地址,用户名,服务器端口,方法,URI字根,HTTP状态,用户代理,而且每天均要审查日志。(最好不要使用缺省的目录,建议更换一个记日志的路径,同时设置日志的访问权限,只允许管理员和system为Full Control)
说明:作为一个重要措施,既可以发现攻击的迹象,采取预防措施,也可以作为受攻击的一个证据。

20.慎重设置WEB站点目录的访问权限,一般情况下,不要给予目录以写入和允许目录浏览权限。只给予.ASP文件目录以脚本的权限,而不要给与执行权限。
说明:目录访问权限必须慎重设置,否则会被黑客利用。
21.ASP编程安全:

安全不仅是网管的事,编程人员也必须在某些安全细节上注意,养成良好的安全习惯,否则,会给黑客造成可乘之机。目前,大多数网站上的ASP程序有这样那样的安全漏洞,但如果写程序的时候注意的话,还是可以避免的。

涉及用户名与口令的程序最好封装在服务器端,尽量少的在ASP文件里出现,涉及到与数据库连接地用户名与口令应给予最小的权限。
说明:用户名与口令,往往是黑客们最感兴趣的东西,如果被通过某种方式看到源代码,后果是严重的。因此要尽量减少它们在ASP文件中的出现次数。出现次数多得用户名与口令可以写在一个位置比较隐蔽的包含文件中。如果涉及到与数据库连接,理想状态下只给它以执行存储过程的权限,千万不要直接给予该用户以修改、插入、删除记录的权限。

需要经过验证的ASP页面,可跟踪上一个页面的文件名,只有从上一页面转进来的会话才能读取这个页面。
说明:现在的需要经过验证的ASP程序多是在页面头部加一个判断语句,但这还不够,有可能被黑客绕过验证直接进入,因此有必要跟踪上一个页面。具体漏洞见所附漏洞文档。

防止ASP主页.inc文件泄露问题
当存在asp 的主页正在制作并没有进行最后调试完成以前,可以被某些搜索引擎机动追加为搜索对象,如果这时候有人利用搜索引擎对这些网页进行查找,会得到有关文件的定位,并能在浏览器中察看到数据库地点和结构的细节揭示完整的源代码。
解决方案:程序员应该在网页发布前对其进行彻底的调试;安全专家需要固定asp 包含文件以便外部的用户不能看他们。 首先对 .inc 文件内容进行加密,其次也可以使用 .asp 文件代替 .inc 文件使用户无法从浏览器直接观看文件的源代码。.inc 文件的文件名不用使用系统默认的或者有特殊含义容易被用户猜测到的,尽量使用无规则的英文字母。


注意某些ASP编辑器会自动备份asp文件,会被下载的漏洞
在有些编辑asp程序的工具,当创建或者修改一个asp文件时,编辑器自动创建一个备份文件,比如:UltraEdit就会备份一个..bak文件,如你创建或者修改了some.asp,编辑器自动生成一个叫some.asp.bak文件,如果你没有删除这个 bak文件,攻击有可以直接下载some.asp.bak文件,这样some.asp的源程序就会给下载。

在处理类似留言板、BBS等输入框的ASP程序中,最好屏蔽掉HTML、javascript、VBScript语句,如无特殊要求,可以限定只允许输入字母与数字,屏蔽掉特殊字符。同时对输入字符的长度进行限制。而且不但在客户端进行输入合法性检查,同时要在服务器端程序中进行类似检查。
说明:输入框是黑客利用的一个目标,他们可以通过输入脚本语言等对用户客户端造成损坏; 如果该输入框涉及到数据查询,他们会利用特殊查询输入得到更多的数据库数据,甚至是表的全部。因此必须对输入框进行过滤。但如果为了提高效率仅在客户端进行输入合法性检查,仍有可能被绕过,因此必须在服务器端再做一次检查。


防止ACCESS mdb 数据库有可能被下载的漏洞
在用ACCESS做后台数据库时,如果有人通过各种方法知道或者猜到了服务器的ACCESS数据库的路径和数据库名称,那么他能够下载这个ACCESS数据库文件,这是非常危险的。
解决方法:
(1) 为你的数据库文件名称起个复杂的非常规的名字,并把他放在几目录下。所谓 "非常规", 打个比方: 比如有个数据库要保存的是有关书籍的信息, 可不要把他起个"book.mdb"的名字,起个怪怪的名称,比如d34ksfslf.mdb, 再把他放在如./kdslf/i44/studi/ 的几层目录下,这样黑客要想通过猜的方式得到你的ACCESS数据库文件就难上加难了。
(2)不要把数据库名写在程序中。有些人喜欢把DSN写在程序中,比如:
DBPath = Server.MapPath("cmddb.mdb")
conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
假如万一给人拿到了源程序,你的ACCESS数据库的名字就一览无余。因此建议你在ODBC里设置数据源,再在程序中这样写:
conn.open "shujiyuan"
(3)使用ACCESS来为数据库文件编码及加密。首先在选取 "工具->安全->加密/解密数据库,选取数据库(如:employer.mdb),然后接确定,接着会出现 "数据库加密后另存为"的窗口,存为:employer1.mdb。 接着employer.mdb就会被编码,然后存为employer1.mdb..
要注意的是,以上的动作并不是对数据库设置密码,而只是对数据库文件加以编码,目的是为了防止他人使用别的工具来查看数据库文件的内容。
接下来我们为数据库加密,首先以打开经过编码了的 employer1.mdb, 在打开时,选择"独占"方式。然后选取功能表的"工具->安全->设置数据库密码", 接着 输入密码即可。这样即使他人得到了employer1.mdb文件,没有密码他是无法看到 employer1.mdb的。
23.SQL SERVER的安全

SQL SERVER是NT平台上用的最多的数据库系统,但是它的安全问题也必须引起重视。数据库中往往存在着最有价值的信息,一旦数据被窃后果不堪设想。

及时更新补丁程序。
说明:与NT一样,SQL SERVER的许多漏洞会由补丁程序来弥补。建议在安装补丁程序之前先在测试机器上做测试,同时提前做好目标服务器的数据备份。

给SA一个复杂的口令。
说明:SA具有对SQL SERVER数据库操作的全部权限。遗憾的是,一部分网管对数据库并不熟悉,建立数据库的工作由编程人员完成,而这部分人员往往只注重编写SQL 语句本身,对SQL SERVER数据库的管理不熟悉,这样很有可能造成SA口令为空。这对数据库安全是一个严重威胁。目前具有这种隐患的站点不在少数。

严格控制数据库用户的权限,轻易不要给让用户对表有直接的查询、更改、插入、删除权限,可以通过给用户以访问视图的权限,以及只具有执行存储过程的权限。
说明:用户如果对表有直接的操作权限,就会存在数据被破坏的危险。

制订完整的数据库备份与恢复策略。
 24. PCANYWHERE的安全:

目前,PCANYWHERE是最流行的基于NT与2000的远程控制工具,同样也需要注意安全问题。

建议采用单独的用户名与口令,最好采用加密手段。千万不要采用与NT管理员一样的用户名与口令,也不要使用与NT集成的口令。同时在服务器端的设置时务必采用security options中的强加密方式,拒绝低加密水平的连接,同时采用口令加密与传输过程中的用户名与口令加密,以防止被嗅探到,还要限制连接次数,另外很重要的一点就是一定在protect item中设置高强度的口令,同时一定限制不能够让别人看到你的host端的任何设置,即便是要察看主机端的相关设置也必须要输入口令!
说明:PCANYWHERE 口令是远程控制的第一个关口,如果与NT的一样, 就失去了安全屏障。被攻破后就毫无安全可言。而如果采用单独的口令,即使攻破了PCANYWHERE,NT还有一个口令屏障。
及时安装较新的版本。

2.中级篇: IIS的安全与性能调整
实际上,安全和应用在很多时候是矛盾的,因此,你需要在其中找到平衡点,毕竟服务器是给用户用而不是做OPEN HACK的,如果安全原则妨碍了系统应用,那么这个安全原则也不是一个好的原则。 网络安全是一项系统工程,它不仅有空间的跨度,还有时间的跨度。很多朋友(包括部分系统管理员)认为进行了安全配置的主机就是安全的,其实这其中有个误区:我们只能说一台主机在一定的情况一定的时间上是安全的随着网络结构的变化、新的漏洞的发现,管理员/用户的操作,主机的安全状况是随时随地变化着的,只有让安全意识和安全制度贯穿整个过程才能做到真正的安全。
提高IIS 5.0网站伺服器的执行效率的八种方法  
以下是提高IIS 5.0网站伺服器的执行效率的八种方法:
1. 启用HTTP的持续作用可以改善15~20%的执行效率。  
2. 不启用记录可以改善5~8%的执行效率。  
3. 使用 [独立] 的处理程序会损失20%的执行效率。  
4. 增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。  
5. 勿使用CGI程式。  
6. 增加IIS 5.0电脑CPU数量。  
7. 勿启用ASP侦错功能。  
8. 静态网页采用HTTP 压缩,大约可以减少20%的传输量。  
简单介绍如下。  
1、启用HTTP的持续作用  
启用HTTP的持续作用(Keep-Alive)时,IIS与浏览器的连线不会断线,可以改善执行效率,直到浏览器关闭时连线才会断线。因为维持「Keep-Alive」状态时,於每次用户端请求时都不须重新建立一个新的连接,所以将改善伺服器的效率。此功能为HTTP1.1预设的功能,HTTP 1.0加上Keep-Alive header也可以提供HTTP的持续作用功能。
 
2、启用HTTP的持续作用可以改善15~20%的执行效率。  
如何启用HTTP的持续作用呢?步骤如下:在 [Internet服务管理员] 中,选取整个IIS电脑、或Web站台,於 [内容] 之 [主目录] 页,勾选 [HTTP的持续作用] 选项。
 
3、不启用记录  
不启用记录可以改善5~8%的执行效率。如何设定不启用记录呢?步骤如下:  
在 [Internet服务管理员] 中,选取整个IIS电脑、或Web站台,於 [内容] 之 [主目录] 页,不勾选 [启用记录] 选项。设定非独立的处理程序使用 [独立] 的处理程序会损失20%的执行效率,此处所谓 独立」系指将 [主目录]、[虚拟目录] 页之应用程式保护选项设定为 [高(独立的)] 时。因此 [应用程式保护] 设定为 [低 (IIS处理程序)] 时执行效率较高如何设定非「独立」的处理程序呢?步骤如下: 在 [Internet服务管理员] 中,选取整个IIS电脑、Web站台、或应用程式的起始目录。於 [内容] 之 [主目录]、[虚拟目录] 页,设定应用程式保护选项为 [低 (IIS处理程序)] 。  
4、调整快取(Cache)记忆体  
IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。ASP指令档案执行过後,会在暂存於快取(Cache)记忆体中以提高执行效能。增加快取记忆体的保存档案数量,可提高Active Server Pages之效能。可以设定所有在整个IIS电脑、「独立」Web站台、或「独立」应用程式上执行之应用程式的快取记忆体档案数量。如何设定快取(Cache)功能呢?步骤如下:在 [Internet服务管理员] 中选取整个IIS电脑、「独立」Web站台、或「独立」应用程式的起始目录。於 [内容] 之 [主目录]、[虚拟目录] 页,按下 [设定] 按钮时,即可由 [处理程序选项] 页设定[指令档快取记忆体] 。如何设定快取(Cache)记忆体档案数量呢?步骤如下:在[Internet服务管理员] 中,选取整个IIS电脑、或Web站台的起始目录。於 [内容] 之[伺服器扩充程式] 页,按下 [设定] 按钮。即可设定快取(Cache)记忆体档案数量。
5、勿使用CGI程式  
使用CGI程式时,因为处理程序(Process)须不断地产生与摧毁,造成执行效率不佳。一般而言,执行效率比较如下: 静态网页(Static):100 ISAPI:50 ASP:10 CGI:1  换句话说,ASP比CGI可能快10倍,因此勿使用CGI程式可以改善IIS的执行效率。以弹性(Flexibility)而言:ASP > CGI > ISAPI > 静态网页(Static)。以安全(Security)而言:ASP(独立) = ISAPI(独立)= CGI > ASP(非独立) = ISAPI(非独立)= 静态网页(Static)
6、增加IIS 5.0电脑CPU数量  
根据微软的测试报告,增加IIS 4.0电脑CPU数量,执行效率并不会改善多少;但是增加IIS 5.0电脑CPU数量,执行效率会几乎成正比地提供,换句话说,两颗CPU的IIS5.0电脑执行效率几乎是一颗CPU电脑的两倍,四颗CPU的IIS 5.0电脑执行效率几乎是一颗CPU电脑的四倍IIS 5.0将静态的网页资料暂存於快取(Cache)记忆体当中;IIS 4.0 则将静态的网页资料暂存於档案当中。调整快取(Cache)记忆体的保存档案数量可以改善执行效率。  
7、启用ASP侦错功能  
勿启用ASP侦错功能可以改善执行效率。如何勿启用ASP侦错功能呢?步骤如下:於[Internet服务管理员] 中,选取Web站台、或应用程式的起始目录,按右键选择[内容],按 [主目录]、[虚拟目录] 或 [目录] 页,按下 [设定] 按钮,选择 [应用程式侦错] 页,不勾选 [启用ASP伺服器端指令侦错]、[启用ASP用户端指令侦错] 选项。
8、静态网页采用HTTP 压缩  
静态网页采用HTTP 压缩,大约可以减少20%的传输量。HTTP压缩功能启用或关闭,系针对整台IIS伺服器来设定。用户端使用IE 5.0浏览器连线到已经启用HTTP压缩IIS5.0之Web伺服器,才有HTTP压缩功能。如何启用HTTP压缩功能呢?步骤如下:若要启用HTTP 压缩功能,方法为在 [Internet服务管理员] 中,选取电脑之 [内容],於 [主要内容] 之下选取 [WWW服务]。然後按一下 [编辑] 按钮,於 [服务] 页上,选取 [压缩静态档案] 可以压缩静态档案,不选取 [压缩应用程式档案] 。  动态产生的内容档案(压缩应用程式档案)也可以压缩,但是须耗费额外CPU处理时间,若%Processor Time已经百分之八十或更多时,建议不要压缩
以上是对采用IIS作为WEB服务器的一些安全相关的设置与其性能调整的参数设置,可以最大化的优化你的IIS,不过个人认为如果不存在障碍,还是采用apache比较好一些,漏洞少,建议采用apache 1.3.24版本,因为最近经测试,apache 1.3.23之前的版本都存在溢出漏洞,不要怕,这种漏洞很少的,呵呵。另外,个人建议不要采用ASP安全性总不叫人放心,个人认为还是采用JSP好一些,安全性好,功能强大,绝对超值,呵呵,因为PHP也存在不少的洞洞
附:IIS安全工具及其使用说明
一、IIS Lock Tool,快速设置IIS安全属性
  IIS Lock Tool的推出,还要感谢红色代码,因为正是红色代码的大面积传播,致使微软设计发布这款帮助管理员们设置IIS安全性的工具。
(一)、IIS Lock Tool具有以下功能和特点
  1、最基本功能,帮助管理员设置IIS安全性;
  2、此工具可以在IIS4和IIS5上使用;
  3、即使系统没有及时安装所有补丁,也能有效防止IIS4和IIS5的已知漏洞;
  4、帮助管理员去掉对本网站不必要的一些服务,使IIS在满足本网站需求的情况下运行最少的服务;
  5、具有两种使用模式:快捷模式和高级模式。快捷模式直接帮助管理员设置好IIS安全性,这种模式只适合于只有HTML和HTM静态网页的网站使用,因为设置完成以后,ASP不能运行;高级模式允许管理员自己设置各种属性,设置得当,对IIS系统任何功能均没有影响。
(二)、IIS Lock Tool的使用
  1、软件下载和安装
  IIS Lock Tool在微软网站下载,下载地址:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=32362
  安装很简单,需要注意的是,安装以后,程序不会在系统的【程序】菜单出现,也不会在【管理工具】出现,需要安装者在安装目录寻找运行该程序。
  2、软件的使用
  在以下的介绍中,我们将详细介绍每一步设置的意义和推荐设置,之所以详细介绍,是为了我们明白这些设置到底意味着什么,同时,和我们原来的安全设置相对照,避免出现设置完成以后,系统出现障碍。
 运行该软件,首先出现以下界面(图一):

图一
  以上界面介绍了IIS Lock Tool的一些基本情况和使用时需要注意的地方:1)使用时应该选择针对本网站最少的服务,去掉不必要的服务;2)设置完成以后,建议对网站进行彻底检查,以确定设置对本网站是否合适;
  在以上界面,点击【下一步】按钮,出现以下界面(图二):

图二
  以上界面选择快捷模式还是高级模式来运行软件,在这里,软件介绍了两者模式的区别:
 快捷模式:此设置模式关闭了IIS的一些高级服务属性,其中包括动态网页属性(ASP);所以,我们需要再重复一遍,选择快捷模式只适合提供静态页面的网站,当然,这种模式是相对最安全的。
  高级模式:此模式运行安装者自定义各种属性,同时允许高级属性的运行。
  快捷模式设置我们不必介绍,点击【下一步】按钮就可以设置完成。我们选择【Advanced Lockdown】(高级设置),点击【下一步】按钮,出现以下界面(图三):

图三
  以上界面帮助管理员设置各种脚本映射,我们来看每一种影射应该怎样设置:
  1)Disable support Active Server Pages(ASP),选择这种设置将使IIS不支持ASP功能;可以根据网站具体情况选择,一般不选择此项,因为网站一般要求运行ASP程序;
  2)Disable support Index Server Web Interface(.idq,.htw,.ida),选择这一项将不支持索引服务,具体就是不支持.idq,.htw,.ida这些文件。我们先来看看到底什么是索引服务,然后来决定取舍。索引服务是IIS4中包含的内容索引引擎。你可以对它进行ADO调用并搜索你的站点,它为你提供了一个很好的web 搜索引擎。如果你的网站没有利用索引服务对网站进行全文检索,也就可以取消网站的这个功能,取消的好处是:1)减轻系统负担;2)有效防止利用索引服务漏洞的病毒和黑客,因为索引服务器漏洞可能使攻击者控制网站服务器,同时,暴露网页文件在服务器上的物理位置(利用.ida、.idq)。因此,我们一般建议在这一项前面打勾,也就是取消索引服务;
 3)Disable support for Server Side Includes(.shtml,.shtm,.stm),取消服务器端包含;先来看看什么叫服务器端包含,SSI就是HTML文件中,可以通过注释行调用的命令或指针。SSI 具有强大的功能,只要使用一条简单的SSI 命令就可以实现整个网站的内容更新,动态显示时间和日期,以及执行shell和CGI脚本程序等复杂的功能。一般而言,我们没有用到这个功能,所以,建议取消;取消可以防止一些IIS潜在地漏洞;
  4)Disable for Internet Data Connector(.idc),取消Internet数据库连接;先看Internet数据库连接的作用,它允许HTML页面和后台数据库建立连接,实现动态页面。需要注意的是,IIS4和IIS5中基本已经不使用idc,所以,建议在此项打勾,取消idc;
  5)Disable support for Internet Printing (.printer),取消Internet打印;这一功能我们一般没有使用,建议取消;取消的好处是可以避免.printer远程缓存溢出漏洞,这个漏洞使攻击者可以利用这个漏洞远程入侵IIS 服务器,并以系统管理员(system)身份执行任意命令;
  6)Disable support for .HTR Scripting(.htr),取消htr映射;攻击者通过htr构造特殊的URL请求,可能导致网站部分文件源代码暴露(包括ASP),建议在此项前面打勾,取消映射;
  理解以上各项设置以后,我们可以根据本网站情况来决定取舍,一般网站除了ASP要求保留以外,其他均可以取消,也就是全消第一项前面的勾,其他全部打勾,按【下一步】按钮,出现以下界面(图四)

图四
  以上界面设置可以让管理员选择一些IIS默认安装文件的保留与否,我们来看怎样选择:
  1)Remove sample web files,删除web例子文件;建议删除,因为一般我们不需要在服务器上阅读这些文件,而且,这些文件可能让攻击者利用来阅读部分网页源程序代码(包括ASP);
  2)Remove the Scripts vitual directory,删除脚本虚拟目录;建议删除;
  3)Remove the MSDAC virtual directory,删除MSDAC虚拟目录,建议删除;
  4)Disable Distribauted Authoring and Versioning(WebDAV),删除WEBDAV,WebDav主要允许管理者远程编写和修改页面,一般我们不会用到,建议删除,删除的好处是可以避免IIS5的一个WebDav漏洞,该漏洞可能导致服务器停止。
  5)Set file permissions to prevent the IIS anouymous user from executing system utilities(such as cmd.exe,tftp.exe),防止匿名用户运行可执行文件,比如cmd.exe和tftp.exe;建议选择此项,因为红色代码和尼姆达均利用了以上所说的匿名执行可执行文件的功能;
  6)Set file permissions to prevent the IIS anouymous user from writing to content directories,防止匿名用户对目录具有写权限,这个不要解释,建议选择;
  设置以上选项以后,按【下一步】按钮,出现以下界面(图五):

图五
  要求确认是否接受以上设置,选择【是】,出现以下界面(图六)开始对系统执行设置:

图六
  在以上界面中,我们可以看到对IIS的详细设置情况。设置完成以后,建议重新启动IIS。
二、URLScan Tool――过滤非法URL访问
  仔细观察IIS的漏洞,我们几乎可以得出这样一个结论,所有利用这些漏洞实现对网站攻击的手段均是构造特殊的URL来访问网站,一般有以下几种类型的URL可以利用漏洞:
  1、特别长的URL,比如红色代码攻击网站的URL就是这样:
GET/default.idaXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u
9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u
00c3%u0003%u8b00%u531b%u53ff%u0078%u0000%u00=a 200;
 2、特殊字符或者字符串的URL,比如在URL后面加::$DATA可以看到网页(ASP)源代码;
  3、URL中含有可执行文件名,最常见的就是有cmd.exe;
  既然这些攻击利用特殊的URL来实现,所以,微软提供了这款专门过滤非法URL的安全工具,可以达到御敌于国门之外的效果,这款工具有以下特点和功能:
  1、基本功能:过滤非法URL请求;
  2、设定规则,辨别那些URL请求是合法的;这样,就可以针对本网站来制定专门的URL请求规则;同时,当有新的漏洞出现时,可以更改这个规则,达到防御新漏洞的效果;
  3、程序提供一套URL请求规则,这个规则包含已经发现的漏洞利用特征,帮助管理员设置规则;
(一)、软件的下载与安装
  URLScan可以在微软的网站上下载,地址如下:
http://download.microsoft.com/download/iis50/Utility/1.0/NT45XP/EN-US/UrlScan.exe
  和一般软件一样安装,但是,此软件不能选择安装路径,安装完成以后,我们可以在System32/InetSvr/URLScan目录下找到以下文件:
  urlscan.dll:动态连接库文件;
  urlscan.inf:安装信息文件;
  urlscan.txt:软件说明文件;
  urlscan.ini:软件配置文件,这个文件很只要,因为对URLScan的所有配置,均有这个文件来完成。
(二)、软件的配置
  软件的配置由urlscan.ini文件来完成,在配置此文件以前,我们需要了解一些基本知识。
 1、urlscan配置文件的构造形式
  urlscan配置文件必须遵从以下规则:
  (1)此文件名必须为urlscan.ini;
  (2)配置文件必须和urlscan.dll在同一目录;
  (3)配置文件必须是标准ini文件结构,也就是由节,串和值组成;
  (4)配置文件修改以后,必须重新启动IIS,使配置生效;
  (5)配置文件由以下各节组成:
  [Option]节,主要设置节;
  [AllowVerbs]节,配置认定为合法URL规则设定,此设定与Option节有关;
  [DenyVerbs]节,配置认定为非法URL规则设定,此设定与Option节有关;
  [DenyHeaders]节,配置认定为非法的header在设立设置;
  [AllowExtensions]节,配置认定为合法的文件扩展名在这里设置,此设定与Option节有关;
  [DenyExtensions]节,配置认定为非法的文件扩展名在这里设置,此设定与Option节有关;
  2、具体配置
  (1)Option节的配置,因为Option节的设置直接影响到以后的配置,因此,这一节的设置特别重要。此节主要进行以下属性的设置:
  UseAllowVerbs:使用允许模式检查URL请求,如果设置为1,所有没有在[AllowVerbs]节设置的请求都被拒绝;如果设置为0,所有没有在[DenyVerbs]设置的URL请求都认为合法;默认为1;
  UseAllowExtensions:使用允许模式检测文件扩展名;如果设置为 1,所有没在[AllowExtensions]节设置的文件扩展名均认为是非法请求;如果设置为0,所有没在[DenyExtensions]节设置的扩展名均被认为是合法请求;默认为0;
  EnableLogging:是否允许使用Log文件,如果为1,将在urlscan.dll的相同目录设置名为urlscan.log的文件记录所有过滤;
  AllowLateScanning:允许其他URL过滤在URLScan过滤之前进行,系统默认为不允许0;
  AlternateServerName:使用服务名代替;如果此节存在而且[RemoveServerHeader]节设置为0,IIS将在这里设置的服务器名代替默认的“Server”;
  NormalizeUrlBeforeScan:在检测URL之前规格化URL;如果为1,URLScan将在IIS编码URL之前URL进行检测;需要提醒的是,只有管理员对URL解析非常熟悉的情况下才可以将其设置为0;默认为1;
  VerifyNormalization:如果设置为1,UrlScan将校验URL规则,默认为1;此节设定与NormalizeUrlBeforeScan有关;
  AllowHighBitCharacters:如果设置为1,将允许URL中存在所有字节,如果为0,含有非ASCII字符的URL将拒绝;默认为1;
  AllowDotInPath:如果设置为1,将拒绝所有含有多个“.”的URL请求,由于URL检测在IIS解析URL之前,所以,对这一检测的准确性不能保证,默认为0;
  RemoveServerHeader:如果设置为1,将把所有应答的服务头清除,默认为0;
  (2)[AllowVerbs]节配置
  如果UseAllowVerbs设置为1,此节设置的所有请求将被允许,一般设置以下请求:
  GET、HEAD、POST
  (3)[DenyVerbs]节配置
  如果UseAllowVerbs设置为0,此节设置的所有请求将拒绝,一般设置以下请求:
  PROPFIND、PROPPATCH、MKCOL、DELETE、PUT、COPY、MOVE、LOCK、UNLOCK
  (4)[AllowExtensions]节设置
  在这一节设置的所有扩展名文件将被允许请求,一般设置以下请求:
  .asp、.htm、.html、.txt、.jpg、.jpeg、.gif,如果需要提供文件下载服务,需要增加.rar、.zip
  (5)[DenyExtensions]节设置
  在这一节设置的所有扩展名文件请求将被拒绝,根据已经发现的漏洞,我们可以在这一节增加内容,一般为以下设置:
.asa、可执行文件、批处理文件、日志文件、罕见扩展如:shtml、.printer等。
三、总结
  以上两个工具功能强大,可以真正实现对IIS的保护。IIS Lock Tool简单,相对而言,只是被动的防卫;UrlScan设置比较难,建议对IIS非常熟悉的管理员使用,只要设置得当,UrlScan的功能更加强大。在使用UrlScan的时候,切记不要设置一次万事大吉,需要不停跟踪新出现的漏洞,随时修改URLScan的配置文件。

3。高级篇:NT/2000的高级安全设置
1.禁用空连接,禁止匿名获得用户名列表
Win2000的默认安装允许任何用户通过空用户得到系统所有账号/共享列表,这个本来是为了方便局域网用户共享文件的,但是一个远程用户也可以得到你的用户列表并使用暴力法破解用户密码。很多朋友都知道可以通过更改注册表Local_Machine\System\CurrentControlSet\Control\LSA-RestrictAnonymous = 1来禁止139空连接,实际上win2000的本地安全策略(如果是域服务器就是在域服务器安全和域安全策略中)就有这样的选项RestrictAnonymous(匿名连接的额外限制),这个选项有三个值: 0:None. Rely on default permissions(无,取决于默认的权限 1 :Do not allow enumeration of SAM accounts and shares(不允许枚举SAM帐号和共享) 2:No access without explicit anonymous permissions(没有显式匿名权限就不允许访问) 0这个值是系统默认的,什么限制都没有,远程用户可以知道你机器上所有的账号、组信息、共享目录、网络传输列表(NetServerTransportEnum等等,对服务器来说这样的设置非常危险。 1这个值是只允许非NULL用户存取SAM账号信息和共享信息。 2这个值是在win2000中才支持的,需要注意的是,如果你一旦使用了这个值,你的共享估计就全部完蛋了,所以我推荐你还是设为1比较好。 好了,入侵者现在没有办法拿到我们的用户列表,我们的账户安全了
2。禁止显示上次登陆的用户名HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\winlogon项中的Don’t Display Last User Name串数据改成1,这样系统不会自动显示上次的登录用户名。将服务器注册表HKEY_LOCAL_ MACHINE\SOFTWARE\Microsoft\
WindowsNT\CurrentVersion\Winlogon项中的Don';t Display Last User Name串数据修改为1,隐藏上次登陆控制台的用户名。其实,在2000的本地安全策略中也存在该选项
Winnt4.0修改注册表:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\Winlogon 中增加DontDisplayLastUserName,将其值设为1。

2.预防DoS:
在注册表HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters中更改以下值可以帮助你防御一定强度的DoS攻击 SynAttackProtect REG_DWORD 2
EnablePMTUDiscovery REG_DWORD 0 NoNameReleaseOnDemand REG_DWORD 1
EnableDeadGWDetect REG_DWORD 0 KeepAliveTime REG_DWORD 300,000
PerFORMRouterDiscovery REG_DWORD 0 EnableICMPRedirects REG_DWORD 0
在Win2000中如何关闭ICMP(Ping)
  3.针对ICMP攻击
ICMP的全名是Internet Control and Message Protocal即因特网控制消息/错误报文协议,这个协议主要是用来进行错误信息和控制信息的传递,例如著名的Ping和Tracert工具都是利用ICMP协议中的ECHO request报文进行的(请求报文ICMP ECHO类型8代码0,应答报文ICMP ECHOREPLY类型0代码0)。
  ICMP协议有一个特点---它是无连结的,也就是说只要发送端完成ICMP报文的封装并传递给路由器,这个报文将会象邮包一样自己去寻找目的地址,这个特点使得ICMP协议非常灵活快捷,但是同时也带来一个致命的缺陷---易伪造(邮包上的寄信人地址是可以随便写的),任何人都可以伪造一个ICMP报文并发送出去,伪造者可以利用SOCK_RAW编程直接改写报文的ICMP首部和IP首部,这样的报文携带的源地址是伪造的,在目的端根本无法追查,(攻击者不怕被抓那还不有恃无恐?)根据这个原理,外面出现了不少基于ICMP的攻击软件,有通过网络架构缺陷制造ICMP风暴的,有使用非常大的报文堵塞网络的,有利用ICMP碎片攻击消耗服务器CPU的,甚至如果将ICMP协议用来进行通讯,可以制作出不需要任何TCP/UDP端口的木马(参见揭开木马的神秘面纱三)......既然ICMP协议这么危险,我们为什么不关掉它呢?
  我们都知道,Win2000在网络属性中自带了一个TCP/IP过滤器,我们来看看能不能通过这里关掉ICMP协议,桌面上右击网上邻居->属性->右击你要配置的网卡->属性->TCP/IP->高级->选项->TCP/IP过滤,这里有三个过滤器,分别为:TCP端口、UDP端口和IP协议,我们先允许TCP/IP过滤,然后一个一个来配置,先是TCP端口,点击"只允许",然后在下面加上你需要开的端口,一般来说WEB服务器只需要开80(www),FTP服务器需要开20(FTP Data),21(FTP Control),邮件服务器可能需要打开25(SMTP),110(POP3),以此类推......接着是UDP,UDP协议和ICMP协议一样是基于无连结的,一样容易伪造,所以如果不是必要(例如要从UDP提供DNS服务之类)应该选择全部不允许,避免受到洪水(Flood)或碎片(Fragment)攻击。最右边的一个编辑框是定义IP协议过滤的,我们选择只允许TCP协议通过,添加一个6(6是TCP在IP协议中的代码,IPPROTO_TCP=6),从道理上来说,只允许TCP协议通过时无论UDP还是ICMP都不应该能通过,可惜的是这里的IP协议过滤指的是狭义的IP协议,从架构上来说虽然ICMP协议和IGMP协议都是IP协议的附属协议,但是从网络7层结构上ICMP/IGMP协议与IP协议同属一层,所以微软在这里的IP协议过滤是不包括ICMP协议的,也就是说即使你设置了“只允许TCP协议通过”,ICMP报文仍然可以正常通过,所以如果我们要过滤ICMP协议还需要另想办法。
  刚刚在我们进行TCP/IP过滤时,还有另外一个选项:IP安全机制(IP Security),我们过滤ICMP的想法就要着落在它身上。
打开本地安全策略,选择IP安全策略,在这里我们可以定义自己的IP安全策略。一个IP安全过滤器由两个部分组成:过滤策略和过滤操作,过滤策略决定哪些报文应当引起过滤器的关注,过滤操作决定过滤器是“允许”还是“拒绝”报文的通过。要新建IP安全过滤器,必须新建自己的过滤策略和过滤操作:右击本机的IP安全策略,选择管理IP过滤器,在IP过滤器管理列表中建立一个新的过滤规则:ICMP_ANY_IN,源地址选任意IP,目标地址选本机,协议类型是ICMP,切换到管理过滤器操作,增加一个名为Deny的操作,操作类型为"阻止"(Block)。这样我们就有了一个关注所有进入ICMP报文的过滤策略和丢弃所有报文的过滤操作了。需要注意的是,在地址选项中有一个镜像选择,如果选中镜像,那么将会建立一个对称的过滤策略,也就是说当你关注any IP->my IP的时候,由于镜像的作用,实际上你也同时关注了my IP->any IP,你可以根据自己的需要选择或者放弃镜像。再次右击本机的IP安全策略,选择新建IP过滤策略,建立一个名称为ICMP Filter的过滤器,通过增加过滤规则向导,我们把刚刚定义的ICMP_ANY_IN过滤策略指定给ICMP Filter,然后在操作选框中选择我们刚刚定义的Deny操作,退出向导窗口,右击ICMP Filter并启用它,现在任何地址进入的ICMP报文都会被丢弃了。
  虽然用IP sec能够对ICMP报文进行过滤,不过操作起来太麻烦,而且如果你只需要过滤特定的ICMP报文,还要保留一些常用报文(如主机不可达、网络不可达等),IP sec策略就力不从心了,我们可以利用Win2000的另一个强大工具路由与远程访问控制(Routing & Remote Access)来完成这些复杂的过滤操作。
  路由与远程访问控制是Win2000用来管理路由表、配置VPN、控制远程访问、进行IP报文过滤的工具,默认情况下并没有安装,所以首先你需要启用它,打开"管理工具"->"路由与远程访问",右击服务器(如果没有则需要添加本机)选择"配置并启用路由及远程访问",这时配置向导会让你选择是什么样的服务器,一般来说,如果你不需要配置VPN服务器,那么选择"手动配置"就可以了,配置完成后,主机下将出现一个IP路由的选项,在"常规"中选择你想配置的网卡(如果你有多块网卡,你可以选择关闭某一块的ICMP),在网卡属性中点击"输入筛选器",添加一条过滤策略"from:ANY to:ANY 协议:ICMP 类型:8 :编码:0 丢弃"就可以了(类型8编码0就是Ping使用的ICMP_ECHO报文,如果要过滤所有的ICMP报文只需要将类型和编码都设置为255)
  细心的朋友刚才可能已经发现,在输入、输出过滤器的下面,还有一个"碎片检查"功能,这个功能使用来应付IP碎片攻击的,这已经超出了本文所讨论的范围,我会在以后的拒绝服务攻击的文章中继续和大家一起探讨的。Win2000的路由及远程访问是一个功能非常强大的工具集
4.改变windows系统的一些默认值(例如:数据包的生存时间(TTL)值,不同系统有不同的值,有经验的人可以根据TTL的不同的值判断对方使用的是何种操作系统(例如windows 2000默认值128),我改改改,看你怎么看)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
DefaultTTL REG_DWORD 0-0xff(0-255 十进制,默认值128)
说明:指定传出IP数据包中设置的默认生存时间(TTL)值.TTL决定了IP数据包在到达
目标前在网络中生存的最大时间.它实际上限定了IP数据包在丢弃前允许通过的路由
器数量.有时利用此数值来探测远程主机操作系统.
5.防止ICMP重定向报文的攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
EnableICMPRedirects REG_DWORD 0x0(默认值为0x1)
说明:该参数控制Windows 2000是否会改变其路由表以响应网络设备(如路由器)发送给它的ICMP重定向消息,有时会被利用来干坏事.Win2000中默认值为1,表示响应ICMP重定向报文.
6.禁止响应ICMP路由通告报文
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\interface
PerFORMRouterDiscovery REG_DWORD 0x0(默认值为0x2)
说明:“ICMP路由公告”功能可造成他人计算机的网络连接异常,数据被窃听,计算机被用于流量攻击等严重后果.此问题曾导致校园网某些局域网大面积,长时间的网络异常.因此建议关闭响应ICMP路由通告报文.Win2000中默认值为2,表示当DHCP发送路由器发现选项时启用
7.防止SYN洪水攻击
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
SynAttackProtect REG_DWORD 0x2(默认值为0x0)
说明:SYN攻击保护包括减少SYN-ACK重新传输次数,以减少分配资源所保留的时
间.路由缓存项资源分配延迟,直到建立连接为止.如果synattackprotect=2,
则AFD的连接指示一直延迟到三路握手完成为止.注意,仅在TcpMaxHalfOpen和
TcpMaxHalfOpenRetried设置超出范围时,保护机制才会采取措施.
8.禁止C$、D$一类的缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
AutoShareServer、REG_DWORD、0x0
9.禁止ADMIN$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\lanmanserver\parameters
AutoShareWks、REG_DWORD、0x0
10.限制IPC$缺省共享
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa
restrictanonymous REG_DWORD 0x0 缺省
0x1 匿名用户无法列举本机用户列表
0x2 匿名用户无法连接本机IPC$共享
说明:不建议使用2,否则可能会造成你的一些服务无法启动,如SQL Server
11.不支持IGMP协议
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
IGMPLevel REG_DWORD 0x0(默认值为0x2)
说明:记得Win9x下有个bug,就是用可以用IGMP使别人蓝屏,修改注册表可以修正这个
bug.Win2000虽然没这个bug了,但IGMP并不是必要的,因此照样可以去掉.改成0后用
route print将看不到那个讨厌的224.0.0.0项了.
12.设置arp缓存老化时间设置
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
ArpCacheLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为120秒)
ArpCacheMinReferencedLife REG_DWORD 0-0xFFFFFFFF(秒数,默认值为600)
说明:如果ArpCacheLife大于或等于ArpCacheMinReferencedLife,则引用或未引用的ARP缓存项在ArpCacheLife秒后到期.如果ArpCacheLife小于阿ARPCacheMinReferencedLife,未引用项在ArpCacheLife秒后到期,而引用项在ArpCacheMinReferencedLife秒后到期.每次将出站数据包发送到项的IP地址时,就会引用ARP缓存中的项。
13.禁止死网关监测技术
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
EnableDeadGWDetect REG_DWORD 0x0(默认值为ox1)
说明:如果你设置了多个网关,那么你的机器在处理多个连接有困难时,就会自动改用备份网关.有时候这并不是一项好主意,建议禁止死网关监测.
14.不支持路由功能
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
IPEnableRouter REG_DWORD 0x0(默认值为0x0)
说明:把值设置为0x1可以使Win2000具备路由功能,由此带来不必要的问题.
15.做NAT时放大转换的对外端口最大值
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services:\Tcpip\Parameters
MaxUserPort REG_DWORD 5000-65534(十进制)(默认值0x1388--十进制为5000)
说明:当应用程序从系统请求可用的用户端口数时,该参数控制所使用的最大端口数.正常情况下,短期端口的分配数量为1024-5000.将该参数设置到有效范围以外时,就会使用最接近的有效数值(5000或65534).使用NAT时建议把值放大点.
16.修改MAC地址
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\
找到右窗口的说明为"网卡"的目录,
比如说是{4D36E972-E325-11CE-BFC1-08002BE10318}
展开之,在其下的0000,0001,0002...的分支中找到"DriverDesc"的键值为你网卡的说明,比如说"DriverDesc"的值为"Intel(R) 82559 Fast Ethernet LAN on Motherboard"然后在右窗口新建一字符串值,名字为"Networkaddress",内容为你想要的MAC值,比如说是"004040404040"然后重起计算机,ipconfig /all看看.
17.防止密码被DUMP,你只需在服务里面关掉Remote regisitery services
:em13:  :em13:  :em13:
作者: 久木    时间: 2005-4-7 20:29     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

让Win2000系统自动更新桌面的墙纸

在每个人的电脑里,一定保存着许多自己喜欢的墙纸,如果要经常在这些墙纸之间更换,就需要我们手动去设置,非常麻烦。有没有一种简单的方法呢?答案是肯定的。下面以Windows 2000系统安装在c:\盘为例,来实现让系统启动时自动更换桌面墙纸。
  假设我们有5个比较喜欢的墙纸11.bmp、12.bmp、13.bmp、14.bmp、15.bmp。将11.bmp备份一下并改名为10.bmp,目的是用它来做交换墙纸,然后将这6个文件拷贝到c:\winnt目录下,将Windows 2000/xp的桌面墙纸设置为10.bmp。编制一个批处理文件,内容如下:
  cd \
  cd winnt
  del 10.bmp
  copy 11.bmp 10.bmp
  copy 12.bmp 11.bmp
  copy 13.bmp 12.bmp
  copy 14.bmp 13.bmp
  copy 15.bmp 14.bmp
  copy 10.bmp 15.bmp
  然后保存在c:\根目录下,并命名为qiangzhi.bat。
  单击"开始--运行",在弹出的"运行"对话框中输入"gpedit.msc"打开"组策略",点击"计算机配置--"windows设置",找到"脚本(启动/关闭)"选项,在右边窗口双击"启动",依次执行"添加--游览",找到刚才保存的"qiangzhi.bat"批处理文件。点击两次"确定"。至此,我们就可以在Windows 2000下实现系统每次启动时自动更换桌面墙纸。
  Windows 98也可以实现,只要将上述的批处理文件中的"cd winnt"改为"cd Windows",然后将批处理文件的内容拷贝到Windows 98系统根目录的AUTOEXEC.BAT中即可实现。(Windows 2000/XP也可以用"计划任务"来实现自动更换墙纸,如:按系统启动时、按时间来更换,灵活性多一些,具体大家可以试一试。)

作者: 久木    时间: 2005-4-7 20:32     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

在NT系列操作系统里让自己消失
在NT系列操作系统里让自己消失
=====[ 1. 内容 ]============================================
1. 内容
2. 介绍
3. 文件
3.1 NtQueryDirectoryFile
3.2 NtVdmControl
4. 进程
5. 注册表
5.1 NtEnumerateKey
5.2 NtEnumerateValueKey
6. 系统服务和驱动
7. 挂钩和扩展
7.1 权限
7.2 全局挂钩
7.3 新进程
7.4 DLL
8. 内存
9. 句柄
9.1 命名句柄并获得类型
10. 端口
10.1 Netstat, OpPorts和FPortWinXP下
10.2 OpPorts在Win2k和NT4下, FPort在Win2k下
11. 结束

=====[ 2. 介绍 ]==================================================
这篇文档是在Windows NT操作系统下隐藏对象、文件、服务、进程等的技术。这种方法是基于Windows API函数的挂钩。
这篇文章中所描述的技术都是从我写rootkit的研究成果,所以它能写rootkit更有效果并且更简单。这里也同样包括了我的实践。
在这篇文档中隐藏对象意味着改变某些用来命名这些对象的系统函数,使它们将忽略这些对象的名字。这样一来我们改动的那些函数的返回值表示这些对象根本就不存在。
最基本的方法(除去少数不同的)是我们用原始的参数调用原始的函数,然后我们改变它们的输出。
在这篇文章里将描述隐藏文件、进程、注册表键和键值、系统服务和驱动、分配的内存还有句柄。

=====[ 3. 文件 ]========================================
在有很多种隐藏文件使系统无法发现的可能。我们只使用改变API的方法,而没使用那些比如涉及到文件系统的技术。这样会更容易些因为我们无法知道文件系统工作的独特性。

=====[ 3.1 NtQueryDirectoryFile ]=============================
在WINNT里在某些目录中寻找某个文件的方法是枚举它里面所有的文件和它的子目录下的所有文件。文件的枚举是使用NtQueryDirectoryFile函数。

NTSTATUS NtQueryDirectoryFile(
IN HANDLE FileHandle,
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
OUT PVOID FileInformation,
IN ULONG FileInformationLength,
IN FILE_INFORMATION_CLASS FileInformationClass,
IN BOOLEAN ReturnSingleEntry,
IN PUNICODE_STRING FileName OPTIONAL,
IN BOOLEAN RestartScan
);

对我们来说重要的参数是FileHandle,FileInformation和FileInformationClass。FileHandle是从NtOpenFile获得的目录对象句柄。FileInformation是一个指针,指向函数要写入需要的数据的已分配内存。FileInformationClass决定写入FileImformation的记录的类型。
FileInformationClass是一个变化的枚举类型,我们只需要其中4个值来枚举目录内容:
#define FileDirectoryInformation 1
#define FileFullDirectoryInformation 2
#define FileBothDirectoryInformation 3
#define FileNamesInformation 12

要写入FileInformation的FileDirecoryInformation记录的结构:
typedef struct _FILE_DIRECTORY_INFORMATION {
ULONG NextEntryOffset;
ULONG Unknown;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;

FileFullDirectoryInformation:
typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
ULONG NextEntryOffset;
ULONG Unknown;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaInformationLength;
WCHAR FileName[1];
} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;

FileBothDirectoryInformation:
typedef struct _FILE_BOTH_DIRECTORY_INFORMATION {
ULONG NextEntryOffset;
ULONG Unknown;
LARGE_INTEGER CreationTime;
LARGE_INTEGER LastAccessTime;
LARGE_INTEGER LastWriteTime;
LARGE_INTEGER ChangeTime;
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
ULONG FileAttributes;
ULONG FileNameLength;
ULONG EaInformationLength;
UCHAR AlternateNameLength;
WCHAR AlternateName[12];
WCHAR FileName[1];
} FILE_BOTH_DIRECTORY_INFORMATION, *PFILE_BOTH_DIRECTORY_INFORMATION;

FileNamesInformation:
typedef struct _FILE_NAMES_INFORMATION {
ULONG NextEntryOffset;
ULONG Unknown;
ULONG FileNameLength;
WCHAR FileName[1];
} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;

这个函数在FileInformation中写入这些结构的一个列表。对我们来说在这些结构类型中只有3个变量是重要的。
NextEntryOffset是这个列表中项的偏移地址。第一个项在地址FileInformation+0处,所以第二个项在地址是FileInformation+第一个项的NextEntryOffset。最后一个项的NextEntryOffset是0。
FileName是文件全名。
FileNameLength是文件名长度。
如果我们想要隐藏一个文件,我们需要分别通知这4种类型,对每种类型的返回记录我们需要和我们打算隐藏的文件比较名字。如果我们打算隐藏第一个记录,我们可以把后面的结构向前移动,移动长度为第一个结构的长度,这样会导致第一个记录被改写。如果我们想要隐藏其它任何一个,只需要很容易的改变上一个记录的NextEntryOffset的值就行。如果我们要隐藏最后一个记录就把它的NextEntryOffset改为0,否则NextEntryOffset的值应为我们想要隐藏的那个记录和前一个的NextEntryOffset值的和。然后修改前一个记录的Unknown变量的值,它是下一次搜索的索引。把要隐藏的记录之前一个记录的Unknown变量的值改为我们要隐藏的那个记录的Unkown变量的值即可。
如果没有原本应该可见的记录被找到,我们就返回STATUS_NO_SUCH_FILE。
#define STATUS_NO_SUCH_FILE 0xC000000F

=====[ 3.2 NtVdmControl ]========================================
不知什么原因DOS的枚举NTVDM能够通过函数NtVdmControl也能获得文件的列表。
NTSTATUS NtVdmControl(
IN ULONG ControlCode,
IN PVOID ControlData
);
ConcrolCode标明了在缓冲区ControlData中申请数据的子函数。如果ControlCode为VdmDiretoryFile那么这个函数的功能将和FileInformation设置为FileBothDirectoryInformation的函数NtQueryDirectoryFile功能一样。
#define VdmDirectoryFile 6
这时的ControlData的用法就和FileInformation一样。这里唯一的不同就是我们不知道缓冲区的长度。所以我们需要手动来计算它的长度。我们把所有记录的NextEntryOffset和最后一个记录的FileNameLength还有0X5E(最后一个记录除去文件名的长度)。隐藏的方法和前面提到的使用NtQueryDirectoryFile的方法一样。

=====[ 4. 进程 ]========================================
各种进程信息是通过NtQuerySystemInformation获取的。
NTSTATUS NtQuerySystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
);

SystemInformationClass标明了我们想要获得的信息的类别,SystemInformation是一个指向函数输出缓冲区的指针,SystemInformationLength是这个缓冲区的长度,ReturnLength是写入字节的数目。
对于正在运行的进程的枚举我们使用设置为SystemProcessesAndThreadsInformation的SystemInformationClass。
#define SystemInformationClass 5

在SystemInformation的缓冲区中返回的数据结构是:
typedef struct _SYSTEM_PROCESSES {
ULONG NextEntryDelta;
ULONG ThreadCount;
ULONG Reserved1[6];
LARGE_INTEGER CreateTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER KernelTime;
UNICODE_STRING ProcessName;
KPRIORITY BasePriority;
ULONG ProcessId;
ULONG InheritedFromProcessId;
ULONG HandleCount;
ULONG Reserved2[2];
VM_COUNTERS VmCounters;
IO_COUNTERS IoCounters; // Windows 2000特有的
SYSTEM_THREADS Threads[1];
} SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;

隐藏进程和隐藏文件方法基本一样,就是改动我们需要隐藏的记录的前一个记录的NextEntryDelta。通常我们不用隐藏第一个记录,因为它是空闲进程(Idle process)。

=====[ 5. 注册表 ]========================================
Windows的注册表是一个很大的树形数据结构,对我们来说里面有两种重要的记录类型需要隐藏。一种类型是注册表键,另一种是键值。因为注册表的结构,隐藏注册表键不象隐藏文件或进程那么麻烦。

=====[ 5.1 NtEnumerateKey ]===============================
因为注册表的结构我们不能请求某个指定部分所有键的列表。我们只能在注册表某个部分通过查询指定键的索引以获得它的信息。这里提供了NtEnumerateKey。
NTSTATUS NtEnumerateKey(
IN HANDLE KeyHandle,
IN ULONG Index,
IN KEY_INFORMATION_CLASS KeyInformationClass,
OUT PVOID KeyInformation,
IN ULONG KeyInformationLength,
OUT PULONG ResultLength
);

KeyHandle是已经用索引标明我们想要从中获取信息的子键的句柄。KeyInformationClass标明了返回信息类型。数据最后写入KeyInformaiton缓冲区,缓冲区长度为KeyInformationLength。写入的字节数由ResultLength返回。
我们需要意识到的最重要的东西是如果我们隐藏了某个键,在这个键之后的所有键的索引都会改变。因为我们是通过高位的索引来获取键的信息,并通过低位的索引来请求这个键。所以我们必须记录之前有多少个记录被隐藏,然后返回正确的值。
让我们来看个例子。假设我们在注册表中有一些键名字是A,B,C,D,E和F。它们的索引从0开始,也就是说索引4对应键E。现在我们如果想要隐藏键B,被挂钩过的应用程序用索引4调用NtEnumerateKey时我们应该返回F键的信息因为有一个索引改变了。现在问题是我们不知道是否会有索引被改变。如果我们不注意索引的改变而对于索引4的请求仍然返回键E而不是键F的话,很有可能在我们用索引1请求时什么都返回不了或者返回键C。这两种情况都会导致错误。这就是为什么我们要注意索引的改变。
现在如果我们通过用索引0到Index重新调用函数来记录转移我们可能会等待一段时间(在1GHz处理器上普通的注册表就得等10秒种那么长的时间)。所以我们不得不想出一种更加巧妙的方法。
我们知道键是按字母排序的(除了引用外)。如果我们忽略引用(我们不需要隐藏)我们能使用以下方法记录改变。我们通过字母排序列出我们想要隐藏的键名的列表(使用RtlCompareUnicodeString),然后当应用程序调用NtEnumerateKey时我们不需要用不可变的变量重新调用它,而能够找到用索引标明的记录的名字。
NTSTATUS RtlCompareUnicodeString(
IN PUNICODE_STRING String1,
IN PUNICODE_STRING String2,
IN BOOLEAN CaseInSensitive
);
String1和String2是将要比较的字符串,CaseInSensitive在不忽略大小写时被设置为True。
函数结果描述String1和String2的关系:
result > 0: String1 > String2
result = 0: String1 = String2
result < 0: String1 < String2
现在我们需要找到一个边缘项。我们在列表中对用索引标明的键按字母比较名字。边缘项是在我们列表中最后一个较短的名字。我们知道转移最多是我们列表中边缘项的数量。但并不是所有我们列表中的项都是注册表中有效的键。所以我们不得不请求我们列表中达到边缘项的所有的在注册表中这个部分的项。这些通过调用NtOpenKey来完成。

NTSTATUS NtOpenKey(
OUT PHANDLE KeyHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);
KeyHandle是高位的键的句柄,我们使用NtEnumerateKey的这个值。DesaireAccess是访问权力。KEY_ENUMERATE_SUB_KEYS是它的正确的值。ObjectAttributes描述了我们要打开的子键(包括了它的名字)。
&#35;define KEY_ENUMERATE_SUB_KEYS 8
如果NtOpenKey返回0表示打开成功,意味着这个来自我们列表中的键是存在的。被打开的键通过NtClose来关闭。
NTSTATUS NtClose(
IN HANDLE Handle
);

对每次NtEnumareteKey的调用我们要计算的改变,数量上等同于我们列表中存在于注册表指定部分的键的数量。然后我们把改变的数量加到变量Index,最后调用原始的NtEnumerateKey。
我们使用KeyInformationClass的KeyBasicInformation来获得用索引标明的键的名字。
&#35;define KeyBasicInformation 0
NtEnumerateKey在KeyInformation缓冲区中返回这个结构:
typedef struct _KEY_BASIC_INFORMATION {
LARGE_INTEGER LastWriteTime;
ULONG TitleIndex;
ULONG NameLength;
WCHAR Name[1];
} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
这里我们只需要的东西是Name和它的长度NameLength。
如果没有被转移的索引的记载我们就返回错误STATUS_EA_LIST_INCONSISTENT。
&#35;define STATUS_EA_LIST_INCONSISTENT 0x80000014

=====[ 5.2 NtEnumerateValueKey ]============================
注册表键值不是按字母分类的。幸运的是在一个键里键值的数目比较少,所以我们可以通过重调的方法来获得改变的数目。用来获取一个键值信息的API是NtEnumerateValueKey。
NTSTATUS NtEnumerateValueKey(
IN HANDLE KeyHandle,
IN ULONG Index,
IN KEY_VALUE_INFORMATION_CLASS KeyValueInformationClass,
OUT PVOID KeyValueInformation,
IN ULONG KeyValueInformationLength,
OUT PULONG ResultLength
);
KeyHandle也是等级高的键的句柄。Index是所给键中键值的索引。KeyValueInformationClass描述信息的类型,保存在KeyValueInformation缓冲区中,缓冲区以字节为大小为KeyValueInformationLength。写入字节的数量返回在ResultLength中。
我们通过用0到Index的所有索引重调函数计算转移。键值的名字通过把KeyValueInformationClass设置为KeyValueBasicInformation来获取。
&#35;define KeyValueBasicInformation 0

然后我们获取在KeyValueInformation缓冲区中接下来的数据结构:
typedef struct _KEY_VALUE_BASIC_INFORMATION {
ULONG TitleIndex;
ULONG Type;
ULONG NameLength;
WCHAR Name[1];
} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
这里我们只对Name和NameLength感兴趣。

如果这里没有被转移的索引记载我们就返回错误STATUS_NO_MORE_ENTRIES。
&#35;define STATUS_NO_MORE_ENTRIES 0x8000001A

=====[ 6. 系统服务和驱动 ]====================================
系统服务和驱动是通过4个独立的API函数枚举的。它们在每个Windows版本中的联系都不一样。所以我们必须挂钩所有4个函数。
BOOL EnumServicesStatusA(
SC_HANDLE hSCManager,
DWORD dwServiceType,
DWORD dwServiceState,
LPENUM_SERVICE_STATUS lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle
);
BOOL EnumServiceGroupW(
SC_HANDLE hSCManager,
DWORD dwServiceType,
DWORD dwServiceState,
LPBYTE lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle,
DWORD dwUnknown
);
BOOL EnumServicesStatusExA(
SC_HANDLE hSCManager,
SC_ENUM_TYPE InfoLevel,
DWORD dwServiceType,
DWORD dwServiceState,
LPBYTE lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle,
LPCTSTR pszGroupName
);
BOOL EnumServicesStatusExW(
SC_HANDLE hSCManager,
SC_ENUM_TYPE InfoLevel,
DWORD dwServiceType,
DWORD dwServiceState,
LPBYTE lpServices,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded,
LPDWORD lpServicesReturned,
LPDWORD lpResumeHandle,
LPCTSTR pszGroupName
);

这里最重要的是lpService,它指向保存服务列表的缓冲区。而指向结果中记录个数的lpServicesReturned也很重要。输出缓冲区中的数据结构取决于函数类型。函数EnumServicesStatusA和
EnumServicesGroupW返回这个结构:
typedef struct _ENUM_SERVICE_STATUS {
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS ServiceStatus;
} ENUM_SERVICE_STATUS, *LPENUM_SERVICE_STATUS;
typedef struct _SERVICE_STATUS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
} SERVICE_STATUS, *LPSERVICE_STATUS;
函数EnumServicesStatusExA和EnumServicesStatusExW返回这个:
typedef struct _ENUM_SERVICE_STATUS_PROCESS {
LPTSTR lpServiceName;
LPTSTR lpDisplayName;
SERVICE_STATUS_PROCESS ServiceStatusProcess;
} ENUM_SERVICE_STATUS_PROCESS, *LPENUM_SERVICE_STATUS_PROCESS;
typedef struct _SERVICE_STATUS_PROCESS {
DWORD dwServiceType;
DWORD dwCurrentState;
DWORD dwControlsAccepted;
DWORD dwWin32ExitCode;
DWORD dwServiceSpecificExitCode;
DWORD dwCheckPoint;
DWORD dwWaitHint;
DWORD dwProcessId;
DWORD dwServiceFlags;
} SERVICE_STATUS_PROCESS, *LPSERVICE_STATUS_PROCESS;

我们只对lpServiceName感兴趣因为它是系统服务的名字。所有记录都有静态的大小,所以我们想要隐藏一个的话就需要将之后所有记录向前移它的大小。这里我们必须区分SERVICE_STATUS和SERVICE_STATUS_PROCESS的大小。

=====[ 7. 动态挂钩和扩展 ]=====================================
为达到预想的效果我们需要挂钩所有正在运行的进程和所有将要被创建的进程。所有新进程都必须在它们运行第一条指令前被挂钩,否则它们就能够在被挂够前看到被隐藏的对象。

=====[ 7.1 权限 ]=============================================
首先我们得知道我们至少获得管理员administrator权限来获得进入所有正在运行的进程。最好的可能是将我们的进程当做系统服务来运行,因为它运行与SYSTEM用户权限下。为安装服务我们首先得获取特殊的权限。
获取SeDebugPrivilege的权限是很有用的,通过调用OpenProcessToken、LookupPrivilegeValue
和AdjustTokenPrivileges来完成。
BOOL OpenProcessToken(
HANDLE ProcessHandle,
DWORD DesiredAccess,
PHANDLE TokenHandle
);
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,
LPCTSTR lpName,
PLUID lpLuid
);
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,
BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState,
DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState,
PDWORD ReturnLength
);

代码如下:
&#35;define SE_PRIVILEGE_ENABLED 0x0002
&#35;define TOKEN_QUERY 0x0008
&#35;define TOKEN_ADJUST_PRIVILEGES 0x0020
HANDLE hToken;
LUID DebugNameValue;
TOKEN_PRIVILEGES Privileges;
DWORD dwRet;
OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,hToken);
LookupPrivilegeValue(NULL,"SeDebugPrivilege",&DebugNameValue);
Privileges.PrivilegeCount=1;
Privileges.Privileges[0].Luid=DebugNameValue;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&Privileges,sizeof(Privileges),
NULL,&dwRet);
CloseHandle(hToken);

=====[ 7.2 全局挂钩 ]=======================================
枚举进程通过前面提到的API函数NtQuerySystemInformation来完成。因为系统中还有一些内部native进程,所以使用重写函数第一个指令的方法来挂钩。对每个正在运行的进程我们需要做的都一样。首先在目标进程里分配一部分内存用来写入我们用来挂钩函数的新代码,然后把每个函数开始的5个字节改为跳转指令(jmp),这个跳转会转为执行我们的代码。所以当被挂钩的函数被调用时跳转指令能立刻被执行。我们需要保存每个函数开始被改写的指令,需要它们来调用被挂钩函数的原始代码。保存指令的过程在"挂钩Windows API"的3.2.3节有描述。
首先通过NtOpenProcess打开目标进程并获取句柄。如果我们没有足够权限的话就会失败。
NTSTATUS NtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL
);
ProcessHandle是指向保存进程对象句柄的指针。DesiredAccess应该被设置为PROCESS_ALL_ACCESS。我们要在ClientId结构里设置UniqueProcess为目标进程的PID,UniqueThread应该为0。被打开的句柄可以通过NtClose关闭。
&#35;define PROCESS_ALL_ACCESS 0x001F0FFF
现在我们为我们的代码分配部分内存。这通过NtAllocateVirtualMemory来完成。
NTSTATUS NtAllocateVirtualMemory(
IN HANDLE ProcessHandle,
IN OUT PVOID BaseAddress,
IN ULONG ZeroBits,
IN OUT PULONG AllocationSize,
IN ULONG AllocationType,
IN ULONG Protect
);
ProcessHandle是来自NtOpenProcess相同参数。BaseAddress是一个指针,指向被分配虚拟内存基地址的开始处,它的输入参数应该为NULL。AllocationSize指向我们要分配的字节数的变量,同样它也用来接受实际分配的字节数大小。最好把AllocationType在设置成MEM_COMMIT之外再加上MEM_TOP_DOWN因为内存要在接近DLL地址的尽可能高的地址分配。
&#35;define MEM_COMMIT 0x00001000
&#35;define MEM_TOP_DOWN 0x00100000

然后我们就可以通过调用NtWriteVirtualMemory来写入我们的代码。
NTSTATUS NtWriteVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL
);
BaseAddress是NtAllocateVirtualMemory返回的地址。Buffer指向我们要写入的字节,BufferLength是我们要写入的字节数。
现在我们来挂钩单个进程。被加载入所有进程的动态链接库只有ntdll.dll。所以我们要检查被导入进程要挂钩的函数是否来自ntdll.dll。但是这些来自其它DLL的函数所在的内存可能已经被分配,这时重写它的代码会在目标进程里导致错误。这就是我们必须去检查我们要挂钩的函数来自的动态链接库是否被目标进程加载的原因。
我们需要通过NtQueryInformationProcess获取目标进程的PEB(进程环境块)。
NTSTATUS NtQueryInformationProcess(
IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass,
OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
我们把ProcessInformationClass设置为ProcessBasicInformation,然后PROCESS_BASIC_INFORMATION结构会返回到ProcessInformation缓冲区中,大小为给定的ProcessInformationLength。
&#35;define ProcessBasicInformation 0
typedef struct _PROCESS_BASIC_INFORMATION {
NTSTATUS ExitStatus;
PPEB PebBaseAddress;
KAFFINITY AffinityMask;
KPRIORITY BasePriority;
ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
PebBaseAddress就是我们要寻找的东西。在PebBaseAddress+0C处是PPEB_LDR_DATA的地址。这些通过调用NtReadVirtualMemory来获得。
NTSTATUS NtReadVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL
);
变量和NtWriteVirtualMemory的很相似。
在PPEB_LDR_DATA+01C处是InInitializationOrderModuleList的地址。它是被加载进进程的动态链接库的列表。我们只对这个结构中的一些部分感兴趣。
typedef struct _IN_INITIALIZATION_ORDER_MODULE_LIST {
PVOID Next,
PVOID Prev,
DWORD ImageBase,
DWORD ImageEntry,
DWORD ImageSize,
...
);
Next是指向下一个记录的指针,Prev指向前一个,最后一个记录的会指向第一个。ImageBase是内存中模块的地址,ImageEntry是模快的入口点,ImageSize是它的大小。
对所有我们想要挂钩的库我们需要获得它们的ImageBase(比方调用GetModuleHandle或者LoadLibrary)。然后把这个ImageBase和InInitializationOrderModuleList的ImageBase比较。
现在我们已经为挂钩准备就绪。因为我们是挂钩正在运行的进程,所以可能我们正在改写代码的同时代码被执行,这时就会导致错误。所以首先我们就得停止目标进程里的所有线程。它的所有线程列表可以通过设置了SystemProcessAndThreadInformation的NtQuerySystemInformation来获得。有关这个函数的描述参考第4节。但是还得加入SYSTEM_THREADS结构的描述,用来保存线程的信息。
typedef struct _SYSTEM_THREADS {
LARGE_INTEGER KernelTime;
LARGE_INTEGER UserTime;
LARGE_INTEGER CreateTime;
ULONG WaitTime;
PVOID StartAddress;
CLIENT_ID ClientId;
KPRIORITY Priority;
KPRIORITY BasePriority;
ULONG ContextSwitchCount;
THREAD_STATE State;
KWAIT_REASON WaitReason;
} SYSTEM_THREADS, *PSYSTEM_THREADS;
对每个线程调用NtOpenThread获取它们的句柄,通过使用ClientId。
NTSTATUS NtOpenThread(
OUT PHANDLE ThreadHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId
);
我们需要的句柄被保存在ThreadHandle。我们需要把DesiredAccess设置为THREAD_SUSPEND_RESUME。
&#35;define THREAD_SUSPEND_RESUME 2
ThreadHandle用来调用NtSuspendThread。
NTSTATUS NtSuspendThread(
IN HANDLE ThreadHandle,
OUT PULONG PreviousSuspendCount OPTIONAL
);

被挂起的进程就可以被改写了。我们按照"挂钩Windows API"里3.2.2节里描述的方法处理。唯一的不同是使用其它进程的函数。
挂钩完后我们就可以调用NtResumeThread恢复所有线程的运行。
NTSTATUS NtResumeThread(
IN HANDLE ThreadHandle,
OUT PULONG PreviousSuspendCount OPTIONAL
);

=====[ 7.3 新进程 ]================================================
感染所有正在运行的进程并不能影响将要被运行的进程。我们可以每隔一定时间获取一次进程的列表,然后感染新的列表里的进程。但这种方法很不可靠。
更好的方法是挂钩新进程开始时肯定会调用的函数。因为所有系统中正在运行的进程都已经被挂钩,所以这种方法不会漏掉任何新的进程。我们可以挂钩NtCreateThread,但这不是最简单的方法。我们可以挂钩NtResumeThread,因为它也是每当新进程创建时被调用,它在NtCreateThread之后被调用。
唯一的问题在于,这个函数并不只在新进程被创建时调用。但我们能很容易解决这点。NtQueryInformationThread能给我们指定线程是属于哪个进程的信息。最后我们要做的就是检查进程是否已经被挂钩了。这通过读取我们要挂钩的函数的开始5个字节来完成。
NTSTATUS NtQueryInformationThread(
IN HANDLE ThreadHandle,
IN THREADINFOCLASS ThreadInformationClass,
OUT PVOID ThreadInformation,
IN ULONG ThreadInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
ThreadInformationClass是信息分类,在这里它被设置为ThreadBasicInformation。ThreadInformation是保存结果的缓冲区,大小按字节计算为ThreadInformationLength。
&#35;define ThreadBasicInformation 0
对ThreadBasicInformation返回这个结构:
typedef struct _THREAD_BASIC_INFORMATION {
NTSTATUS ExitStatus;
PNT_TIB TebBaseAddress;
CLIENT_ID ClientId;
KAFFINITY AffinityMask;
KPRIORITY Priority;
KPRIORITY BasePriority;
} THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION;
ClientId是线程所属进程的PID。
现在我们来感染新进程。问题就是新进程的地址空间中只有ntdll.dll,其他的模块在调用NtResumeThread之后被加载。有几种方法可以解决这个问题,比方说我们可以挂钩一个名为LdrInitializeThunk的API函数,它在进程初始化时被调用。
NTSTATUS LdrInitializeThunk(
DWORD Unknown1,
DWORD Unknown2,
DWORD Unknown3
);
首先我们先运行原始的代码,然后挂钩新进程里所有要挂钩的函数。但最好对LdrInitializeThunk解除挂钩,因为这个函数在之后要被调用很多次,我们并不需要重新再挂钩所有的函数。这时在程序执行第一个指令前所有工作已经完成。这就是为什么在我们挂钩它之前它没有机会调用任何一个被挂钩过的函数的原因。
对自己挂钩和动态挂钩正在运行的进程一样,只是这里我们不需要关心正在运行的线程。

=====[ 7.4 DLL ]================================================
系统中每个进程都是一份ntdll.dll拷贝。这意味着我们可以在进程初始化阶段挂钩这个模块里的任意一个函数。但是来自其它模块比如kernel32.dll或advapi32.dll的函数该怎么办呢?还有一些进程只有ntdll.dll,其他模块都是在进程被挂钩之后在运行过程中才被动态加载的。这就是我们还得挂钩加载新模块的函数LdrLoadDll的原因。
NTSTATUS LdrLoadDll(
PWSTR szcwPath,
PDWORD pdwLdrErr,
PUNICODE_STRING pUniModuleName,
PHINSTANCE pResultInstance
);
这里对我们来说最重要的是pUniModuleName,它保存模块名字。当调用成功后pResultInstance保存模块地址。
我们首先调用原始的LdrLoadDll然后挂钩被加载模块里所有函数。

=====[ 8. 内存 ]===========================================
当我们正在挂钩一个函数时我们会修改它开始的字节。通过调用NtReadVirtualMemory任何人都可以检测出函数被挂钩。所以我们还要挂钩NtReadVirtualMemory来防止检测。
NTSTATUS NtReadVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
OUT PVOID Buffer,
IN ULONG BufferLength,
OUT PULONG ReturnLength OPTIONAL
);
我们修改了我们挂钩的函数开始的字节并且为我们新的代码分配了内存。我们就需要检查时候有人读取了这些代码。如果我们的代码出现在BaseAddress到BaseAddress+BufferLength中我们就需要在缓冲区中改变它的一些字节。
如果有人在我们分配的内存中查询字节我们就返回空的缓冲区和错误STATUS_PARTIAL_COPY。这个值用来表示被请求的字节并没有完全被拷贝到缓冲区中,它也同样被用在当请求了未分配的内存时。这时ReturnLength应该被设为0。
&#35;define STATUS_PARTIAL_COPY 0x8000000D
如果有人查询被挂钩的函数开始的字节我们就调用原始代码并拷贝原始代码里开始的那些字节到缓冲区中。
现在新进程已无法通过读取它的内存来检测是否被挂钩了。同样如果你调试被挂钩的进程调试器也会用问题,它会显示原始代码,但却执行我们的代码。
为了使隐藏更完美,我们还要挂钩NtQueryVirtualMemory。这个函数用来获取虚拟内存的信息。我们挂钩它来防止探测我们分配的虚逆内存。
NTSTATUS NtQueryVirtualMemory(
IN HANDLE ProcessHandle,
IN PVOID BaseAddress,
IN MEMORY_INFORMATION_CLASS MemoryInformationClass,
OUT PVOID MemoryInformation,
IN ULONG MemoryInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
MemoryInformationClass标明了返回数据的类别。我们对开始的2种类型感兴趣。
&#35;define MemoryBasicInformation 0
&#35;define MemoryWorkingSetList 1
对MemoryBasicInformation返回这个结构:
typedef struct _MEMORY_BASIC_INFORMATION {
PVOID BaseAddress;
PVOID AllocationBase;
ULONG AllocationProtect;
ULONG RegionSize;
ULONG State;
ULONG Protect;
ULONG Type;
} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
每个区段都有它的大小RegionSize和它的类型Type。空闲内存的类型是MEM_FREE。(区段对象就是文件映射对象,是可被映射到一个进程的虚逆地址空间的对象)
&#35;define MEM_FREE 0x10000
如果我们代码之前一个区段的类型是MEM_FREE我们就在它的RegionSize加上我们代码的区段的大小。如果我们代码之后的区段的类型也是MEM_FREE那么就在之前区段的RegionSize上再加上之后的空闲区段的大小。
如果我们代码之前的区段是其它类型,我们就对我们代码的区段返回MEM_FREE。它的大小根据之后的区段来计算。
对MemoryWorkingSetList返回这个结构:
typedef struct _MEMORY_WORKING_SET_LIST {
ULONG NumberOfPages;
ULONG WorkingSetList[1];
} MEMORY_WORKING_SET_LIST, *PMEMORY_WORKING_SET_LIST;
NumberOfPages是WorkingSetList中列项的数目。这个数字应该减少一些。我们在WorkingSetList中找到我们代码的区段然后把之后记录前移。WorkingSetList是按DWORD排列的数组,每个元素的高20位标明了区段地址,低12位是标志。

=====[ 9. 句柄 ]=========================================
用类SystemHandleInformation来调用NtQuerySystemInformation会在_SYSTEM_HANDLE_INFORMATION_EX结构中获取所有被打开的句柄的数组。
&#35;define SystemHandleInformation 0x10
typedef struct _SYSTEM_HANDLE_INFORMATION {
ULONG ProcessId;
UCHAR ObjectTypeNumber;
UCHAR Flags;
USHORT Handle;
PVOID Object;
ACCESS_MASK GrantedAccess;
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
typedef struct _SYSTEM_HANDLE_INFORMATION_EX {
ULONG NumberOfHandles;
SYSTEM_HANDLE_INFORMATION Information[1];
} SYSTEM_HANDLE_INFORMATION_EX, *PSYSTEM_HANDLE_INFORMATION_EX;
ProcessId标明了拥有句柄的进程。ObjectTypeNumber是句柄类型。NumberOfHandles是Information数组中元素的数量。隐藏其中一项是很麻烦的,我们要去掉所有之后的元素并减少NumberOfHandles。去掉之后所有元素是必须的,因为数组中句柄是按ProcessId分组的。这意味着一个来自同一个进程中的所有句柄都在一块儿。对于一个进程变量Handle的数量是不断增加的。
现在回想一下这个函数(NtQuerySystemInformation)使用SystemProcessAndThreadsInformation类来调用时返回的结构_SYSTEM_PROCESSES。这里我们能够看到每个进程都有它自己的句柄的数量在HandleCount中。如果我们想要做得更完美我们就应该修改HandleCount,因为用SystemProcessesAndThreadsInformation类调用这个函数时隐藏了不少句柄。但校正是非常浪费时间的。在系统正常运行的一小段时间里就会有很多句柄正在打开或关上。所以在对这个函数两次紧挨着的调用句柄的数量被更改是很正常的,所以我们根本不需要改变HandleCount。

=====[ 9.1 命名句柄并获取类型 ]===================================
隐藏句柄很麻烦,但找出哪个句柄该被隐藏更困难一些。比方说我们要隐藏一个进程就要隐藏它的所有句柄并隐藏所有和它有联系的句柄。我们比较句柄的ProcessId参数和想要隐藏的进程的PID,如果它们相等就隐藏这个句柄。但是其它进程的句柄在我们能比较任何东西之前不得不先命名。系统中句柄的数量通常很庞大,所以最好在尝试命名之前先比较句柄类型。命名类型可以为我们不感兴趣的句柄省不少时间。
命名句柄和句柄类型通过调用NtQueryObject来完成。
NTSTATUS ZwQueryObject(
IN HANDLE ObjectHandle,
IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
OUT PVOID ObjectInformation,
IN ULONG ObjectInformationLength,
OUT PULONG ReturnLength OPTIONAL
);
ObjectHandle是我们想要获取有关信息的句柄,ObjectInformationClass是信息类型,保存在以字节计算长度为ObjectInformationLength的缓冲区ObjectInformation中。
我们对OBJECT_INFORMATION_CLASS使用的类是ObjectNameInformation和ObjectAllTypesInformation。ObjectNameInfromation类在缓冲区中返回OBJECT_NAME_INFORMATION结构,而ObjectAllTypesInformation类返回OBJECT_ALL_TYPES_INFORMATION结构。
&#35;define ObjectNameInformation 1
&#35;define ObjectAllTypesInformation 3
typedef struct _OBJECT_NAME_INFORMATION {
UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
Name决定了句柄的名字。

typedef struct _OBJECT_TYPE_INFORMATION {
UNICODE_STRING Name;
ULONG ObjectCount;
ULONG HandleCount;
ULONG Reserved1[4];
ULONG PeakObjectCount;
ULONG PeakHandleCount;
ULONG Reserved2[4];
ULONG InvalidAttributes;
GENERIC_MAPPING GenericMapping;
ULONG ValidAccess;
UCHAR Unknown;
BOOLEAN MaintainHandleDatabase;
POOL_TYPE PoolType;
ULONG PagedPoolUsage;
ULONG NonPagedPoolUsage;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
typedef struct _OBJECT_ALL_TYPES_INFORMATION {
ULONG NumberOfTypes;
OBJECT_TYPE_INFORMATION TypeInformation;
} OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;
Name决定类型对象名字,类型对象紧跟在每个OBJECT_TYPE_INFORMATION结构后面。下一个OBJECT_TYPE_INFORMATION结构跟在这个Name后面,间隔4个字节。

SYSTEM_HANDLE_INFORMATION结构中的ObjectTypeNumber是TypeInformation数组中的索引。
比较困难的是获取其他进程中句柄的名字。这里有两种命名的可能性。一是通过调用NtDuplicateObject把句柄拷贝到我们的进程中然后命名它。这种方法对某些特殊类型的句柄会失败。但由于它失败的次数比较少,所以我们采用这种方法。
NtDuplicateObject(
IN HANDLE SourceProcessHandle,
IN HANDLE SourceHandle,
IN HANDLE TargetProcessHandle,
OUT PHANDLE TargetHandle OPTIONAL,
IN ACCESS_MASK DesiredAccess,
IN ULONG Attributes,
IN ULONG Options
);
SourceHandle是我们想要拷贝的句柄,SourceProcessHandle是拥有SourceHandle的进程的句柄。TargetProcessHandle是想要拷贝到的进程的句柄,在这里是我们进程的句柄。TargetHandle是指向保存原始句柄拷贝的指针。DesiredAccess应该被设为PROCESS_QUERY_INFORMATION,Attributes和Options设为0。
第二种命名方法对所有句柄都有效,就是使用系统驱动。源代码可以在http://rootkit.host.sk的OpHandle项目里找到。

=====[ 10. 端口 ]==========================================
枚举打开端口最简单的方法是调用AllocateAndGetTcpTableFromStack和AllocateAndGetUdpTableFromStack函数,或者AllocateAndGetTcpExTableFromStack和AllocateAndGetUdpExTableFromStack函数,它们都来自iphlpapi.dll。带Ex的函数从Windows XP才开始有效。

typedef struct _MIB_TCPROW {
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
} MIB_TCPROW, *PMIB_TCPROW;
typedef struct _MIB_TCPTABLE {
DWORD dwNumEntries;
MIB_TCPROW table[ANY_SIZE];
} MIB_TCPTABLE, *PMIB_TCPTABLE;
typedef struct _MIB_UDPROW {
DWORD dwLocalAddr;
DWORD dwLocalPort;
} MIB_UDPROW, *PMIB_UDPROW;
typedef struct _MIB_UDPTABLE {
DWORD dwNumEntries;
MIB_UDPROW table[ANY_SIZE];
} MIB_UDPTABLE, *PMIB_UDPTABLE;
typedef struct _MIB_TCPROW_EX
{
DWORD dwState;
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwRemoteAddr;
DWORD dwRemotePort;
DWORD dwProcessId;
} MIB_TCPROW_EX, *PMIB_TCPROW_EX;
typedef struct _MIB_TCPTABLE_EX
{
DWORD dwNumEntries;
MIB_TCPROW_EX table[ANY_SIZE];
} MIB_TCPTABLE_EX, *PMIB_TCPTABLE_EX;
typedef struct _MIB_UDPROW_EX
{
DWORD dwLocalAddr;
DWORD dwLocalPort;
DWORD dwProcessId;
} MIB_UDPROW_EX, *PMIB_UDPROW_EX;
typedef struct _MIB_UDPTABLE_EX
{
DWORD dwNumEntries;
MIB_UDPROW_EX table[ANY_SIZE];
} MIB_UDPTABLE_EX, *PMIB_UDPTABLE_EX;
DWORD WINAPI AllocateAndGetTcpTableFromStack(
OUT PMIB_TCPTABLE *pTcpTable,
IN BOOL bOrder,
IN HANDLE hAllocHeap,
IN DWORD dwAllocFlags,
IN DWORD dwProtocolVersion;
);
DWORD WINAPI AllocateAndGetUdpTableFromStack(
OUT PMIB_UDPTABLE *pUdpTable,
IN BOOL bOrder,
IN HANDLE hAllocHeap,
IN DWORD dwAllocFlags,
IN DWORD dwProtocolVersion;
);
DWORD WINAPI AllocateAndGetTcpExTableFromStack(
OUT PMIB_TCPTABLE_EX *pTcpTableEx,
IN BOOL bOrder,
IN HANDLE hAllocHeap,
IN DWORD dwAllocFlags,
IN DWORD dwProtocolVersion;
);
DWORD WINAPI AllocateAndGetUdpExTableFromStack(
OUT PMIB_UDPTABLE_EX *pUdpTableEx,
IN BOOL bOrder,
IN HANDLE hAllocHeap,
IN DWORD dwAllocFlags,
IN DWORD dwProtocolVersion;
);

还有另外一种方法。当程序创建了一个套接字并开始监听时,它就会有一个为它和打开端口的打开句柄。我们在系统中枚举所有的打开句柄并通过NtDeviceIoControlFile把它们发送到一个特定的缓冲区中,来找出这个句柄是否是一个打开端口的。这样也能给我们有关端口的信息。因为打开句柄太多了,所以我们只检测类型是File并且名字是DeviceTcp或DeviceUdp的。打开端口只有这种类型和名字。
如果你看一下iphlpapi.dll里函数的代码,就会发现这些函数同样调用NtDeviceIoControlFile并发送到一个特定缓冲区来获得系统中所有打开端口的列表。这意味着我们要想隐藏端口只需要挂钩NtDeviceIoControlFile函数。
NTSTATUS NtDeviceIoControlFile(
IN HANDLE FileHandle
IN HANDLE Event OPTIONAL,
IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
IN PVOID ApcContext OPTIONAL,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG IoControlCode,
IN PVOID InputBuffer OPTIONAL,
IN ULONG InputBufferLength,
OUT PVOID OutputBuffer OPTIONAL,
IN ULONG OutputBufferLength
);
我们感兴趣的成员变量有这几个:FileHandle标明了要通信的设备的句柄,IoStatusBlock指向接收最后完成状态和请求操作信息的变量,IoControlCode是指定要完成的特定的I/O控制操作的数字,InputBuffer包含了输入的数据,长度为按字节计算的InputBufferLength,相似的还有OutputBuffer和OutputBufferLength。

=====[ 10.1 WinXP下使用Netstat OpPorts FPort ]=========================
在Windoes XP获得所有打开端口的列表可以使用一些软件比方OpPorts、FPort和Netstat。
这里程序用IoControlCode0x000120003调用了NtDeviceIoControlFile两次。输出缓冲区在第二次调用时被填满。FileHandle的名字这里总是DeviceTcp。InputBuffer因不同类型的调用而不同:
1) 为获得MIB_TCPROW数组InputBuffer看起来是这样:
第一次调用:
0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00
第二次调用:
0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00

2) 为获得MIB_UDPROW数组:
第一次调用:
0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00
第二次调用:
0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00

3) 为获得MIB_TCPROW_EX数组:
第一次调用:
0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00
第二次调用:
0x00 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00

4) 为获得MIB_UDPROW_EX数组:
第一次调用:
0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00
第二次调用:
0x01 0x04 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x01 0x00 0x00
0x02 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00

你可以看到缓冲区只有少数字节不同。我们现在比较清晰地简要说明一下:
我们感兴趣的调用是InputBuffer[1]为0x04且InputBuffer[17]为0x01。只有使用这些输入数据才能使OutputBuffer里为我们想要的表。如果我们想要获得TCP端口信息我们就把InputBuffer[0]设为0x00,想获得UDP端口信息就把它设为0x01。如果我们还需要额外的输出表(MIB_TCPROW_EX或MIB_UDPROW_EX)我们就在第二次调用里把InfputBufer[16]设为0x02。
如果我们发现使用了这几个参数的调用我们就修改输出缓冲区。获取输出缓冲区中ROW的数量可以很容易根据ROW的大小分开IoStatusBlock结构里的Infotmation变量。隐藏其中一个ROW就会变的容易,只需要用之后的ROW改写他并删掉最后一个ROW。不要忘了修改OutputBufferLength和IoStatusBlock。

=====[ 10.2 Win2k和NT4下使用OpPorts, Win2k下使用FPort ]==========================
我们用IoControlCode0x00210012调用NtDeviceIoControlFile来判断这个拥有类型File和名字DeviceTcp或DeviceUdp是否是打开端口的句柄。
所以最先我们比较IoControlCode然后是类型和句柄名字。如果这些都符合就接着比较输入缓冲区长度,它应该和结构TDI_CONNECTION_IN长度一样,为0x18。输出缓冲区的结构是TDI_CONNECTION_OUT。
typedef struct _TDI_CONNETION_IN
{
ULONG UserDataLength,
PVOID UserData,
ULONG OptionsLength,
PVOID Options,
ULONG RemoteAddressLength,
PVOID RemoteAddress
} TDI_CONNETION_IN, *PTDI_CONNETION_IN;
typedef struct _TDI_CONNETION_OUT
{
ULONG State,
ULONG Event,
ULONG TransmittedTsdus,
ULONG ReceivedTsdus,
ULONG TransmissionErrors,
ULONG ReceiveErrors,
LARGE_INTEGER Throughput
LARGE_INTEGER Delay,
ULONG SendBufferSize,
ULONG ReceiveBufferSize,
ULONG Unreliable,
ULONG Unknown1[5],
USHORT Unknown2
} TDI_CONNETION_OUT, *PTDI_CONNETION_OUT;

具体判断句柄是不是一个打开端口的方法请参考OpPorts的源代码,在http://rookit.host.sk上可以找到。我们现在来隐藏指定端口。我们已经比较过了InputBufferLength和IoControlCode,现在来比较RemoteAddressLength,对打开端口来说它总是3或4。最后要做的是比较OutputBufferBuffer里的ReceiveTsdus,用网络上的端口和要隐藏的端口列表比较。区别TCP和UDP的做法是句柄的名字不一样。在删除了OutputBuffer、修改IoStatusBlock并返回STATUS_INVALID_ADDRESS后我们就已经隐藏了这个端口了。

=====[ 11. 结束语 ]===============================================
具体细节请参考Hacker defender rootkit version 1.0.0的源代码,在http://rootkit.host.sk和http://www.rootkit.com都可以找到。
在将来我还会加入更多有关的技术。这篇文档的更新版本会改进现有的方法和并加入新的思想。
特别感谢Ratter提供了很多完成这篇文档和Hacker defender代码所需要的技术。
===================================[ End ]==============================
后记:
其实只要我们对Windows的内核有一定程度的了解我们都知道单纯靠挂钩函数是不能真正做到隐藏的,这样做只不过是欺骗操作系统的使用者,却欺骗不了操作系统自己。线程要想被运行就必须获得时间片,将自己加入调度链表中,从而暴露自己。内核维护一组被称为调度程序数据库的数据结构来做出线程调度的决策。其中最重要的结构是调度程序就绪队列(KiDispatckerReadyListHead)。它里面有64个DWORD,分别对应于32个线程优先级的队列,队列包含处于就绪状态的线程,正在等待调度执行。还有两个队列KiWaitInListHead和KiWaitOutListHead保存着处于等待状态的线程。可以很简单的枚举这3个链表中的所有元素从而列出系统中的所有线程。因此要想彻底从Windows系统里“消失”就要从Windows的内核下手(Windows的内核只负责线程调度,其它功能由执行程序组件完成)。这个功能还有待完成。

作者: 久木    时间: 2005-4-7 20:33     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

Internet上WindowsNT安全措施
人们普遍认为NT在安全性方面不如Unix。难道是NT本身比Unix不安全吗?答案是否定的。原因在于多年以来Unix管理员已经学会了在复杂的Internet环境中实现Unix服务,所以NT管理员也应该学习在Internet上保护自己的系统,从而使自己的WindowsNT高枕无忧。
  在Internet的广泛应用中,WindowsNT的安全性一度令NT管理员们深感不安。在运行Windows95的环境下,任何一位略懂网络技术的用户键入命令:“net Q:\\SERVER-NAME\SHARENAME”,就能通过网络存取服务器的启动分区!为了确保安全性,以下7项措施可供NT管理员参考。
  1.用NTFS,不用FAT
  NTFS(NT文件系统)可以对文件和目录使用ACL存取控制表),ACL可以管理共享目录的合理使用,而FAT(文件分配表)却只能管理共享级的安全。出于安全考虑,您必须处处设置尽可能多的安全措施,凡是与Internet相连的WindowsNT计算机都应该使用NTFS。使用NTFSACL的好处在于,如果它授权用户对某分区具有全部存取权限,但共享级权限为"只读”,则最终的有效权限为“只读”。WindowsNT取NTFSACL和共享权限的交集。在实施这样的网络方案时,您最好限制Internet服务器的共享,但是如果非要与Internet服务器交换文件,则可借助于NTFS。一旦建立新的共享权限,不要忘记修改由NT指定的缺省权限,否则Everyone用户组就能享有“完全控制”的共享权限。那些已经使用了FAT的用户,在x86的NT系统上可以用convert 命令将启动卷升级为NTFS。
  2.将系统管理员账号改名
  对于试图猜测口令的非法用户,NT的UserManager可以设置防范措施,例如5次口令输入错误后就禁止该账号登录。问题在于系统管理员这个最重要的账号却用不上这项防范措施。即使将系统管理员的权限全部授予某个用户账号,并且只使用该用户账号进行管理,但是由于系统管理员账号本身不能删掉或废止,因而非法用户仍然可以对系统管理员账号进行口令攻击。
  一种值得推荐的方法是将系统管理员账号的用户名由原先的“Administrator”改为一个无意义的字符串。这样要登录的非法用户不但要猜准口令,还要先猜出用户名。这种改名功能在UserManager的UserProperties对话框中并没有设置,不过它的“User”*“Rename”菜单选项却能实现这一功能。
  用于提供Internet公共服务的计算机不需要也不应该有除了系统管理用途之外的其他用户账号。因此,应该废止Guest账号,移走或限制所有的其他用户账号。
  如果用的是NT4.0,可以用ResourceKit中提供的工具封锁联机系统管理员账号。这种封锁只对由网络过来的非法登录起作用。账号一旦被封锁掉,系统管理员还可以通过本地登录重新设置封锁特性。
  3.别忘了打开审计系统
  如何才能知道在NT环境中安全性是否已经被攻击或攻破呢?NT的事件审计系统就设有此项功能,但该系统需要被激活。UserManager中的“Policies”*“Audit”菜单选项可以激发控制审计事件的屏幕。问题的关键在于您应当收集有用的信息,而不是收集得越多越好。您可以审计各种操作成功和失败的情况。失败的情况通常比成功的情况少得多,但从安全性的角度考虑,失败事件更值得注意。另外不常用的操作也值得注意,如安全性策略的改变和再启动往往反映了未经授权的行为。NT允许跟踪诸如FileAccess、UseofUserRights和ProcessTracking等成功的操作,但它需要大量的存储空间,而且对跟踪所得的数据进行分析也不是一件容易的事情。使用审计功能,最关键的一步是要查看NT在正常运行时所记录的事件日志,它能帮助我们发现问题的前兆。审计日志本身也需要保护,因为非法用户在进入系统之后通常会抹掉其活动踪迹。首先我们应该定时自动备份日志文件,但是如果这些备份仍然是联机的,则也有可能被非法用户找到。一个比较好的解决方法是将审计事件记录同时制成硬拷贝,或者将其通过E-mail发送给系统管理员。NTPerl为我们提供了一个阅读事件日志的模块。
  4.废止TCP/IP上的NetBIOS
  连接到Internet上的NT支持NetBEUI和TCP/IP两种传输协议的Windows网络功能。那么什么是Windows网络功能呢?它就是所有要求\\NAME句法形式的操作,包括目录和打印机共享、NetDDE和远程管理。通过Internet连到某个驱动器编辑或寄存内容,只需要在本地lmhosts 文件里构造目标站NetBIOS名与其IP地址之间的映象。例如,使用Windows95中的EventViewer和UserManager就可以管理Internet上的其他服务器,这种特性为管理员提供了方便,但同时也使非法用户找到了可乘之机。
  好在NT已能够对TCP/IP上的NetBIOS施行严密的控制。您可以使用网络控制面板中的装订对话框废止多种基于NetBIOS服务与TCP/IP之间的装订。由于NT的网络服务同时运行多种传输功能,做上述废止操作的计算机之间可以使用Server、Workstation和其他服务进行对话,因为这些对话不从Internet上走,而是通过NetBEUI通道。当然,完成了这种废止操作之后,不仅是非法用户,就连系统管理员也不能做远程驱动器安装并远程编辑或寄存内容了。
  5.关闭不必要的向内TCP/IP端口
  一旦非法用户进入系统并得到管理员权限之后,他定要想办法恢复管理员刻意废止的NBT(TCP/IP上的NetBIOS)装订。管理员应该使用路由器作为另一道防线。假设有个NT服务器没有太多的防护系统,暴露在防火墙以外,其作用是提供诸如Web和FTP之类的公共服务。这种情况下只须保留两条路由器到服务器的向内路径:端口80的HTTP和端口21的FTP。路由器应该并能够阻塞所有其他的向内途径。如果管理员有调整包过滤规则的权限,他可能会给自己多留一点便利。例如,在取消全部非Web和非FTP服务时留一个例外,即用于远程管理的端口137、138、139从IP地址来的NBT途径。虽然一般来说只有管理员才能远程操作服务器,但事实上发现了管理员和IP地址之间这种连接的非法用户也能盗用该路径。非法用户若想知道主系统的IP地址,通常会按如下步骤进行:
  1.了解目标服务器管理员的情况。
  2.针对管理员的兴趣爱好,做个假Web页面。
  3.发送E-mail邀请他访问该页面。
  4.截获主系统的IP地址。
  5.用JavaScript或ActiveX钻进该系统。
  这种管理员为自己开后门、留一条路径的做法,其安全性只依赖于别人不知道IP地址。[Image]但这种安全性在非法用户系统而耐心的猜试攻势面前也是极不安全的,所以要禁止一切多余的向内路径。
  6.取消Access from Network的便利
  在缺省情况下,NT授予Everyone用户组Access from Network(从网络存取)的权限。取消了该权限虽然会阻塞Windows的全部网络服务,但仍然可以支持Web 服务。在一个NTWeb服务器上,既能以SYSTEM方式运行,也能以本地用户方式运行,这两种状态在NT看来都不存在远程用户。由于与NT连用的FTP服务器要求用户进行网络登录,所以这种情况下就无法使用FTP服务器,但包括Microsoft Internet Information Server(IIS)在内的其他FTP服务器是采用本地登录的,并不受取消Accessfrom Network权限的影响。与NBT方法不同的是,这里讲的技术无法对协议选择弃留。所以Access from Network权限取消后运行Web和FTP服务,不但通过Internet的、而且本地使用NetBEUI协议的文件共享都被阻塞掉了。当然还有一种妥协方案,只给管理员本人账号留有Access from Network的权限。
  7.不可轻易发布信息
  有人认为,在Internet上没人知道你在运行WindowsNT。然而事实并非如此,如联机FTP 服务是这样宣布连接的:
  ftp>open ftp.myhost.com
  Connected to ftp.myhost.com
  220 ftp WindowsNT FTP Server
  (Version3.51)
  正常的用户不需要以上信息,而非法用户却能根据该信息有效地对特定操作系统进行攻击。IISFTP服务也发布同样明显的消息:
  Connected to ftp.myhost.com.
  220 ftp Microsoft. FTP Service
  (Version2.0)
  上面两种情况表明您连接在NT上工作以及您运行的NT是什么版本。所以如果您不想为非法用户攻击您的系统提供便利的话,最好不要轻易发布信息。

作者: 久木    时间: 2005-4-7 20:35     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

安装Windows2000十大注意事项
■你的计算机是否适合安装Windows 2000
  在开始安装Windows 2000之前,为保证安装的顺利和成功,必须保证硬件符合下列最低的需求:
  133MHz Pentium或更高的微处理器(或相当的其他微处理器)。
  推荐最小64MB内存(最小支持32MB,最大4GB)。
  2GB硬盘,850MB的可用空间。
  除了要满足最低硬件配置需求外,还要考虑你的硬件和软件是否与Windows 2000兼容,如果你的计算机中有一些老的如ISA接口的设备等最好进行更新。还要了解硬件的驱动程序是否适用于Windows 2000。
   ■只安装Windows 2000还是安装双重引导系统
  开始安装程序之前,还应该决定是只安装Windows 2000还是安装双重引导系统,以便在计算机上同时使用 Windows 2000 Professional和其他操作系统,如MS-DOS或Windows 98等。
  因为目前除了Office 2000和IE 5等少数应用程序能与 Windows 2000完全兼容外,大多数软件在Windows 2000环境下不能很正常地使用,所以建议安装双重引导系统。这样既可以让你的计算机充分发挥Windows 2000的效能,又可以运行一些16位的应用程序。
  Windows 2000支持与下列操作系统进行双重引导:
  NT 3.51、NT 4.0
  Windows 95、Windows 98
  Windows 3.1、Windows for Workgroups 3.11
  MS-DOS、OS/2
   ■选择文件系统是用NTFS还是FAT、FAT32
  如果只安装 Windows 2000,建议选择NTFS文件系统,NTFS是Windows 2000推荐使用的文件系统,NTFS具有 FAT的所有基本功能,并提供了下列优于FAT和FAT 32文件系统的特点:
  更好的文件安全性。
  更大的磁盘压缩。
  支持大磁盘,最大可达2TB(NTFS的最大驱动器容量远远大于FAT的最大驱动器容量,并且随着驱动器容量的增加,NTFS的性能并不下降,这与FAT有很大不同)。
  可以在安装过程中,将现有的分区转换为NTFS。也可以在安装后的任何时候,通过在命令提示符下使用Convert.exe程序,将文件系统从FAT转换为NTFS。
  但是NTFS文件系统存在一个明显的不足,就是如果使用NTFS格式化分区,那么只有Windows 2000可以访问在该分区上创建的文件( 除了Windows NT 4.0 Service Pack 4(SP4) 及其后续版本外),其他操作系统不能使用Windows 2000 NTFS分区。
  因此如果计划安装双重引导系统,就不能使用NTFS文件系统,应使用 FAT32或FAT文件系统。对于Windows 2000同Windows 95或MS-DOS之间的双重配置,主分区必须使用FAT格式化;而对于Windows 2000同Windows 95 OSR2或Windows 98的双重配置,主分区必须使用FAT或FAT32格式,而不是使用NTFS。
如果安装分区小于2GB,那么应使用FAT格式分区。
  对于容量为2GB或更大的分区,则使用FAT32文件系统。如果在运行Windows 2000安装程序过程中用FAT格式分区,且分区大于2GB,那么安装程序会自动使用FAT32格式分区。
  大于32GB的分区推荐使用NTFS而不是FAT32文件系统格式。
   ■安装前创建安装启动盘
  当无法从硬盘上启动安装程序时,可用安装启动盘来启动安装程序。如果没有安装启动盘,可以自行创建。
  注意:安装启动盘与紧急修复磁盘包含的信息并不相同。
  创建安装启动盘:
  将一个已格式化过的磁盘插入软驱中,并在CD-ROM 驱动器中放入Windows 2000 Professional光盘。
  需要四张1.44MB空白并已格式化的3.5英寸磁盘。将它们标记为“安装磁盘 1”、“安装磁盘 2”等等。
  单击“开始”,然后单击“运行”。
  在提示符下,键入下列命令:
  d:bootdiskMakeboot.exe a: (d为 CD-ROM 驱动器的盘符,a 为软驱的盘符。)
  遵循出现的提示进行操作。
   ■选择全新安装还是更新安装
  如果想保留现有的文件和参数设置,而且使用的是支持升级的以前版本的Windows,那么应该选择更新。在更新过程中,安装替换了现有的Windows文件,但保留了已有的设置和应用程序。有些应用程序可能与Windows 2000 不兼容,因此在更新后,它们可能无法在Windows 2000中正常运行。
  可以从下列操作系统升级或更新到Windows 2000 Professional:
  Windows 95(所有版本)和Windows 98(所有版本)
  Windows NT 3.51 Workstation、Windows NT 4.0 Workstation(包括 Service Pack)
  如果符合下面的任何一种情况,那么应该选择全新安装:当前的操作系统不支持升级到Windows 2000;已使用某个操作系统,但不想保留现有的文件和参数设置;有两个分区,并想使用Windows 2000和当前的操作系统创建双重引导配置。
   ■若要安装双重引导系统,必须为每个操作系统使用单独的分区
  如果选择Windows 2000的双重引导配置,那么每个操作系统都应被安装在单独的驱动器或磁盘分区上。将Windows 2000安装到与其他操作系统相同的分区上,会导致安装程序将其他操作系统安装的文件覆盖。
  安装Windows 2000的磁盘分区的大小时,建议为1GB以上的磁盘空间。尽管安装Windows 2000最小只需要500 MB的可用磁盘空间,但使用较大的安装分区可为以后添加更新软件、操作系统工具或其他文件提供更大的灵活性。

作者: 久木    时间: 2005-4-7 20:36     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

Win2000/XP系统用户切换酷招
使用Windows 2000/XP双系统的用户,在日常工作中最好不要以管理员组成员的身份登录,平时应该用普通用户(Users组成员)身份登录系统,由于Users组的账号不能修改系统注册表设置,操作系统文件或程序文件,因此对病毒、木马具有先天的免疫功能!但用户却无法使用只能由系统管理员执行的应用程序。
  如果要用全部功能怎么办呢?就用“用户切换”功能。下面我们就以Windows XP为例,来看看如何使用快速用户切换功能。
  一、进行快速用户切换
  使用快速用户切换功能,直接在当前用户环境下以管理员身份运行应用程序!
  假设我们现在处于普通用户的环境下,想配置诺顿个人安全特警的信任域。但由于当前用户的“面子(即权限)”不够大,防火墙配置程序拒绝执行。我们来祭出快速用户切换这把“宝刀”:打开“开始→所有程序→Norton Internet Security”,用鼠标右键单击“Norton Internet Security”菜单项,选择“运行方式”菜单项,程序会打开“运行身份”对话框,单击其中的“下列用户”单选框,然后在“用户名”下拉列表框里选择一个管理员账号,并在“密码”文本框中输入相应的账号密码。最后单击“确定”按钮即可。接下来,系统就会以管理员的身份运行诺顿个人安全特警的配置程序!
  二、使用“注销”菜单法
  切换用户最常用的方法,就是通过“注销”菜单来访问用户切换功能。方法是:单击“开始→注销”,在打开的“注销Windows”对话框中,单击“切换用户”按钮,系统会保留当前会话状态。从表面上看,这和注销用户并没有什么两样,但使用切换用户方法可以保留原来用户账号打开的会话(比如你正在进行软件下载,那么使用用户切换后,该下载任务会继续进行。如果使用了“注销”,那么软件下载任务就会被强行关闭)。
三、使用Runas命令
  Linux/UNIX系统中有个su命令,利用这个命令用户可以在超级用户、普通用户之间自由地进行“变脸”。现在Windows 2000/XP也有了类似的命令——Runas命令。Runas是一个DOS命令,只能在Windows 2000/XP的DOS命令窗口运行,它允许用户用其他权限运行指定的工具和程序,而不是当前登录用户账号所提供的权限。其语法如下:
  Runas [{/profile|/noprofile}] [/env] [/netonly] [/showtrustlevels] [/trustlevel] /user:UserAccountName program
  各参数的作用如下:
  /profile:加载用户配置文件,是Runas命令的默认参数。
  /no profile:不加载用户配置文件,这样可以提高应用程序的载入速度,不过由于某些应用程序需要读取特定用户的配置文件,因此不建议大家使用此参数。
  /env:指定当前使用的网络环境,而不是用户的本地环境。
  /netonly:指明指定的用户信息只用于远程访问。
  /showtrustlevels:列出/trustlevel开关项。
  /trustlevel:指定应用程序运行所在的授权级别。
  /user:UserAccountName:指定在其下运行程序的用户账号的名称。对于单机用户来说,可以使用以下格式:
  /user:UserName@ComputerName
  或/user:ComputerNameSERNAME
  此处的USERNAME应该用具体的用户账号来代替,COMPUTERNAME指计算机名。
  对于域或者工作组的用户,可以使用以下格式:
  /USER:USERNME@DOMAINNAME(WORKGROUPNAME)
  或/USER:DOMAINNAME(WORKGROUPNAME)SERNAME
  此处的DOMAINNAME(WORKGROUPNAME)是指计算机所在域的域名(或者所在工作组的名称)。
  PROGRAM:指定所要运行的程序或命令。可以使用RUNAS命令来启动任何应用程序、MMC控制台项目或“控制面板”项目。这里要注意,并非所有的项目都可以用RUNAS来启动,例如“打印机”文件夹和桌面项。
  四、总结
  以上介绍的三种用户切换方法,可谓各有千秋。其中注销菜单法最烦琐,但是也是最彻底的方法;而用“运行身份”对话框和RUNAS命令,虽然使用起来比较简单,但并不是所有任务都能完成,例如设置文件夹共享等。

作者: 久木    时间: 2005-4-7 20:37     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

Windows2000系统服务设置(建议配置)

进入系统服务:
>控制面板>管理工具>服务
>开始→运行→输入:services.msc

1. Alerter(错误警报器)
说明:通知所选用户和计算机有关系统管理级警报。
参考:如果电脑是单独的平台(未联网使用),可以关闭此项服务。
建议:手动
2. Application Management(应用程序管理)
说明:Windows2000引入了一种基于MSI(应用程序安装信息程序包文件)文件格式的软件管理方案——应用程序管理组件服务,它不仅管理软件的安装、删除,而且可以使用此项服务修改、修复现有应用程序,监视文件复原并通过复原排除基本故障等。
参考:当设置为“已禁用”时其实并不影响单机上软件的安装与卸载,而且基于MSI格式安装、修复与删除的行为也正常。
建议:手动
3. Automatic Updates(自动更新)
说明:自动联网下载Windows的更新组件
参考:宽带用户如果需要Windows自动更新,可让此服务随机启动(自动),驻留后台。
建议:手动
4. Background Intelligent Transfer Service(后台智能传输服务)
说明:用来实现http1.1服务器之间的信息传输,微软称支持Windows更新时断点续传。
建议:手动
5. ClipBook(剪贴簿)
说明:通过Network DDE和Network DDE DSDM提供的网络动态数据交换服务,查阅远程机器中的剪贴簿,用于局域网中电脑来共享粘贴/剪贴的内容。
参考:普通用户可以设置为:已禁用。
建议:手动/已禁用
6. COM+Event System(COM+组件系统)
说明:COM+倡导了一种新的概念,它把COM组件软件提升到应用层(用户使用层)而不再是底层的软件结构,通过操作系统的各种支持,使组件对象模型建立在应用层上,把所有组件的底层细节留给操作系统。一些 COM+软件需要这项服务的支持。
参考:检查\Program Files\ComPlus Applications目录,如果该目录为空就可以关闭此服务,但实际使用中若关闭该服务后下次启动时仍会随机启动。
建议:自动
7. Computer Browser(计算机浏览器)
说明:维护网上邻居中计算机的最新列表,并将这个列表通知给请求的程序,用来浏览局域网电脑的服务。
参考:普通用户设置为:已禁用;局域网用户设为:手动。
建议:手动
8. DHCP Client(动态主机配置协议客户端)
说明:DHCP是一种提供动态IP地址分配、管理的TCP/IP服务协议,它作为网络启动过程的一部分。DHCP客户端系统就可以向DHCP服务器请求和租用IP地址。
参考:如果是通过拨号方式连入Internet,则需要保持此服务的自动启动状态,因为在Internet上的IP地址是由ISP动态分配的。除非系统不应用于任何网络,可以将其设为:已禁用。
建议:自动
9. Distributed Link Tracking Client(分布式链接跟踪客户端)
说明:分布式链接跟踪客户端能跟踪文件在网络域的NTFS卷中移动的情况,并发出通知,用于局域网更新文件链接信息。后台运行时一般占用4M内存。
参考:普通用户设置为:已禁用;局域网用户(硬盘已格式为NTFS格式)设为:手动。
建议:手动/已禁用
10. Distributed Transaction Coordinator(分布式协同处理)
说明:分布于两个以上的数据库、消息队列、文件系统其它事务保护资源管理器。
建议:手动
11. DNS Client(域名系统客户端)
说明:将域名解析为IP地址。
参考:除非没有连入任何网络,否则应保持此服务的自动启动状态。
建议:自动
12. Event Log(事件日志)
说明:记录程序和系统发送的出错消息,包含了对诊断问题有所帮助的信息。禁用此服务后,将导致了几个关于网络的服务无法启动的现象,并且无法实现拨号上网。
参考:如果存在Internet或局域网连接,建议保持此服务的自动启动状态。
建议:自动
13. Fax Service(传真服务)
说明:在Windows95中支持的传真功能在Windows2000中重新被予以支持,而且与系统集成得更好。
参考:如果不使用传真机,可以设置为:已禁用。
14. FTP Publishing Service(FTP发布服务)
说明:通过Internet信息服务(IIS)的管理单元提供FTP连接和管理。
建议:自动/手动
15. IIS Admin Service(IIS管理服务)
说明:允许通过Internet信息服务(IIS)的管理单元管理Web和FTP服务。
建议:自动/手动
16. Indexing Service(索引服务)
说明:索引服务能针对本地硬盘或共享网络驱动器上的文档内容和属性建立索引,并通过Windows2000特有的文档过滤器快速定位到所需要的文档上,大大强化了Windows2000的搜索能力。但另一方面,索引搜索又消耗了大量系统资源。
微软建议:对于仅有64MB内存,而要索引的文档又超过十万个的系统,就应该禁用这个服务。但事实上,在针对64MB内存的系统中,即使文档数量远远低于十万个,系统资源的消耗亦非常惊人,而且在128MB的系统上情况无明显好转,因此强烈建议禁用它。
建议:已禁用
17. Internet Connection Sharing(Internet连接共享)
说明:此服务为局域网计算机提供Internet共享连接,为多台联网的电脑共享一个拨号网络访问Internet提供了捷径。以前在Windows9X中要实现这一功能需借助SYGATE、WinGATE等代理软件,现在这一功能已直接被Windows2000支持。
参考:对普通用户可将其设为:已禁用。
建议:手动/已禁用
18. IPSEC Policy Agent(IP安全策略代理)
说明:此服务允许IP安全策略对两台计算机之间传输的数据包进行加密,从而防止在网上看到它的人对它进行更改和破译。IPSEC是一种用来保护内部网、专用网络(Internet)和外部网(Extranet)免遭攻击的重要防御方法。使用IPSEC前必须需要首先定义两台计算机之间相互信任和通信安全的方式。
请注意:在Windows2000默认情况下“IP安全策略代理”是自动启动的,而“IP安全策略”并没有启动(网络和拨号连接→拨号连接属性→网络→Internet协议(TCP/IP)属性→高级→选项中的“IP安全机制”属性中可以看到)。
参考:一般用户就完全可以禁用此代理服务。
建议:手动
19. Logical Disk Manager(逻辑磁盘管理)
20. Logical Disk Manager Administrative Service(逻辑磁盘管理服务)
说明:磁盘管理服务。
参考:在需要时此服务会通知用户,所以一般可以关闭此服务。
建议:手动
21. Logical Disk Manager Administrative Service
说明:磁盘管理请求的系统管理服务
建议:手动
22. Messenger(信使服务)
说明:此服务非MSN Messenger,发送和接收由系统管理员或由Alerter服务所发送消息的服务。Alerter服务需要依赖本服务。
参考:如果Alerter已禁止,可设置为:手动或已禁用。
建议:手动
23. Net Logon(网络登录)
说明:此服务用于在局域网上验证登录信息的选项、登录域名控制。
参考:一般用户可设为:已禁用或手动。
建议:手动
24. NetMeeting Remote Desktop Sharing(NetMeeting远程桌面共享)
说明:该服务能通过NetMeeting,允许拥有权限的用户远程访问Windows桌面。
参考:此服务提供的功能对一般用户并无太大的用处,并可能带来安全问题,可以设置为:已禁用。
建议:手动/已禁用
25. Network Connections(网络连接)
说明:管理“网络和拨号连接”文件夹中的所有对象。
参考:如果存在任何网络连接(包括拨号连接),保持此服务的自动/手动状态。若禁用此服务,“网络和拨号连接”文件夹中将为空,不能新建连接和拨号上网。
建议:手动
26. Network DDE(网络动态数据交换)
27. Network DDE DSDM
说明:此两项服务和Clipbook一起使用。网络动态数据交换服务是一种为DDE对话提供网络传输和安全的服务。DDE(动态数据交换)是实现进程通讯的一种形式,它允许支持DDE的两个或多个程序交换信息和命令。
参考:一般用户可设为:已禁用。
建议:手动
28. NT LM Security Support Provider
说明:此服务供Telnet服务使用,为使用传输协议而不是命名管道的远程过程调用(RPC)程序提供安全机制。
建议:手动
29. Performance Logs and Alerts(性能日志和警报)
说明:记录计算机运行状况并且定时写入日志或发出警告。但是记录的内容可能过于专业,不易理解。
参考:根据用户需要确定启动类型。
建议:手动
30. Plug and Play(即插即用)
说明:即插即用是Intel开发的一组规范,它赋予了计算机自动检测和配置设备并安装相应驱动程序的能力。当有设备被更改时,能自动通知使用该设备的程序当前设备的状况。
参考:将该服务状态保持自动启动状态有利于设备的管理和维护。
建议:自动
31. Print Spooler(打印后台处理)
说明:此服务的作用是将多个请求打印的文档统一进行保存和管理,待打印机资源空闲后,再将数据送往打印机处理。
参考:无任何打印设备的用户设置为:已禁用,否则设为:自动。
注意:如果启用了传真服务(Fax Service),此服务就应该保持自动状态,因为传真服务依赖Print Spooler的运行。
32. Protected Storage
说明:提供储存本地密码和网上服务密码的服务,包括填表时的自动完成功能,防止未授权的服务、过程或用户对其的非法访问。
建议:自动
33. QoS RSVP(QoS 许可控制)
说明:为依赖质量服务(QoS)的程序和控制程序提供网络信号和本地通信控制安装功能。
建议:手动
34. Remote Access Auto Connection Manager(远程访问自动连接管理器)
说明:在程序企图读取网络信息时自动连接到网络。
建议:手动
35. Remote Access Connection Manager(远程访问连接管理器)
建议:手动
36. Remote Procedure Call(RPC)(远程过程调用)
说明:一种消息传递功能。在计算机的远程管理期间它允许分布式应用程序(即COM+应用程序)呼叫网络上不同计算机上的可用服务。很多服务需要依赖它的运行。
建议:自动
37. Remote Procedure Call Locator(远程过程调用定位器)
说明:管理RPC数据库服务,后台运行时一般占用1M内存。
建议:手动
38. Remote Registry Service(远程注册表服务)
说明:该服务能使您编辑另一台计算机上的注册表,可能带来安全问题。
参考:普通单机用户根本没必要使用这个服务,可以设置为:已禁用。
建议:手动/已禁用
39. Removable Storage(可移动存储)
建议:手动
40. Routing and Remote Access(路由和远程访问)
说明:在局域网以及广域网环境中为企业提供路由服务。
建议:已禁用
41. Run As Service(以其他用户身份运行服务的服务)
说明:当以一般权限用户身份登录系统,而在使用中又需要修改只有系统管理员才能修改的系统设置项时,该服务提供了不用重启系统以管理员身份登录的捷径。只需要在命令提示符下运行RunAs命令就可达到更改目的。
参考:对于一般用户在未熟悉RunAs命令用法之前可以将其设为:已禁用。
建议:已禁用
42 Security Accounts Manager(安全帐户管理器)
说明:存储本地用户帐户的安全信息。Protected Storage,IIS Admin服务都需要此服务的支持。
建议:自动
43. Server(服务器)
参考:此服务用于局域网文件/打印共享。
建议:手动
44. Smart Card(智能卡)
45. Smart Card Helper(智能卡助手)
说明:提供对智能卡设备的支持。
建议:已禁用
46. System Event Notification(系统事件通知)
说明:记录用户登录、注销、重起、关机信息。
建议:自动
47. Task Scheduler(计划任务)
说明:能使程序在预定的时间自动运行,如定期进行磁盘碎片整理。
参考:不需要此功能的用户可以设置为:已禁用。
48. TCP/IP NetBIOS Helper Service(TCP/IP NetBIOS支持服务)
说明:在TCP/IP上提供NetBIOS支持,NetBIOS是基于局域网的。
参考:作为访问Internet资源的一般用户可以禁用它,除非系统处在局域网中。
建议:手动
49. Telephony(电话服务)
说明:为计算机提供电话拨号的能力。
参考:如果使用拨号方式连接到Internet或通过电话线连接其他计算机,就应将其设为:手动。
建议:手动
50. Telnet(远程登录协议)
说明:远程控制计算机执行控制台命令,后台运行时一般占用2M内存。此服务允许从远程计算机上登录本系统并且使用命令行方式操作这台计算机。
参考:对于一般单机用户该服务并不重要,可以设为:手动或已禁用。
建议:手动/已禁用
51. Uninterruptible Power Supply(不间断电源)
说明:管理连接到计算机的不间断电源(UPS)的服务。
参考:如果没有UPS设备就设为:已禁用。
建议:手动/已禁用
52. Utility Manager(辅助工具)(手动)
说明:从一个窗口中启动和配置辅助工具。
建议:手动
53. Windows Installer(Windows 安装服务)msiexec.exe
说明:Windows的MSI安装服务,根据包含在.msi文件中的指示来安装、修复或删除软件。
建议:手动
54. Windows Management Instrumentation(Windows管理规范)
55. Windows Management Instrumentation Driver Extensions(Windows管理规范驱动程序扩展)
说明:WMI是Windows2000中的基础管理结构,它通过一组常用接口控制和监视系统(如对系统属性的查看与更改、设置用户权限等)。
参考:为加快系统启动速度,可以将这两个服务设置为:手动,在系统启动后在需要的时候再自动调用它们。
建议:手动
56. Windows Time(Windows时间)
说明:自动联网实现网上时间校对。
建议:手动
57. Workstation(工作站)
说明:很多服务都依靠这个服务,支持联网和打印/文件共享的。
建议:手动
58. World Wide Web Publishing Service(万维网发布服务)
说明:通过Internet信息服务(IIS)的管理单元提供Web连接和管理。
建议:自动/手动

作者: 久木    时间: 2005-4-7 20:41     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

Windows Server 2003常规设置大全
-----Windows Server 2003的一些优化设置
1.禁用配置服务器向导:
禁止“配置你的服务器”(Manage Your Server)向导的出现:在控制面板(Control Panel) -> 管理员工具
(Administrative Tools )-> 管理你的服务器(Manage Your Server)运行它,然后在窗口的左下角复选“
登录时不要显示该页”(Don';t display this page at logon)。
2.启用硬件和DirectX加速
★硬件加速:桌面点击右键--属性(Properties) -> 设置(Settings )--高级( Advanced )--
疑难解答(Troubleshoot)。把该页面的硬件加速滚动条拉到“完全”( Full),最好点击“确定”(OK)保
存退出。这期间可能出现一瞬的黑屏是完全正常。
★DirectX加速:打开“开始”(Start) -> “运行”(Run),键入“dxdiag”并回车打开“DirectX 诊
断工具”(DirectX Tools),在“显示”(Display)页面,点击DirectDraw, Direct3D and AGP Texture 加
速三个按钮启用加速。把“声音的硬件加速级别”(Hardware Sound Acceleration Level)滚动条拉到“完全
加速”( Full Acceleration)。
3. 启用声卡:
系统安装后,声卡是禁止状态,所以要在 控制面板 -> 声音 -> 启用,重启之后再设置它在任务栏显示。
如果你使用的是Windows server 2003标准版请从第二步xx作,因为标准版已允许声音服务。
★打开“开始”(Start) -> “运行”(Run),键入“Services.msc ”,在出现的窗口中找到
“Windows Audio”并双击它,然后在启动模式(startup type )的下拉菜单选择“自动”(Automatic),
并点击“应用”(Apply) ->“开始”(Start) -> “确定”(OK)
★打开“开始”(Start) -> “运行”(Run),键入“dxdiag”并回车打开“DirectX 诊断工具”
(DirectX Tools),在“Sound”(Display)页面,把“声音的硬件加速级别”
(Hardware Sound Acceleration Level)滚动条拉到“完全加速”( Full Acceleration)。
4. 如何启用 ASP 支持:
Windows Server 2003 默认安装,是不安装 IIS 6 的,需要另外安装。安装完 IIS 6,
还需要单独开启对于 ASP 的支持。方法是: 控制面板 -> 管理工具 ->
Web服务扩展 -> Active Server Pages -> 允许。
5. 如何启用 XP 的桌面主题:
★打开“开始”(Start) -> “运行”(Run),键入“Services.msc ”,选themes“主题”(默认是禁止的)
,然后改为“自动”,按“应用”,选“开启”。
★接着点“桌面”的属性,在“主题”里选“windows xp”
★我的电脑----属性----高级----性能-----在桌面上为图标标签使用阴影
6. 禁止关机时出现的关机理由选择项:
关机事件跟踪(Shutdown Event Tracker)也是Windows server 2003区别于其他工作站系统的一个设置,
对于服务器来说这是一个必要的选择,但是对于工作站系统却没什么用,我们同样可以禁止它。
打开”开始“Start ->”运行“ Run ->输入”gpedit.msc “,在出现的窗口的左边部分,
选择 ”计算机配置“(Computer Configuration )-> ”管理模板“(Administrative Templates )
-> ”系统“(System),在右边窗口双击“Shutdown Event Tracker” 在出现的对话框中选择“禁止”
(Disabled),点击然后“确定”(OK)保存后退出,这样,你将看到类似于windows 2000的关机窗口
7. 如何使用USB硬盘、U盘,添加已经有分区的硬盘
我的电脑(单击右键)----管理----磁盘管理-----在相应的硬盘上执行导入和分配盘符**作
8. 在控制面板里显示全部组件:
把 Windows\inf 目录中的 sysoc.inf 文件里的 "hide" 替换掉。
9.禁用Internet Explorer Enhanced Security 和禁止安全询问框的出现
在IE工具选项中自定义设置IE的安全级别。在”安全“(Security)选项卡上拉动滚动条把Internet区域
安全设置为”中“(Medium)或“中低”。自定义设置中将有关的选择“提示”修改为选择“禁止”或“启用”。
10. 禁用开机 CTRL+ALT+DEL和实现自动登陆
★方法1:打开注册表(运行->“Regedit”),再打开:
HKEY_LOCAL_MACHIN|SOFTWARE|MicroSoft|Windows NT|CurrentVersion |Winlogon段,在此段中按右键,新建
二个字符串段,AutoAdminLogon=“1”,DefaultPassword=“为超级用户Administrator所设置的Password”。
注意,一定要为Administrator设置一个密码,否则不能实现自启动。 然后,重新启动Windows即可实现自动登录。
★方法2:管理工具 -> Local Security Settings(本地安全策略) -> 本地策略 -> 安全选项 ->
interactive logon: Do not require CTRL+ALT+DEL,启用之。
★方法3(自动登陆):使用Windows XP的Tweak UI来实现Server 2003自动登陆。
下载:Tweak UI http://www.ssite.org/uppic/sun_pic/...003/tweakui.exe
下载后直接执行tweakui.exe 在左边的面板中选择Logon -> Autologon -> 在右边勾选Log on automatically
at system startup输入你的用户名和域名(如果没有就不写),点击下面的Set Password,输入用户名的密码
,然后点击OK。
11.隐藏文件
Windows Server 2003默认情况下是显示所有的文件夹的,如果你不想这样,可以通过一下方法来隐藏:
打开任意一个文件夹,选择工具(Tools) -> 文件夹选项(Folder Options) -> 查看(View),
调整 显示系统文件夹的内容、隐藏受保护的**作系统文件、隐藏文件和文件夹 三项
12.允许内置的IMAPI CD-Burning服务和支持Windows影像设备服务
.允许内置的IMAPI CD-Burning服务和支持Windows影像设备服务
★假如你希望启用Windows内置的IMAPI CD-Burning服务。做如下xx作:
打开“开始”(Start) -> “运行”(Run),键入“Services.msc ”,在出现的窗口中找到
“IMAPI CD-Burning COM Service ”并双击它,然后在启动模式(startup type )的下拉菜单选择“自动”
(Automatic),并点击“应用”(Apply) ->“开始”(Start) -> “确定”(OK)
★假如你有如数码相机和扫描仪之类的影像设备,你应该打开Windows Image Acquisition 服务。
打开“开始”(Start) -> “运行”(Run),键入“Services.msc ”,在出现的窗口中找到
“Windows Image Acquisition (WIA) ”并双击它,然后在启动模式(startup type )的下拉
菜单选择“自动”(Automatic),并点击“应用”(Apply) ->“开始”(Start) -> “确定”(OK)
13.高级设置
★我们可以修改一些windows server 2003的高级设置以适合工作站的应用环境。
右键点击“我的电脑”(My Computer)--属性(Properties)--高级(Advanced)--性能(Performance)
--设置(Setting)--高级(Advanced),把“处理器计划”(Processor scheduling )和内存使用
(Memory usage)分配给“程序”(Programs)使用。然后点击“确定”(OK.)
★禁用错误报告
右键点击“我的电脑”(My Computer)--属性(Properties)--高级(Advanced)--点击“错误报告”
(Error Reporting )按钮,在出现的窗口中把“禁用错误报告”(Disable Error Reporting)选上并复选“
但在发生严重错误时通知我”(But, notify me when critical errors occur.)
★调整虚拟内存
一些朋友经常会对关机和注销缓慢感到束手无策,解决办法就是禁用虚拟内存,这样你的注销和关机时间可能
会加快很多。右键点击“我的电脑”(My Computer)--属性(Properties)--高级(Advanced)--性能
(Performance)--设置(Setting)--高级(Advanced),点击“虚拟内存”(Virtual memory)部分的
“更改”(Change),然后在出现的窗口选择“无分页文件”。重启系统即可。
14.加快启动和运行速度
★修改注册表,减少预读取,减少进度条等待时间:
开始→运行→regedit启动注册表编辑器,HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
Manager\Memory Management\PrefetchParameters, 有一个键值名为EnablePrefetcher,它的值是3,把它改为
“1”或“5”。找到 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control,
将 WaitToKillServiceTimeout 设为:1000或更小。 ( 原设定值:20000 )
找到 HKEY_CURRENT_USER\Control Panel\Desktop 键,将右边视窗的
WaitToKillAppTimeout 改为 1000, ( 原设定值:20000 )即关闭程序时仅等待1秒。
将 HungAppTimeout 值改为:200( 原设定值:5000 ), 表示程序出错时等待0.5秒。
★让系统自动关闭停止回应的程式。
打开注册表 HKEY_CURRENT_USER\Control Panel\Desktop 键,
将 AutoEndTasks 值设为 1。 ( 原设定值:0 )
★禁用系统服务QoS
开始菜单→运行→键入 gpedit.msc ,出现“组策略”窗口, 展开 "管理模板”→“网络” , 展开 "QoS 数
据包调度程序", 在右边窗右键单击“限制可保留带宽" ,在属性中的“设置”中有“限制可保留带宽" ,选
择“已禁用”,确定即可。当上述修改完成并应用后,用户在网络连接的属性对话框内的一般属性标签栏中如
果能够看到"QoS Packet Scheduler(QoS 数据包调度程序)"。说明修改成功,否则说明修改失败。
★改变窗口弹出的速度:
找到HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics子键分支,在右边的窗口中找到
MinAniMate键值,其类型为REG_SZ,默认情况下此健值的值为1,表示打开窗口显示的动画,把它改为0,则禁
止动画显示,接下来从开始菜单中选择“注销”命令,激活刚才所作的修改。
★禁止Windows XP的压缩功能:
点击“开始”下的“运行”,在“运行”输入框中输入“regsvr32/u zipfldr.dll”,然后按回车键即可。
★设置个性的启动信息或警告信息:
个性化的Windows XP启动:打开注册表编辑器,找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT
\CurrentVersion\Winlogon子键分支,双击LegalNoticeCaption健值,打开“编辑字符串”对话框,在“数
值数据”下的文本框中输入自己想要的信息标题,如“哥们儿,你好!”,然后点击“确定”,重新启动。
如果想要改变警告信息的话可以双击LegalNoticeText健值名称,在出现的“编辑字符串”窗口中输入想要显示
的警告信息,单击“确定”,重新启动。
15.安装Java VM
Windows server 2003没有集成MS Java VM或Sun Java VM,你可以自行下载并安装它。
16.安装DirectX 9a
在Windows Server 2003上安装DirectX 9a和在其他版本的Windows上安装DirectX 9a的方法是一样的。安装之前
必须先启用DirectX and Graphics Acceleration。
17.可用的杀毒软件和防火墙:
Symantec Norton Antivirus Corporate 9.0
Zone Alarm 3.7.159
Norton Personal Firewall 2003

作者: 久木    时间: 2005-4-7 20:42     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

轻松提高Win2003的运行速度
注册表是优化修改Windows的利器,Windows 2003也不例外。下面笔者就介绍如何利用注册表提高系统的运行速度。
   1.减少进度条读取时间
   进入“开始→运行”,输入“regedit”打开“注册表编辑器”,找到键值HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters\EnablePrefe tcher”,默认值是3,修改为1即可。
   2.利用预读改善开机速度
   如果使用PⅢ 800MHz CPU和512MB内存以上的配置,建议将上面的键值更改为4或5,以充分利用系统的预读功能,重新启动后,开机的速度可以得到改善。
   3.减少程序关闭前的等待奔?BR>   找到键值“HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\WaitToKillServiceTimeout”,将默认值20000修改为1000或更小(单位是毫秒);再找到键值“HKEY_CURRENT_USER\Control Panel\Desktop\WaitToKillAppTimeout”,将默认值20000修改为1000或更小(单位是毫秒),这样就可以大大减少关闭程序时的等待时间。
   4.减少程序出错时的等待时间
   找到键值“HKEY_CURRENT_USER\Control Panel\Desktop\HungAppTimeout”,将默认值5000修改为200(单位是毫秒),这样可以大幅减少程序出错时的等待时间。
   5.让系统自动关闭停止响应的程序
   找到“HKEY_CURRENT_USER\Control Panel\Desktop\ AutoEndTasks”,将默认值0修改为1即可。
   6.提高窗口弹出速度:
   找到“HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics\MinAniMate”,默认值为1,表示打开窗口时显示动画,只要将它修改为“0”就可以禁止动画显示,从而在很大程度上提高窗口弹出的速度。
   注意:在修改注册表之前,强烈建议先进行备份。

作者: syxxzhao    时间: 2005-4-8 00:43     标题: [分享]NT/2000服务器终极安全设置与效率优化指南

经典贴
好极“顶”
马上试试,





欢迎光临 黑色海岸线论坛 (http://bbs.thysea.com/) Powered by Discuz! 7.2