利用遠(yuǎn)程注冊(cè)表加強(qiáng)系統(tǒng)安全
遠(yuǎn)程訪問(wèn)機(jī)器的注冊(cè)表通常是令人皺眉的事情;畢竟,您想讓其他人在您不知道的情況下查看您的注冊(cè)表嗎?但是,如果正確處理的話,這個(gè)過(guò)程可以成為抽取機(jī)器信息和識(shí)別您網(wǎng)絡(luò)中潛在 漏洞的強(qiáng)大工具。在這里,Brian 運(yùn)用他在 WebSphere Business Integrator Team 中的工作經(jīng)驗(yàn),描述了遠(yuǎn)程注冊(cè)表訪問(wèn)如何允許您從多臺(tái)機(jī)器中抽取信息 — 并且識(shí)別那些易受攻擊的系統(tǒng)。本文還包括了代碼樣本。
在一個(gè)軟件開(kāi)發(fā)測(cè)試環(huán)境中,跟蹤機(jī)器被證明是非常困難的,尤其是當(dāng)機(jī)器的數(shù)量達(dá)到兩位數(shù)的時(shí)候。在哪臺(tái)機(jī)器上使用了什么軟件?使用的 NT 是什么版本?服務(wù)包(service pack)的級(jí)別是什么?安裝了什么修訂程序?您可以走到每臺(tái)機(jī)器前手工檢查核對(duì)所有這些問(wèn)題,但是當(dāng)機(jī)器分散在一個(gè)廣闊的區(qū)域內(nèi),這樣做會(huì)是一個(gè)非常費(fèi)時(shí)的過(guò)程。
在這樣的情形下,如果有一種方法,能夠不必實(shí)際使用某臺(tái)機(jī)器并且不安裝額外軟件,就可以獲取那臺(tái)機(jī)器的信息,那將是很有用的。然后,收集到的信息可以用來(lái)分配資源和識(shí)別那些可能易受惡意的用戶和程序攻擊的機(jī)器。本文描述了利用遠(yuǎn)程注冊(cè)表訪問(wèn)的某些方面。
警告:通過(guò)使用本文中描述的遠(yuǎn)程注冊(cè)表功能,您能節(jié)省系統(tǒng)管理的大量時(shí)間。但是仍要小心,因?yàn)榫庉嬃硪粋€(gè)系統(tǒng)的注冊(cè)表會(huì)與編輯您自己的注冊(cè)表一樣危險(xiǎn)(如果不比編輯您自己的更危險(xiǎn)的話)。
利用安裝功能
在這里的 WebSphere Business Integrator(WSBI)測(cè)試環(huán)境中,我們有大約 40 臺(tái)測(cè)試機(jī)器,它們的地理位置分散在整個(gè)英國(guó) Hursley 實(shí)驗(yàn)室中。在最初的測(cè)試階段期間,我們的注意力主要集中于 WSBI 的安裝和配置。在測(cè)試機(jī)器上不斷地安裝和重新安裝各種產(chǎn)品以及服務(wù)包和必備軟件 — 通常必須重新安裝整個(gè)操作系統(tǒng)。很快,我們發(fā)現(xiàn)要監(jiān)視每臺(tái)測(cè)試機(jī)器狀態(tài)幾乎是不可能的。我們需要一種方法,它可以在不必訪問(wèn)每臺(tái)機(jī)器的情況下,快速知道該機(jī)器所處的狀態(tài)。
在 WSBI 安裝中,我們要在單一安裝封裝器中安裝并配置了大約 15 個(gè) IBM 產(chǎn)品 — 例如 DB2 V7.2、MQSeries V5.2、HTTP Server V1.3.12。正如對(duì)于所有好的安裝程序,在任何安裝開(kāi)始之前,都要檢查目標(biāo)機(jī)器以確保它滿足要安裝的軟件的前提條件 — 例如服務(wù)包級(jí)別和相關(guān)產(chǎn)品。這個(gè)檢查通常在 InstallShield 腳本中由編寫注冊(cè)表腳本檢查相關(guān)值來(lái)完成的。
例如,一種最常見(jiàn)的檢查就是驗(yàn)證 NT 服務(wù)包級(jí)別。鍵 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 下的注冊(cè)表項(xiàng),它們會(huì)出現(xiàn)在 Regedit.exe 中。
當(dāng)在腳本中查詢一個(gè)注冊(cè)表項(xiàng)時(shí),需要知道三樣?xùn)|西:
要查詢的鍵名稱 — 本例中,是 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 鍵中值的名稱,這里是“CSDVersion”
正在查詢的值類型,這里是一個(gè)字符串值
使用 InstallShield 腳本函數(shù) RegDBGetKeyValueEx 來(lái)執(zhí)行注冊(cè)表查詢。但是假設(shè)您想要檢查安裝了什么級(jí)別的服務(wù)包。清單 1 顯示可以如何達(dá)到這一點(diǎn)。
清單1. 抽取服務(wù)包級(jí)別
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”并把它存儲(chǔ)在 svServicePackVersion 中。然后,您可以知道這臺(tái)機(jī)器上安裝了 Service Pack 6。通過(guò)執(zhí)行類似這樣的各種查詢,可能確定一臺(tái)機(jī)器的配置以及在它上面安裝了什么軟件。
當(dāng)我們意識(shí)到可以對(duì)遠(yuǎn)程機(jī)器的注冊(cè)表執(zhí)行這些查詢時(shí),我們的實(shí)驗(yàn)室工作取得了突破性的進(jìn)展。
連接到遠(yuǎn)程注冊(cè)表
要通過(guò)腳本訪問(wèn)遠(yuǎn)程機(jī)器上的注冊(cè)表,需要遠(yuǎn)程機(jī)器上的管理員特權(quán)。我們發(fā)現(xiàn)當(dāng)運(yùn)行我們的腳本時(shí),擁有在遠(yuǎn)程機(jī)器上具有管理員特權(quán)的一個(gè)用戶帳戶并使用這個(gè)用戶名和密碼登錄到腳本正在運(yùn)行的這臺(tái)機(jī)器是一個(gè)難題。
假設(shè)在我們的 WSBI 測(cè)試環(huán)境中,有三臺(tái)測(cè)試機(jī)器,使用第四臺(tái)作為審計(jì)機(jī)器。在每臺(tái)測(cè)試機(jī)器上,我們都需要添加一個(gè)用戶帳戶并賦予它管理員特權(quán);我們將用戶名命名為“auditor”并賦予它密碼“angelus”。這是每臺(tái)機(jī)器上需要手工執(zhí)行的唯一操作。每臺(tái)測(cè)試機(jī)器上的這些帳戶現(xiàn)在都允許我們通過(guò)審計(jì)機(jī)器上運(yùn)行的腳本來(lái)訪問(wèn)每臺(tái)機(jī)器的注冊(cè)表。
現(xiàn)在假設(shè)我們用剛才創(chuàng)建的帳戶(用戶名“auditor”,密碼“angelus”)登錄到 AuditMachine。下一步是重新運(yùn)行清單 1 上的腳本,但是這次不檢查本地注冊(cè)表,而是想知道機(jī)器“Gunn”的服務(wù)包級(jí)別,所以我們需要連接到它的注冊(cè)表上。要做到這一點(diǎn),我們使用命令 RegDBConnectRegistry。這個(gè)功能創(chuàng)建到遠(yuǎn)程注冊(cè)表的連接。要連接到 Gunn,該命令類似于:
RegDBConnectRegistry ("Gunn" , HKEY_LOCAL_MACHINE, 0 );
把它放置在腳本中,那么我們就得到:
清單2. 遠(yuǎn)程抽取機(jī)器 Gunn 的服務(wù)包級(jí)別
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;
如果一切順利的話,我們現(xiàn)在就能訪問(wèn) Gunn 的注冊(cè)表并抽取服務(wù)包級(jí)別。
接下來(lái),通過(guò)在 RegBConnectRegistry 命令中用表示其它兩臺(tái)機(jī)器的相應(yīng)的名稱替代“Gunn”,然后運(yùn)行相同的過(guò)程;我們就可以抽取這兩臺(tái)機(jī)器的服務(wù)包級(jí)別。
我們注意到,三次重復(fù)輸入相同的代碼效率很低,因此可以使用循環(huán)機(jī)制來(lái)輪流查詢每臺(tái)機(jī)器的注冊(cè)表。需要輸入的全部信息是每臺(tái)機(jī)器的名稱。這可以通過(guò)創(chuàng)建一個(gè)文本文件來(lái)完成,該文件中,每一行包含一個(gè)機(jī)器的名稱。因此,假設(shè)我們已經(jīng)創(chuàng)建了一個(gè)名為 machineList.txt 的文本文件,其中輸入了我們希望查詢的三臺(tái)機(jī)器的名稱,并將它保存在 C 盤的根目錄下。現(xiàn)在我們可以進(jìn)一步修改腳本以把這些機(jī)器名讀取到一個(gè)列表結(jié)構(gòu)中,并輪流連接到每臺(tái)機(jī)器的注冊(cè)表。
清單 3. 從多臺(tái)機(jī)器中抽取服務(wù)包級(jí)別
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 文件中讀入一個(gè)機(jī)器名,連接到它的注冊(cè)表,進(jìn)行查詢,然后繼續(xù)移到在文本文件中命名的下一臺(tái)機(jī)器。使用這種方法的優(yōu)點(diǎn)是通過(guò)簡(jiǎn)單編輯 machineList.txt 文件中的名稱,我們能非常容易地在審計(jì)過(guò)程中添加和除去機(jī)器。
輸出信息
到現(xiàn)在為止,您可能已經(jīng)注意到當(dāng)我們執(zhí)行這些查詢時(shí),還沒(méi)有產(chǎn)生任何輸出。所以,現(xiàn)在我們來(lái)討論確定表示輸出結(jié)果的最好方法。我們團(tuán)隊(duì)決定把輸出格式化為 XML 文件,因?yàn)檫@樣使我們可以瀏覽檢索到的信息,并且允許我們可能開(kāi)發(fā)的任何其它應(yīng)用程序利用這些數(shù)據(jù)。清單4 顯示了用適當(dāng)命名的標(biāo)記生成的 XML 文件。
清單4. 從多臺(tái)機(jī)器中抽取服務(wù)包級(jí)別并輸出到 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; 如果我們?cè)?AuditMachine 上運(yùn)行清單4(假設(shè)我們使 machineList.txt 包含我們的目標(biāo)機(jī)器的名稱),并且我們的審計(jì)帳戶設(shè)置正確,那么我們將生成一個(gè)名為 Audit.xml 的輸出文件。然后,我們可以瀏覽這個(gè)文件并查看每臺(tái)機(jī)器上的服務(wù)包級(jí)別是什么。
在我們的示例中,通過(guò)從三臺(tái)機(jī)器中抽取單段信息,我們執(zhí)行了一個(gè)很小的審計(jì)。理論上,以這種方式能從多少臺(tái)機(jī)器抽取信息或者抽取多少信息并沒(méi)有限制。在這里的 WSBI 測(cè)試中,目前我們每次審計(jì)大約 40 臺(tái)機(jī)器。使用這里描述的技術(shù),我們當(dāng)前的審計(jì)系統(tǒng)能確定:
機(jī)器運(yùn)行的是 NT 還是 2000
是否應(yīng)用了服務(wù)包
安裝了什么修訂程序
是否安裝了 Norton Anti-Virus
安裝了哪些 IBM 產(chǎn)品以及是什么級(jí)別
對(duì)于每次審計(jì),涉及的原理與我們示例中的完全相同:
讀入機(jī)器名或者 IP 地址的列表
輪流連接到每臺(tái)機(jī)器的遠(yuǎn)程注冊(cè)表
從每臺(tái)機(jī)器的注冊(cè)表中抽取信息
這里顯示了對(duì)一臺(tái)機(jī)器進(jìn)行完整審計(jì)的示例。
收集在 XML 文件的單一資源庫(kù)中的這些信息讓我們極其清晰地了解了我們的測(cè)試環(huán)境,并且使我們可以更有效地管理硬件資源。 進(jìn)一步擴(kuò)展原理
到目前為止,我們只查詢了遠(yuǎn)程機(jī)器的注冊(cè)表。但是,它并不僅限于查詢。還有可能編輯遠(yuǎn)程機(jī)器的注冊(cè)表。
回到我們的示例,假設(shè)那些機(jī)器位于三個(gè)不同的房間 — Gunn 在“The War Room”、Wesley 在“The Test Cell”、Cordelia 在“Room 101”。如果我們可以引入使 XML 文件中包含機(jī)器位置的一些方法,那么這會(huì)使我們的審計(jì)方便些。一種解決方案是在注冊(cè)表中放置一個(gè)額外鍵表示機(jī)器的位置。使用 regedit.exe,在鍵 HKEY_LOCAL_MACHINE\SOFTWARE\IBM\MachineLocation 下,我們創(chuàng)建了一個(gè)名為“location”的新字符串值。
但是如果有很多機(jī)器的話,那么遍歷每臺(tái)機(jī)器并且手工創(chuàng)建每個(gè)位置鍵就不很理想了。比較好的方法是將值遠(yuǎn)程地插入到每臺(tái)機(jī)器中。執(zhí)行的方法與檢索注冊(cè)表值的方法是完全相同的。首先,連接到遠(yuǎn)程注冊(cè)表:
RegDBConnectRegistry ("Gunn" , HKEY_LOCAL_MACHINE, 0 );
接著,設(shè)置注冊(cè)表值:
svKey = ";SOFTWARE\\IBM\\MachineLocation";;
svName = ";Location";;
nvType = REGDB_STRING;
svLocation = ";The War Room";
最后,執(zhí)行注冊(cè)表操作。這次,我們使用 RegDBSetKeyValueEx,它設(shè)置注冊(cè)表值(正如它的名字所表示的)。
RegDBSetKeyValueEx (svKey, svName, nvType, svLocation, nvSize);
然后,審計(jì)過(guò)程就可以查詢這個(gè)鍵了。也可以用這種方法更新甚至刪除注冊(cè)表鍵,雖然從遠(yuǎn)程注冊(cè)表刪除鍵是非常危險(xiǎn)的。
優(yōu)點(diǎn)
這種方法的審計(jì)的主要優(yōu)點(diǎn)是:
它除去了在測(cè)試機(jī)器上安裝任何第三方軟件的需求,因此也除去了由此產(chǎn)生的潛在干擾;需要做的全部操作就是在每臺(tái)機(jī)器上創(chuàng)建一個(gè)用戶帳戶。
可以通過(guò)在腳本中修改那些您想要查詢的注冊(cè)表鍵以及要審計(jì)的機(jī)器,非常容易地調(diào)整您的審計(jì)過(guò)程。
這個(gè)審計(jì)過(guò)程不會(huì)以任何方式干擾正在被審計(jì)的機(jī)器上執(zhí)行的操作。那臺(tái)機(jī)器的用戶完全不知道審計(jì)的發(fā)生。5 秒內(nèi)就可生成本文前面包含的完整的審計(jì) XML 文件。 提高安全性
惡意的用戶
要弄壞一臺(tái)機(jī)器,沒(méi)有比通過(guò)對(duì)注冊(cè)表胡亂更改里面的內(nèi)容更好的方法了,因此惡意的用戶遠(yuǎn)程地訪問(wèn)您的注冊(cè)表將會(huì)是一大災(zāi)難。然而,由于我們之前設(shè)置的遠(yuǎn)程-注冊(cè)表帳戶是管理員用戶,所以我們只要通過(guò)執(zhí)行以下這些步驟,就能將遠(yuǎn)程注冊(cè)表訪問(wèn)權(quán)限限制為管理員。
運(yùn)行 Regedt32.exe。
打開(kāi)以下 注冊(cè)表鍵:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurePipeServers\WinReg。
單擊 WinReg 鍵,然后在“安全(Security)”下拉菜單中選擇“權(quán)限(Permissions)”。 確保在框中只出現(xiàn)具有完全控制的管理員。 要完全限制所有的遠(yuǎn)程-注冊(cè)表訪問(wèn),從框中除去所有名稱。
惡意的程序:識(shí)別易受攻擊的機(jī)器
惡意的程序進(jìn)入系統(tǒng)的主要方法是利用操作系統(tǒng)的安全性漏洞。我們都知道近期“紅色代碼(Code Red)”和類似的病毒已經(jīng)引出了許多問(wèn)題。堵住這些漏洞的補(bǔ)丁程序通常在那些利用漏洞的病毒猖獗運(yùn)行之前的幾個(gè)月就可獲得,但是在一個(gè)多機(jī)器的環(huán)境中,您如何能識(shí)別哪些機(jī)器易受攻擊呢?補(bǔ)丁程序或者修訂程序的安裝總是在注冊(cè)表中留下痕跡。打開(kāi) Regedit 并瀏覽到鍵 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Hotfix,列出了當(dāng)前已安裝的所有修訂程序。例如,防止“紅色代碼”病毒的補(bǔ)丁程序稱為 Q300972。在一臺(tái)安裝了這個(gè)修訂的機(jī)器上,在上面顯示的鍵下,會(huì)有一個(gè)稱為 Q300972 的鍵。因此,利用這里所描述的技術(shù),通過(guò)在審計(jì)期間查找這個(gè)鍵,我們能識(shí)別沒(méi)有安裝補(bǔ)丁程序的任何機(jī)器,并且相應(yīng)地對(duì)它們進(jìn)行處理。
反病毒軟件是任何安全性實(shí)現(xiàn)的一個(gè)必需部分,但是有些機(jī)器可能沒(méi)有安裝反病毒軟件,或者軟件可能過(guò)時(shí)了,從而使它們門戶大開(kāi)易受攻擊。遠(yuǎn)程注冊(cè)表調(diào)用可以用來(lái)找到這些機(jī)器。
安裝任何一種反病毒軟件都會(huì)在注冊(cè)表中留下一些蹤跡,假設(shè)在我們的系統(tǒng)上,在安裝了反病毒軟件后,它在注冊(cè)表中留下了下列蹤跡:
然后,審計(jì)可以尋找這些值以便識(shí)別那些沒(méi)有安裝反病毒軟件或者殺毒軟件需要更新的機(jī)器。
如果您查看前面提供的審計(jì)示例,就會(huì)注意到執(zhí)行了兩個(gè)這種性質(zhì)的檢查。我們的審計(jì)檢查了“紅色代碼”修訂是否存在,檢查了反病毒軟件并且抽取出它的版本。
結(jié)束語(yǔ)
本文描述了在小心正確地使用遠(yuǎn)程注冊(cè)表訪問(wèn)時(shí),它是如何成為一個(gè)有價(jià)值的工具,用來(lái)抽取有關(guān)多臺(tái)機(jī)器的信息以及識(shí)別易受攻擊的機(jī)器。您可以使用本文中的示例作為創(chuàng)建您自己的相關(guān)變體的一個(gè)起點(diǎn)。通過(guò)使用它和包含的源代碼,您應(yīng)該發(fā)現(xiàn)在您自己的環(huán)境中實(shí)現(xiàn)遠(yuǎn)程注冊(cè)表工具是非常簡(jiǎn)單的。
(出處:瑞星反病毒資訊網(wǎng))
相關(guān)文章
修改注冊(cè)表權(quán)限加強(qiáng)對(duì)木馬、病毒的防范
修改注冊(cè)表權(quán)限加強(qiáng)對(duì)木馬、病毒的防范...2006-10-10阻止對(duì)Windows注冊(cè)表的遠(yuǎn)程訪問(wèn)
阻止對(duì)Windows注冊(cè)表的遠(yuǎn)程訪問(wèn)...2006-10-10巧改注冊(cè)表解決WinXP不能發(fā)郵件問(wèn)題
巧改注冊(cè)表解決WinXP不能發(fā)郵件問(wèn)題...2006-10-10我教你學(xué)之注冊(cè)表系統(tǒng)外觀修改實(shí)例(三)
我教你學(xué)之注冊(cè)表系統(tǒng)外觀修改實(shí)例(三)...2006-10-10巧用注冊(cè)表輕松修改Win 2k/XP的默認(rèn)刷新率
巧用注冊(cè)表輕松修改Win 2k/XP的默認(rèn)刷新率...2006-10-10