Retour à l'accueil

PhaaS collector.js : fingerprinting des sandboxes

L'article analyse la plateforme PhaaS avec collector.js utilisant le fingerprinting du navigateur pour filtrer les sandboxes. Décrit la détection WebGL GPU, fuite IP WebRTC, rustines anti-bot et architecture en deux étapes. Fournit les IOC et recommandations pour le SOC.

Comment PhaaS filtre les sandboxes via le fingerprinting du navigateur
Advertisement 728x90

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

Google AdInline article slot

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.

Google AdInline article slot

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 :

Google AdInline article slot
  • 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

Advertisement 728x90

Lire ensuite