漏洞背景

Samba是在Linux和UNIX系统上实现SMB协议的一个软件,2017年5月24日Samba发布了4.6.4版本,中间修复了一个严重的远程代码执行漏洞,漏洞编号CVE-2017-7494,漏洞影响了Samba 3.5.0 之后到4.6.4/4.5.10/4.4.14中间的所有版本,,确认属于严重漏洞,可以造成远程代码执行。

环境搭建

靶机环境    :                Linux-mint 17 镜像网上随便下内核版本3.13.0-24-generic x86_64

samba版本:                4.1.6-Ubuntu

然后配置smb服务配置
vim /etc/samba/smb.confg

参考其他人分析在末行加入

但是我自己测试 只需要就可以


重新reload smb的配置文件 重启服务
/etc/init.d/samba restart
/etc/init.d/samba reload
有的机器上需要关闭防火墙

/etc/init.d/iptables stop

看当前靶机ip

攻击机环境: kali2017-amd64 .iso         :https://www.kali.org/downloads/  直接安装镜像即可,linux kali 自带metasploit框架,利用起来非常的方便

Exploit_CVE-2017-7494(msf-ruby)        :https://github.com/hdm/metasploit-framework/blob/0520d7cf76f8e5e654cb60f157772200c1b9e230/modules/exploits/linux/samba/is_known_pipename.rb

在攻击机上扫描目标靶机是否445 端口是否打开,因为samba服务开启需要开启445端口

可以看到445和139端口open开启

把down下来的ruby脚本is_known_pipename.rb拷贝至kali机器上的/usr/share/metasploit-framework/modules/exploits/linux/samba/目录下

启动启动msfconsole,并选择使用is_known_pipename模块:

设置目标机ip等,看下配置选项:


开始进行攻击:

可以看到尝试着在靶机的共享目录下上传一个随机字符串生成的so文件,然后就会回连一个shell,看出ip就是靶机的ip

获取一个组ID为root的shell终端。

漏洞代码分析:

官方给出的漏洞补丁可以看出


漏洞出现在source3/rpc_server/srv_pipe.c 的475行中也就是发生在is_known_pipename函数中对传进来的管道名称进行了过滤的处理,如果管道名称中含有了“/”的字符进行了过滤,其实更严格的话应该是判断首个字符串是不是‘/’来判断是否需要过滤,后续会有介绍,那么根据补丁来进行分析肯定管道名称带有’/’会触发漏洞,所以跟进代码看一下

再跟:

继续:

 

以samba-4.5.9.tar.gz源码为例分析:

可以看出参数pipename参数传递过来就是module_name,如果首字符是’/’的话也就是管道的名称的首字符是’/’也就是传过来的是绝对路径的时候,就会跳到load_module函数中,在跟进去就是会加载上传上来的so,而且导出函数

会以SAMBA_INIT_MODULE的函数名进行导出,然后进行执行导出函数,在代码中搜一下可以

#define SAMBA_INIT_MODULE “samba_init_module”

所以上传的so必须要是以samba_init_module函数名导出才可以加载,(但是后续分析ruby exp上传的so在dlopen的时候就会结束,但是会得到反弹shell不知道为什么)

动态gdb跟踪调试:

下载 samba-4.5.9.tar.gz    链接:https://download.samba.org/pub/samba/stable/samba-4.5.9.tar.gz

./configure … –enable-debug

make

安装好对应的依赖,进行编译,因为本机的smbd服务正在运行,要首先stop系统对应的smbd的服务,然后在调试debug的smbd进程

关掉本机的smbd服务

然后进行调试debug版的smbd程序,在源码目录中的bin中smbd,以交互模式和设置配置文件路径进行启动
已经知道是在srv_pipe.c:is_known_pipename函数中,下断点,攻击机这时候发起攻击,因为为了调试所以直接就指定靶机的共享目录  /tmp

在exp  set SMB_SHARE_BASE /tmp

靶机这gdb 跟进:

 

然后跟进函数中:

打印module名称就是从攻击机上上传上来的恶意的so的名称,然后进入到load_module函数中:

然后通过do_smb_load_module->load_module函数中,最后在load_module中加载so,并且导出函数并且执行下图为加载上传的so文件:

然后加载执行,但是这个恶意的so中无论是gdb调试还是正常的运行中都会在dlopen之后退出,然后回弹一个远程shell,不再执行导出函数和执行函数的步骤,这块还不懂怎么回事,希望厉害的人可以解答一下,so就在附件中。

临时解决方案:

在samba的配置文件global节点中添加nt pipe support = 0,即关闭pipe支持(依赖pipe的功能受影响),然后重启服务。

参考链接:

Msf复现Samba远程代码执行漏洞

http://www.4hou.com/technology/4983.html

http://bobao.360.cn/learning/detail/3900.html

http://bobao.360.cn/news/detail/4180.html

https://github.com/omri9741/cve-2017-7494

https://wiki.samba.org/index.php/Build_Samba_from_Source

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

 

留言

请输入验证码 * 请输入正确的验证码