前言
Samba远程漏洞(CVE-2017-7494) 被称为Linux 版的永恒之蓝,由于其影响范围广以及攻击成功后获得的权限高(一般默认smb服务以root权限运行)受到了广泛的关注,趁空余时间写一下这个漏洞的复现以及利用分析
漏洞成因
Linux Samba 协议实现代码中,处于source3/rpc_server/srv_pipe.c
中的is_known_pipename()
函数对路径过滤不严格导致攻击者可以上传恶意可执行文件然后构造对应的payload调用恶意文件导致远程代码执行。
以下Samba版本受到影响:
- 3.5.0- 4.6.4
- 3.5.0- 4.5.10
- 3.5.0- 4.4.14
漏洞成因:
处于\source3\rpc_server\src_pipe.c
的is_known_pipename()
函数未对传进来的管道名pipename
的路径分隔符/
进行识别过滤,导致可以用绝对路径调用恶意的so文件,从而远程任意代码执行。
首先看到is_known_pipename()
函数
跟进到smb_probe_module()
再跟进到do_smb_load_module(),发现调用的过程就在其中,调用了传进来的moudule_name
对应的init_samba_module
函数
我们可以通过smb
服务上传一个恶意的so
文件,该文件包含一个输出函数init_samba_module
,随后通过上述过程进行调用,执行任意代码。
漏洞复现
环境配置
信息类型 | 详细信息 |
---|---|
系统版本 | ubuntu-14.04-server-amd64 |
Samba版本 | 4.1.6-Ubuntu |
IP | 192.168.153.131 |
渗透环境:
信息类型 | 详细信息 |
---|---|
系统版本 | kali-linux-2018.2-amd64 |
IP | 192.168.153.132 |
首先,靶机在安装时勾选Samba-Server
,然后就会安装一个4.1.6版本有漏洞的Samba
添加SMB账户
sudo useradd [用户名] sudo smbpass -a [用户名]
然后配置靶机/etc/samba/smb.conf
在[global]
处添加一个security=[用户名]
然后再文件尾追加一个配置信息,[sambaTest]
为共享名,随意加
[sambaTest] comment= 'smb cve test' # 内容 browseable=yes # 可浏览 writeable=yes #可写 path= /home/ testzero_ 123/test1D/ test2D #共享文件夹路径 public=no #是否公开匿名访问 read only=no #只读 create mask=777 #权限码
建立对应共享文件夹并改权限
mkdir [path] sudo chmod 777 [path]
重载、启动SMB服务
sudo /etc/init.d/smbd reload
sudo /etc/init.d/smbd restart
利用
利用Metasploit
加载is_known_pipename Exploit
进行利用
启动msf
然后配置一下msf
若想不用账号密码,匿名访问只需要在smb.conf
文件中去掉security=[用户名]
并设置public=yes
就好了,之后在msf
中就可以不设置smbuser
和smbpass
了。
POC分析
POC本地msf
路径 :
/usr/share/metasploit-framework/modules/exploits/linux/samba/is_konwn_pipename.rb
Github地址: is_known_pipename.rb
Exploit脚本为Ruby
编写,由于我还没学习Ruby
,所以有不正确之处还读者请斧正。
POC过程
1. 建立SMB连接。若需要账号密码登录,则必须登录后才能继续
从微软上扒的SMB协议建立时序图:
POC对应代码:
这个代码没啥好看的,调用库的SMB连接函数罢了
2. 利用NetShareEnumAll
遍历目标服务器的共享名(ShareName)以及获取对应的共享文件夹下的可写路径(Path)
对应poc代码:
其中find_writeable_path()
函数需要跟进看一下:
再跟进看enumerate_directories()
以及verify_writeable_directory
函数
可以看到代码逻辑很清楚,首先遍历出当前路径所有的文件夹,然后尝试往里面写一个随机的txt文件用作可写测试,随后删除掉txt文件,记录下可写的文件路径。
至此,我们得到了一个共享名(即本例中的sambaTest)以及其当前路径下的可写目录(Path)
3. 利用NetShareGetInfo获取共享文件夹的绝对路径(SharePath)
对应代码:
至此获取到了共享名sambaTest的绝对路径。
值得注意的是,这里跟早期的Payload不一样,早期的payload是靠暴力猜解目录,所以跟一些分析文章有些出入。现在的Payload是根据NetShareGetInfo直接获取到准确的路径,极大地提高了攻击的成功率。
4. 上传恶意so文件
其中写入的so文件是Metasploit
生成的反弹shell,很简单的执行一句命令。有一点需要注意的是里面的函数名必须是samba_init_module
并且是一个导出函数,这个原因上述的漏洞分析也有提及。
5. 调用恶意文件,并执行echo命令打印随机字符串检验是否调用成功
利用从第2步获取到的可写文件目录(Path)以及从第3步得到的共享文件绝对路径(SharePath)构造恶意管道名\\PIPE\/SharePath/Path/Evil.so
,然后通过SMB_COM_NT_CREATE_ANDX进行调用。
在复现时,第一次调用恶意so文件总会失败,产生Error Code
为:STATUS_OBJECT_NAME_NOT_FOUND的错误。尚未能明白为什么会出现这种首次失败的情况,并且网上的复现均未出现这种情况,也许要详细看看smb协议才能知道了。
POC代码将STATUS_OBJECT_PATH_INVALID作为我们payload被加载的标志,随后就是用NBSS协议进行了一次远程代码执行的测试,执行代码为echo随机字符串。
6.删除恶意so文件,断开smb连接
至此,exploit的流程结束,现在攻击者通过恶意so文件反弹的shell,已经具有远程命令执行的能力了
利用条件总结:
- Samba 版本具有漏洞
- 知道smb账号密码或者允许匿名登录
- 对应账号目录下至少有一个路径可写
本文作者为Mr.Bai,转载请注明。