Threat Summary
Open threat exchange telemetry confirms that Blind Eagle — tracked as APT-C-36 — is actively iterating its intrusion toolkit against financial sector organizations in Colombia in a sustained campaign observed between May and July 2026. Researchers gained rare visibility into the operation through multiple exposed staging servers, revealing four significant capability upgrades:
- A third-generation string obfuscation scheme — JavaScript droppers now use a custom AES S-box substitution routine, breaking static signatures built against earlier variants.
- A RunPE-style process-hollowing loader built on a bare AutoIt3 interpreter, with staging infrastructure hosted on legitimate GitHub repositories to blend with enterprise traffic.
- A reusable 'Photo Studio' persistence component, indicating the actor is productizing its tooling for repeatable intrusions.
- Continued use of VBScript droppers as the initial execution stage, delivering commodity and semi-commodity RATs.
The campaign's payload roster — AsyncRAT, njRAT (S0385), Njw0rm, LV, Bladabindi, and LimeRAT — combined with tags for HVNC (hidden VNC) and Chrome credential theft, tells a clear story: this is a banking fraud operation. Blind Eagle is not conducting espionage here; it is harvesting credentials, establishing covert remote desktop sessions, and positioning for fraudulent financial transactions against Colombian banking customers and institutions. The use of dynamic DNS (DuckDNS) for C2 and process injection for defense evasion round out a mature, financially motivated intrusion chain.
Threat Actor / Malware Profile
Blind Eagle / APT-C-36
A long-running Latin America-focused threat actor active since at least 2018, historically concentrating on Colombian government, financial, and industrial targets. The group is characterized by heavy reliance on commodity .NET RATs, aggressive use of dynamic DNS, Spanish-language phishing lures (often impersonating Colombian government agencies such as DIAN), and continuous loader/obfuscation turnover to evade signature-based detection.
Attack Chain Breakdown
| Stage | Technique |
|---|---|
| Delivery | Spanish-language phishing with malicious attachments/links; VBScript dropper as first-stage execution |
| Obfuscation | JavaScript strings protected with custom AES S-box substitution (third observed scheme) |
| Loading | RunPE / process hollowing via bare AutoIt3 interpreter, staged from GitHub |
| Payload | AsyncRAT, njRAT, Njw0rm, Bladabindi, LimeRAT (.NET RAT families) |
| Persistence | 'Photo Studio' reusable persistence component; Run-key and scheduled task artifacts typical of njRAT/AsyncRAT |
| C2 | Dynamic DNS (*.duckdns.org) resolving to rotating infrastructure |
| Objective | HVNC sessions, Chrome credential theft, banking fraud |
Payload Behaviors
- njRAT / Bladabindi (S0385): Full-featured .NET RAT — keylogging, remote desktop, registry-based persistence, process hollowing into
RegAsm.exe/vbc.exe-style surrogates. - AsyncRAT: AES-encrypted TCP C2, HVNC module for covert browser sessions targeting banking portals, anti-VM checks, UAC bypass attempts.
- LimeRAT / Njw0rm / LV: Lightweight RATs used as backup access; Njw0rm historically spreads via removable media.
- Anti-analysis: Custom AES string obfuscation, process injection into trusted signed processes, staging through GitHub and DuckDNS to inherit reputation.
IOC Analysis
This pulse contains two indicator classes, each requiring a distinct operationalization path:
- FileHash-SHA256 (2):
a4fbd707f4ce7ca68e6137cef1c56b6f408e5f0a0f148434d996bb98c3a21fff,a73cb9d5d46e19f3daa4a14cfe5d8fa4319a3d62452039e4972e6a316bbb26f4— Load into EDR blocklists (Microsoft DefenderBlock fileindicators, CrowdStrike custom IOC, Sentinel TI feed). Hashes rotate quickly given the actor's obfuscation cadence, so treat hash blocks as point-in-time controls and pair them with behavioral detections below. - Hostname:
rema200426.duckdns.org— Dynamic DNS C2. Block at DNS sinkhole/proxy immediately, but more importantly hunt historically: query passive DNS and proxy logs for past resolution. Alert on any endpoint resolution of*.duckdns.orgoutside sanctioned use, as Blind Eagle rotates subdomains routinely.
Tooling guidance: Enrich both hashes on VirusTotal/OTX to pull associated dropped files and mutex names. Use nslookup/dig plus passive DNS (SecurityTrails, PassiveTotal) to expand the DuckDNS subdomain into historical IPs for retro hunting. Sigma and KQL content below converts the behavioral layer — not just the indicators — into durable detection.
Detection Engineering
---
title: Blind Eagle VBScript Dropper Execution Spawning Scripting or AutoIt Loader
id: 7c1e4a2b-9f3d-4e5a-b8c6-aptc360001
status: experimental
description: Detects wscript/cscript execution of VBScript droppers that spawn AutoIt3, mshta, or powershell — consistent with Blind Eagle (APT-C-36) VBScript dropper staging a RunPE AutoIt loader, per OTX pulse.
author: Security Arsenal Threat Intel
references:
- https://www.levelblue.com/blogs/spiderlabs-blog/still-circling-blind-eagles-toolkit-keeps-evolving
date: 2026/08/17
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\wscript.exe'
- '\cscript.exe'
selection_child:
Image|endswith:
- '\autoit3.exe'
- '\autoit3_x64.exe'
- '\powershell.exe'
- '\mshta.exe'
- '\regsvr32.exe'
- '\rundll32.exe'
condition: selection_parent and selection_child
falsepositives:
- Enterprise logon scripts and administrative automation
level: high
tags:
- attack.execution
- attack.t1059.005
- attack.t1218
---
title: Bare AutoIt3 Interpreter Executing Script From Suspicious Path (Blind Eagle RunPE Loader)
id: 7c1e4a2b-9f3d-4e5a-b8c6-aptc360002
status: experimental
description: Detects AutoIt3 interpreter executing scripts from Temp, Public, or AppData paths, or renamed AutoIt binaries — matches Blind Eagle's RunPE process-hollowing loader staged via GitHub (OTX pulse, Aug 2026).
author: Security Arsenal Threat Intel
references:
- https://www.levelblue.com/blogs/spiderlabs-blog/still-circling-blind-eagles-toolkit-keeps-evolving
date: 2026/08/17
logsource:
category: process_creation
product: windows
detection:
selection_cmd:
CommandLine|contains:
- 'autoit3'
selection_path:
CommandLine|contains:
- '\AppData\Local\Temp\'
- '\Users\Public\'
- '\AppData\Roaming\'
- 'github'
- 'raw.githubusercontent'
filter_legit:
Image|startswith:
- 'C:\Program Files\AutoIt3\'
- 'C:\Program Files (x86)\AutoIt3\'
condition: selection_cmd and selection_path and not filter_legit
falsepositives:
- Legitimate AutoIt-based software packaging (rare outside Program Files)
level: high
tags:
- attack.defense_evasion
- attack.t1055.012
- attack.t1059.010
---
title: Dynamic DNS C2 Resolution From Non-Browser Process (Blind Eagle DuckDNS)
id: 7c1e4a2b-9f3d-4e5a-b8c6-aptc360003
status: experimental
description: Detects DNS queries to DuckDNS dynamic domains from processes other than browsers/DNS clients — consistent with AsyncRAT, njRAT, and LimeRAT C2 used by Blind Eagle (e.g., rema200426.duckdns.org).
author: Security Arsenal Threat Intel
references:
- https://www.levelblue.com/blogs/spiderlabs-blog/still-circling-blind-eagles-toolkit-keeps-evolving
date: 2026/08/17
logsource:
category: dns_query
product: windows
detection:
selection_query:
QueryName|contains:
- 'rema200426.duckdns.org'
selection_dyn:
QueryName|endswith:
- '.duckdns.org'
filter_browsers:
Image|endswith:
- '\chrome.exe'
- '\msedge.exe'
- '\firefox.exe'
- '\svchost.exe'
condition: (selection_query or selection_dyn) and not filter_browsers
falsepositives:
- Developer tooling and IoT agents using dynamic DNS legitimately
level: high
tags:
- attack.command_and_control
- attack.t1071.001
- attack.t1568.002
// Blind Eagle (APT-C-36) hunt: C2 resolution + VBScript-to-AutoIt loader chain
let duckdns_ioc = "rema200426.duckdns.org";
let ioc_hashes = dynamic(["a4fbd707f4ce7ca68e6137cef1c56b6f408e5f0a0f148434d996bb98c3a21fff",
"a73cb9d5d46e19f3daa4a14cfe5d8fa4319a3d62452039e4972e6a316bbb26f4"]);
let C2Hits = DeviceNetworkEvents
| where TimeGenerated > ago(14d)
| where RemoteUrl has "duckdns.org" or RemoteUrl == duckdns_ioc
| extend Hunt = "DuckDNS C2 connection"
| project Hunt, TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, RemotePort;
let HashHits = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where SHA256 in (ioc_hashes) or InitiatingProcessSHA256 in (ioc_hashes)
| extend Hunt = "Known IOC hash execution"
| project Hunt, TimeGenerated, DeviceName, FileName, ProcessCommandLine, SHA256, InitiatingProcessFileName;
let LoaderChain = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFileName in~ ("wscript.exe","cscript.exe")
| where FileName has_any ("autoit3","powershell.exe","mshta.exe","regsvr32.exe","rundll32.exe")
| extend Hunt = "VBScript dropper spawning loader"
| project Hunt, TimeGenerated, DeviceName, InitiatingProcessCommandLine, FileName, ProcessCommandLine;
let AutoItRunPE = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where ProcessCommandLine has "autoit3"
| where ProcessCommandLine has_any ("\\Temp\\","\\Public\\","Roaming","githubusercontent")
| extend Hunt = "AutoIt3 RunPE loader from suspicious path"
| project Hunt, TimeGenerated, DeviceName, FileName, ProcessCommandLine, SHA256;
C2Hits
| union HashHits, LoaderChain, AutoItRunPE
| sort by TimeGenerated desc
# Blind Eagle (APT-C-36) endpoint hunt — run elevated on suspect hosts
# Checks: IOC hashes, DuckDNS C2 connections, AutoIt loader artifacts, persistence, VBScript droppers
$iocHashes = @(
'a4fbd707f4ce7ca68e6137cef1c56b6f408e5f0a0f148434d996bb98c3a21fff',
'a73cb9d5d46e19f3daa4a14cfe5d8fa4319a3d62452039e4972e6a316bbb26f4'
)
$c2 = 'rema200426.duckdns.org'
$findings = @()
Write-Host '[*] Checking DNS cache and active connections for DuckDNS C2...'
$dns = Get-DnsClientCache -ErrorAction SilentlyContinue | Where-Object { $_.Entry -like '*duckdns.org*' }
if ($dns) { $findings += $dns | ForEach-Object { "DNS-CACHE: $($_.Entry) -> $($_.Data)" } }
$conns = Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue |
ForEach-Object { $r = try { (Resolve-DnsName $_.RemoteAddress -ErrorAction Stop).NameHost } catch { '' }
if ($r -like '*duckdns.org*' -or $r -eq $c2) { "NET-CONN: PID $($_.OwningProcess) -> $($_.RemoteAddress):$($_.RemotePort) ($r)" } }
if ($conns) { $findings += $conns }
Write-Host '[*] Hunting IOC file hashes in staging locations...'
$paths = @("$env:TEMP", "$env:APPDATA", 'C:\Users\Public', "$env:LOCALAPPDATA\Temp")
foreach ($p in $paths) {
if (Test-Path $p) {
Get-ChildItem -Path $p -Recurse -File -ErrorAction SilentlyContinue -Include *.exe,*.dll,*.vbs,*.js,*.au3,*.a3x |
ForEach-Object { $h = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
if ($iocHashes -contains $h) { $findings += "IOC-HASH HIT: $($_.FullName)" } }
}
}
Write-Host '[*] Checking Run keys for RAT persistence (njRAT/AsyncRAT style)...'
$runKeys = @('HKCU:\Software\Microsoft\Windows\CurrentVersion\Run',
'HKLM:\Software\Microsoft\Windows\CurrentVersion\Run')
foreach ($k in $runKeys) {
Get-ItemProperty $k -ErrorAction SilentlyContinue | Get-Member -MemberType NoteProperty |
Where-Object { $_.Definition -match 'Temp|Public|AppData|autoit|\.vbs|\.js' } |
ForEach-Object { $findings += "RUNKEY: $k -> $($_.Name)" }
}
Write-Host '[*] Checking scheduled tasks for suspicious script/AutoIt actions...'
Get-ScheduledTask -ErrorAction SilentlyContinue | ForEach-Object {
$a = ($_.Actions | Out-String)
if ($a -match 'wscript|cscript|autoit3|AppData|Public|duckdns') { $findings += "TASK: $($_.TaskName) :: $($a.Trim())" }
}
Write-Host '[*] Checking for stray AutoIt3 binaries outside Program Files...'
Get-ChildItem -Path 'C:\Users','C:\ProgramData' -Recurse -Filter 'autoit3*.exe' -ErrorAction SilentlyContinue |
ForEach-Object { $findings += "AUTOIT: $($_.FullName)" }
Write-Host "`n===== HUNT RESULTS ====="
if ($findings.Count -eq 0) { Write-Host '[+] No Blind Eagle artifacts found.' } else { $findings | ForEach-Object { Write-Host "[!] $_" } }
Response Priorities
Immediate (0–4 hours)
- Block
rema200426.duckdns.orgat DNS sinkhole and egress proxy; add both SHA256 hashes to EDR block policies. - Retro-hunt 14–30 days of DNS/proxy/EDR telemetry using the KQL above; isolate any host with DuckDNS resolutions from non-browser processes.
- Search mail gateways for VBScript/JS attachments and GitHub-linked lures targeting Spanish-speaking finance staff.
24 Hours
- Credential exposure assessment: This campaign explicitly targets Chrome credential stores and banking sessions. Any host with a confirmed AsyncRAT/njRAT execution requires forced password resets for all users of that endpoint — prioritizing banking, SSO, and email credentials — plus review of browser-saved credentials and session tokens.
- Review financial transaction logs from affected business units for anomalous transfers consistent with HVNC-driven fraud; brief fraud teams on Blind Eagle TTPs.
- Check GitHub access logs for retrieval of AutoIt3 binaries/scripts from endpoints.
1 Week
- Architectural hardening: Restrict AutoIt3, wscript, and cscript execution via AppLocker/WDAC for users who don't require them; block or alert on egress to dynamic DNS providers (DuckDNS, No-IP) absent a business justification.
- Deploy the Sigma detections fleet-wide and tune browser-filter logic for your sanctioned DDNS use cases.
- Implement network-level process injection detection (EDR AMSI/ETW telemetry) and disable Office/script attachment types at the gateway for the Colombian finance user population.
- Conduct a targeted phishing-awareness refresh in Spanish for finance teams, using Blind Eagle's government-impersonation lures as training material.
Related Resources
Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.