BusySnake Stealer — Armored Likho (Eagle Werewolf) APT

A Python-based information stealer (Kaspersky Securelist, July 2026) deployed by the espionage actor Armored Likho against government agencies and electric-power operators in Russia, Kazakhstan and Brazil. Spear-phishing delivers a decoy-laden NSIS EXE dropper (or a ZDI-CAN-25373 LNK variant) that injects into pnx.exe, pulls a Python 3.12 runtime + module.pyw payload from GitHub into %APPDATA%\WindowsHelper, and persists via a WindowsHelper scheduled task. BusySnake loots Chromium/Firefox credentials, cookies, Telegram tdata, crypto wallets and 2FA secrets, then opens a reverse SSH tunnel + RustDesk for hands-on access. Defensive hunt & harden pack — no offensive code.
Threat
BusySnake Stealer (Armored Likho / Eagle Werewolf)
Severity
HIGH · APT ESPIONAGE + CRED THEFT
Type
Python infostealer · reverse tunnel · remote access
Delivery
Spear-phish → NSIS/LNK dropper → GitHub Python payload
Targets
Government & electric-power (RU/KZ/BR)
Version
v0.2 · 2026-07-06
Author
HuntPack
01

Executive Summary

Kaspersky's Securelist (published 3–4 July 2026) attributed a new Python-based infostealer, BusySnake Stealer, to the espionage actor Armored Likho (also tracked as Eagle Werewolf). The campaign targets government agencies and electric-power sector entities across Russia, Kazakhstan and Brazil, and marks a jump in the actor's technical maturity — Python source obfuscation with PyArmor Pro 9.2.0, rapid payload rotation via automated GitHub releases, and network mechanisms embedded directly into the malware to bypass security tooling.

The chain starts with a spear-phishing email carrying a RAR/ZIP archive with government/social-program lures. A first-stage NSIS self-extracting EXE (e.g. psihologicheskiy_test.exe) shows a decoy application, injects into a legitimately-named pnx.exe, and downloads follow-on archives from GitHub into %APPDATA%\WindowsHelper. A parallel LNK variant abuses the ZDI-CAN-25373 shortcut vulnerability to hide PowerShell parameters. The staging step fetches a portable Python 3.12 interpreter (python.zip), get-pip.py and data.zip containing the payload module.pyw. Persistence is a scheduled task named WindowsHelper (via run.vbs, later via the Schedule.Service COM object) that re-launches the stealer every 5 minutes; wh_selfdelete.vbs removes the loader.

BusySnake then harvests Chromium (DPAPI) and Firefox (NSS) passwords, cookies, screenshots, keystrokes, clipboard 2FA otpauth:// secrets, cryptocurrency wallet JSONs, and Telegram tdata, writing staged output (chromium_passwords.json, firefox_passwords.json, all_browser_data.json) under %APPDATA%\WindowsHelper before exfiltration to a Flask C2. For hands-on access it opens a reverse SSH tunnel (Go2Tunnel-style -R 0.0.0.0 arguments) and drives RustDesk.

Defender priority: The signature that generalizes best is the execution + persistence lineage, not a rotating payload hash. Hunt Q2 (a portable python.exe/pythonw.exe running module.pyw out of %APPDATA%\WindowsHelper) and Q3 (the WindowsHelper scheduled task re-launching run.vbs/.pyw every 5 minutes). Escalate any hit on Q6 (reverse SSH -R 0.0.0.0) — that is hands-on-keyboard access, not automated theft.

02

Source Review & Web Hunter Notes

TierSourceKey FindingCarry
1 · Vendor researchKaspersky Securelist — "Armored Likho's new weapon: BusySnake Stealer"Full chain: NSIS/LNK dropper → pnx.exe injection → GitHub Python payload → WindowsHelper task; PyArmor 9.2.0; C2 IPs/domains; file hashes; SSH-tunnel/RustDeskyes
1 · NewsThe Hacker News — "Armored Likho Targets Government Agencies, Power Sector with BusySnake Stealer"Attribution (Eagle Werewolf); gov + energy targeting in RU/KZ/BR; AI-assisted first-stage loader; tool polymorphismyes
2 · NewsTechTimes ("New APT Group Hits Power Grids in Three Countries with AI-Crafted Malware") · MalwareTips · CyberSecBriefCorroborates three-country power-sector targeting and LLM-generated loader stylistic tellspartial

