TokenGrabber: Python-based MaaS Infostealer Builder

TokenGrabber (TL-2026-2643), also tracked as TokenGrabber Builder, is a high-severity malware campaign, first published 2026-09-25. It has no confirmed attribution, maps to 18 MITRE ATT&CK techniques (T1005, T1012, T1027), and is covered by 9 detection rules and 26 indicators of compromise.

Key facts for TL-2026-2643

Threat ID
TL-2026-2643
Also known as
TokenGrabber Builder, TokenGrabber MaaS, TokenGrabber Stealer
Severity
HIGH
Status
ACTIVE
Category
MALWARE
First published
2026-09-25
Last reviewed
2026-09-25
Attribution confidence
LOW
Motivation
FINANCIAL
Target regions
Global
Detection rules
9
Indicators of compromise
26

Malware and tooling in TokenGrabber

Malware and tooling: Python, TokenGrabber, Discord webhook, Telegram webhook

K7 Labs documents "TokenGrabber", a Python-based Malware-as-a-Service (MaaS) infostealer builder family. A builder (Nuitka, PyInstaller, or raw-script backends) auto-installs pip dependencies and injects an XOR-0x5A-then-Base64-encoded webhook into an embedded stealer.py payload. The Windows payload steals Chromium (17 browsers) and Firefox credentials/cookies, credit cards, Wi-Fi passwords, Discord tokens, and Roblox session cookies, performs geo/system recon, persists via a deceptive Registry Run key and scheduled task, and exfiltrates as an in-memory ZIP to an attacker-controlled webhook. No CVE or operator attribution is disclosed.

How TokenGrabber works

TokenGrabber is a Python-coded Malware-as-a-Service infostealer builder family analyzed by K7 Labs (analyst Deepa B). The distribution chain observed in the wild begins as a RAR archive named "my new program called 2.rar" (SHA-256 1ab7846f93678fb727c95df133c1b0a050760b11dd164ca5f6408e84398b676e) that unpacks to a nested TokenGrabberBuilder.zip (SHA-256 7053dc55b4ba193ea162f01a329427fd244d8163a65cbf2a7f86c04c849c8114) containing a "TokenGrabber Builder" folder. The builder compiles customized Windows executables for different operators, a hallmark of the MaaS model that provides affiliate scalability, reduced attribution (a unique per-binary webhook encoding yields a different hash per build), and a low barrier to entry via an interactive UI.

At startup the builder auto-installs required Python libraries via pip, so an unexpected runtime invocation of pip.exe is a documented detection signal. It locates a Python interpreter via _find_python() by probing PATH, %LOCALAPPDATA%\Programs\Python\, %USERPROFILE%\Python\, C:\, C:\Program Files and C:\Program Files (x86), version folders for Python 3.14-3.8, and the HKCU and HKLM SOFTWARE\Python\PythonCore registry keys. The operator-supplied webhook URL is stored in a webhook.txt file in the working directory and reused across build sessions. It is encoded with XOR using key 0x5A and then Base64, and injected as a string literal into the payload template; a runtime _x() function reverses the encoding. This means no plaintext webhook appears in binaries, producing a unique hash per webhook and weakening 1:1 URL-based signatures.

Three compilation backends are offered. Nuitka compiles Python to C then native code, leaving no recoverable Python bytecode or .pyc, defeating decompilers such as uncompyle6/decompile3 (the UI labels it "Nuitka - slower, stronger AV evasion"). PyInstaller packages the interpreter and bytecode, which is unpackable with pyinstxtractor to recover .pyc; the builder writes a custom .spec via _write_spec() excluding tkinter, matplotlib, numpy and pandas to shrink size and reduce the detection surface. A raw-script backend saves stealer.py uncompiled for manual deployment.

The embedded payload (stealer.py, SHA-256 9e471343255259f7fb388f1f07b0e023261630dbdc01f5d647dc99f452119eff) hardens against analysis and sandboxes. All sensitive strings are stored as Base64 + XOR-0x5A blobs decoded into an _E dictionary, including the webhook exfil URL (_H), the registry Run path Software\Microsoft\Windows\CurrentVersion\Run (_E["rk"]), a secondary exfiltration endpoint https://pastebin.com/api/api_post.php (_E["pburl"]), the scheduled-task command schtasks /create /tn (_E["st"]), and the Wi-Fi enumeration command netsh wlan show profiles (_E["nw"]). High-risk imports are loaded lazily via getter functions only when needed. The _debug_check() routine calls IsDebuggerPresent() via ctypes (catching x64dbg, WinDbg, PyCharm debuggers), maintains a process blacklist via psutil for VirtualBox, Xen, QEMU and Parallels artifacts, exits if total disk is below 50 GB, and uses a PID-derived variable sleep to outlast sandbox time limits.

Persistence is dual. The payload registers HKCU\Software\Microsoft\Windows\CurrentVersion\Run under the deceptive name WindowsUpdate, and creates a scheduled task with an ONLOGON trigger launched with creationflags=0x08000000 (CREATE_NO_WINDOW) and stdout/stderr redirected to DEVNULL.

