# Desglosando la Plataforma PhaaS: Fingerprinting con collector.js para Evadir Sandboxes
Un correo de Gmail Workspace sobre mensajes retrasados fue enviado vía SendGrid con SPF, DKIM y ARC válidos. Remitente: sandeep@oesplindia[.]com, Responder a: td@sevensounds[.]ae. El enlace apunta a maxillae890[.]bitnest[.]za[.]com/testatrix449/*email@victim. El dominio bitnest[.]za[.]com usa DNS wildcard vía Cloudflare, resolviendo cualquier subdominio a IPs de CDN 188[.]114[.]96[.]11 o 188[.]114[.]97[.]11.
La infraestructura es de dos etapas: una página de aterrizaje recolecta huellas dactilares, luego el backend decide si mostrar el formulario. El registro SPF del dominio es v=spf1 -all, descartando correos legítimos.
Análisis de collector.js: Recolección de Huellas
El script collector.js?v=21e981d0 se carga primero y recopila datos mediante la función collect(). Itera sobre propiedades del navegador usando Object.getOwnPropertyNames() para construir un objeto de datos.
Parámetros estándar:
- Pantalla: resolución, profundidad de color.
- Navegador: User-Agent, idioma, plataforma, hardwareConcurrency, plugins.
WebGL para Huellas de GPU
El código extrae detalles de la 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)
};
En sandboxes, el renderizador reporta SwiftShader o llvmpipe, detectando virtualización.
WebRTC para Fugas de IP
Evadiendo VPNs vía 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); });
Desajustes entre IPs HTTP y WebRTC indican proxies.
Técnicas Antidetección
El script verifica automatización y DevTools:
- Parcheo de Array.prototype.includes para 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;
Esto se activa en Puppeteer.
- Detección de DevTools vía toString:
var fn = function() {}, cnt = 0;
fn.toString = function() { ++cnt; return ""; };
console.log(fn);
data.tostring = cnt;
DevTools abiertos llaman a toString durante el registro.
Extras: eventos táctiles, detección de iframe, visibilityState, pagehide.
Envío de Datos y Backend
Tras 120 ms, los datos se envían vía formulario POST a demo[.]bitnest[.]za[.]com/testatrix449/:
- analytics: huella JSON.
- _h: hash de URL.
- _p: email de la víctima.
El backend devuelve un formulario de phishing o bloquea el acceso. Licencias vencidas muestran "Your license has expired".
Vínculos de Infraestructura e IOCs
La IP 91[.]193[.]42[.]16 aloja sevensounds[.]ae y exquisite[.]za[.]com. El dominio oesplindia[.]com expone puertos FTP/MySQL/SNMP en 170[.]10[.]163[.]134.
IOCs clave:
- Dominios: bitnest[.]za[.]com, oesplindia[.]com, sevensounds[.]ae.
- IPs: 188[.]114[.]96[.]11, 149[.]72[.]123[.]24 (SendGrid).
- Script: collector.js?v=21e981d0.
- STUN: stun.l.google.com:19302.
- SendGrid: user_id=60417945.
Lecciones Clave
- Configuración de Dos Etapas: La página de aterrizaje omite el formulario, evadiendo escáneres.
- Modelo de Licencias: PhaaS funciona como SaaS con accesos caducados.
- Evasión de Sandboxes: Renderizador WebGL, fugas de IP WebRTC, verificaciones toString de DevTools.
- DNS Wildcard: Campañas rápidas bajo Cloudflare.
- Tácticas MITRE: T1566.002 (Spearphishing), T1217 (Descubrimiento de Navegador).
— Editorial Team
Aún no hay comentarios.