MS08-067漏洞分析与复现

        一名网络空间安全专业学生所做的漏洞复现实验,如有错误或有待改进的地方,还请大家多多指教。

MS08-067漏洞分析与复现

目录

MS08-067漏洞分析与复现

1 前置知识

2 漏洞简介

3 漏洞代码分析

4 Metasploit攻击模块代码简析

5 复现

6 可能遇到的问题

6.1 在Meterpreter中开启vnc后无法控制目标计算机,只能监视。


1 前置知识

        SMB(Server Message Block,服务器消息块):一个网络文件共享协议,它允许应用程序和终端用户从远端的文件服务器访问文件资源,能被用于Web链接和客户端与服务器之间的信息沟通。该协议提供了Windows远程文件与打印机共享网络服务。SMB作为应用层协议,直接运行在TCP 445端口上。

        MSRPC(Microsoft Remote Procedure Call,微软远程过程调用):是对DCE/RPC远程过程调用在Windows系统下的重新改进和实现,用以支持Windows系统中的应用程序能够通过网络调用远程主机上服务进程中的过程。独立运行于网络传输层协议上,主要使用SMB命名管道传输协议,即利用SMB命名管道机制作为RPC的承载传输协议(MSRPC over SMB)。MSRPC作为调用大量本地服务进程的网络接口,MSRPC over SMB常被利用作为通道来攻击本地服务中存在的安全漏洞。

2 漏洞简介

        MS08-067漏洞于2008年底被爆出,广泛存在于Windows 2000/XP/Server 2003/Vista/Server 2008的各个版本,甚至测试阶段的Windows 7 Beta。在利用MSRPC访问远程主机时,Server服务程序调用netapi32.dll中的NetPathCanonicalize函数对路径参数进行规范化,NetPathCanonicalize函数将调用下级函数CanonicalizePathName来进行路径整理,CanonicalizePathName函数又会调用子函数ConPathMacros,而在ConPathMacros函数中存在缓冲区溢出漏洞。

        路径规范化主要包含两部分工作:将路径字符串中的“/”转换为“\”、去除相对路径“\.\”和“\..\”。CanonicalizePathName函数先会遍历路径字符串,将“/”全部替换为“\”,这一步是非常简单的,不会出现什么问题,而下一步会调用ConPathMacros函数进行相对路径的去除,服务程序在这里对路径字符串的地址空间检查存在逻辑漏洞,攻击者精心设计的输入路径,可以在函数去除“\..\”字符串时,把路径字符串中的内容复制到路径串之前的地址空间(低地址)中,达到覆盖函数返回地址、执行任意代码的目的。

3 漏洞代码分析

        漏洞函数NetPathCanonicalize在netapi32.dll中,使用IDA Pro打开该dll文件。

        直接在Function Window内按Ctrl+F搜索函数名,双击跳转。

  

        该函数包含6个参数:PathName存储需要标准化的路径、Oubuf存储标准化后的路径的Buffer、OutbufLen存储Buffer长度、Prefix为可选参数(当PathName是相对路径时有用)、PathType存储路径类型、Flags为0(保留参数)。

        按F5查看反编译的伪代码,当OurbufLen不为0时调用下级函数CanonPathName真正开始进行路径字符串处理。

        双击CanonPathName跳转,查看伪代码,先是有两次长度的检查。检查wcslen(PathPrefix)是否超过520。

        检查wcslen(PathName)+wcslen(PathPrefix)长度是否超过519,即对PathName长度进行了限制。

        循环处理路径,将“/”全部转换成“\”,完成第一步路径规范化。

        调用ConPathMacros函数处理相对路径。

        双击跳转,查看伪代码,会导致溢出的关键代码存在于while循环中。

        由for循环可大概确定相对路径处理步骤如下:

\abc\a\..\b  ===>  \abc\b

          ^ ^

          |  |

          | +--- 当前\指针(后文表示为CurrentSlash)

          +----- 前一个\指针(后文表示为PrevSlash)

        当函数扫描到“..\”时,代码会将CurrentSlash指向位置开始的数据复制到PrevSlash开始的内存空间,在第一次复制后,for循环会重新定位PrevSlash作为可能的下一次复制的起始位置,由for循环可知重定位过程为:当前PrevSlash指针减1的位置开始,向前(低地址方向)遍历直至搜索到“\”,该位置为PrevSlash指针重定位后指向的位置,当PrevSlash指向的位置是路径缓冲区的起始地址时,for循环结束。

        然而,当相对路径字符串“\***\..\”出现在一个路径的开头时,如“\***\..\a”,PrevSlash指向第一个“\”,在完成第一次拷贝后缓冲区内容变成“\a”,然后for循环重定位PrevSlash开始:PrevSlash先减1,直接向前越过了路径缓冲区的起始位置,for循环终止条件之一“PrevSlash指向路径缓冲区起始地址”失效,PrevSlash将一直向低地址方向遍历,直到在低地址区域搜索到一个“\”。但当后续路径字符串又含有相对路径,则立即执行wcscpy()将CurrentSlash指向位置开始的数据复制到PrevSlash指向的位置,然后wcscpy()函数返回。

        如果攻击者构造恶意路径字符串,先触发PrevSlash向前越过路径缓冲区,并在低地址区域一个特殊的位置填入一个“\”使PrevSlash指向它,然后触发第二次相对路径检测,执行第二次wcscpy()路径复制,而此时CurrentSlash指向位置开始的数据中包含一个恶意地址,该恶意地址指向一串shellcode,且低地址区域“\”的位置能让复制后这个恶意地址刚好覆盖第二次wcscpy()函数调用的返回地址,这样,wcscpy()函数返回时,将跳转到恶意代码处执行。

