0x01 概述
Samba的is_known_pipename
函数中,pipename路径符号存在漏洞,未过滤 /
符号。攻击者连接上一个可写的共享目录,通过上传恶意的链接库文件,并构造一个指向该库文件的管道名,使服务端程序加载并执行它,从而实现远程代码执行。
0x02 影响
影响Samba 3.5.0到4.6.4/4.5.10/4.4.14的中间版本。 利用条件:
- 可访问Samba端口,默认445端口
- 拥有共享文件写入权限,如:匿名可写等
- 恶意攻击者需猜解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服务
0x04 Exploit测试
已有用户向Metasploit提交Exploit模块: Metasploit Exploit , 相关PullRequest
首先安装一个漏洞版本的Samba软件,配置一个匿名可写的共享目录,并重启服务。
也可以使用网上的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利用过程如下:
Exploit获取的默认为nobody权限,如果smb.conf中配置了 guest account=root
,则可以获得root权限。
id
uid=0(root) gid=0(root) groups=0(root)