Windows 漏洞:MS08-067 远程代码执行漏洞复现及深度防御
摘要:详细讲解 MS08-067 远程代码执行漏洞(CVE-2008-4250)及防御过程。
本文分享自华为云社区《Windows漏洞利用之MS08-067远程代码执行漏洞复现及深度防御》,作者:eastmount 。
一.漏洞描述
MS08-067 漏洞全称是“Windows Server 服务 RPC 请求缓冲区溢出漏洞”,攻击者利用受害者主机默认开放的 SMB 服务端口 445,发送特殊 RPC(Remote Procedure Call,远程过程调用)请求,造成栈缓冲区内存错误,从而被利用实施远程代码执行。
当用户在受影响的系统上收到 RPC 请求时,该漏洞会允许远程执行代码,攻击者可以在未经身份验证情况下利用此漏洞运行任意代码。同时,该漏洞可以用于蠕虫攻击。它影响了某些旧版本的 Windows 系统,包括:
Windows 2000
Windows XP
Windows Server 2003
漏洞原理:
MS08-067 漏洞是通过 MSRPC over SMB 通道调用 Server 程序中的 NEtPathCanonicalize 函数时触发的。NetPathCanonicalize 函数在远程访问其他主机时,会调用 NetpwPathCanonicalize 函数,对远程访问的路径进行规范化,而在 NetpwPathCanonicalize 函数中发生了栈缓冲区内存错误(溢出),造成可被利用实施远程代码执行(Remote Code Execution)。后续部分我将分析该漏洞的 CFG 流程图及漏洞成因。

本文参考了很多大佬的文章,再次感谢他们。实验部分是结合自己的实践和经验讲解,如果存在错误或不足之处,也请批评和指正。
二.环境搭建
1.环境准备
受害机:Windows XP SP1 镜像
攻击机:Kali 系统
第一步,在虚拟机中安装 Windows XP SP1 系统和 Kali 系统。

第二步,虚拟机两个系统之间能够相互通信。
Kali:192.168.44.136
Win XP:192.168.44.135


第三步,打开 Windows XP 系统,确定 445 端口开启。如下图所示,在 Win XP 的 CMD 中输入“netstat -sn”查看端口 445 是否打开。

第四步,关闭 Windows XP 系统的防火墙。

做完这些初始准备之后,我们开始利用 Kali 系统进行漏洞复现。
2.端口详解
这里作者补充一些端口的基础知识,更有利于我们进行 Web 渗透实验。
(1) 端口作用
我们知道,一台拥有 IP 地址的主机可以提供许多服务,比如 Web 服务、FTP 服务、SMTP 服务等,这些服务完全可以通过 1 个 IP 地址来实现。那么,主机是怎么区分不同的网络服务呢?显然不能只靠 IP 地址,因为 IP 地址与网络服务的关系是一对多的关系,实际上是通过“IP 地址+端口号”来区分不同的服务的。
需要注意的是,端口并不是一一对应的。比如你的电脑作为客户机访问一台 WWW 服务器时,WWW 服务器使用“80”端口与你的电脑通信,但你的电脑则可能使用“3456”这样的端口。如下图所示:

(2) 端口的分类
端口共 1-65535 号,知名端口范围从 0 到 1023,这些端口号一般固定分配给一些服务,大家尽量不要使用。比如 21 端口分配给 FTP 服务,25 端号分配给 SMTP 邮件传输协议服务,80 端口分配给 HTTP 服务,135 端口分配给 RPC 远程过程调用服务等等。
动态端口的范围从 1024 到 65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如 1024 端口就是分配给第一个向系统发出申请的程序,在关闭程序进程后,就会释放所占用的端口号。注意,端口冲突就不能正常工作。
同时,动态端口号也常常被病毒木马程序所利用,如冰河默认连接端口号是 7626、WAY 2.4 连接端口号是 8011、Netspy 3.0 连接端口号是 7306、YAI 病毒连接端口号是 1024 等等。
(3) 常见的端口

(4) 黑客通过端口可以干什么
信息收集
目标探测
服务判断
系统判断
角色分析
(5) 445 端口
谢公子大佬在 “135、137、138、139和445端口” 文章中介绍过这些端口,它们都是与文件共享和打印机共享有关的端口,而且在这几个端口上经常爆发很严重的漏洞。比如 2017 年危害全球的永恒之蓝,就是利用的 445 端口。
本篇文章的 445 端口就是利用 SMB(Server Message Block)Windows 协议族,用于文件共享、打印共享的服务。445 端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉!
总之,公开服务器打开 139 和 445 端口是一件非常危险的事情。 如果有 Guest 帐号,而且没有设置任何密码时,就能够被人通过因特网轻松地盗看文件。如果给该帐号设置了写入权限,甚至可以轻松地篡改文件。也就是说在对外部公开的服务器中不应该打开这些端口。通过因特网使用文件服务器就等同自杀行为,因此一定要关闭 139 和 445 端口。对于利用 ADSL 永久性接入因特网的客户端机器可以说也是如此。
三.利用 Metasploit 复现漏洞
攻击机:Kali - 192.168.44.136
受害机:Win XP - 192.168.44.135
第一步,利用 Nmap 工具扫描端口及确认该漏洞是否存在。
nmap 漏扫脚本目录为“/usr/share/nmap/script/”,如下图所示,扫描结果为 VULNERABLE,表示 MS0808-067 漏洞存在且可以利用。

