PhaaS 플랫폼 분석: collector.js 지문 수집으로 샌드박스 우회
Gmail Workspace에서 지연 메시지 알림 이메일이 SendGrid를 통해 SPF, DKIM, ARC가 유효한 상태로 발송되었습니다. 발신자: sandeep@oesplindia[.]com, 답장-To: td@sevensounds[.]ae. 링크는 maxillae890[.]bitnest[.]za[.]com/testatrix449/*email@victim으로 연결됩니다. bitnest[.]za[.]com 도메인은 Cloudflare의 와일드카드 DNS를 사용해 모든 서브도메인을 CDN IP 188[.]114[.]96[.]11 또는 188[.]114[.]97[.]11로 해석합니다.
인프라는 2단계 구조입니다: 랜딩 페이지에서 지문을 수집한 후 백엔드가 폼 표시 여부를 결정합니다. 해당 도메인의 SPF 레코드는 v=spf1 -all로, 합법적 이메일이 아님을 확인합니다.
collector.js 분석: 지문 수집
collector.js?v=21e981d0 스크립트가 먼저 로드되어 collect() 함수로 데이터를 수집합니다. Object.getOwnPropertyNames()를 사용해 브라우저 속성을 반복하며 데이터 객체를 구축합니다.
표준 파라미터:
- 화면: 해상도, 색상 깊이.
- Navigator: User-Agent, 언어, 플랫폼, hardwareConcurrency, 플러그인.
WebGL을 통한 GPU 지문
코드가 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)
};
샌드박스에서는 렌더러가 SwiftShader 또는 llvmpipe로 보고되어 가상화가 탐지됩니다.
WebRTC를 통한 IP 유출
STUN으로 VPN 우회:
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); });
HTTP와 WebRTC IP 불일치가 프록시를 신호합니다.
탐지 방지 기법
스크립트는 자동화와 DevTools를 확인합니다:
- Array.prototype.includes 패칭 for 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;
Puppeteer에서 작동합니다.
- DevTools 탐지 via toString:
var fn = function() {}, cnt = 0;
fn.toString = function() { ++cnt; return ""; };
console.log(fn);
data.tostring = cnt;
DevTools가 열려 있으면 로깅 중 toString이 호출됩니다.
추가: 터치 이벤트, iframe 탐지, visibilityState, pagehide.
데이터 제출 및 백엔드
120ms 후 데이터가 POST 폼으로 demo[.]bitnest[.]za[.]com/testatrix449/에 전송됩니다:
- analytics: JSON 지문.
- _h: URL 해시.
- _p: 피해자 이메일.
백엔드가 피싱 폼을 반환하거나 접근을 차단합니다. 라이선스 만료 시 "Your license has expired" 표시.
인프라 연계 및 IOC
IP 91[.]193[.]42[.]16이 sevensounds[.]ae와 exquisite[.]za[.]com을 호스팅합니다. oesplindia[.]com 도메인이 170[.]10[.]163[.]134에서 FTP/MySQL/SNMP 포트를 노출합니다.
주요 IOC:
- 도메인: bitnest[.]za[.]com, oesplindia[.]com, sevensounds[.]ae.
- IP: 188[.]114[.]96[.]11, 149[.]72[.]123[.]24 (SendGrid).
- 스크립트: collector.js?v=21e981d0.
- STUN: stun.l.google.com:19302.
- SendGrid: user_id=60417945.
주요 요약
- 2단계 설정: 랜딩 페이지가 폼을 건너뛰어 스캐너 회피.
- 라이선스 모델: PhaaS가 SaaS처럼 만료 액세스 운영.
- 샌드박스 우회: WebGL 렌더러, WebRTC IP 유출, DevTools toString 확인.
- 와일드카드 DNS: Cloudflare 아래 빠른 캠페인 전개.
- MITRE 전술: T1566.002 (스피어피싱), T1217 (브라우저 정보 수집).
— Editorial Team
아직 댓글이 없습니다.