隐藏在Chrome插件商店中的恶魔——恶意插件User-Agent Swither分析

0x00 插件背景

User-Agent Swither 是一款Chrome插件,用户切换访问web时候的User-Agent的,这个插件有51万条安装量。大部分都是前端工作人员或者安全研究人员使用,需要频繁切换User-Agent。

然而,在v2ex上有人发了这么一篇文章https://www.v2ex.com/t/389340?from=timeline

0x01 插件分析

通常,chrome插件的物理地址C:\Users\admin\AppData\Local\Google\Chrome\User Data\Default\Extensions\ffhkkpnppgnfaobgihpdblnhmmbodake 打开background.js,看这个js文件的第80行

格式化后

可以看出,这段js从promo.jpg图片中取数据。下图为这段js代码解析出来的后门js代码。

随后跳转到从图片中解析出来的javascript代码

代码抠出来是这样的

很明显,这段js代码是经过深度混淆过的。

然后,通过document.defaultView的方式来执行从图片解析出来的javascript代码。

下面需要几个知识

1.javascript中这两种调用方法是一样的。chrome.runtime.onMessagechrome["runtime"]["onMessage"]

2.=>这个符号是ES6的特性,代表匿名ES函数

3.Promise为承诺,ES6的新特性已经被大多数

0x02 恶意JavaScript分析

这段javascript用了大量的Promise对象,用了大量的=>这样的匿名函数,函数名用了"\x63\x6f\x64\x65"这种ascii码的16进制作为函数名,且使用了chrome["runtime"]["onMessage"]这种调用的方式。

首先_0x2126是一个字符串数组,数组内的数据在之后的js代码中被大量引用作为函数名。不过这个数组在function t函数中被重新排序了,排序后的

这个数组中的数据在之后被作为函数名来调用相关的函数。_0x1838('0x30')其实就是取_0x2126中第0x30个元素,也就是local

function t 就是用来对_0x2126这个list进行重新排序的函数

function e 主要作用是post数据,更新执行的步骤

比如,恶意js在init的时候,此时发送的请求如下

响应的请求

function n 主要是完成了一个xhr请求,通过executeScript来完成。

function o 用于解析返回的js代码,取出其中的code和version字段,并通过l.set方法持久化存储到本地。

function a 更新插件运行状态

function i 为入口函数

function r 是用来下载执行恶意JS

这段js里面有一个比较重要的变量c

还有一个 重要的l,l包含了四个函数EE,get,set,Yj

function EE

function get 用于从存储的文件中取数据

function set 用于将数据写入到存储文件中

function yJ

这段恶意js的执行流程如下:

这段恶意js的入口函数为function i,随后function i首先会向https://the-extension.com/stats?hash=jwtmv6kavksy5cazdf4leg66r&eventCategory=eval&eventAction=init&eventLabel=更新运行状态

随后会调用function r,这个函数完成了下载恶意js并持久化存储到本地并执行的功能。

此时向n函数中传递的参数为"https://the-extension.com/?hash=jwtmv6kavksy5cazdf4leg66r"GET,也就是用GET请求获取这个网页的内容。

下载下来的东西保存在了这里

外部的恶意js地址https://the-extension.com/?hash=jwtmv6kavksy5cazdf4leg66r,返回的json{"code":"evil javascript","version":"v20170905"}由于篇幅有限,我们把恶意的javascript省去,可以关注我们的官方博客获取详细的代码。可见这段恶意代码的版本为v20170905

0x03 外部恶意JavaScript分析

恶意js会向chrome增加一些事件的处理函数,比如新打开一个tab,这段恶意js回将你打开的网址上传到服务器上。

接受上传用户信息的apihttps://uaswitcher.org/logic/page/data,上传用户隐私数据,数据中包含用户的插件版本,tabs是重载还是新打开、用户的浏览器等。

https://uaswitcher.org/splash发送相关信息,其中s是代码中指定的,不知道含义,ver是插件的版本。返回的o是与本地的settings做对比,返回的u是接收用户隐私数据的域名。

更新恶意js的状态

这段js还会从http://api.data-monitor.info/api/bhrule?sub=116获取推广连接

顺手遍历了一下其他的id,也会存在一些规则,应该是给其他用的,这个sub=116是代码中写死的。

用于处理推广数据的代码

至此,这个恶意插件的流程就非常清楚了。

原文发布于微信公众号 - 逢魔安全实验室(FormSec)

原文发表时间:2018-02-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏公众号_薛勤的博客

Java中用final修饰参数的方法当传入i++时异常

我的项目是这样写项目运行不起来,具体原因我参考的 https://www.cnblogs.com/xiohao/p/4861500.html, 解决方法...

11130
来自专栏python3

python3--基础综合练习题

允许用户最多尝试3次,3次都没猜对的话,就直接退出,如果猜对了,打印恭喜信息并退出

30830
来自专栏IMWeb前端团队

Nodejs进阶:基于express+multer的文件上传

概览 图片上传是web开发中经常用到的功能,node社区在这方面也有了相对完善的支持。 常用的开源组件有multer、formidable等,借助这两个开源组件...

56890
来自专栏木头编程 - moTzxx

微信小程序Ⅳ [js文件的外部引用]

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/de...

88320
来自专栏黄Java的地盘

如何实现一个简单的Node.js脚手架

对前端、Node操作有一定的了解,同时向了解脚手架开发过程或者需要自己实现一个脚手架的开发者。

19410
来自专栏Java面试笔试题

什么是DAO模式?

DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访...

13820
来自专栏圆方圆学院精选

【刘文彬】RPC的基础:调研EOS插件http_plugin

原文链接:醒者呆的博客园,https://www.cnblogs.com/Evsward/p/httpPlugin.html

13410
来自专栏LuckQI

学习Java基础知识,打通面试关~十七了解类的加载过程

在我们Java程序中我们所写的Calss文件最终都会加载到内存当中,再次过程中会进行数据校验,转换解析和初始化的操作。完成后就可以形成我们虚拟机所需要的Java...

12520
来自专栏python3

python3--协程,greenlet模块,gevent模块

之前学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知...

32730
来自专栏达摩兵的技术空间

你不知道的opn模块

opn模块通常是作为跨平台的打开文件或者网站的模块,在web应用中最常见的使用是比如项目开发或者启动的时候打开浏览器进行访问。

7110

扫码关注云+社区

领取腾讯云代金券