創(chuàng)建c:\con.txt嗎?windows文件系統(tǒng)漏洞
更新時間:2008年01月28日 22:44:25 作者:
創(chuàng)建c:\con.txt嗎?windows文件系統(tǒng)漏洞
你會建立c:\con.txt嗎?--windows文件系統(tǒng)漏洞
唉,寫完了前面的廢話頭都昏了,有錯誤及時告訴我哦。
----------------------------
如果你在想con.txt不是很正常嗎?那好,你先去創(chuàng)建下,只要帶有獨立的con字樣的文件就好,然后悟出什么了再看這篇文章(如果你用linux或者mac或者unix那就算了)。
呵呵,正常來說帶有con、prn、com1這樣字眼的文件或目錄是不能創(chuàng)建的(原因自己找),但我想到了以前在安全焦點的一篇文章,是教你創(chuàng)建帶"\"的文件夾的。當(dāng)時的方法是用控制臺命令(如果你叫dos命令那是不標(biāo)準(zhǔn)的)mkdir csk..\這樣的語法創(chuàng)建的??磥磉@是windows一個文件系統(tǒng)的漏洞了,沒錯……
我后來就在想其中的原理,可能你會發(fā)現(xiàn)像上面的csk..\在創(chuàng)建后是csk.,而他實際被windows解釋為訪問mkdir csk.\的目錄??磥碛凶址趧?chuàng)建時被略去了。而一次偶然機會我發(fā)現(xiàn)mkdir C:\con\是成功的,在c下面出現(xiàn)了c:\con文件夾,而且刪不掉……呵呵,有一個bug……
我這時突然想到了可能的原因:首先創(chuàng)建目錄時肯定要驗證正確性,而像這種C:\dir\肯定是先將\符號略去了,但后面的內(nèi)容呢?看來windows似乎不去檢查了……否則mkdir c:\con\就應(yīng)該失敗了,而mkdir c:\con肯定是無效的。
所以我在想是否創(chuàng)建的文件也能利用這個漏洞奪過windows文件系統(tǒng)的一些檢查呢?正如你看到的,我成功了^-^

