MS08-067攻击原理和MSF利用过程
MS08-067介绍
下面是Metasploit中的信息:
1 | msf5 > search MS08-067 |
MS08-067漏洞是通过MSRPC over SMB
通道调用Server服务中的NetPathCanonicalize
函数触发的。
NetPathCanonicalize
函数在远程访问其他主机时,会调用NetpwPathCanonicalize
函数,对远程访问的路径进行规范化,而在NetpwPathCanonicalize
函数中发生了栈缓冲区内存错误,从而造成了远程代码执行。
所谓路径规范化,即就是将路径字符串中的/
换为\
,同时去除相对路径中的\.\
和\..\
。如:
1 | "**\*\.\**" --> "**\*\**" |
在路径规范化的操作中存在逻辑漏洞,构造一个恶意的路径字符串,可以在函数去掉\..\
时,把路径字符串中的内容复制到路径字符串之前的低地址空间中,达到覆盖函数返回地址,执行任意代码的目的。
## 攻击过程复现 在Metasploit中为ms08_067_netapi
模块
查看可用的payload攻击载荷,也就是shellcode。
常用的攻击载荷类型有:
- 开放监听后门
- 回连控制端后门
- 运行某个命令或程序
- 下载并执行可执行文件
- 添加系统用户等
这里我们选择回连到控制端的后门。
1 | # 可用载荷 |
查看可攻击的目标:
我们的对象是Windows2003 SP0。选择并设置payload:
配置属性:
攻击结束后可以得到一个回连的shell:
MS08-067漏洞MSF攻击模块源代码分析
整个模块可以分为三个部分:
- 环境准备
- 模块初始化
- 功能函数。
环境准备及初始化部分
1 | ## |
1 | def initialize(info = {}) |
1. 模块描述:从第四行的Description中可以得到,漏洞发生的位置位于Server服务调用的NetAPI32.dll动态链接库中,进行path canonicalization(路径规范化)的代码。此外,入股真实的系统和我们设置的不一样的话,会导致Win2k3 Server的崩溃,但WinXP可以正常渗透。 2. 引用:第22行的reference指该漏洞在各个著名安全漏洞库中的参考名称、ID或URL 3. 默认选项:第30行指一些默认配置,如Session退出采用退出线程的方式 4. payload的初始化参数:第35行,一般包括可用空间大小和坏字符,还包括一些自定义选项,如关于栈空间布局的选项 5. Target:第45行它会根据渗透测试目标的不同来分别初始化,里面列出的每个成员都对应于一个可被攻击的操作系统,其中还包含返回地址在栈中位置、绕过NX(数据执行保护)需要的代码块地址,以及其他相关的漏洞利用参数等。
功能函数
1 | def exploit |
1.
第1~25行:首先exploit函数先建立TCP连接,然后进行SMB空会话连接,如果指定了目标系统,则赋予其相应的参数值,如果选择自动获取模式,则尝试通过SMB协议会话获取目标系统信息。
2.
第26~40行:开始构造恶意路径,先初始化了一些变量,包括填补字符变量pad
。服务器名称server
,前缀prex
,路径path
。其中调用的库Rex
是Metasploit体系结构的基础,在Ruby的基础上提供支持多种协议的客户端和服务端类、日志记录、编码、输入和输出等有用的类。
下面是关于Windows 2003 SP0 Universal的前面初始化的TARGET中的信息:
1 | # Standard return-to-ESI without NX bypass |
SVCHOST.EXE
系统文件中的JMP
ESI指令地址,即这个攻击模块是利用ESI寄存器中指向栈空间的地址,覆盖其返回地址,并通过SVCHOST.EXE
中的JMP
ESI指令进行中转,最终执行了栈中的Shellcode。 3.
第41~78行:首先构造内含跳转地址的填充字符串jumper,jumper初始化为长度70字节,'A'到'Z'的随机字符,从第5字节其填充4字节由初始化变数Ret定义的返回地址。从51字节起填充8字节的控制领和2字节的跳转指令\xeb\x62
(jump
0x62)。之后第51行生成恶意路径path
,由8个部分构成。其中包括编码的shellcode、触发漏洞的unicode相对路径\..\..\
,填补字符串pad,EBP栈基址、RET返回地址、跳转指令快jumper、字符串结尾'\0'。。
至此恶意请求的元素就准备好了。
1 | handle = dcerpc_handle( |
1. 第1~4行首先向远程主机的SMB端口发起RPC请求。 2. 第8~14行将前面准备好的各元素构成完整的数据包Stub。 3. 最后将Stub作为内容调用远程及的RPC接口。
补充:
Stub是服务NwtPathCanonicalize结构的标准调用报头,将触发远程主机上的Server服务去调用路径规范化处理函数NetpwPathCanonicalize
,其srvsvc_NetPathCanonicalize
结构体定义如下:
1 | struct srvsvc_NetPathCanonicalize{ |
v1.5.2