STEALER LOGS
EXPOSURE
WATCHLIST
RESET
DetectionBlue TeamSOCOctober 12, 2026•9 min read

Hunting from Stealer-Log Marketplace Indicators

The attacker already holds your credentials. The question is whether you learn about it from a monitoring feed or from the incident.

Scroll

Infostealer output is traded as “logs”: one archive per infected machine, containing saved credentials, cookies, autofill data, system details and often a screenshot. Defenders can use exposure data derived from those logs to find compromised accounts and infected devices before the attacker uses them. Collecting this data raises legal and ethical questions, so use lawful channels only.

Signals at a Glance

Exposure dataWhat it tells youATT&CK
Corporate email or domain with a saved password in a logAccount to reset; infected device may be personal or corporateT1589.001
Session cookie for a corporate applicationActive session to revoke nowT1539
Machine name, OS username, IP and install date in the log headerMap to the infected host in your fleetT1078
Installed security products and file paths listed in the logInfection vector and cleanup scopeT1082
Successful sign-in to an exposed account from an unfamiliar IP after exposureLikely account takeover in progressT1078

Sourcing and Handling

Load the exposed accounts into a watchlist and join them to sign-in logs. The aim is not just a reset but finding use of the credential since the infection date:

// Microsoft Sentinel (KQL) - exposed accounts with successful sign-ins from unfamiliar IPs
let Exposed = _GetWatchlist('stealer_exposed')
    | project UserPrincipalName = tolower(Account), ExposedAt = todatetime(ExposureDate);
let Known = SigninLogs
    | where TimeGenerated between (ago(90d) .. ago(7d)) and ResultType == 0
    | summarize KnownIPs = make_set(IPAddress, 200) by UserPrincipalName = tolower(UserPrincipalName);
SigninLogs
| where ResultType == 0
| extend UserPrincipalName = tolower(UserPrincipalName)
| join kind=inner Exposed on UserPrincipalName
| where TimeGenerated >= ExposedAt
| join kind=leftouter Known on UserPrincipalName
| where isnull(KnownIPs) or not(set_has_element(KnownIPs, IPAddress))
| project TimeGenerated, UserPrincipalName, IPAddress, AppDisplayName, UserAgent, ExposedAt
// tune/validate: watchlist column names are yours; exclude mobile carrier and VPN ranges

Mapping the Log to a Device

A log header normally carries the machine name, OS username, public IP, locale and time. Match those against your inventory to find the infected device, which may be unmanaged or personal. A structured working record keeps the investigation consistent:

{
  "exposure_id": "<case reference>",
  "source": "<monitoring provider or CERT>",
  "log_date": "<YYYY-MM-DD>",
  "account": "<user@yourdomain.example>",
  "host_metadata": {
    "machine_name": "<from log header>",
    "os_user": "<from log header>",
    "public_ip": "<from log header>"
  },
  "matched_asset": "<EDR device id or 'unmanaged'>",
  "actions": ["password reset", "sessions revoked", "mfa re-enrolled", "device isolated"],
  "follow_up_review_until": "<YYYY-MM-DD>"
}
Vetted sources

Use exposure data from reputable commercial providers, national CERT notifications and breach-notification services, with legal review of how raw logs are handled. Map findings with your identity provider’s sign-in logs and EDR inventory, and baseline normal sign-in locations before treating a new IP as hostile.

Build Detections That Fire

Mjolnir Security helps blue teams turn threat intelligence into high-fidelity detections across endpoint, network, identity and cloud telemetry.

Detection EngineeringManaged Detection & ResponseThreat HuntingIncident ResponsePurple Teaming
  • Detection Engineering We build and tune detections mapped to ATT&CK from your own telemetry.
  • Threat Hunting as a Service Hypothesis-driven hunts for the behaviours on this page.
  • 24/7 Incident Response Containment when a detection fires. Call +1 833 403 5875.
Written by: Mjolnir Threat Research (MTAC)  |  Published: October 12, 2026  |  Last reviewed: October 12, 2026