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

你会建立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]

陈士凯版权所有,转载请标明作者与出处。

(0)

相关推荐

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

    你会建立c:\con.txt吗?--windows文件系统漏洞唉,写完了前面的废话头都昏了,有错误及时告诉我哦.----------------------------如果你在想con.txt不是很正常吗?那好,你先去创建下,只要带有独立的con字样的文件就好,然后悟出什么了再看这篇文章(如果你用linux或者mac或者unix那就算了). 呵呵,正常来说带有con.prn.com1这样字眼的文件或目录是不能创建的(原因自己找),但我想到了以前在安全焦点的一篇文章,是教你创建带"\"的

  • VirtualBox创建的Debian虚拟机与Windows宿主共享文件

    术语: 1.VM:虚拟机 步骤: 1.在Windows10上下载并安装VirtualBox6.0.8(时间:2019/5/30),下载地址:https://download.virtualbox.org/virtualbox/6.0.8/VirtualBox-6.0.8-130520-Win.exe 或者https://www.virtualbox.org/wiki/Downloads另选版本: 2.启动VirtualBox,创建Debian VM: 3.从Debian站点下载系统安装镜像,右键

  • C#使用Windows Service的简单教程(创建、安装、卸载、调试)

    前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务.本文就向大家介绍如何运用C#来创建.安装.卸载.调试Windows Service程序. 一.创建Windows服

  • C#创建Windows服务的实现方法

    Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 一.创建Windows 服务 1.新建一个Windows 服务,并将项目名称改为"WindowsServiceDemo

  • C#创建Windows服务与服务的安装、卸载

    Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这种服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 一.使用C#创建Windows service步骤: 1.文件->新建->项目:选择Windows服务,修

  • C#创建控制Windows服务

    需求 针对一种特殊的应用, 不需要显示GUI, 希望常驻在Windows服务当中,在必要的时候我们可以进行启动或开机启动. 这个时候我们就可以创建WindowsService 来实现. 创建WindowsService 下面演示了使用VisualStudio2019创建一个基于.NetFramework的Windows服务 项目结构如下所示: 包含了一个启动项以及一个服务类 右键查看 Service1代码, 如下所示, 包含了重写OnStart方法以及OnStop方法: public parti

  • Windows 2003 工作手册(3)

    二十一.如何对传入的连接禁用 NetBT 代理    版权所概要 默认情况下,在基于 Windows XP 和 Windows Server 2003 的系统上,对传入的远程访问服务 (RAS) 或虚拟专用网 (VPN) 连接启用 Netbios 代理.此设置允许 RAS 客户端在其所连接的局域网 (LAN) 中解析 Netbios 名称.在被配置为 RAS 或 VPN 服务器的计算机上,如果从命令外壳程序中运行 Ipconfig /all 命令,将返回信息显示WINS Proxy Enable

  • IIS短文件名漏洞复现图文详解

    一.漏洞描述 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的.它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问).攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息. 二.漏洞原理 IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400. 漏洞成因: 为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成

  • linux下获取文件的创建时间与实战教程

    背景 有时候我们需要获取文件的创建时间. 例如: 我在研究 <xtrabackup 原理图>的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件.我们就需要知道 xtrabackup_logfile 这个文件的创建时间戳和修改时间戳. 复习: Linux关于文件的三个时间戳 Linux 的文件系统保存有三个时间戳,利用 stat 指令查看文件信息可以获取.他们分别是 ATime.MTime 和 CTime [root@192-168-199-198 back

  • C#编写Windows服务实例代码

    Microsoft Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用.还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务. 使用Microsoft Visual Studio2012可以很方便的创建一个Windo

随机推荐