Decisions: behavior-first — the payload is rotated through automated GitHub releases and obfuscated with PyArmor, so no single hash is durable. Anchor on (1) the portable-Python-runs-module.pyw-from-WindowsHelper execution, (2) the WindowsHelper scheduled-task persistence, (3) the staged stealer-output JSONs, and (4) the reverse-SSH/RustDesk egress. Atomic IOCs (four C2 IPs, ~10 C2 domains, MD5 hashes) are carried as a refreshable watchlist for Q7/Q8 and §9 — treat as perishable. All atomic indicators below trace to the Kaspersky Securelist report.

03

Hunt Brief & Attack Chain

Working hypothesis: A targeted user opens a spear-phishing RAR/ZIP; an NSIS EXE (or ZDI-CAN-25373 LNK) shows a decoy, injects pnx.exe, and stages a portable Python 3.12 + module.pyw under %APPDATA%\WindowsHelper; a WindowsHelper scheduled task re-launches the stealer every 5 minutes; BusySnake harvests browser/wallet/Telegram/2FA secrets and opens a reverse SSH tunnel + RustDesk for interactive access.

StepBehaviorTelemetryHunt Angle
1 · Spear-phishRAR/ZIP with gov/social-program lure; NSIS EXE or LNKMail gw; file; ProcessRollup2N1; N3
2 · Dropper / injectionNSIS decoy injects into pnx.exe in an nsn*.tmp dirProcessRollup2Q1
3 · StagingGitHub pull of python.zip / data.zip / get-pip.py to WindowsHelperNetworkConnectIP4; DNS; fileN2
4 · ExecutionPortable python.exe runs module.pyw from WindowsHelperProcessRollup2Q2; N4
5 · PersistenceWindowsHelper scheduled task re-runs run.vbs/.pyw every 5 minScheduledTaskRegistered; ProcessRollup2Q3; N1
6 · CollectionReads browser creds / cookies / wallet / Telegram tdata; writes staged JSONfile open/writeQ4; Q5
7 · Remote accessReverse SSH tunnel (-R 0.0.0.0) + RustDeskProcessRollup2; netQ6
8 · Exfil / C2Flask C2 over web; known IPs/domainsNetworkConnectIP4; DNSQ7; Q8

Affected surface & telemetry

SurfaceRequired TelemetryPriorityGap Risk
Government / OT-adjacent Windows workstationsProcess lineage + command lineCriticalLow — core process telemetry
Browser / wallet / Telegram secret storesFile open/write attributionHighMedium — needs file-read visibility
Persistence (Scheduled Tasks / WSH)ScheduledTaskRegistered; script-host execHighLow
EgressDNS / proxy / NetworkConnectIP4MediumMedium — IPs/domains rotate
04

Consolidated IOC Table

The payload rotates via automated GitHub releases and is PyArmor-obfuscated; the behavioral lineage is the durable surface. Atomic indicators (below) are perishable — copy-ready blocks in §9. Every atom traces to the Kaspersky Securelist report.
TypeValueConfActionContext
BehaviorPortable python.exe/pythonw.exe running module.pyw from %APPDATA%\WindowsHelperhighdetectExecution — flagship
BehaviorWindowsHelper scheduled task re-launching run.vbs / .pyw every 5 minhighdetectPersistence
BehaviorInjected pnx.exe executing from an nsn*.tmp NSIS dirhighdetectDropper / injection
Behaviorssh.exe with -R 0.0.0.0 reverse-tunnel args; RustDesk remote controlhighdetectHands-on access
Filechromium_passwords.json / firefox_passwords.json / all_browser_data.json / inventory_state.db under WindowsHelperhighdetectExfil staging
IP (C2)159.198.41.140 · 159.198.75.219 · 159.198.32.222 · 69.67.173.153mediumhuntFlask C2 / tunnel — perishable
Domain (C2)winupdate.live/.ink · arvax.xyz · varenie.live · lvl99.store · onetoken.ink · grked.online · ndrt.ink · myboard.chickenkiller.com/.twilightparadox.commediumhuntC2 / tunnel endpoints — perishable
Hash (MD5, dropper)1096268FA2B3D454C86CF851CB782319 · 894332174F536C2E1EFEDA05CBA79F8B · 393B498F2114CABC0B29D5FCD9DC6723mediumhuntEXE / DLL / LNK — polymorphic
Hash (MD5, stealer)C7622A1EFFA27BBFEE6D6E03D6474343 · 80B7700053E115D65365CE7330383320mediumhuntmodule.pyw variants — polymorphic
05

ATT&CK Mapping

TacticTechniqueObserved BehaviorQuery / Control
Initial Access / ExecutionT1566.001 / T1204.002 — Spear-phish attachment / user executionRAR/ZIP lure → NSIS EXE or LNK run by userN1, N3; Q1
ExecutionT1059.006 / T1059.005 — Python / VBScriptmodule.pyw run by portable Python; run.vbsQ2, Q3
Defense EvasionT1055 / T1027.013 / T1218.011 — Injection / obfuscated payload / rundll32Inject pnx.exe; PyArmor; rundll32→powershell→pythonQ1, N4
PersistenceT1053.005 — Scheduled taskWindowsHelper task every 5 min (schtasks / Schedule.Service COM)Q3, N1
Command & ControlT1105 / T1102 — Ingress tool transfer / web service (GitHub)Python runtime + payload pulled from GitHubN2
Credential AccessT1555.003 / T1539 / T1111 — Browser creds / cookies / 2FAChromium DPAPI + Firefox NSS; clipboard otpauth://Q4, Q5
CollectionT1113 / T1115 / T1005 — Screenshots / clipboard / local dataScreenshots, keylog, wallet JSON, Telegram tdataQ5
Command & ControlT1572 / T1219 — Protocol tunneling / remote access toolReverse SSH -R 0.0.0.0; RustDeskQ6
ExfiltrationT1041 / T1071.001 — Exfil over C2 / webFlask C2 at known IPs/domainsQ7, Q8
06

Native Audit-Log Hunts

HuntSourceLogicResponse
N1 · WindowsHelper taskSecurity 4698 / Task Scheduler Op logScheduled task named WindowsHelper (or any task whose action launches wscript/python from %APPDATA%\WindowsHelper), trigger every 5 minDisable task; isolate; triage
N2 · GitHub payload pullProxy / DNS / EDR netDownload of python.zip / data.zip / get-pip.py from a GitHub raw/release URL by a non-dev user, landing in WindowsHelperPull files; block repo
N3 · LNK / archive deliveryMail gateway / EDRRAR/ZIP attachment containing an EXE or a .lnk (ZDI-CAN-25373) that spawns PowerShell with a download cradleQuarantine mail; hunt recipients
N4 · rundll32→powershell→pythonEDR / processA rundll32powershellpython lineage, or PowerShell with -enc/download cradle spawning a portable PythonIsolate; capture tree
N5 · Firefox/Chromium secret read by non-browserEDR file auditA non-browser process opening Login Data / key4.db / logins.json / Telegram tdataTreat as stealer; reset creds
07

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Field names validated against the Falcon event reference; process hunts include SyntheticProcessRollup2. Q2 (Python running module.pyw from WindowsHelper) and Q3 (the WindowsHelper task) are the durable anchors — payload hashes rotate. Baseline any legitimate portable-Python and RustDesk usage before promoting.
Q1 · NSIS dropper — injected pnx.exe from an nsn*.tmp dir
CONF HIGHFP LOWCOST LOW

Looks for: a process named pnx.exe executing from an NSIS extraction dir (\Temp\nsn*.tmp\ / \Temp\). Accomplishes: catches the first-stage decoy dropper / injection target. FP: low — pnx.exe in a temp NSIS path is not a common legit pattern.

// HUNT: BusySnake NSIS dropper — injected pnx.exe from an nsn*.tmp temp dir
// MITRE: T1204.002, T1055 | CONF: high  FP: low  COST: low | REQUIRES: ProcessRollup2
// FALSE POSITIVES: pnx.exe from an NSIS temp path is not a common legit binary
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^pnx\.exe$/i
| ImageFileName=/\\(Local\\Temp|Temp)\\(nsn.+\.tmp\\)?pnx\.exe$/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine, SHA256HashData], limit=200)
Q2 · BusySnake execution — portable Python running module.pyw from WindowsHelper
CONF HIGHFP LOWCOST LOW

Looks for: python.exe/pythonw.exe whose command line references module.pyw and/or the WindowsHelper working dir. Accomplishes: the flagship execution signature. FP: low — a portable Python running a .pyw out of %APPDATA%\WindowsHelper is not normal.

