# Décryptage de la plateforme PhaaS : fingerprinting via collector.js pour contourner les sandboxes
Un e-mail Gmail Workspace concernant des messages retardés a été envoyé via SendGrid avec des en-têtes SPF, DKIM et ARC valides. Expéditeur : sandeep@oesplindia[.]com, Répondre à : td@sevensounds[.]ae. Le lien pointe vers maxillae890[.]bitnest[.]za[.]com/testatrix449/*email@victim. Le domaine bitnest[.]za[.]com utilise un DNS wildcard via Cloudflare, résolvant n'importe quel sous-domaine vers les IP CDN 188[.]114[.]96[.]11 ou 188[.]114[.]97[.]11.
L'infrastructure est en deux étapes : une page d'atterrissage collecte les empreintes digitales, puis le backend décide d'afficher ou non le formulaire. L'enregistrement SPF du domaine est v=spf1 -all, excluant tout envoi légitime par e-mail.
Analyse de collector.js : collecte d'empreintes digitales
Le script collector.js?v=21e981d0 se charge en premier et rassemble les données via la fonction collect(). Il parcourt les propriétés du navigateur avec Object.getOwnPropertyNames() pour construire un objet de données.
Paramètres standards :
- Écran : résolution, profondeur de couleur.
- Navigateur : User-Agent, langue, plateforme, hardwareConcurrency, plugins.
WebGL pour l'empreinte GPU
Le code extrait les détails du GPU :
var gl = d.createElement("canvas").getContext("webgl"),
ext = gl.getExtension("WEBGL_debug_renderer_info");
data.webgl = {
vendor: gl.getParameter(ext.UNMASKED_VENDOR_WEBGL),
renderer: gl.getParameter(ext.UNMASKED_RENDERER_WEBGL)
};
Dans les sandboxes, le renderer indique SwiftShader ou llvmpipe, signalant la virtualisation.
WebRTC pour les fuites d'IP
Contournement des VPN via STUN :
var RTC = w.RTCPeerConnection || w.webkitRTCPeerConnection;
var pc = new RTC({
iceServers: [{ urls: "stun:stun.l.google.com:19302" }]
});
pc.createDataChannel("");
pc.onicecandidate = function(e) {
if (e.candidate) {
var p = e.candidate.candidate.split(" ");
data._rtc.push({ i: p[4], t: p[7], p: p[2] });
}
};
pc.createOffer().then(function(o) { return pc.setLocalDescription(o); });
Les incohérences entre les IP HTTP et WebRTC indiquent des proxies.
Techniques anti-détection
Le script vérifie l'automatisation et les DevTools :
- Patch d'Array.prototype.includes pour canPlayType :
var orig = Array.prototype.includes;
Array.prototype.includes = function() { data.proto = true; };
try { d.createElement("video").canPlayType("video/mp4"); } catch (e) {}
Array.prototype.includes = orig;
Cela se déclenche dans Puppeteer.
- Détection des DevTools via toString :
var fn = function() {}, cnt = 0;
fn.toString = function() { ++cnt; return ""; };
console.log(fn);
data.tostring = cnt;
Les DevTools ouverts appellent toString lors des logs.
Extras : événements tactiles, détection d'iframe, visibilityState, pagehide.
Soumission des données et backend
Après 120 ms, les données sont envoyées via un formulaire POST vers demo[.]bitnest[.]za[.]com/testatrix449/ :
- analytics : empreinte JSON.
- _h : hachage URL.
- _p : e-mail de la victime.
Le backend renvoie un formulaire de phishing ou bloque l'accès. Les licences expirées affichent « Votre licence a expiré ».
Liens d'infrastructure et IOC
L'IP 91[.]193[.]42[.]16 héberge sevensounds[.]ae et exquisite[.]za[.]com. Le domaine oesplindia[.]com expose les ports FTP/MySQL/SNMP sur 170[.]10[.]163[.]134.
IOC principaux :
- Domaines : bitnest[.]za[.]com, oesplindia[.]com, sevensounds[.]ae.
- IP : 188[.]114[.]96[.]11, 149[.]72[.]123[.]24 (SendGrid).
- Script : collector.js?v=21e981d0.
- STUN : stun.l.google.com:19302.
- SendGrid : user_id=60417945.
Points clés
- Configuration en deux étapes : la page d'atterrissage saute le formulaire, évitant les scanners.
- Modèle de licences : PhaaS fonctionne comme un SaaS avec accès expirant.
- Contournement des sandboxes : renderer WebGL, fuites IP WebRTC, vérifications toString DevTools.
- DNS wildcard : déploiements rapides de campagnes sous Cloudflare.
- Tactiques MITRE : T1566.002 (Spearphishing), T1217 (Découverte navigateur).
— Editorial Team
Aucun commentaire pour le moment.