Amber Albatross — PUP-Bundled → PyInstaller Stealer
cmd.exe/powershell.exe — a stealer that runs a familiar reconnaissance burst. Defensive hunt & harden pack.Executive Summary
Amber Albatross is a Red Canary-named activity cluster (tracked since January 2024) that starts from a potentially-unwanted program (PUP) bundle and ends in a stealer. Victims install free "utility" software — observed bundled in downloads from PcAppStore, Bit Guardian's Bit Driver Updater, and Malware Crusher — which executes an installer (often InnoSetup) that drops and runs a binary. A complex, obfuscated, anti-analysis chain eventually unpacks a Pyarmor-obfuscated PyInstaller executable, launched via cmd.exe and powershell.exe, which then fires a sequence of reconnaissance commands typical of infostealers.
The PUP/installer framing gives it a veneer of legitimacy that defeats reputation-only defenses, and the Pyarmor+PyInstaller packaging frustrates static analysis. The durable detection targets are therefore the PyInstaller-from-temp execution (the unpacked stealer), the installer → shell → packed-exe lineage, and the stealer recon burst. The cluster sits in the same loader/stealer ecosystem as HijackLoader (IDAT/GHOSTPULSE), Arechclient2, and dllFake.
_MEI extraction directory) and Q3 (a recon burst from that process). Treat any hit as a credential-stealer infection — rotate browser-stored creds.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry |
|---|---|---|---|
| 1 · Vendor research | Red Canary — Amber Albatross (Threat Detection Report) | PUP → InnoSetup → Pyarmor PyInstaller stealer; cmd/powershell launch; recon burst | yes |
| 1 · Vendor research | Red Canary — Intelligence Insights (Apr/May 2025) | Amber Albatross alongside HijackLoader/Arechclient2; bundled-PUP sources | yes |
| 2 · Vendor | Red Canary — HijackLoader / Field Guide | Loader ecosystem (IDAT/GHOSTPULSE), adjacent stealers (Arechclient2, dllFake) | partial |
Decisions: payload-anchored on the unpacked Pyarmor PyInstaller + recon burst (the PUP/installer front is varied and looks legitimate); cross-references the SocGholish / Scarlet Goldfinch loader-ecosystem packs and the HijackLoader adjacency; behavior over atomic IOCs since the bundles/installers rotate.
Hunt Brief & Attack Chain
Working hypothesis: A user installs a bundled "utility"; an InnoSetup installer drops a payload that, through an obfuscated chain, unpacks a Pyarmor PyInstaller stealer launched via cmd/powershell, which profiles the host and steals credentials.
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 · PUP install | Bundled "utility" (PcAppStore / Bit Driver Updater / Malware Crusher) | ProcessRollup2; install | N1; N2 |
| 2 · InnoSetup | InnoSetup installer drops & runs a binary | ProcessRollup2 | Q2 |
| 3 · Obfuscated chain | Anti-analysis stages unpack the payload (Pyarmor) | ProcessRollup2 | Q4 |
| 4 · Stealer exec | PyInstaller exe (_MEI temp extraction) launched via cmd/powershell | ProcessRollup2; file write | Q1 / Q5 |
| 5 · Recon | whoami / systeminfo / ipconfig / tasklist burst | ProcessRollup2 | Q3 |
| 6 · Theft / C2 | Browser-credential theft; exfil | file read; network | Q6 |
Affected surface & telemetry
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Windows user endpoints | Process lineage + command line (ProcessRollup2) | Critical | Low — standard sensor |
| PyInstaller extraction | File writes to _MEI* temp dirs | High | Low — reliable marker |
| Browser credential theft | File read on browser profile DBs | Medium | High — file reads weak; pivot |
| PUP delivery | Proxy / software inventory | Medium | Medium — bundled installers |
Consolidated IOC Table
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| Behavior | PyInstaller exe (_MEI temp extraction) from a user path via cmd/powershell | high | detect | Unpacked stealer — flagship |
| Behavior | recon burst (whoami/systeminfo/ipconfig/tasklist) from the packed exe | high | detect | Stealer profiling |
| Software | PcAppStore · Bit Driver Updater · Malware Crusher (PUP bundlers) | medium | hunt | Delivery vehicles |
| Behavior | InnoSetup installer dropping & executing a binary | medium | hunt | Installer stage |
| Packer | Pyarmor-obfuscated PyInstaller | medium | hunt | Anti-analysis packaging |
ATT&CK Mapping
| Tactic | Technique | Observed Behavior | Query / Control |
|---|---|---|---|
| Initial Access / Execution | T1204.002 — User Execution (bundled PUP installer) | Free-utility install → InnoSetup | Q2; N1 |
| Execution | T1059.006 / T1059.001 / .003 — Python / PowerShell / cmd | PyInstaller stealer launched via cmd/powershell | Q1, Q5 |
| Defense Evasion | T1027.002 — Software packing (Pyarmor) | Obfuscated, anti-analysis chain | Q4 |
| Discovery | T1087 / T1082 / T1016 — Account / system / network | Recon burst | Q3 |
| Credential Access | T1555.003 — Credentials from Web Browsers | Browser-credential theft | Q6; pivot |
| C2 / Exfil | T1071.001 / T1041 — Web C2 / exfil | Stealer beacon / data exfil | Q6 |
Native Audit-Log Hunts
| Hunt | Source | Logic | Response |
|---|---|---|---|
| N1 · PUP bundler inventory | Software inventory / Add-Remove Programs | Presence of PcAppStore / Bit Driver Updater / Malware Crusher | Uninstall; sweep host for the stealer |
| N2 · InnoSetup install | EID 4688 / Sysmon EID 1 | InnoSetup installer dropping & running a binary from a download/temp path | Investigate the dropped binary (pairs with Q2) |
| N3 · _MEI extraction | Sysmon EID 11 (FileCreate) | PyInstaller _MEI* temp directory creation by a user-path exe | Pull the binary; isolate (pairs with Q1) |
| N4 · Stealer C2 | Proxy / firewall | Outbound from the PyInstaller exe to unknown HTTP/HTTPS | Block; identify the host; rotate creds |
CrowdStrike LogScale CQL Hunt Queries
SyntheticProcessRollup2. Q1 (PyInstaller-from-temp) is the strongest payload keeper and generalizes across many Python-packed stealers.Looks for: a process extracting/running from a PyInstaller _MEI temp directory in a user path. Accomplishes: catches the unpacked stealer. FP: some legit PyInstaller apps — flag user/temp paths + a non-vendor parent.
// HUNT: Amber Albatross PyInstaller stealer (_MEI extraction from a user path) // MITRE: T1059.006, T1027.002 | CONF: high FP: low-med COST: low // FP NOTES: some legit PyInstaller apps; flag %TEMP%/%AppData% + installer/shell parent #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | (ImageFileName=/\\(Temp|AppData\\Local\\Temp)\\_MEI[0-9]+\\/i or CommandLine=/_MEI[0-9]+/i) | table([@timestamp, ComputerName, UserName, ImageFileName, CommandLine, ParentBaseFileName, SHA256HashData], limit=200)
Looks for: an InnoSetup installer (or *tmp\is-* path) spawning a child binary from a temp path. Accomplishes: the installer stage. FP: legit InnoSetup apps — correlate with a following Q1/Q3.
// HUNT: Amber Albatross InnoSetup installer chain // MITRE: T1204.002 | CONF: medium FP: medium COST: low // TUNING: InnoSetup is legit; correlate to a following Q1 (_MEI) or Q3 (recon) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | (ParentBaseFileName=/setup.*\.exe$|.*installer.*\.exe$/i or ParentImageFileName=/\\Temp\\is-[A-Za-z0-9]+/i) | FileName=/\.exe$/i | ImageFileName=/\\(Temp|AppData)\\/i | table([@timestamp, ComputerName, UserName, ParentImageFileName, ImageFileName, CommandLine], limit=200)
Looks for: a burst of discovery commands parented by a binary in a user/temp path. Accomplishes: the stealer recon stage. FP: admin scripts — scope to user-path parents + breadth.
// HUNT: Amber Albatross stealer recon burst // MITRE: T1087, T1082, T1016 | CONF: med-high FP: medium COST: low // TUNING: scope to a user/temp-path parent; require breadth (>=4 distinct recon binaries) #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentImageFileName=/\\(Temp|AppData|Users\\[^\\]+\\Downloads)\\/i | FileName=/^(whoami|systeminfo|ipconfig|tasklist|net|net1|nltest|wmic|reg|hostname)\.exe$/i | groupBy([aid, ComputerName, ParentImageFileName], function=[count(field=FileName, distinct=true, as=cmds), collect([FileName, CommandLine], limit=20)]) | cmds>=4 | sort(cmds, order=desc)
Looks for: cmd/powershell launching an executable from a user/temp path (the obfuscated-chain → stealer handoff). FP: legit tooling — correlate with Q1/Q3.
// HUNT: Amber Albatross shell -> user-path packed exe handoff // MITRE: T1059.001/.003 | CONF: medium FP: medium COST: low // TUNING: correlate to Q1 (_MEI) / Q3 (recon); exclude sanctioned installers #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(cmd|powershell|pwsh)\.exe$/i | ImageFileName=/\\(Temp|AppData\\Local\\Temp|Users\\[^\\]+\\AppData)\\.+\.exe$/i | table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine], limit=200)
Looks for: writes into a _MEI* temp directory (PyInstaller self-extraction). Accomplishes: catches the unpack at file-write time. FP: legit PyInstaller apps — pair with Q2 (installer) or Q3 (recon).
// HUNT: PyInstaller _MEI self-extraction // MITRE: T1027.002 | CONF: high FP: low-med COST: low // TUNING: pair with Q2/Q3; legit PyInstaller apps also extract to _MEI #event_simpleName=/PeFileWritten|NewExecutableWritten/ | TargetFileName=/\\(Temp|AppData\\Local\\Temp)\\_MEI[0-9]+\\/i | table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName], limit=200)
Looks for: outbound connections from a binary in a user/temp path (the stealer beacon/exfil). FP: some apps run from there — correlate with Q1/Q3.
// HUNT: Amber Albatross stealer C2 / exfil from a user-path exe // MITRE: T1071.001, T1041 | CONF: medium FP: medium COST: med // TUNING: correlate to Q1/Q3; exclude sanctioned apps that run from AppData #event_simpleName=NetworkConnectIP4 | ContextImageFileName=/\\(Temp|AppData\\Local\\Temp|Users\\[^\\]+\\AppData)\\.+\.exe$/i | RemoteAddressIP4!=/^(10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.|127\.)/ | table([@timestamp, ComputerName, ContextImageFileName, RemoteAddressIP4, RemotePort], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA Name | Field Patterns | Benign Exclusions | Deployment Path |
|---|---|---|---|
| Amber Albatross — PyInstaller from temp + recon | Image from *\Temp\_MEI*\; spawns whoami/systeminfo/net.exe | Sanctioned PyInstaller apps (allow-list) | Endpoint Security → Custom IOA → Process Creation |
| Amber Albatross — shell → user-path packed exe | Parent *\cmd.exe/powershell.exe; Child from *\AppData\Local\Temp\* | Sanctioned installers/tooling | Custom IOA → Process Creation |
Machine-Readable IOC Appendix
Grouped IOC Quick-Copy
One-click blocks for detection and PUP inventory. Bundles/installers rotate — behavior (PyInstaller-from-temp + recon) is the durable signal.
Process extracting/running from %TEMP%\_MEI<digits>\ (PyInstaller self-extraction) PyInstaller exe in %TEMP%/%AppData% launched by an installer or cmd/powershell Recon burst (>=4 of whoami/systeminfo/ipconfig/tasklist/net/nltest) from a user-path exe InnoSetup installer (\Temp\is-XXXX) dropping & running a binary cmd/powershell launching an exe from %TEMP%/%AppData% (obfuscated-chain handoff) Outbound C2 from a user-path exe (stealer beacon / browser-cred exfil)
# PUP bundlers observed delivering Amber Albatross: PcAppStore Bit Guardian - Bit Driver Updater Malware Crusher # Packaging: InnoSetup installer -> obfuscated chain -> Pyarmor-obfuscated PyInstaller stealer # Loader-ecosystem adjacency: HijackLoader (IDAT / GHOSTPULSE / SHADOWLADDER), Arechclient2, dllFake # Inventory Add/Remove Programs for the PUP bundlers; flag unknown "utility/updater/cleaner" apps
# Typical Amber Albatross / stealer recon (parented by the PyInstaller exe): whoami /all systeminfo ipconfig /all tasklist net user / net group nltest /domain_trusts # A burst of these from a %TEMP%/%AppData% binary == high-confidence stealer activity
# Block the delivery + the payload: WDAC/AppLocker: deny execution from %TEMP%/%AppData% for standard users Block/uninstall PUP bundlers (PcAppStore/Bit Driver Updater/Malware Crusher); web filtering Restrict user software installs; software-acquisition governance (approved sources only) PowerShell CLM + ScriptBlock logging; browser app-bound credential encryption On hit: rotate browser-stored creds/cookies; reset SSO sessions
Hardening — Tiered & Deployable
Deny execution from user-writable paths and cut the PUP delivery channel.
- WDAC/AppLocker: deny execution from
%TEMP%/%AppData%for standard users — M1038. Blocks the unpacked stealer (Q1). - Block/uninstall PUP bundlers; web + download filtering — M1021. Cuts delivery (PcAppStore/Bit Driver Updater/Malware Crusher).
- Restrict user software installs — M1026. Removes the "install a free utility" path.
- PowerShell CLM + ScriptBlock logging — M1038 / M1040. Feeds Q4.
- Browser app-bound credential/cookie encryption — M1027. Limits the stealer's prize.
- Inventory + alert on unknown "utility/updater/cleaner" apps — M1042. Feeds N1.
- Monitor _MEI extraction + recon bursts from user paths — M1047. Feeds Q1/Q3/N3.
- Application allowlisting enterprise-wide — M1038. Denies PUPs & packed stealers.
- Software-acquisition governance: approved sources only — M1033.
- User training on "free utility / driver updater / PC cleaner" lures — M1017.
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the host; preserve the PyInstaller exe + _MEI contents and the PUP installer | SOC L2 | Containment timestamp; Q1/Q3 events |
| Triage | Pull the PUP → installer → PyInstaller → recon tree; identify what was stolen (browser creds/cookies); find C2 | SOC L2 | Process tree; recon output; C2 |
| Eradicate | Remove the stealer + PUP bundlers + persistence; block C2 | IR | Removal log; C2 block |
| Recover | Rotate browser-stored creds/cookies + SSO sessions; verify no follow-on payload (HijackLoader-style) | IR + IT | Cred rotation; payload review |
| Harden | Deny temp execution; block PUP bundlers; promote Q1+Q3 IOA | Detection Eng | Control status; IOA enabled |
Detection Coverage Map & Validation
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1204.002 | PUP / InnoSetup delivery | Q2 | — | Partial + inventory (N1/N2) |
| T1059.006 / T1027.002 | PyInstaller stealer (_MEI) | Q1, Q5 | IOA-1 | Good |
| T1059.001/.003 | Shell → packed-exe handoff | Q4 | IOA-2 | Partial correlate |
| T1087 / T1082 / T1016 | Recon burst | Q3 | IOA-1 | Good |
| T1555.003 / T1041 | Browser-cred theft / C2 | Q6 | — | Partial correlate; file-read weak |
| T1204 (delivery infra) | PUP bundler sources | — | — | GAP proxy/web filtering (N1) |
Validation gates: (1) confirm process + file telemetry fleet-wide; (2) baseline legit PyInstaller apps (allow-list for Q1); (3) lab-test a benign PyInstaller exe from %TEMP% (Q1/Q5) and a benign user-path binary running a recon burst (Q3); (4) promote Q1+Q3 (PyInstaller-from-temp that runs recon) to Custom IOA Detect+Block; keep Q2/Q4/Q6 correlated.
Hunt Summary Ticket
TITLE: Hunt — Amber Albatross (PUP -> InnoSetup -> Pyarmor PyInstaller stealer)
SEVERITY: High (credential stealer; legitimate-looking PUP delivery)
SCOPE: Windows user endpoints installing free "utility" software
HYPOTHESIS: PUP bundle (PcAppStore/Bit Driver Updater/Malware Crusher) -> InnoSetup ->
obfuscated chain -> Pyarmor PyInstaller stealer (_MEI temp) via cmd/powershell
-> recon burst -> browser-cred theft.
QUERIES RUN: Q1 PyInstaller _MEI from temp (IOA) | Q2 InnoSetup chain | Q3 recon burst (IOA) |
Q4 shell -> packed exe | Q5 _MEI file writes | Q6 stealer C2
+ Native N1-N4 (PUP inventory, InnoSetup, _MEI extraction, stealer C2)
DO FIRST: Q1 + Q3 — isolate on any hit; rotate browser creds
FINDINGS: <pending analyst execution>
GAPS: PUP delivery needs proxy/web filtering; browser-theft file-read weak
ACTIONS: Deny %TEMP%/%AppData% execution; block PUP bundlers; PowerShell CLM; promote Q1+Q3
OWNER: HuntPack
VERSION: v0.3 - 2026-06-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used For |
|---|---|---|
| 1 | Red Canary — Amber Albatross (Threat Detection Report) | Full chain: PUP → InnoSetup → Pyarmor PyInstaller → recon |
| 1 | Red Canary — Intelligence Insights (HijackLoader, Arechclient2, Amber Albatross) | Ecosystem adjacency; bundled-PUP sources |
| 2 | Red Canary — Intelligence Insights (May 2025) · Red Canary — HijackLoader | Loader ecosystem; adjacent stealers |
HuntPack v0.3 · Amber Albatross · Generated 2026-06-12 · Defensive use only. The PUP/installer front varies and looks legitimate — the durable signals are the PyInstaller-from-temp stealer and the recon burst. Validate field names + any sanctioned PyInstaller allow-list in your tenant before promoting any query.