当前位置:操作系统 > IE/注册表 >>

利用远程注册表加强系统安全

远程访问机器的注册表通常是令人皱眉的事情;毕竟,您想让其他人在您不知道的情况下查看您的注册表吗?但是,如果正确处理的话,这个过程可以成为抽取机器信息和识别您网络中潜在 漏洞的强大工具。在这里,Brian 运用他在 WebSphere Business Integrator Team 中的工作经验,描述了远程注册表访问如何允许您从多台机器中抽取信息 — 并且识别那些易受攻击的系统。本文还包括了代码样本。

  在一个软件开发测试环境中,跟踪机器被证明是非常困难的,尤其是当机器的数量达到两位数的时候。在哪台机器上使用了什么软件?使用的 NT 是什么版本?服务包(service pack)的级别是什么?安装了什么修订程序?您可以走到每台机器前手工检查核对所有这些问题,但是当机器分散在一个广阔的区域内,这样做会是一个非常费时的过程。

  在这样的情形下,如果有一种方法,能够不必实际使用某台机器并且不安装额外软件,就可以获取那台机器的信息,那将是很有用的。然后,收集到的信息可以用来分配资源和识别那些可能易受恶意的用户和程序攻击的机器。本文描述了利用远程注册表访问的某些方面。
  
  警告:通过使用本文中描述的远程注册表功能,您能节省系统管理的大量时间。但是仍要小心,因为编辑另一个系统的注册表会与编辑您自己的注册表一样危险(如果不比编辑您自己的更危险的话)。

  利用安装功能

  在这里的 WebSphere Business Integrator(WSBI)测试环境中,我们有大约 40 台测试机器,它们的地理位置分散在整个英国 Hursley 实验室中。在最初的测试阶段期间,我们的注意力主要集中于 WSBI 的安装和配置。在测试机器上不断地安装和重新安装各种产品以及服务包和必备软件 — 通常必须重新安装整个操作系统。很快,我们发现要监视每台测试机器状态几乎是不可能的。我们需要一种方法,它可以在不必访问每台机器的情况下,快速知道该机器所处的状态。


  在 WSBI 安装中,我们要在单一安装封装器中安装并配置了大约 15 个 IBM 产品 — 例如 DB2 V7.2、MQSeries V5.2、HTTP Server V1.3.12。正如对于所有好的安装程序,在任何安装开始之前,都要检查目标机器以确保它满足要安装的软件的前提条件 — 例如服务包级别和相关产品。这个检查通常在 InstallShield 脚本中由编写注册表脚本检查相关值来完成的。

  例如,一种最常见的检查就是验证 NT 服务包级别。键 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的注册表项,它们会出现在 Regedit.exe 中。

  当在脚本中查询一个注册表项时,需要知道三样东西:

  要查询的键名称 — 本例中,是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 键中值的名称,这里是“CSDVersion”
正在查询的值类型,这里是一个字符串值
  
  使用 InstallShield 脚本函数 RegDBGetKeyValueEx 来执行注册表查询。但是假设您想要检查安装了什么级别的服务包。清单 1 显示可以如何达到这一点。

  清单1. 抽取服务包级别

STRING szKey, szName, svServicePackVersion;
NUMBER nvType, nvSize;
begin
svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";;
svName = ";CSDVersion";;
nvType = REGDB_STRING;
RegDBGetKeyValueEx (szKey, szName, nvType, svServicePackVersion, nvSize);
end;


清单1 将返回值“Service Pack 6”并把它存储在 svServicePackVersion 中。然后,您可以知道这台机器上安装了 Service Pack 6。通过执行类似这样的各种查询,可能确定一台机器的配置以及在它上面安装了什么软件。


   本篇文章共5页,此页为首页   下一页




  当我们意识到可以对远程机器的注册表执行这些查询时,我们的实验室工作取得了突破性的进展。

  连接到远程注册表

  要通过脚本访问远程机器上的注册表,需要远程机器上的管理员特权。我们发现当运行我们的脚本时,拥有在远程机器上具有管理员特权的一个用户帐户并使用这个用户名和密码登录到脚本正在运行的这台机器是一个难题。

  假设在我们的 WSBI 测试环境中,有三台测试机器,使用第四台作为审计机器。在每台测试机器上,我们都需要添加一个用户帐户并赋予它管理员特权;我们将用户名命名为“auditor”并赋予它密码“angelus”。这是每台机器上需要手工执行的唯一操作。每台测试机器上的这些帐户现在都允许我们通过审计机器上运行的脚本来访问每台机器的注册表。

  现在假设我们用刚才创建的帐户(用户名“auditor”,密码“angelus”)登录到 AuditMachine。下一步是重新运行清单 1 上的脚本,但是这次不检查本地注册表,而是想知道机器“Gunn”的服务包级别,所以我们需要连接到它的注册表上。要做到这一点,我们使用命令 RegDBConnectRegistry。这个功能创建到远程注册表的连接。要连接到 Gunn,该命令类似于:

  RegDBConnectRegistry ("Gunn" , HKEY_LOCAL_MACHINE, 0 );

  把它放置在脚本中,那么我们就得到:

  清单2. 远程抽取机器 Gunn 的服务包级别