Credential harvesting spans 17 Chromium-based browsers (targeting User Data directories under %LOCALAPPDATA% and %APPDATA%), Firefox profiles under %APPDATA%\Mozilla\Firefox\Profiles, Wi-Fi credentials, Discord tokens and Roblox sessions. For Chromium, the payload extracts the AES master key from Local State via os_crypt.encrypted_key using DPAPI (CryptUnprotectData), copies locked databases to temp to bypass SQLite locking, and decrypts with AES-256-GCM (or a DPAPI fallback). _f0() targets Login Data (URLs, usernames, passwords), _f1() History (browsing history with timestamps), _f2() Web Data (credit card numbers, names, expiry dates), and _f3() Cookies/Network\Cookies (session cookies). Firefox data (places.sqlite history and cookies.sqlite) is read in plaintext with no decryption. Wi-Fi passwords are pulled via netsh wlan show profiles with key=clear. Discord tokens are extracted from LevelDB (Local Storage\leveldb), decrypted with an AES-GCM key plus regex for older token formats, and validated against the live API /api/v9/users/@me before exfiltration. Roblox .ROBLOSECURITY cookies are harvested from Chromium and Firefox and checked against Roblox before packaging. Geo/system recon captures public IP, country, city, ISP, GPS coordinates, timezone, %USERNAME% and %COMPUTERNAME%.

Exfiltration assembles all data in-memory into a ZIP via BytesIO (no disk writes) named StolenData_<USERNAME>.zip and sends it via HTTP POST to the webhook endpoint, with pastebin as a secondary exfil channel. Because no CVE applies and no operator is attributed, the family is treated as an active MaaS credential-theft and session-token threat. The pattern closely parallels other open-source Python MaaS infostealer builders (e.g. BlankGrabber, Arkanix Stealer) that ship a stealer.py payload, auto-install pip dependencies, and exfiltrate via Discord/Telegram webhooks, confirming TokenGrabber sits within a broader low-barrier-to-entry credential-theft ecosystem.

Detection opportunities documented by K7 Labs include unexpected pip.exe execution, suspicious Registry Run keys and scheduled tasks, netsh wlan show profiles invocation, browser credential/cookie database access, HTTP POSTs to unknown webhook endpoints, and ZIP archives containing collected system data.

MITRE ATT&CK techniques used in TL-2026-2643

Collection

T1005 Data from Local System; T1560 Archive Collected Data

Discovery

T1012 Query Registry; T1057 Process Discovery; T1082 System Information Discovery

Defense Evasion

T1027 Obfuscated Files or Information; T1140 Deobfuscate/Decode Files or Information; T1497 Virtualization/Sandbox Evasion

Persistence

T1053 Scheduled Task/Job; T1547 Boot or Logon Autostart Execution

Execution

T1059 Command and Scripting Interpreter

defense-impairment

T1112 Modify Registry

execution

T1204 User Execution

Credential Access

T1528 Steal Application Access Token; T1539 Steal Web Session Cookie; T1552 Unsecured Credentials; T1555 Credentials from Password Stores

Exfiltration

T1567 Exfiltration Over Web Service

Remediation for TokenGrabber

Immediate actions

  • Block inbound/outbound traffic to unknown Discord/Telegram webhook endpoints and pastebin API exfil URLs at perimeter egress
  • Alert on unexpected pip.exe invocation on endpoint hosts
  • Hunt for the documented file hashes and deceptive 'WindowsUpdate' Run key / scheduled task names
  • Alert on netsh wlan show profiles with key=clear and browser credential/cookie database file reads

Workarounds

  • Disable or restrict PowerShell/script hosts and native netsh wlan profile disclosure where not required
  • Use browser password managers with OS-level protection rather than browser-native autofill stores

Longer-term hardening

  • Deploy EDR with behavioral detection for browser credential/cookie database reads, netsh wlan profile dumps, and in-memory ZIP webhook POSTs
  • Enforce application allowlisting to block unknown Python/PyInstaller/Nuitka binaries
  • Restrict Discord/Roblox session tokens at the host via token-lifetime and session controls
  • Correlate outbound webhook POSTs with in-memory archive creation (BytesIO/zipfile) as an exfiltration signal

Weaknesses (CWE) in TokenGrabber

CWE-200, CWE-522

Timeline of TokenGrabber

  • Placed within the broader open-source Python MaaS infostealer trend (BlankGrabber, Arkanix Stealer) that shares stealer.py + pip-loader + webhook-exfil architecture; no CVE and no operator attribution disclosed.
  • Exfiltration documented as an in-memory ZIP (BytesIO) named StolenData_<USERNAME>.zip POSTed to the attacker webhook, with pastebin.com/api/api_post.php as a secondary channel; geo/system recon captured.
  • Credential harvesting documented across 17 Chromium browsers (DPAPI + AES-256-GCM decryption of Login Data/History/Web Data/Cookies), Firefox profiles, Wi-Fi passwords (netsh key=clear), Discord LevelDB tokens and Roblox .ROBLOSECURITY cookies.
  • Dual persistence documented: deceptive 'WindowsUpdate' HKCU Run key and an ONLOGON scheduled task launched with CREATE_NO_WINDOW (0x08000000) and output redirected to DEVNULL.
  • Anti-analysis/sandbox evasion documented: IsDebuggerPresent() via ctypes (x64dbg/WinDbg/PyCharm), psutil process blacklist (VirtualBox/Xen/QEMU/Parallels), <50 GB disk check, PID-derived variable sleep.
  • XOR-0x5A + Base64 webhook injection into the embedded stealer.py payload (SHA-256 9e471343...eff) documented, with runtime _x() deobfuscation and webhook.txt persistence of the operator URL.
  • Nested TokenGrabberBuilder.zip (SHA-256 7053dc55...114) unpacked; Nuitka, PyInstaller and raw-script compilation backends identified, plus _find_python() interpreter discovery and automatic pip dependency installation.
  • Initial distribution sample observed in the wild as the RAR archive 'my new program called 2.rar' (SHA-256 1ab7846f...676e).
  • K7 Labs publicly documents the TokenGrabber Python MaaS infostealer builder family (analysis by Deepa B).

Sources cited for TokenGrabber

More in malware

Detection coverage for TL-2026-2643

As of 2026-09-25, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-2643 across Splunk SPL, Microsoft KQL and Sigma, covering 26 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats