遠程訪問機器的注冊表通常是令人皺眉的事情;畢竟,您想讓其他人在您不知道的情況下查看您的注冊表嗎?但是,如果正確處理的話,這個過程可以成為抽取機器信息和識別您網絡中潛在 漏洞的強大工具。在這里,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。通過執行類似這樣的各種查詢,可能確定一臺機器的配置以及在它上面安裝了什么軟件。
當我們意識到可以對遠程機器的注冊表執行這些查詢時,我們的實驗室工作取得了突破性的進展。
連接到遠程注冊表
要通過腳本訪問遠程機器上的注冊表,需要遠程機器上的管理員特權。我們發現當運行我們的腳本時,擁有在遠程機器上具有管理員特權的一個用戶帳戶并使用這個用戶名和密碼登錄到腳本正在運行的這臺機器是一個難題。
假設在我們的 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;
RegDBGetKeyValueEx (szKey, szName, nvType, svServicePackVersion, nvSize);
end;
如果一切順利的話,我們現在就能訪問 Gunn 的注冊表并抽取服務包級別。
接下來,通過在 RegBConnectRegistry 命令中用表示其它兩臺機器的相應的名稱替代“Gunn”,然后運行相同的過程;我們就可以抽取這兩臺機器的服務包級別。
我們注意到,三次重復輸入相同的代碼效率很低,因此可以使用循環機制來輪流查詢每臺機器的注冊表。需要輸入的全部信息是每臺機器的名稱。這可以通過創建一個文本文件來完成,該文件中,每一行包含一個機器的名稱。因此,假設我們已經創建了一個名為 machineList.txt 的文本文件,其中輸入了我們希望查詢的三臺機器的名稱,并將它保存在 C 盤的根目錄下?,F在我們可以進一步修改腳本以把這些機器名讀取到一個列表結構中,并輪流連接到每臺機器的注冊表。
清單 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;
以上代碼將從 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;";);
nResult = ListGetNextString (listMachines, svMachineName);
endwhile;
WriteLine(nvFileHandle, ";<;/audits&;gt;";);
CloseFile(nvFileHandle)
end;如果我們在 AuditMachine 上運行清單4(假設我們使 machineList.txt 包含我們的目標機器的名稱),并且我們的審計帳戶設置正確,那么我們將生成一個名為 Audit.xml 的輸出文件。然后,我們可以瀏覽這個文件并查看每臺機器上的服務包級別是什么。
在我們的示例中,通過從三臺機器中抽取單段信息,我們執行了一個很小的審計。理論上,以這種方式能從多少臺機器抽取信息或者抽取多少信息并沒有限制。在這里的 WSBI 測試中,目前我們每次審計大約 40 臺機器。使用這里描述的技術,我們當前的審計系統能確定:
機器運行的是 NT 還是 2000
是否應用了服務包
安裝了什么修訂程序
是否安裝了 Norton Anti-Virus
安裝了哪些 IBM 產品以及是什么級別
對于每次審計,涉及的原理與我們示例中的完全相同:
讀入機器名或者 IP 地址的列表
輪流連接到每臺機器的遠程注冊表
從每臺機器的注冊表中抽取信息
這里顯示了對一臺機器進行完整審計的示例。
收集在 XML 文件的單一資源庫中的這些信息讓我們極其清晰地了解了我們的測試環境,并且使我們可以更有效地管理硬件資源。進一步擴展原理
到目前為止,我們只查詢了遠程機器的注冊表。但是,它并不僅限于查詢。還有可能編輯遠程機器的注冊表。
回到我們的示例,假設那些機器位于三個不同的房間 ― Gunn 在“The War Room”、Wesley 在“The Test Cell”、Cordelia 在“Room 101”。如果我們可以引入使 XML 文件中包含機器位置的一些方法,那么這會使我們的審計方便些。一種解決方案是在注冊表中放置一個額外鍵表示機器的位置。使用 regedit.exe,在鍵 HKEY_LOCAL_MACHINE/SOFTWARE/IBM/MachineLocation 下,我們創建了一個名為“location”的新字符串值。
但是如果有很多機器的話,那么遍歷每臺機器并且手工創建每個位置鍵就不很理想了。比較好的方法是將值遠程地插入到每臺機器中。執行的方法與檢索注冊表值的方法是完全相同的。首先,連接到遠程注冊表:
RegDBConnectRegistry ("Gunn" , HKEY_LOCAL_MACHINE, 0 );
接著,設置注冊表值:
svKey = ";SOFTWARE//IBM//MachineLocation";;
svName = ";Location";;
nvType = REGDB_STRING;
svLocation = ";The War Room";
最后,執行注冊表操作。這次,我們使用 RegDBSetKeyValueEx,它設置注冊表值(正如它的名字所表示的)。
RegDBSetKeyValueEx (svKey, svName, nvType, svLocation, nvSize);
然后,審計過程就可以查詢這個鍵了。也可以用這種方法更新甚至刪除注冊表鍵,雖然從遠程注冊表刪除鍵是非常危險的。
優點
這種方法的審計的主要優點是:
它除去了在測試機器上安裝任何第三方軟件的需求,因此也除去了由此產生的潛在干擾;需要做的全部操作就是在每臺機器上創建一個用戶帳戶。
可以通過在腳本中修改那些您想要查詢的注冊表鍵以及要審計的機器,非常容易地調整您的審計過程。
這個審計過程不會以任何方式干擾正在被審計的機器上執行的操作。那臺機器的用戶完全不知道審計的發生。5 秒內就可生成本文前面包含的完整的審計 XML 文件。提高安全性
惡意的用戶
要弄壞一臺機器,沒有比通過對注冊表胡亂更改里面的內容更好的方法了,因此惡意的用戶遠程地訪問您的注冊表將會是一大災難。然而,由于我們之前設置的遠程-注冊表帳戶是管理員用戶,所以我們只要通過執行以下這些步驟,就能將遠程注冊表訪問權限限制為管理員。
運行 Regedt32.exe。
打開以下注冊表鍵:
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Control/SecurePipeServers/WinReg。
單擊 WinReg 鍵,然后在“安全(Security)”下拉菜單中選擇“權限(Permissions)”。 確保在框中只出現具有完全控制的管理員。 要完全限制所有的遠程-注冊表訪問,從框中除去所有名稱。
惡意的程序:識別易受攻擊的機器
惡意的程序進入系統的主要方法是利用操作系統的安全性漏洞。我們都知道近期“紅色代碼(Code Red)”和類似的病毒已經引出了許多問題。堵住這些漏洞的補丁程序通常在那些利用漏洞的病毒猖獗運行之前的幾個月就可獲得,但是在一個多機器的環境中,您如何能識別哪些機器易受攻擊呢?補丁程序或者修訂程序的安裝總是在注冊表中留下痕跡。打開 Regedit 并瀏覽到鍵 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Hotfix,列出了當前已安裝的所有修訂程序。例如,防止“紅色代碼”病毒的補丁程序稱為 Q300972。在一臺安裝了這個修訂的機器上,在上面顯示的鍵下,會有一個稱為 Q300972 的鍵。因此,利用這里所描述的技術,通過在審計期間查找這個鍵,我們能識別沒有安裝補丁程序的任何機器,并且相應地對它們進行處理。
反病毒軟件是任何安全性實現的一個必需部分,但是有些機器可能沒有安裝反病毒軟件,或者軟件可能過時了,從而使它們門戶大開易受攻擊。遠程注冊表調用可以用來找到這些機器。
安裝任何一種反病毒軟件都會在注冊表中留下一些蹤跡,假設在我們的系統上,在安裝了反病毒軟件后,它在注冊表中留下了下列蹤跡:
然后,審計可以尋找這些值以便識別那些沒有安裝反病毒軟件或者殺毒軟件需要更新的機器。
如果您查看前面提供的審計示例,就會注意到執行了兩個這種性質的檢查。我們的審計檢查了“紅色代碼”修訂是否存在,檢查了反病毒軟件并且抽取出它的版本。
結束語
本文描述了在小心正確地使用遠程注冊表訪問時,它是如何成為一個有價值的工具,用來抽取有關多臺機器的信息以及識別易受攻擊的機器。您可以使用本文中的示例作為創建您自己的相關變體的一個起點。通過使用它和包含的源代碼,您應該發現在您自己的環境中實現遠程注冊表工具是非常簡單的。
(出處:瑞星反病毒資訊網)