创建c:\con.txt吗?windows文件系统漏洞

所属分类: 实用技巧 / 安全教程 阅读数: 1930
收藏 0 赞 0 分享
你会建立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..\.?.?.\.
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:\出现了con文件夹!

到目前为止已经搞一段落了,我先来总结下:
1.原先的文件名漏洞并不是出现在mkdir和rmdir这两个命令中,而是ntdll.NtCreateFile,换句话说你编写程序调用CreateDirectoryW(L"C:\\con\\",NULL);也会有同样效果。
2.加了\后可以成功创建文件原因不明,但的确可以绕过一些检查。
3.虽然原先的路径字符串对是否创建文件成功(ntdll.NtCreateFile)有作用,但似乎最终文件名是由那段unicode定的。

好了,现在心里已经有点头绪了,那我们来试下CreateFileW吧,也就是要创建一个文件,比如con.txt。
想到控制台中>>这个重定向命令。比如help >>c:\aa.txt可以将help命令的内容输入到aa.txt里面,那肯定是要调用CreateFileW了,但先不管这个,先试验下这个:
help >>c:\con.txt\(呵呵,多加一个\,企图绕过验证)
结果:
C:\WINDOWS\system32>help >>c:\con.txt\
文件名、目录名或卷标语法不正确。
呵呵,看来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);
}
当然运行这个肯定是失败的,不过还是先用ollydbg看下:
跟进CreateFileW后,首先执行API的是:ntdll.RtlInitUnicodeString,呵呵,看名字就知道含义了~
同时前面的ntdll.RtlDosPathNameToNtPathName_U又出现了:
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对应内存,然后修改!
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,向上帝祈祷……,结果……
虽然出现了带con的文件名,但好像有问题……C:下出现的是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);
然后进Olly用相同方法,呵呵,欢呼吧,成功了!!

好了,到此为止你知道怎么创建了。呵呵,道理永远是浅显的,上面的过程无非是修改了下内存,但到底是为什么会造成这个问题的呢?希望大家考虑下,我这里就卖个关子。

最后别忘了把那些垃圾删掉吧,你可以用del命令或者自己编程,然后拦截DeleteFileW,当然程序要是unicode版的,文件名先伪造一个合法的,然后用相同方法去修改就好了。

在这里我想说些有趣的事:
1.前面mkdir con\建立的文件夹可以访问,能防止文件,但无法删除
2.那些带有con\prn的文件打不开也删不掉,而且系统无法确定其时间。

不过上面仅供学习娱乐,创建带con可能意义不大,不过你可以先CreateFileW一个这样的文件,通过破解让他顺利创建后利用返回的合法HANDLE再使用WriteFile也许允许你用里面读写数据哦……这样里面得内容就100%安全了,除非format。

不过世上还有无聊的人会编病毒……所以我就不公开提供生成这种文件的代码了。需要的自己找我吧

最后附上能自动创建、删除这类文件的程序:
WinFileKiller

点击下载:[url]ftp://FTP_visitor:visitor@ftp.csksoft.net/Public/Products/Crack/WinFileKiller.rar[/url]

陈士凯版权所有,转载请标明作者与出处。
更多精彩内容其他人还在看

一些通用跳转地址,XXOXX的时候有点用

近日在写exploit的时候需要用到一些其他语言的call ebx的跳转地址,但是metasploit的opcode DB没有包括繁体中文、日文、韩文机器的跳转地址,所以费了点时间收集了下,在这里要感谢傲少提供的机器给我去找地址。现在贴到这里,方便大家。
收藏 0 赞 0 分享

入侵过程中用过的三大门派的几个小工具[推荐]

vbs在入侵中的作用、我在入侵中的注意的细节、跨站、入侵中的批处理、入侵过程中用的小工具共有这五个,当然随着期数的变化,出的题目也会增加,现在大家针对这些题目欢迎来稿呀,不要被高手这两个字吓住了。
收藏 0 赞 0 分享

sql2005 sa执行命令方法总结

测试环境:windows xp pro sp2 + mssql 2005(服务以system权限启动)
收藏 0 赞 0 分享

几款双功能免杀超强版asp小马

几款双功能免杀超强版asp小马,对于需要查找后门的朋友可以参考下。
收藏 0 赞 0 分享

如何防范别人盗你的qq号(盗别人的qq密码)

想用别人的 qq号码,最主要的就是把别人的密码偷来,那么怎么盗别人的qq密码呢?不过,没有人会告诉你:我的密码是什么什么,请你尽情的用我的号码吧!那么,黑客是怎么去把别人的密码偷来呢
收藏 0 赞 0 分享

QQ聊天记录删除了怎么恢复 详细步骤教程

许多网友都想知道“QQ聊天记录删除了怎么恢复”,因为QQ聊天记录对于我们来说是很重要的数据。下面我们就来介绍下如何解决QQ聊天记录删除恢复的问题
收藏 0 赞 0 分享

php+mysql注入页面实现

最近在弄靶场,原本是打算找一些漏洞程序来做实验环境,但是去找这些程序感觉太麻烦了,几段代码能实现的东西还是自己写吧
收藏 0 赞 0 分享

QQ密码被盗怎么办 (教你如何找回QQ密码)

QQ密码保护是一套保障QQ密码安全的机制。通过给你的QQ号填写对应的相关资料,如证件号、安全提示问题、安全邮箱等,给你的QQ号穿一件防弹衣。一旦出现问题,就可以通过QQ密码保护找回QQ密码
收藏 0 赞 0 分享

QQ密码找回方法全攻略(QQ被盗怎么要回QQ密码呢)

自从本站开办以来,不断有网友来信大量重复询问同一个问题:QQ密码的破解。因为站长有限的精力,不可能一一作答,以后同样的问题我将不会回覆了,您自己看这篇教程吧
收藏 0 赞 0 分享

让你变成ASP木马高手

这篇文章主要介绍了让你变成ASP木马高手
收藏 0 赞 0 分享
查看更多