4 Metasploit攻击模块代码简析

        查看kali的Metasploit框架下MS08-067漏洞攻击模块。

        首先是模块初始化部分,它将告诉我们有关该漏洞与攻击配置的相关信息。如:模块描述Description,告诉我们漏洞发生于Server服务调用的NetAPI32.dll动态链接库中进行路径规范化的代码,该攻击模块能绕过一些系统的NX机制(不可执行/DEP数据执行保护),如果没有正确设置target,可能会导致Server服务崩溃。一般Windows XP系统成功率较高,而Server 2003系统目标会崩溃或挂起。

        引用References,即该漏洞在各个漏洞库中的参考名称。

        默认选项Defaultoptiions,如会话退出采用退出线程的方式。

        攻击载荷参数Payload,可用空间大小、坏字符、调整栈空间布局的相关选项。

        目标Targets,可选的目标操作系统,不同target的几个关键变量有所不同,如返回地址在栈中位置、绕过NX需要的代码块地址等。

 

        然后是模块中对应各个操作的功能函数。

        exploit函数包含了渗透攻击的整个过程。首先建立TCP连接,然后进行SMB空会话连接,若指定了目标系统,则赋予相关参数值,若选择自动获取目标模式,则尝试通过SMB协议会话获取目标系统信息。

        开始构造恶意路径,先初始化一些变量,如填充字符串pad、服务器名称server、前缀prefix、路径path,调用了Rex库,该库提供了如支持多种协议的客户端和服务端类、日志记录、编码、输入输出和一些其他有用的类。

        然后根据目标系统的不同,来选择对应的代码进行组包操作,然后生成恶意路径结构path,path由8个部分组成:开始字符“\”、100个A到Z的随机字符串、Shellcode、触发漏洞的两个连续相对路径“\..\..\”、填充字符串pad、rop stager、2个随机字符填充、字符串结尾“\0”。也就是说该恶意路径形如:“\******\..\..\***”。

        最后的工作就是和远程服务器进行交互,把构造的数据发过去。首先向远程主句的SMB端口发起RPC请求,然后将前面准备好的元素构造成完整的数据包Stub,最后将Stub作为内容调用远程主机的RPC接口。Stub是符合NetPathCanonicalize结构的标准调用包头,将触发远程主机上的Server服务区调用路径规范化处理函数NetpwPathCanonicalize。

5 复现

攻击端OS:Kali 2021.2

攻击端IP:192.168.197.129

被攻击端OS:Windows XP Professional SP3

被攻击端IP:192.168.197.130

        先尝试ping被攻击端,测试网络连通性。

        使用nmap扫描目标主机存在的漏洞。

        扫描到ms08-067漏洞。

        使用nmap扫描目标系统指纹(需要以root权限)。

        目标系统为Windows XP SP2或SP3.

        开启Metasploit。

        查找利用MS08-067漏洞的可用exp并使用。

        查看配置。

        Payload Meterpreter攻击载荷已默认指定,不需要再填写,其他项需要手动填写。

        查看可选目标。

 

        前面已经确认目标靶机的系统为Windows XP SP3中文简体,也就是第34个(在实际攻击场景中可能需要其他信息辅助判断、一个个试,或就设置为Automatic Targeting),设置target。

        设置目标IP。

        再次查看配置,确认配置信息设置正确。

        执行攻击。

        刚获得Meterpreter shell时,该shell极其脆弱,很容易被关闭,因此攻击渗透成功后要尽快将shell绑定到目标机器的一个稳定进程上。先用ps命令查看目标计算机上正在运行的进程。

        PID=688的services.exe进程是一个常用的稳定进程,准备捆绑到该进程上。查看下当前shell的PID。

        使用migrate进行进程迁移。

        再次查看PID,确认是否迁移成功。

        接下来便可开始进行各种攻击者想做的事,如调用目标系统cmd。

        使用vnc实现远程控制。

 

6 可能遇到的问题

6.1 在Meterpreter中开启vnc后无法控制目标计算机,只能监视。

——需要修改配置文件vnc.rb

        在下图代码段添加pay.datastore[‘ViewOnly’] = false,设置“仅监视”为否。

        按ESC,输入“:wq!”保存修改并退出。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值