Infostealer Browser Credential Theft
Infostealers systematically harvest credentials, cookies, and autofill data from browser credential databases. This is the single invariant behavior across all stealer families regardless of obfuscation or bypass technique. Hudson Rock tracks 30+ million infected computers; 1.8 billion credentials were stolen in 2025 alone, with enterprise credentials present in 14% of infections (up from 6% in early 2024). The Snowflake breach (2024) demonstrated downstream impact: UNC5537 used infostealer-harvested credentials for initial access to 160+ organizations. LummaC2 (51% of dark web credential logs before its May 2025 takedown), Stealc, RedLine, Raccoon, Vidar, AMOS, and Medusa all share the invariant: the stealer process must open browser credential files (Login Data, Cookies, logins.json) and invoke CryptUnprotectData() or NSS3 decryption. This is a kernel-observable event regardless of family or Chrome App-Bound Encryption bypass technique used.
Attack Chokepoints 3 invariant stages
Each stage is an invariant condition the attacker must satisfy, regardless of tool, variant, or threat actor. Detection at any stage breaks the chain.
1 Credential Database Access ▶
- Code execution on victim machine (via ClickFix, malvertising, cracked software, game cheats, SEO poisoning, YouTube malware, or social engineering)
- Target must use a Chromium-based browser (Chrome, Edge, Brave, Opera, etc.) or Firefox
- Browser credential database files must be accessible (not locked by exclusive handle; Chrome Login Data is typically not exclusively locked)
- {"For App-Bound Encryption bypass variants"=>"Chrome must be installed (COM elevation requires GoogleChromeElevationService); OR Chrome must be running (CDP bypass); OR stealer must have code injection capability (memory injection bypass)"}
- Outbound network access for C2 exfiltration (though some variants stage locally and exfiltrate via separate channel)
- Sysmon Event ID 10 (Process Access)
- Sysmon Event ID 11 (File Created/Accessed)
- Windows Security Event ID 4663 (Object Access)
2 Credential Decryption ▶
- ETW DPAPI provider
- Sysmon Event ID 1 (Process Creation for COM/CDP bypass processes)
- Windows Security Event ID 4688
3 Data Exfiltration ▶
- Sysmon Event ID 3 (Network Connection)
- Sysmon Event ID 22 (DNS Query)
- Web proxy logs
Variations 12 variants tracked
Tools and methods that exploit this chokepoint. The list grows. The chokepoint doesn't change.
LummaC2 2022-Q4 Disrupted (May 2025) / Active (rebrand expected) ▶
# Post-ClickFix delivery chain:
powershell.exe -enc <base64> → downloads LummaC2 loader
# Loader copies browser DBs:
copy "%LOCALAPPDATA%\Google\Chrome\User Data\Default\Login Data" %TEMP%\lg.db
copy "%LOCALAPPDATA%\Google\Chrome\User Data\Local State" %TEMP%\ls.json
# Calls CryptUnprotectData via embedded DPAPI wrapper
# Exfils via HTTPS POST to rotating C2 domains
- Sysmon EID 10: Non-browser process accessing Login Data / Cookies files
- ETW: CryptUnprotectData called by non-browser process
- Sysmon EID 3: HTTPS POST to low-reputation domain from stealer process
Stealc 2023-Q1 Active ▶
# StealC v2 — JSON-based C2, Themida-packed:
# Copies Login Data, Cookies, Local State from all Chromium profiles
# CryptUnprotectData for DPAPI decryption
# Multi-monitor screenshot capture
# HTTPS POST exfil with JSON format
- Sysmon EID 10: Non-browser process accessing Login Data / Cookies
- Sysmon EID 3: HTTPS POST to C2 with JSON-formatted exfil
RedLine 2020-Q1 Disrupted (Oct 2024) / Variants Active ▶
# .NET stealer targeting all Chromium + Firefox:
# Uses SQLite library to query browser DBs directly
# Targets: Login Data, Cookies, logins.json, key4.db
# Also: VPN credentials, FTP clients, crypto wallets
# Exfils via HTTP POST to C2 panel
- Sysmon EID 10: .NET process accessing browser credential files
- Sysmon EID 7: System.Data.SQLite.dll loaded by non-browser process
- Sysmon EID 3: HTTP POST exfil to C2 panel
Raccoon v2 2022-Q3 Active ▶
# C++ rewrite (June 2022 relaunch):
# Targets 60+ browsers, DPAPI-based Chromium decryption
# Reads Login Data, Cookies, Local State from all profiles
# HTTP POST exfil with structured log format
- Sysmon EID 10: Non-browser C++ process accessing browser credential files
- Sysmon EID 3: HTTP POST to C2 with structured credential log
Vidar 2.0 2025-Q4 Active ▶
# Pure C rewrite (October 2025):
# Memory injection into chrome.exe for ABE bypass
# Calls decryption APIs from within trusted Chrome context
# Bypasses ABE without COM or CDP
- Sysmon EID 10: Process access to chrome.exe with PROCESS_ALL_ACCESS
- Sysmon EID 8: CreateRemoteThread into chrome.exe from non-browser process
AMOS (Atomic macOS Stealer) 2023-Q2 Active ▶
# macOS execution chain:
osascript -e 'display dialog "Chrome needs your password" default answer "" with hidden answer'
# Captures admin password via fake dialog
# Accesses Safari Keychain, Chrome Login Data, Firefox logins.json
# Exfils via HTTP POST to Telegram bot
- macOS: osascript spawning dialog for credential capture
- File access: Non-browser process reading Chrome/Safari credential files
- Network: HTTP POST to api.telegram.org from non-Telegram process
EDDIESTEALER 2025-Q2 Active ▶
# Chrome DevTools Protocol (CDP) bypass:
chrome.exe --remote-debugging-port=9222
# Connects via WebSocket to CDP endpoint
# Extracts cookies via Network.getCookies without touching encrypted DB
- Sysmon EID 1: chrome.exe launched with --remote-debugging-port
- Sysmon EID 3: WebSocket connection to localhost:9222 from non-browser
Medusa Stealer 2024-Q1 Active ▶
# Broadest coverage: 100+ browsers
# Targets Chromium, Gecko, Electron apps
# Also targets password manager databases
# Same DPAPI/NSS3 decryption pattern
- Sysmon EID 10: Non-browser process accessing 100+ browser profile paths
- Sysmon EID 3: Large HTTP POST exfil (high volume from broad targeting)
Chrome App-Bound Encryption Bypass (COM Elevation) 2024-Q3 Active ▶
# Embedded in stealer code — no standalone CLI:
# Elevates via GoogleChromeElevationService COM interface
# to call app-bound decryption in trusted process context
# Achieved ~45 days after ABE launch (July 2024)
- Windows System: COM activation of GoogleChromeElevationService
- Source process is NOT chrome.exe (the anomaly)
- Sysmon EID 1: Chrome Elevation Service spawned by unusual parent
North Korean APT Infostealer Operations 2024-Q1 Active ▶
# NK groups use commodity stealers + custom tools:
# Deployed via trojanized crypto/DeFi apps
# Credential theft feeds financial operations
# ByBit heist ($1.5B, Feb 2025) used stealer credentials
- Same as commodity stealer artifacts. Login Data access, DPAPI calls.
- Additional: Crypto wallet file access (wallet.dat, keystore files)
Contagious Interview (OtterCookie / North Korean Fake Job Interview Stealer) 2024-Q3 Active ▶
# Delivery via fake developer job interview:
node.exe malicious_package/index.js
# OtterCookie JS backdoor steals crypto keys, browser creds, SSH keys
# Heavy obfuscation since October 2025
- Sysmon EID 1: node.exe executing from npm cache or project directory
- Sysmon EID 10: node.exe accessing browser credential files
- File access: SSH key files, crypto wallet files accessed by node.exe
Storm-2561 Fake VPN Client Stealer 2025-Q2 Active ▶
# SEO poisoning → spoofed VPN download site → GitHub ZIP:
msiexec /i fake_vpn_installer.msi
# Side-loaded DLL signed by "Taiyuan Lihua" harvests VPN + browser creds
- Sysmon EID 1: msiexec.exe installing MSI from Downloads/Temp
- Sysmon EID 7: DLL loaded with Taiyuan Lihua signature
- Sysmon EID 10: Process accessing VPN credential stores + browser files
Detection Strategy
Rules organized by the chokepoint stage they detect. Each stage has one or more rules at different maturity levels.
Raw Log Samples 5 samples
Real-world log events produced by this technique and which Sigma rules they trigger.
EID 11 Sysmon Non-browser process copies Chrome Login Data to temp directory (credential harvesting) ▶
EID 4663 Windows Event Log Audit file access. Non-browser process reads the Login Data credential database. ▶
EID 11 Sysmon Stealer copies Login Data to TEMP directory to avoid Chrome file lock ▶
EID 8 Sysmon CryptUnprotectData API call observed via Sysmon API monitoring. DPAPI decryption of harvested credentials. ▶
EID 3 Sysmon Outbound C2 exfiltration connection immediately following credential decryption ▶
Emulation
ATT&CK: T1555.003 Simulates infostealer browser credential access patterns for detection validation powershell ▶
#Requires -Version 5.1
# MITRE ATT&CK: T1555.003 — Credentials from Web Browsers
# Simulates non-browser process access to Chrome Login Data, DPAPI decryption call, and outbound connection.
[CmdletBinding()]
param(
[switch]$SkipNetwork,
[switch]$CleanupOnly
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
$ChromeLoginDataPath = Join-Path $env:LOCALAPPDATA `
'Google\Chrome\User Data\Default\Login Data'
$TempCopy = Join-Path $env:TEMP "~cred_emu_$(Get-Random).db"
$C2Endpoint = 'https://example.com' # benign destination — change to your lab listener
function Write-Step ([string]$Message) {
Write-Host "[*] $Message" -ForegroundColor Cyan
}
function Write-Ok ([string]$Message) {
Write-Host "[+] $Message" -ForegroundColor Green
}
function Write-Warn ([string]$Message) {
Write-Host "[!] $Message" -ForegroundColor Yellow
}
function Remove-Artefacts {
if (Test-Path $TempCopy) {
Remove-Item -Path $TempCopy -Force -ErrorAction SilentlyContinue
Write-Ok "Removed temp file: $TempCopy"
}
}
if ($CleanupOnly) {
Remove-Artefacts
exit 0
}
Write-Host ""
Write-Host "=== Browser Credential Theft Emulation ===" -ForegroundColor Magenta
Write-Host " T1555.003 | Detection Chokepoints Project" -ForegroundColor DarkGray
Write-Host ""
if (-not (Test-Path $ChromeLoginDataPath)) {
Write-Warn "Chrome Login Data not found at: $ChromeLoginDataPath"
Write-Warn "Chrome must be installed and have been launched at least once."
Write-Warn "Falling back to synthetic file for file-access telemetry only."
$ChromeLoginDataPath = $null
}
Write-Step "Step 1/3 — Opening browser credential store (file access telemetry)"
Write-Verbose " Target: $ChromeLoginDataPath"
if ($ChromeLoginDataPath) {
try {
# Open the file read-only to trigger file-access audit events.
# Chrome locks Login Data while running; we copy first (also an Analyst indicator).
$fs = [System.IO.File]::Open(
$ChromeLoginDataPath,
[System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read,
[System.IO.FileShare]::ReadWrite
)
$buf = New-Object byte[] 4
[void]$fs.Read($buf, 0, 4) # read SQLite magic bytes only — no credential parsing
$fs.Close()
Write-Ok "File access completed (read 4 bytes — SQLite header only, no credentials parsed)"
}
catch [System.IO.IOException] {
# Chrome is running and has an exclusive lock — copy approach instead
Write-Warn "Chrome is running (file locked). Using file copy to trigger EID 11."
Copy-Item -Path $ChromeLoginDataPath -Destination $TempCopy -ErrorAction SilentlyContinue
Write-Ok "Copied Login Data to: $TempCopy"
}
} else {
# Synthetic fallback: create a dummy file in TEMP to generate EID 11
[System.IO.File]::WriteAllText($TempCopy, "SQLite format 3`0")
Write-Ok "Created synthetic credential file at: $TempCopy"
}
Start-Sleep -Milliseconds 500
Write-Step "Step 2/3 — Calling CryptUnprotectData (DPAPI decryption telemetry)"
Add-Type -TypeDefinition @'
using System;
using System.Runtime.InteropServices;
using System.Text;
public class Dpapi {
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public struct DATA_BLOB {
public int cbData;
public IntPtr pbData;
}
[DllImport("crypt32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool CryptUnprotectData(
ref DATA_BLOB pDataIn,
StringBuilder szDataDescr,
IntPtr pOptionalEntropy,
IntPtr pvReserved,
IntPtr pPromptStruct,
int dwFlags,
ref DATA_BLOB pDataOut);
public static bool TestDpapi() {
// Encrypt a benign string, then decrypt — exercises the CryptUnprotectData API path
byte[] plain = Encoding.UTF8.GetBytes("detection-chokepoints-emulation-test");
byte[] encrypted = System.Security.Cryptography.ProtectedData.Protect(
plain, null, System.Security.Cryptography.DataProtectionScope.CurrentUser);
DATA_BLOB inBlob = new DATA_BLOB();
DATA_BLOB outBlob = new DATA_BLOB();
inBlob.cbData = encrypted.Length;
inBlob.pbData = Marshal.AllocHGlobal(encrypted.Length);
Marshal.Copy(encrypted, 0, inBlob.pbData, encrypted.Length);
bool result = CryptUnprotectData(ref inBlob, null, IntPtr.Zero,
IntPtr.Zero, IntPtr.Zero, 0, ref outBlob);
Marshal.FreeHGlobal(inBlob.pbData);
if (result) Marshal.FreeHGlobal(outBlob.pbData);
return result;
}
}
'@ -ReferencedAssemblies 'System.Security'
try {
$result = [Dpapi]::TestDpapi()
if ($result) {
Write-Ok "CryptUnprotectData called successfully (benign test data decrypted)"
} else {
Write-Warn "CryptUnprotectData returned false — API monitoring telemetry may still fire"
}
} catch {
Write-Warn "DPAPI call skipped: $_"
}
Start-Sleep -Milliseconds 500
if (-not $SkipNetwork) {
Write-Step "Step 3/3 — Making outbound connection (network exfiltration telemetry)"
Write-Verbose " Destination: $C2Endpoint"
try {
$response = Invoke-WebRequest -Uri $C2Endpoint -Method HEAD `
-TimeoutSec 10 -UseBasicParsing -ErrorAction Stop
Write-Ok "Network connection completed (HTTP $($response.StatusCode) from $C2Endpoint)"
} catch {
Write-Warn "Network request failed (connection telemetry may still have been generated): $_"
}
} else {
Write-Warn "Step 3 skipped (-SkipNetwork flag set)"
}
Write-Host ""
Write-Step "Cleaning up artefacts"
Remove-Artefacts
Write-Host ""
Write-Host "=== Emulation Complete ===" -ForegroundColor Magenta
Write-Host ""
Write-Host "Expected detections:" -ForegroundColor White
Write-Host " [Research] Sysmon EID 10/11 or WEL EID 4663 — non-browser file access" -ForegroundColor DarkCyan
Write-Host " [Hunt] EID 10 + CryptUnprotectData within 60 seconds" -ForegroundColor DarkYellow
Write-Host " [Analyst] EID 10/11 + Sysmon EID 3 (outbound connection)" -ForegroundColor DarkGreen
Write-Host ""
Write-Host "If no alerts fired, verify:" -ForegroundColor DarkGray
Write-Host " - Sysmon is running with a config that captures EID 3/8/10/11"
Write-Host " - Object Access auditing is enabled (auditpol) for EID 4663"
Write-Host " - Sigma rules are deployed and log sources are ingested"
Write-Host ""
OSINT Pivots
behavior_files:"Login Data" behavior_files:"Local State" positives:0
http.html:"stealer" http.html:"logs" http.html:"panel"
page.title:"Join meeting" NOT domain:zoom.us NOT domain:teams.microsoft.com NOT domain:meet.google.com NOT domain:webex.com NOT domain:gotomeeting.com