或者使用 “nmap -sV -Pn 192.168.44.135” 查看目标主机开放的端口。目标机开放了 135、139、445、1025、5000 端口,且目标机系统为 Windows XP。作为黑客,一看到 XP 或 2003 系统的 445 端口开放,我们就能想到轰动一时的 MS08-067。

第二步,进入 Msfconsole 并利用 search 语句查找漏洞利用模块。终端内输入 msfconsole 打开 metasploite 命令行客户端,使用 search 命令查找 ms08-067 的漏洞利用模块。

第三步,进入漏洞模块,并查看相关的使用说明。使用 use 命令选择我们要使用的利用模块。target 设置为系统默认是自动定位,如果需要精确定位,可以 show targets 查看所有,然后进行选择。

第四步,设置攻击机、受害机信息。

第五步,运行 exploit 反弹 shell。此时我们成功获取了 Windows XP 系统的 Shell,我们调用“ipconfig”查看的 IP 地址也是目标的“192.168.44.135”。

注意:Windows XP SP1 系统是中文而不是英文的,需要对 ms08_067_netapi_ser2003_zh.rb 处理。
参考:MS08-067 远程执行代码 漏洞复现 - feizianquan
第六步,在目标主机上创建文件夹及文件。

显示结果下图所示:

第七步,对目标 XP 主机进行深度提权。
Windows DOM 用户常用命令如下:
net user abcd 1234 /add
新建一个用户名为 abcd,密码为 1234 的帐户,默认为 user 组成员
net user abcd /del
将用户名为 abcd 的用户删除
net user abcd /active:no
将用户名为 abcd 的用户禁用
net user abcd /active:yes
激活用户名为 abcd 的用户
net user abcd
查看用户名为 abcd 的用户的情况
net localgroup administrators abcd /add
将 abcd 账户给予管理员权限

此时被攻击的主机新增“hacker”管理员如下图所示:

第八步,开启远程连接 3389 端口并进行远程操作。
首先查看端口,发现目标主机 Windows XP 并未开启 3389 端口。

输入命令开启远程连接端口。

接着输入“rdesktop 192.168.44.135”连接远程 IP 地址,并输入我们创建好的 hacker 用户名及密码。

输入创建的用户名 hacker 和密码 123456 回车,弹出提示框点击 OK,稍等就会成功远程登录 XP 系统。

最后,我们还需要将新建的用户名 hacker 删除。写到这里,整个实验就讲解完毕。
四.常见错误及漏洞原因分析
1.常见错误
我们在运行 exploit 执行漏洞利用模块时,有时会有相关错误。比如一直提示“exploit completed,but no session was created”或“ConnectionRefused the connection was refused by the remote host”。需要注意:
Windows XP 系统关闭防火墙
漏洞不稳定多尝试几次

有时 XP 系统会提示“Generic Host Process for win32 services”错误。这是 svchost.exe 错误,内存溢出造成。


最终作者解决了 XP 系统无法提权的问题,在调用“show payloads”设置攻击载荷时,当我采用“set payload generic/shell_reverse_tcp”就会报错,最后我将 Payload 修改为“set payload generic/shell_bind_tcp”。
反弹 shell 失败:set payload generic/shell_reverse_tcp
反弹 shell 成功:set payload generic/shell_bind_tcp
如果仍然失败,可能需要换其他 XP 或 2003 系统进行尝试。祝好运~

2.漏洞成因
如果想了解该漏洞的原理知识,推荐以下三篇文章,后续作者也需要深入去分析各种漏洞的原代码。
https://www.cnblogs.com/justforfun12/p/5239941.html
https://bbs.pediy.com/thread-251219.htm
https://www.freebuf.com/vuls/203881.html
MS08-067 漏洞是通过 MSRPC over SMB 通道调用 Server 服务程序中的 NetPathCanonicalize 函数时触发的,而 NetPathCanonicalize 函数在远程访问其他主机时,会调用 NetpwPathCanonicalize 函数,对远程访问的路径进行规范化,而在 NetpwPathCanonicalize 函数中发生了栈缓冲区内存错误,造成可被利用实施远程代码执行。
在路径规范化的操作中,服务程序对路径字符串的地址空间检查存在逻辑漏洞。攻击者通过精心设计输入路径,可以在函数去除【…\】字符串时,把路径字符串中内容复制到路径串之前的地址空间中(低地址),达到覆盖函数返回地址,执行任意代码的目的。
这里通过 IDA Pro 打开 c:\windows\system32\netapi32.dll,找到漏洞所在的 NetpwPathCanonicalize 函数并双击。通过观察其流程图 CFG 可知,此函数并没有直接进行输入路径和规范化,而是调用了下级函数 CanonicalizePathName 来进行路径整理,将待整理的路径字符串进行规范化,然后再保存到预先分配的输出路径缓冲区 buffer 中,最终造成缓冲区溢出漏洞。

五.总结
写到这里,这篇文章就介绍结束了,通过本次实验我们复现了 MS08-067 远程代码执行漏洞,涉及漏洞发现、验证漏洞、利用漏洞的完整过程,并利用 Metasploit 工具进行 shell 反弹及深入理解,希望对您有所帮助。如何进行防御呢?一方面关闭相关端口、安装杀毒软件和补丁,另一方面在防火墙中进行流量监测,主要是针对数据包中存在的形如"\ ** \ … \ … \ *"这样的恶意路径名进行检测,最为保险的方法是使用 pcre 正则去匹配。
本次实验的完整命令:
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/528b0ef6fa3e0a7c855119e3d】。文章转载请联系作者。
评论