// HUNT: BusySnake stealer execution — module.pyw run from WindowsHelper
// MITRE: T1059.006 | CONF: high  FP: low  COST: low | REQUIRES: ProcessRollup2
// FALSE POSITIVES: baseline sanctioned portable-Python automation writing to AppData
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^(python|python3|pythonw)\.exe$/i
| CommandLine=/(\\WindowsHelper\\.+\.pyw|module\.pyw)/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, SHA256HashData], limit=200)
Q3 · WindowsHelper persistence — script host launching run.vbs / .pyw
CONF HIGHFP LOWCOST LOW

Looks for: wscript/cscript executing a .vbs/.pyw from a WindowsHelper path — the 5-minute re-launch task. Accomplishes: catches persistence firing. FP: low — WSH running from %APPDATA%\WindowsHelper is anomalous.

// HUNT: BusySnake persistence — WindowsHelper task re-launches run.vbs / module.pyw
// MITRE: T1053.005, T1059.005 | CONF: high  FP: low  COST: low | REQUIRES: ProcessRollup2
// FALSE POSITIVES: legit WSH rarely runs from %APPDATA%\WindowsHelper
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^(wscript|cscript)\.exe$/i
| CommandLine=/\\WindowsHelper\\.+\.(vbs|pyw)/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Q4 · Exfil staging — stealer output JSON/DB written under WindowsHelper
CONF HIGHFP LOWCOST LOW

Looks for: creation of chromium_passwords.json / firefox_passwords.json / all_browser_data.json / inventory_state.db under a WindowsHelper directory. Accomplishes: a near-zero-FP tell that theft has run. FP: low — these exact staged filenames are BusySnake-specific.

// HUNT: BusySnake exfil staging — stealer output written under WindowsHelper
// MITRE: T1074.001, T1555.003 | CONF: high  FP: low  COST: low | REQUIRES: FileCreate telemetry
// FALSE POSITIVES: these exact staged filenames under WindowsHelper are malware-specific
#event_simpleName=/NewExecutableWritten|PeFileWritten|FileCreateInfo/
| TargetFileName=/\\WindowsHelper\\.*(chromium_passwords|firefox_passwords|all_browser_data|inventory_state)\.(json|db)$/i
| table([@timestamp, ComputerName, UserName, ContextBaseFileName, TargetFileName], limit=200)
Q5 · Credential harvest — non-browser process reading browser/wallet/Telegram secrets
CONF HIGHFP MEDCOST MED

Looks for: a non-browser image opening many browser credential / wallet / Telegram tdata files. Accomplishes: BusySnake's core looting. FP: medium — some backup/security tools read these; require a high distinct-file count and a non-browser image (correlate to Q2 lineage).

// HUNT: BusySnake credential harvest — mass read of browser/wallet/Telegram secrets
// MITRE: T1555.003, T1539, T1005 | CONF: high  FP: medium  COST: med | REQUIRES: file-read telemetry
// TUNING: require many distinct targets + non-browser image; baseline backup/security tools
#event_simpleName=/FileOpenInfo/
| TargetFileName=/(\\User Data\\.+\\(Login Data|Cookies|Local State|Web Data)|key4\.db|logins\.json|\\Telegram Desktop\\tdata|wallet\.dat|\\MetaMask|keystore)/i
| ContextBaseFileName=/^(python|python3|pythonw|pnx)\.exe$/i
| groupBy([ComputerName, ContextBaseFileName], function=count(TargetFileName, distinct=true, as=files))
| files >= 4
| table([ComputerName, ContextBaseFileName, files], limit=200)
Q6 · Reverse SSH tunnel — Go2Tunnel-style -R 0.0.0.0 arguments
CONF HIGHFP LOW-MEDCOST LOW

Looks for: ssh.exe invoked with a reverse-forward to 0.0.0.0 plus host-key checking disabled — the Armored Likho Go2Tunnel argument set. Accomplishes: flags hands-on-keyboard tunneling. FP: low-med — baseline any sanctioned ssh -R automation.