呵呵,這可不是畫出來的哦,是貨真價實的con.txt。其實原理和我上面的猜測差不多,但由于時間有限,我的分析不一定正確,下面給出具體破解過程:
2005.8.1:23:00
首先我要知道m(xù)kdir造成漏洞的原因,于是拿出ollydbg去調(diào)試cmd.exe(mkdir是內(nèi)部命令嘛,不知他找誰?)。接著對KERNEL32.CreateDirectoryW設(shè)斷點,果然在輸入了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,在執(zhí)行完了以后,ss:[ebp-8]指向的位置存放著:\??\c:\con\(unicode)。
然后程序執(zhí)行到:
7C81E9FE FF15 0810807C call dword ptr ds:[<&ntdll.NtCreateFile>]
呵呵,Native的創(chuàng)建文件,到此為止C:\con已經(jīng)在你硬盤上了,由此可推測那個\??\c:\con\(unicode)便是最終的生成路徑了。
你必須用rd c:\con\才能刪除那個目錄!
然后再試mkdir c:\con:繼續(xù)跟蹤,雖然也到了ntdll.NtCreateFile,但很明顯函數(shù)執(zhí)行失敗了……不過可以明確一點CreateDirectoryW似乎不檢查文件合法性……
不過我不服氣,想到那個\??\c:\con\(unicode)總該起點作用吧,于是又用了這段mkdir c:\coo。
然后再運行到ntdll.RtlDosPathNameToNtPathName_U以后找到了那段unicode的地址:dword ptr ss:[ebp-8],當(dāng)時是0x001581E8,
于是打開了內(nèi)存修改:
先找到那個地址:
001581E0 47 00 45 00 0F 07 1E 00 5C 00 3F 00 3F 00 5C 00 G.E..\.?.?.\.
001581F0 63 00 3A 00 5C 00 63 00 6F 00 6F 00 00 00 AD BA c.:.\.c.o.o...
然后手動改為\??\c:\con\(注意是unicode,這里多加了個\,為了繞過驗證):
001581E0 47 00 45 00 0F 07 1E 00 5C 00 3F 00 3F 00 5C 00 G.E..\.?.?.\.
001581F0 63 00 3A 00 5C 00 63 00 6F 00 6E 00 5C 00 00 00 c.:.\.c.o.n.\...
然后就按F9讓他去吧,呵呵,成功了,雖然打了mkdir c:\coo,但在c:\出現(xiàn)了con文件夾!
到目前為止已經(jīng)搞一段落了,我先來總結(jié)下:
1.原先的文件名漏洞并不是出現(xiàn)在mkdir和rmdir這兩個命令中,而是ntdll.NtCreateFile,換句話說你編寫程序調(diào)用CreateDirectoryW(L"C:\\con\\",NULL);也會有同樣效果。
2.加了\后可以成功創(chuàng)建文件原因不明,但的確可以繞過一些檢查。
3.雖然原先的路徑字符串對是否創(chuàng)建文件成功(ntdll.NtCreateFile)有作用,但似乎最終文件名是由那段unicode定的。
好了,現(xiàn)在心里已經(jīng)有點頭緒了,那我們來試下CreateFileW吧,也就是要創(chuàng)建一個文件,比如con.txt。
想到控制臺中>>這個重定向命令。比如help >>c:\aa.txt可以將help命令的內(nèi)容輸入到aa.txt里面,那肯定是要調(diào)用CreateFileW了,但先不管這個,先試驗下這個:
help >>c:\con.txt\(呵呵,多加一個\,企圖繞過驗證)
結(jié)果:
C:\WINDOWS\system32>help >>c:\con.txt\
文件名、目錄名或卷標(biāo)語法不正確。
呵呵,看來CreateFileW與CreateDirectoryW不同了,然后又試了C:\WINDOWS\system32>help >>c:\con.txt,這回更搞笑,唉都忘了con含義了(自己試試看)。
看來命令行里靠不住了,于是自己編了個小程序:
HANDLE pfile=CreateFile("C:\con.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
if (pfile!=INVALID_HANDLE_VALUE)
{
MessageBox(NULL,L"OK!",NULL,MB_OK);
}
當(dāng)然運行這個肯定是失敗的,不過還是先用ollydbg看下:
跟進(jìn)CreateFileW后,首先執(zhí)行API的是:ntdll.RtlInitUnicodeString,呵呵,看名字就知道含義了~
同時前面的ntdll.RtlDosPathNameToNtPathName_U又出現(xiàn)了:
7C8109E9 50 push eax
7C8109EA 56 push esi
7C8109EB FF15 3C11807C call dword ptr ds:[<&ntdll.RtlDosPathNameToNtPathName_U>>;
7C8109F1 84C0 test al,al
7C8109F3 0F84 408E0200 je kernel32.7C839839
呵呵,看來又會是老樣子嗎?先終止吧,把代碼改稱
HANDLE pfile=CreateFile("C:\co.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
然后用老辦法,到了ntdll.RtlDosPathNameToNtPathName_U以后找到unicode對應(yīng)內(nèi)存,然后修改!
00142AA0 5C 00 3F 00 3F 00 5C 00 63 00 3A 00 5C 00 63 00 \.?.?.\.c.:.\.c.
00142AB0 6F 00 6E 00 2E 00 74 00 78 00 74 00 5C 00 00 00 o.n...t.x.t.\...
按下F9,向上帝祈禱……,結(jié)果……
雖然出現(xiàn)了帶con的文件名,但好像有問題……C:下出現(xiàn)的是con.tx……
不過問題一想就明白。strlen("con.tx")==strlen("con.tx")
看來原先的字符串還控制這文件名長度……第二次使用
HANDLE pfile=CreateFile("C:\coo.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
然后進(jìn)Olly用相同方法,呵呵,歡呼吧,成功了??!
好了,到此為止你知道怎么創(chuàng)建了。呵呵,道理永遠(yuǎn)是淺顯的,上面的過程無非是修改了下內(nèi)存,但到底是為什么會造成這個問題的呢?希望大家考慮下,我這里就賣個關(guān)子。
最后別忘了把那些垃圾刪掉吧,你可以用del命令或者自己編程,然后攔截DeleteFileW,當(dāng)然程序要是unicode版的,文件名先偽造一個合法的,然后用相同方法去修改就好了。
在這里我想說些有趣的事:
1.前面mkdir con\建立的文件夾可以訪問,能防止文件,但無法刪除
2.那些帶有con\prn的文件打不開也刪不掉,而且系統(tǒng)無法確定其時間。
不過上面僅供學(xué)習(xí)娛樂,創(chuàng)建帶con可能意義不大,不過你可以先CreateFileW一個這樣的文件,通過破解讓他順利創(chuàng)建后利用返回的合法HANDLE再使用WriteFile也許允許你用里面讀寫數(shù)據(jù)哦……這樣里面得內(nèi)容就100%安全了,除非format。
不過世上還有無聊的人會編病毒……所以我就不公開提供生成這種文件的代碼了。需要的自己找我吧
最后附上能自動創(chuàng)建、刪除這類文件的程序:
WinFileKiller
點擊下載:[url]ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Products/Crack/WinFileKiller.rar[/url]

陳士凱版權(quán)所有,轉(zhuǎn)載請標(biāo)明作者與出處。
唉,寫完了前面的廢話頭都昏了,有錯誤及時告訴我哦。
----------------------------
如果你在想con.txt不是很正常嗎?那好,你先去創(chuàng)建下,只要帶有獨立的con字樣的文件就好,然后悟出什么了再看這篇文章(如果你用linux或者mac或者unix那就算了)。
呵呵,正常來說帶有con、prn、com1這樣字眼的文件或目錄是不能創(chuàng)建的(原因自己找),但我想到了以前在安全焦點的一篇文章,是教你創(chuàng)建帶"\"的文件夾的。當(dāng)時的方法是用控制臺命令(如果你叫dos命令那是不標(biāo)準(zhǔn)的)mkdir csk..\這樣的語法創(chuàng)建的??磥磉@是windows一個文件系統(tǒng)的漏洞了,沒錯……
我后來就在想其中的原理,可能你會發(fā)現(xiàn)像上面的csk..\在創(chuàng)建后是csk.,而他實際被windows解釋為訪問mkdir csk.\的目錄??磥碛凶址趧?chuàng)建時被略去了。而一次偶然機會我發(fā)現(xiàn)mkdir C:\con\是成功的,在c下面出現(xiàn)了c:\con文件夾,而且刪不掉……呵呵,有一個bug……
我這時突然想到了可能的原因:首先創(chuàng)建目錄時肯定要驗證正確性,而像這種C:\dir\肯定是先將\符號略去了,但后面的內(nèi)容呢?看來windows似乎不去檢查了……否則mkdir c:\con\就應(yīng)該失敗了,而mkdir c:\con肯定是無效的。
所以我在想是否創(chuàng)建的文件也能利用這個漏洞奪過windows文件系統(tǒng)的一些檢查呢?正如你看到的,我成功了^-^

呵呵,這可不是畫出來的哦,是貨真價實的con.txt。其實原理和我上面的猜測差不多,但由于時間有限,我的分析不一定正確,下面給出具體破解過程:
2005.8.1:23:00
首先我要知道m(xù)kdir造成漏洞的原因,于是拿出ollydbg去調(diào)試cmd.exe(mkdir是內(nèi)部命令嘛,不知他找誰?)。接著對KERNEL32.CreateDirectoryW設(shè)斷點,果然在輸入了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,在執(zhí)行完了以后,ss:[ebp-8]指向的位置存放著:\??\c:\con\(unicode)。
然后程序執(zhí)行到:
7C81E9FE FF15 0810807C call dword ptr ds:[<&ntdll.NtCreateFile>]
呵呵,Native的創(chuàng)建文件,到此為止C:\con已經(jīng)在你硬盤上了,由此可推測那個\??\c:\con\(unicode)便是最終的生成路徑了。
你必須用rd c:\con\才能刪除那個目錄!
然后再試mkdir c:\con:繼續(xù)跟蹤,雖然也到了ntdll.NtCreateFile,但很明顯函數(shù)執(zhí)行失敗了……不過可以明確一點CreateDirectoryW似乎不檢查文件合法性……
不過我不服氣,想到那個\??\c:\con\(unicode)總該起點作用吧,于是又用了這段mkdir c:\coo。
然后再運行到ntdll.RtlDosPathNameToNtPathName_U以后找到了那段unicode的地址:dword ptr ss:[ebp-8],當(dāng)時是0x001581E8,
于是打開了內(nèi)存修改:
先找到那個地址:
001581E0 47 00 45 00 0F 07 1E 00 5C 00 3F 00 3F 00 5C 00 G.E..\.?.?.\.
001581F0 63 00 3A 00 5C 00 63 00 6F 00 6F 00 00 00 AD BA c.:.\.c.o.o...
然后手動改為\??\c:\con\(注意是unicode,這里多加了個\,為了繞過驗證):
001581E0 47 00 45 00 0F 07 1E 00 5C 00 3F 00 3F 00 5C 00 G.E..\.?.?.\.
001581F0 63 00 3A 00 5C 00 63 00 6F 00 6E 00 5C 00 00 00 c.:.\.c.o.n.\...
然后就按F9讓他去吧,呵呵,成功了,雖然打了mkdir c:\coo,但在c:\出現(xiàn)了con文件夾!
到目前為止已經(jīng)搞一段落了,我先來總結(jié)下:
1.原先的文件名漏洞并不是出現(xiàn)在mkdir和rmdir這兩個命令中,而是ntdll.NtCreateFile,換句話說你編寫程序調(diào)用CreateDirectoryW(L"C:\\con\\",NULL);也會有同樣效果。
2.加了\后可以成功創(chuàng)建文件原因不明,但的確可以繞過一些檢查。
3.雖然原先的路徑字符串對是否創(chuàng)建文件成功(ntdll.NtCreateFile)有作用,但似乎最終文件名是由那段unicode定的。
好了,現(xiàn)在心里已經(jīng)有點頭緒了,那我們來試下CreateFileW吧,也就是要創(chuàng)建一個文件,比如con.txt。
想到控制臺中>>這個重定向命令。比如help >>c:\aa.txt可以將help命令的內(nèi)容輸入到aa.txt里面,那肯定是要調(diào)用CreateFileW了,但先不管這個,先試驗下這個:
help >>c:\con.txt\(呵呵,多加一個\,企圖繞過驗證)
結(jié)果:
C:\WINDOWS\system32>help >>c:\con.txt\
文件名、目錄名或卷標(biāo)語法不正確。
呵呵,看來CreateFileW與CreateDirectoryW不同了,然后又試了C:\WINDOWS\system32>help >>c:\con.txt,這回更搞笑,唉都忘了con含義了(自己試試看)。
看來命令行里靠不住了,于是自己編了個小程序:
HANDLE pfile=CreateFile("C:\con.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
if (pfile!=INVALID_HANDLE_VALUE)
{
MessageBox(NULL,L"OK!",NULL,MB_OK);
}
當(dāng)然運行這個肯定是失敗的,不過還是先用ollydbg看下:
跟進(jìn)CreateFileW后,首先執(zhí)行API的是:ntdll.RtlInitUnicodeString,呵呵,看名字就知道含義了~
同時前面的ntdll.RtlDosPathNameToNtPathName_U又出現(xiàn)了:
7C8109E9 50 push eax
7C8109EA 56 push esi
7C8109EB FF15 3C11807C call dword ptr ds:[<&ntdll.RtlDosPathNameToNtPathName_U>>;
7C8109F1 84C0 test al,al
7C8109F3 0F84 408E0200 je kernel32.7C839839
呵呵,看來又會是老樣子嗎?先終止吧,把代碼改稱
HANDLE pfile=CreateFile("C:\co.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
然后用老辦法,到了ntdll.RtlDosPathNameToNtPathName_U以后找到unicode對應(yīng)內(nèi)存,然后修改!
00142AA0 5C 00 3F 00 3F 00 5C 00 63 00 3A 00 5C 00 63 00 \.?.?.\.c.:.\.c.
00142AB0 6F 00 6E 00 2E 00 74 00 78 00 74 00 5C 00 00 00 o.n...t.x.t.\...
按下F9,向上帝祈禱……,結(jié)果……
雖然出現(xiàn)了帶con的文件名,但好像有問題……C:下出現(xiàn)的是con.tx……
不過問題一想就明白。strlen("con.tx")==strlen("con.tx")
看來原先的字符串還控制這文件名長度……第二次使用
HANDLE pfile=CreateFile("C:\coo.txt",FILE_GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,0);
然后進(jìn)Olly用相同方法,呵呵,歡呼吧,成功了??!
好了,到此為止你知道怎么創(chuàng)建了。呵呵,道理永遠(yuǎn)是淺顯的,上面的過程無非是修改了下內(nèi)存,但到底是為什么會造成這個問題的呢?希望大家考慮下,我這里就賣個關(guān)子。
最后別忘了把那些垃圾刪掉吧,你可以用del命令或者自己編程,然后攔截DeleteFileW,當(dāng)然程序要是unicode版的,文件名先偽造一個合法的,然后用相同方法去修改就好了。
在這里我想說些有趣的事:
1.前面mkdir con\建立的文件夾可以訪問,能防止文件,但無法刪除
2.那些帶有con\prn的文件打不開也刪不掉,而且系統(tǒng)無法確定其時間。
不過上面僅供學(xué)習(xí)娛樂,創(chuàng)建帶con可能意義不大,不過你可以先CreateFileW一個這樣的文件,通過破解讓他順利創(chuàng)建后利用返回的合法HANDLE再使用WriteFile也許允許你用里面讀寫數(shù)據(jù)哦……這樣里面得內(nèi)容就100%安全了,除非format。
不過世上還有無聊的人會編病毒……所以我就不公開提供生成這種文件的代碼了。需要的自己找我吧
最后附上能自動創(chuàng)建、刪除這類文件的程序:
WinFileKiller
點擊下載:[url]ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Products/Crack/WinFileKiller.rar[/url]

陳士凱版權(quán)所有,轉(zhuǎn)載請標(biāo)明作者與出處。
相關(guān)文章
ART OF WEB-SQL-INJECTION第2卷 ORACLE篇
在國外對ORACLE的攻擊一直很收關(guān)注,只是國內(nèi)研究的人不太多,或者技術(shù)不夠~這里我就打響第一炮吧2007-10-10NtGodMode.exe任意密碼登錄windows系統(tǒng)帳號下載
NTGod NT上帝模式,打開上帝模式可以用任意密碼登錄任意windows系統(tǒng)帳號,從而達(dá)到不增加帳號、不破壞被入侵主機系統(tǒng)的情況下,登錄系統(tǒng)帳號。2008-05-05巧用端口映射 不通過網(wǎng)關(guān)開放任意內(nèi)網(wǎng)(LCX.exe)
巧用端口映射 不通過網(wǎng)關(guān)開放任意內(nèi)網(wǎng)(LCX.exe)...2007-02-02