begin
RegDBConnectRegistry (";Gunn"; , HKEY_LOCAL_MACHINE, 0 );
svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";;
svName = ";CSDVersion";;
nvType = REGDB_STRING;
计算机教程利用远程注册表加强系统安全来自www.itwen.comIT WEN计算机教程网

RegDBGetKeyValueEx (szKey, szName, nvType, svServicePackVersion, nvSize);
end;


  如果一切顺利的话,我们现在就能访问 Gunn 的注册表并抽取服务包级别。

  接下来,通过在 RegBConnectRegistry 命令中用表示其它两台机器的相应的名称替代“Gunn”,然后运行相同的过程;我们就可以抽取这两台机器的服务包级别。

  我们注意到,三次重复输入相同的代码效率很低,因此可以使用循环机制来轮流查询每台机器的注册表。需要输入的全部信息是每台机器的名称。这可以通过创建一个文本文件来完成,该文件中,每一行包含一个机器的名称。因此,假设我们已经创建了一个名为 machineList.txt 的文本文件,其中输入了我们希望查询的三台机器的名称,并将它保存在 C 盘的根目录下。现在我们可以进一步修改脚本以把这些机器名读取到一个列表结构中,并轮流连接到每台机器的注册表。
清单 3. 从多台机器中抽取服务包级别

begin
listMachines = ListCreate(STRINGLIST);
ListReadFromFile (listMachines, ";c:\\machineList.txt";);
nResult = ListGetFirstString (listMachines, svMachineName);
while (nResult != END_OF_LIST)
RegDBConnectRegistry (svMachineName , HKEY_LOCAL_MACHINE, 0 );
svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";;
svName = ";CurrentVersion";;
nvType = REGDB_STRING;
RegDBGetKeyValueEx (svKey, svName, nvType, svServicePackVersion, nvSize);
nResult = ListGetNextString (listMachines, svMachineName);
endwhile;
end;


   本篇文章共5页,此页为第2 页   上一页   下一页


  



  以上代码将从 machineList.txt 文件中读入一个机器名,连接到它的注册表,进行查询,然后继续移到在文本文件中命名的下一台机器。使用这种方法的优点是通过简单编辑 machineList.txt 文件中的名称,我们能非常容易地在审计过程中添加和除去机器。

  输出信息

  到现在为止,您可能已经注意到当我们执行这些查询时,还没有产生任何输出。所以,现在我们来讨论确定表示输出结果的最好方法。我们团队决定把输出格式化为 XML 文件,因为这样使我们可以浏览检索到的信息,并且允许我们可能开发的任何其它应用程序利用这些数据。清单4 显示了用适当命名的标记生成的 XML 文件。

  清单4. 从多台机器中抽取服务包级别并输出到 XML 文件

; begin
CreateFile (nvFileHandle, ";C:\";, ";Audit.xml";);
WriteLine(nvFileHandle, ";<;?xml version=";1.0";?>;";);
WriteLine(nvFileHandle, ";<;audits&;gt;";);
listMachines = ListCreate(STRINGLIST);
ListReadFromFile (listMachines, ";c:\machineList.txt";);
nResult = ListGetFirstString (listMachines, svMachineName);

while (nResult != END_OF_LIST)
RegDBConnectRegistry (svMachineName , HKEY_LOCAL_MACHINE, 0 );
svKey = ";SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion";;

svName = ";CurrentVersion";;
nvType = REGDB_STRING;
RegDBGetKeyValueEx (svKey, svName, nvType, svServicePackVersion, nvSize);
WriteLine(nvFileHandle, ";<;MachineName&;gt;";);
WriteLine(nvFileHandle, ";<;ServicePack&;gt;"; + svCSDVersion+ ";<;/ServicePack&;gt;";
WriteLine(nvFileHandle, ";<;/MachineName&;gt;";);

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,