// HUNT: BusySnake reverse SSH tunnel — Go2Tunnel-style arguments
// MITRE: T1572 | CONF: high  FP: low-med  COST: low | REQUIRES: ProcessRollup2 + CommandLine
// TUNING: baseline sanctioned ssh -R jump-host automation before alerting
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| FileName=/^ssh\.exe$/i
| CommandLine=/-R\s+0\.0\.0\.0:|ExitOnForwardFailure=yes|StrictHostKeyChecking=no/i
| table([@timestamp, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Q7 · C2 DNS — resolution of known Armored Likho domains
CONF MEDFP LOWCOST LOW

Looks for: DNS resolution of the reported C2 / tunnel domains. Accomplishes: a cheap watchlist hit. FP: low, but the domains are perishable — confirm they are still live before treating a miss as clean.

// HUNT: BusySnake C2 DNS — known Armored Likho domains (perishable)
// MITRE: T1071.001 | CONF: medium  FP: low  COST: low | REQUIRES: DnsRequest
// FALSE POSITIVES: domains rotate; refresh from current threat intel
#event_simpleName=DnsRequest
| DomainName=/(winupdate\.(live|ink)|arvax\.xyz|varenie\.live|lvl99\.store|onetoken\.ink|grked\.online|ndrt\.ink|myboard\.(chickenkiller\.com|twilightparadox\.com))$/i
| table([@timestamp, ComputerName, ContextBaseFileName, DomainName], limit=200)
Q8 · C2 beacon — connection to known Flask C2 IPs
CONF MEDFP LOWCOST LOW

Looks for: outbound connections to the four reported C2 / tunnel IP addresses. Accomplishes: confirms exfil / tunnel egress. FP: low, but the IPs are perishable — treat as hunt, not a standalone block.

// HUNT: BusySnake C2 beacon — known Flask C2 / tunnel IPs (perishable)
// MITRE: T1041, T1071.001 | CONF: medium  FP: low  COST: low | REQUIRES: NetworkConnectIP4
// FALSE POSITIVES: IPs rotate; confirm against current threat intel before blocking
#event_simpleName=NetworkConnectIP4
| in(RemoteAddressIP4, values=["159.198.41.140","159.198.75.219","159.198.32.222","69.67.173.153"])
| table([@timestamp, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
08

CrowdStrike Custom IOA Recommendations

IOA NameField PatternsBenign ExclusionsDeployment Path
BusySnake — Python module.pyw from WindowsHelperImage python/pythonw.exe; CommandLine matches WindowsHelper\...\.pyw or module.pywSanctioned portable-Python automation (allow-list by path/signer)Endpoint Security → Custom IOA → Process Creation, Detect+Block
BusySnake — WindowsHelper WSH persistenceParent/child wscript/cscript.exe; CommandLine matches WindowsHelper\...\.(vbs|pyw)None expected in most enterprisesCustom IOA → Process Creation, Detect+Block
BusySnake — reverse SSH tunnelssh.exe with -R 0.0.0.0 + StrictHostKeyChecking=noSanctioned jump-host tunneling (allow-list source hosts/users)Custom IOA → Process Creation, Detect
Q2, Q3 and Q4 are strong, generalizable promotions — the WindowsHelper execution + persistence + staged-output triad is BusySnake-specific and near-zero-FP. Q6 (reverse SSH) generalizes to many tunneling actors and is worth promoting fleet-wide with a tuned allow-list. The C2 IPs/domains (Q7/Q8) are a refreshable network watchlist, not IOAs.
09

Machine-Readable IOC Appendix

Grouped IOC Quick-Copy

One-click blocks for detection. Atomic indicators (IPs/domains/hashes) are perishable and trace to the Kaspersky Securelist report — behavior is the durable surface. Confirm atoms against current intel before blocking.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
ipv4,159.198.41.140,detect,high,2027-01-06,BusySnake Flask C2,campaign:ArmoredLikho
ipv4,159.198.75.219,detect,high,2027-01-06,BusySnake C2/tunnel,campaign:ArmoredLikho
ipv4,159.198.32.222,detect,high,2027-01-06,BusySnake C2/tunnel,campaign:ArmoredLikho
ipv4,69.67.173.153,detect,high,2027-01-06,BusySnake C2/tunnel,campaign:ArmoredLikho
domain,winupdate.live,detect,high,2026-10-06,BusySnake C2,campaign:ArmoredLikho
domain,arvax.xyz,detect,high,2026-10-06,BusySnake C2,campaign:ArmoredLikho
domain,varenie.live,detect,high,2026-10-06,BusySnake C2,campaign:ArmoredLikho
domain,grked.online,detect,high,2026-10-06,BusySnake tunnel endpoint,campaign:ArmoredLikho
md5,C7622A1EFFA27BBFEE6D6E03D6474343,detect,high,2027-01-06,BusySnake module.pyw,campaign:ArmoredLikho
md5,1096268FA2B3D454C86CF851CB782319,detect,high,2027-01-06,BusySnake NSIS dropper,campaign:ArmoredLikho
Behavioral Signaturesdetection logic
Portable python.exe/pythonw.exe running module.pyw from %APPDATA%\WindowsHelper (Q2)
wscript/cscript launching run.vbs or a .pyw from a WindowsHelper path, every 5 minutes (Q3)
Scheduled task named "WindowsHelper" (schtasks or Schedule.Service COM) (N1)
Injected pnx.exe executing from a \Temp\nsn*.tmp NSIS dir (Q1)
Stealer output written under WindowsHelper: chromium_passwords.json / firefox_passwords.json /
  all_browser_data.json / inventory_state.db (Q4)
Non-browser process mass-reading Login Data / key4.db / logins.json / Telegram tdata / wallet.dat (Q5)
ssh.exe with -R 0.0.0.0 + StrictHostKeyChecking=no + ExitOnForwardFailure=yes (reverse tunnel) (Q6)
RustDesk remote-control launched by a WindowsHelper-lineage process
Atomic IOCs (perishable)Kaspersky Securelist
# C2 / tunnel IPs
159.198.41.140
159.198.75.219
159.198.32.222
69.67.173.153
# C2 / tunnel domains
winupdate.live
winupdate.ink
arvax.xyz
varenie.live
lvl99.store
onetoken.ink
grked.online
ndrt.ink
myboard.chickenkiller.com
myboard.twilightparadox.com
# Hashes (MD5)
1096268FA2B3D454C86CF851CB782319   # NSIS EXE dropper
894332174F536C2E1EFEDA05CBA79F8B   # DLL loader
393B498F2114CABC0B29D5FCD9DC6723   # LNK (ZDI-CAN-25373)
C7622A1EFFA27BBFEE6D6E03D6474343   # module.pyw (BusySnake)
80B7700053E115D65365CE7330383320   # module.pyw (new version)
# All atoms per Kaspersky Securelist; rotate frequently -- refresh before relying on them.
Hardening / Blockdefense-in-depth
Disable Windows Script Host (blocks run.vbs / wscript persistence) where WSH is not required
ASR: block executable content from email client and webmail (NSIS/LNK delivery)
App control (WDAC/AppLocker): deny execution from %APPDATA%\Roaming\WindowsHelper\ and \Temp\nsn*.tmp\
Block/monitor unsanctioned portable Python interpreters on user endpoints
Block outbound SSH (22) from workstations; alert on ssh.exe -R reverse tunnels
Block C2 IPs/domains at proxy/DNS; alert on RustDesk on non-IT hosts
Force reset of browser-stored creds + revoke sessions on any hit; hardware 2FA
10

Hardening — Tiered & Deployable

Break the WSH/portable-Python execution path, constrain the persistence dir, and cut the reverse-tunnel egress.

Immediate — Break the chain
  • Block executable content from email client and webmail (ASR)M1042. Cuts the NSIS EXE / LNK delivery. GUID BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550.
  • Disable Windows Script Host where not requiredM1042 / M1038. Kills run.vbs persistence and the WSH launcher.
  • Promote Q2 / Q3 / Q4 to Detect+BlockM1040. The WindowsHelper execution + persistence + staged-output triad is malware-specific.
  • Block C2 IPs/domains + RustDesk on non-IT hosts at proxy/DNSM1037 / M1021. Feeds Q7/Q8.

Deployable — disable WSH (GPO/registry)

REM Disable Windows Script Host for the machine (and per-user) -- run elevated
reg add "HKLM\SOFTWARE\Microsoft\Windows Script Host\Settings" /v Enabled /t REG_DWORD /d 0 /f
reg add "HKCU\SOFTWARE\Microsoft\Windows Script Host\Settings" /v Enabled /t REG_DWORD /d 0 /f
REM Verify:
reg query "HKLM\SOFTWARE\Microsoft\Windows Script Host\Settings" /v Enabled

Deployable — enable the email-content ASR rule (PowerShell)

Add-MpPreference -AttackSurfaceReductionRules_Ids BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550 -AttackSurfaceReductionRules_Actions Enabled
# Verify:
(Get-MpPreference).AttackSurfaceReductionRules_Ids
Near term — Constrain & observe (pilot first)
  • WDAC/AppLocker: deny execution from %APPDATA%\Roaming\WindowsHelper\ and \Temp\nsn*.tmp\M1038. Breaks Q1/Q2.
  • Inventory + constrain unsanctioned portable Python interpretersM1045 / M1038. Removes the runtime BusySnake ships with itself.
  • Egress control: block outbound SSH (22) from workstations; alert on ssh.exe -RM1037. Feeds Q6.

Deployable — AppLocker deny rule (path condition)

# Deny execution from the malware's working/staging dirs (deny beats allow in AppLocker).
# Add EXE + Script rule collections denying these paths, then test in Audit mode first:
%OSDRIVE%\Users\*\AppData\Roaming\WindowsHelper\*
%OSDRIVE%\Users\*\AppData\Local\Temp\nsn*.tmp\*
# Deploy via GPO: Computer Config > Windows Settings > Security Settings > Application Control Policies
Strategic — Reduce stealer + espionage surface
  • Application allowlisting fleet-wide; default-deny user-path executionM1038.
  • Phishing-resistant (hardware) MFA + session-token bindingM1032. Blunts stolen cookies / 2FA reuse.
  • Egress allow-listing / broker for OT-adjacent and government segmentsM1030 / M1037. Denies arbitrary C2 + reverse tunnels.
11

Containment Runbook

PhaseActionsOwnerEvidence
IsolateNetwork-contain the host; preserve %APPDATA%\WindowsHelper (payload, staged JSON/DB, VBScripts), the NSIS dropper and the phishing mailSOC L2Containment timestamp; Q2/Q3 events; samples
TriageMap dropper → injection → Python execution → task persistence → secret reads → tunnel/exfil; enumerate which browsers/wallets/Telegram/2FA were touched; extract C2 IPs/domains from Q7/Q8IRProcess tree; file-access list; C2 list
EradicateDelete the WindowsHelper scheduled task + run.vbs/wh_selfdelete.vbs; remove WindowsHelper dir + portable Python; kill any ssh -R / RustDesk session; block C2IRTask/file removal log; killed sessions
RecoverAssume credential + cookie + wallet + Telegram-session compromise: force-reset passwords, revoke browser sessions/tokens, re-enroll 2FA, invalidate Telegram sessions, rotate/move any wallet funds; reimage if injection/loader ranIR + IT + userCred reset; token revoke; wallet moves
HardenDisable WSH; ASR email-content rule; AppLocker deny on WindowsHelper/Temp; block SSH egress; promote Q2/Q3/Q4/Q6; brief targeted teamsDetection EngIOA enabled; ASR/GPO applied; egress blocks
A reverse SSH tunnel or RustDesk hit (Q6) means interactive operator access — assume lateral movement and additional persistence beyond the WindowsHelper task, and widen scope to credentials used from the host.
12

Detection Coverage Map & Validation

TechniqueBehaviorCQLIOACoverage
T1204.002 / T1055NSIS dropper / pnx.exe injectionQ1Good
T1059.006module.pyw execution from WindowsHelperQ2IOA-1Good
T1053.005 / T1059.005WindowsHelper task / run.vbs persistenceQ3IOA-2Good + N1
T1074.001Stealer output staged under WindowsHelperQ4Good
T1555.003 / T1539 / T1005Browser/wallet/Telegram secret readsQ5Partial needs file-read telemetry
T1572Reverse SSH tunnelQ6IOA-3Good
T1105 / T1102GitHub payload pullGAP proxy/DNS (N2)
T1219RustDesk remote controlPartial app inventory / net
T1041 / T1071.001C2 exfil (IPs/domains)Q7, Q8Partial perishable atoms

Validation gates: (1) confirm process + file open/write + DNS/network telemetry is flowing from the targeted (government / OT-adjacent) hosts; (2) baseline any sanctioned portable-Python automation, RustDesk deployments, and ssh -R jump-host use so Q2/Q6 stay clean; (3) lab-test — a benign portable-Python script must NOT fire Q2 unless it runs from WindowsHelper, and a benign browser-profile read must stay below the Q5 distinct-file threshold; (4) refresh the C2 IP/domain watchlist (Q7/Q8) before relying on a clean result — the atoms rotate. No durable payload hash — anchor on behavior.

13

Hunt Summary Ticket

TITLE:        Hunt — BusySnake Stealer / Armored Likho (Eagle Werewolf) APT
SEVERITY:     High (state-nexus espionage; credential/wallet/Telegram theft; interactive access)
SCOPE:        Government + electric-power Windows workstations; browser/wallet/Telegram secret stores; egress
HYPOTHESIS:   Spear-phish RAR/ZIP -> NSIS EXE (or ZDI-CAN-25373 LNK) injects pnx.exe -> stages portable
              Python 3.12 + module.pyw in %APPDATA%\WindowsHelper -> WindowsHelper task re-runs every 5 min
              -> BusySnake harvests browser/wallet/Telegram/2FA -> reverse SSH tunnel + RustDesk -> Flask C2.
QUERIES RUN:  Q1 pnx.exe dropper | Q2 module.pyw exec (IOA) | Q3 WindowsHelper task (IOA) |
              Q4 staged-output JSON | Q5 secret reads | Q6 reverse SSH (IOA) | Q7 C2 DNS | Q8 C2 IP beacon
              + Native N1-N5 (WindowsHelper task, GitHub pull, LNK/archive, rundll32->ps->python, secret read)
DO FIRST:     Q2, Q3, Q4 -- then escalate any Q6 hit (reverse SSH = hands-on-keyboard access)
FINDINGS:     <pending analyst execution>
GAPS:         GitHub payload pull (proxy/DNS); RustDesk (app inventory); C2 atoms perishable
ACTIONS:      Disable WSH; ASR email-content rule; AppLocker deny WindowsHelper/Temp; block SSH egress;
              promote Q2/Q3/Q4/Q6; assume cred+cookie+wallet+Telegram compromise on any hit
OWNER:        HuntPack
VERSION:      v0.2 - 2026-07-06
14

Changelog

v0.22026-07-24CQL correctness pass. All 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.
v0.12026-07-06Initial pack, built in the review-v2 gold layout (fixed left-sidebar scrollspy TOC, collapsible, cloud selector inside the CQL section, per-card Copy/Open-in-Falcon, Grouped IOC Quick-Copy grid, coverage+validation, .ticket). Research from Kaspersky Securelist + The Hacker News (3–4 July 2026): Armored Likho (Eagle Werewolf) deploys the Python BusySnake Stealer against government + electric-power targets in Russia, Kazakhstan and Brazil via spear-phish → NSIS/LNK dropper → GitHub-hosted portable Python + module.pyw in %APPDATA%\WindowsHelper, persisted by a WindowsHelper scheduled task, stealing browser/wallet/Telegram/2FA secrets with reverse SSH tunnel + RustDesk egress. 8 CQL + 5 native hunts, 3 IOA candidates; behavior-anchored (payload rotates via GitHub, PyArmor-obfuscated). Atomic IOCs (4 C2 IPs, ~10 domains, 5 MD5 hashes) carried as a perishable watchlist, all traced to Securelist.
15

References

TierSourceUsed For
1Kaspersky Securelist — Armored Likho's new weapon: BusySnake StealerFull infection chain, persistence, stealer functions, C2 IPs/domains, MD5 hashes, SSH-tunnel/RustDesk, attribution
1The Hacker News — Armored Likho Targets Government Agencies, Power Sector with BusySnake StealerAttribution (Eagle Werewolf); gov + energy targeting (RU/KZ/BR); AI-assisted first stage; tool polymorphism
2TechTimes · MalwareTipsCorroboration — three-country power-sector targeting; LLM-generated loader tells

HuntPack v0.1 · BusySnake Stealer / Armored Likho (Eagle Werewolf) · Generated 2026-07-06 · Defensive use only — no offensive code. The payload rotates via automated GitHub releases and is PyArmor-obfuscated, so anchor on the WindowsHelper execution + persistence lineage and the reverse-SSH/RustDesk egress, not a fixed hash. Atomic IOCs are perishable and trace to Kaspersky Securelist — validate field names and baseline sanctioned portable-Python / RustDesk / ssh -R usage before promoting any query.