C:\Windows\System32\svchost.exe-k netsvcs
用IDA pro打开netapi32.dll,找到漏洞所在的NetpwPathCanonicalize函(每次运行堆栈中的地址会不同,但各函数的地址一样),如图在书中提到:
查看该函数流程图,可以看到,此函数并没有直接进行输入路径的规范化, 而是继续调用了下级函数CanonicalizePathName
然而在实际操作中并没有发现CanonicalizePathName这个函数,并且多种资料表明应当是调用CanonPathName函数进行规范化。
IDA分析NetpwPathCanonicalize函数代码(F5 + 整理 + 主要代码):
该函数声明如下:
DWORD NetpwPathCanonicalize(
LPWSTR PathName, //需要标准化的路径
LPWSTR Outbuf, //存储标准化后的路径的Buffer
DWORD OutbufLen, //Buffer长度
LPWSTR Prefix, //可选参数,当PathName是相对路径时有用
LPDWORD PathType, //存储路径类型
DWORD Flags // 保留,为0
)
动态调试
通过wmic查看命令行参数为svchost.exe -k netsvcs的进程pid:
打开OllyDbg,点击file->attach,附着到svchost.exe进程上:
View->Executable modules双击netapi32,在cpu指令窗口右键选Search for查找exec(label) in current module,找到函数NetpwPathCanonicalize,地址为71C44A3E,在此处设下断点:
追踪漏洞触发过程
回到CPU指令窗口运行程序,然后攻击机Metasploit加载ms08_067_netapi模块并exploit:
NetpwPathCanonicalize中断
分析环境中的svchost程序会中断在NetpwPathCanonicalize函数的入口地址处。该函数的传入参数如下所示:
esp [esp] * 注释 *
00ECF924 02248D34 ;指向待整理路径
00ECF928 022321D8 ;指向输出路径buffer
00ECF92C 000003F1 ;输出buffer的长度
00ECF930 02248FB0 ;指向prefix,值为 \x5C\x00 ,即unicode ‘\’
00ECF934 02248FB4 ;指向路径类型,值为 0x1001
00ECF938 00000000 ;WORD Flags保留,值为0
CanonicalizePathName中断
结合IDA pro对NetpwPathCanonicalize的流程分析,在地址处将调用下一级函数CanonPathName,在此地址设下断点:
运行到此断点,然后跟踪函数CanonPathName,传入参数如下所示:
00F0F8FC 00157570 ;指向prefix,值为\x5C\00,即Unicode"\"
00F0F900 001572F4 ;指向待整理路径
00F0F904 02132E80 ;指向输出路径的buffer
00F0F908 000003F9 ;输出buffer的长度
00F0F90C 00000000 ;WORD Flag保留字,值为0
从上两个函数的参数传递可以看出,函数CanonPathName进行路径整理,然后再保存到预先分配的输出路径缓冲区buffer中。
待整理路径结构
在OD中查看待整理路径的结构,路径是Unicode字符串,以【\x5C\x00】(Unicode字符“\”)开始,【\x00\x00】结束,中间包含一些随机的大小写字母,较长一段不可显示的字符是经过编码的Shellcode,其中最关键的是两个连在一起的父目录相对路径【....\】。
整个待整理路径形如:
\******\..\..\***
整理路径前的预操作
MS08-067漏洞原理及利用方法MS08-067(2):http://www.youerw.com/fanwen/lunwen_61930.html