你會建立c:\con.txt嗎?--windows檔案系統漏洞
唉,寫完了前面的廢話頭都昏了,有錯誤及時告訴我哦。
----------------------------
如果你在想con.txt不是很正常嗎?那好,你先去建立下,只要帶有獨立的con字樣的檔案就好,然後悟出什麼了再看這篇文章(如果你用linux或者mac或者unix那就算了)。
呵呵,正常來說帶有con、prn、com1這樣字眼的檔案或目錄是不能建立的(原因自己找),但我想到了以前在安全焦點的一篇文章,是教你建立帶"\"的檔案夾的。當時的方法是用控制台命令(如果你叫dos命令那是不標準的)mkdir csk..\這樣的文法建立的。看來這是windows一個檔案系統的漏洞了,沒錯……
我後來就在想其中的原理,可能你會發現像上面的csk..\在建立後是csk.,而他實際被windows解釋為訪問mkdir csk.\的目錄。看來有字元在建立時被略去了。而一次偶然機會我發現mkdir C:\con\是成功的,在c下面出現了c:\con檔案夾,而且刪不掉……呵呵,有一個bug……
我這時突然想到了可能的原因:首先建立目錄時肯定要驗證正確性,而像這種C:\dir\肯定是先將\符號略去了,但後面的內容呢?看來windows似乎不去檢查了……否則mkdir c:\con\就應該失敗了,而mkdir c:\con肯定是無效的。
所以我在想是否建立的檔案也能利用這個漏洞奪過windows檔案系統的一些檢查呢?正如你看到的,我成功了^-^
呵呵,這可不是畫出來的哦,是貨真價實的con.txt。其實原理和我上面的猜測差不多,但由於時間有限,我的分析不一定正確,下面給出具體破解過程:
2005.8.1:23:00
首先我要知道mkdir造成漏洞的原因,於是拿出ollydbg去調試cmd.exe(mkdir是內部命令嘛,不知他找誰?)。接著對KERNEL32.CreateDirectoryW設斷點,果然在輸入了mkdir c:\con\後中斷了。自然單步跟入CreateDirectoryW:
----------------------------------------------------------------
7C81E97F 50 push eax
7C81E980 57 push edi
7C81E981 FF15 3C11807C call dword ptr ds:[<&ntdll.RtlDosPathNameToNtPathName_U>>
; ntdll.RtlDosPathNameToNtPathName_U
7C81E987 84C0 test al,al
7C81E989 0F84 8ACA0100 je kernel32.7C83B419
7C81E98F 66:817D F4 F001 cmp word ptr ss:[ebp-C],1F0
7C81E995 0F87 8CCA0100 ja kernel32.7C83B427
7C81E99B 8B45 F8 mov eax,dword ptr ss:[ebp-8]
----------------------------------------------------------------
注意上面的API:RtlDosPathNameToNtPathName_U,在執行完了以後,ss:[ebp-8]指向的位置存放著:\??\c:\con\(unicode)。
然後程式執行到:
7C81E9FE FF15 0810807C call dword ptr ds:[<&ntdll.NtCreateFile>]
呵呵,Native的建立檔案,到此為止C:\con已經在你硬碟上了,由此可推測那個\??\c:\con\(unicode)便是最終的產生路徑了。
你必須用rd c:\con\才能刪除那個目錄!
然後再試mkdir c:\con:繼續跟蹤,雖然也到了ntdll.NtCreateFile,但很明顯函數執行失敗了……不過可以明確一點CreateDirectoryW似乎不檢查檔案合法性……
不過我不服氣,想到那個\??\c:\con\(unicode)總該起點作用吧,於是又用了這段mkdir c:\coo。
然後再運行到ntdll.RtlDosPathNameToNtPathName_U以後找到了那段unicode的地址:dword ptr ss:[ebp-8],當時是0x001581E8,
於是開啟了記憶體修改:
先找到那個地址:
001581E0 47 00 45 00 0F 07 1E 00 5C 00 3F 00 3F 00 5C 00 G.E.