《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析

《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析

漏洞还原

按照书上的方法,我们还原这个漏洞,并尝试对win2k3进行渗透。
但是我尝试了好几次才成功,其中有几个小坑,这里给大家提个醒:

  1. 要保证win2k3主机的Server服务是开启状态,我的一开始就是关闭状态,导致失败了。
  2. 新版的metasploit不需要设置lhost和lport参数,当然你非要设置也可以,别设置错了就行。
  3. 新版的metasploit在设置target 参数时,要设置为3.

我的参数截图如下:
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第1张图片

命令执行情况如下;
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第2张图片

漏洞分析

首先根据书上说的,用ida分析netapi32.dll文件,找到NetpwPathCanonicalize函数:
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第3张图片
书上说,根据流程图判断出此函数直接调用了下级函数 CanonicalizePathName 函数,但是我找不到这个函数。好像是因为ida版本的问题,这个函数变成了:sub_71C44AC3 ,如下:
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第4张图片
接下来进行动态调试:
运行win2k3上面的ollydbg工具,在File菜单中选择Attach, 附加到svchost.exe。 这里要注意一点,svchost.exe有好几个进程,且他们的PID不同,其中只有一个是我们需要的,那么如何找到我们需要的那个进程呢?
书上说: “其中命令行位”C:\Windows\System32\svchost.exe -k netsvcs”的进程是目标所在”。一开始我不理解这句话,尝试了好多次,都没有找到正确的进程,后面一直进行不下去,也不知道问题出现在了哪里。浪费了很多时间。正确的做法应该是这样的:
在cmd执行命令:

wmic process where caption="svchost.exe" get caption, handle, commandline

《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第5张图片
可以看到,我们的目标进程的pid为1004,然后换算成16进制是3EC
Attach到这个进程:
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第6张图片

按照书上说的,找到netapi32.dll模块,并给NetpwPathCanonicalize函数加上断点,然后按F9让程序处于运行状态,此时程序没有什么反应,要等到攻击机执行exploit后,程序才会停在断点处。执行上述操作:
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第7张图片
可以看到已经停在了NetpwPathCanonicalize函数入口处,然后在0x71c449e, CannonicalizePathName函数入口处加个断点,然后F9,程序就会停在CannonicalizePathName函数的入口处,我这里也是sub_71C44AC3函数入口处,这个时候,我们可以通过栈查看调用该函数时提供了哪些参数,按照书上所说,在内存窗口使用Ctrl+g 快捷键,跳到准确内存位置处.
《Metasploit渗透测试魔鬼训练营》MS08-067 漏洞还原与分析_第8张图片
上图我们根据该函数的第2个参数(待整理路径字符串的指针),跳到这个字符串在内存中的位置,可以看到是 “\****************\..\..\****************” 的形式,
然后按照书上的,在内存上加断点,f9运行,程序会中断3次,第3次是进入wcscat函数复制时停下的。然后用F8(单步调试)进入wcscat函数,并把内存跳到该函数输入参数里的dest地址处,单步运行,会发现程序正在把source出的字符串拷贝到dest处,如果要快速完成这个函数可以用Ctrl +F9。然后按照书上说的在strTemp起始处加上硬件断点,然后跳过6次无关的中断,第7次停在了wcscpy函数里,这是第一次路径规范,可以单步执行,发现字符串变为 “\..\*****************” 。
然后就要执行第二次路径规范了,要再次执行wcscpy函数,必须先找到这个函数的两个参数,dest地址和src位置。那程序时如何找到dest位置呢。因为这里路径规范就是要去除/../这样的结构,例如这样的”\***************\..\****************” ,当找到/../的位置后,就从这个位置-2开始往前找(减2是因为word型数据,一个字符占2个字节),直到找到某个字符为“\”为止。
那在执行第二次路径规范之前内存是这样的:
这里写图片描述
\..\结构的起始位置是 00f4f4dc ,程序没有想到\..\会在字符串的开头位置,在程序的思维中此时应该是这样的”\*****************\..\**********”。 所以程序从00f4f4da开始比对是否是字符”\”,并且使用cmp eax, dword ptr [ebp+8]语句 判断地址是否等于00f4f4dc,进而判断是否找到了字符串的开头, 实际上从查找的第一个字符开始就已经在字符串前面了。根据书上说的,由于一些操作,字符串前面某个位置会有字符”\”,使得上面的查找操作终止,这样就为wcscpy函数提供了一个错误的dest参数,导致拷贝字符时超出了字符串的界限(往前超的),导致覆盖了字符串前面的栈中的函数返回地址(注意,字符串也是在栈中的),覆盖为什么呢,就是我们构造的路径字符串里的Retdec, 即 0100129e,那按照这个返回地址返回会到哪里呢?会执行什么语句呢?查找一下可以看到0100129e处的语句时call esi ,那么esi是多少呢,很不幸,esi恰好是栈中字符串里的需要执行的命令的位置。

我们已经知道了为什么会触发这个漏洞,那书上是如何利用这个漏洞呢?字符串前面的那个\,又是什么时候出现的呢?按照书上的方法,下个内存断点,可以发现这个\是在wcscat之后,第一次路径规范(wcscpy)之前出现的。至于出现的原因可以看书上的解说。

你可能感兴趣的:(metasploit魔鬼训练营)