linuxsmb漏洞_Samba远程漏洞(CVE-2017-7494)利⽤分析前⾔
Samba远程漏洞(CVE-2017-7494) 被称为Linux 版的永恒之蓝,由于其影响范围⼴以及攻击成功后获得的权限⾼(⼀般默认smb服务以root权限运⾏)受到了⼴泛的关注,趁空余时间写⼀下这个漏洞的复现以及利⽤分析
漏洞成因
cve漏洞库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
IP192.168.153.131
渗透环境:信息类型详细信息系统版本kali-linux-2018.2-amd64
IP192.168.153.132
⾸先,靶机在安装时勾选Samba-Server,然后就会安装⼀个4.1.6版本有漏洞的Samba
添加SMB账户
sudo useradd [⽤户名]
sudo smbpass -a [⽤户名]
然后配置靶机/etc/f
在[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
运⾏成功后如图
若想不⽤账号密码,匿名访问只需要在f⽂件中去掉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账号密码或者允许匿名登录
对应账号⽬录下⾄少有⼀个路径可写
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论