Threat Summary
This OTX pulse, sourced from ESET Research, documents a live intrusion by the Lazarus Group (DPRK state-sponsored) against a Spanish aerospace company — a continuation of the long-running Operation Dream Job playbook. The attack chain is human-first, not exploit-first:
- Reconnaissance & Lure: Operators masquerade as Meta recruiters on LinkedIn, cultivating trust with aerospace employees over extended social-engineering conversations.
- Delivery: The target receives a 'coding challenge' or 'skills assessment' — a trojanized project that executes a malicious loader when the victim builds/runs it.
- Staging: NickelLoader acts as the intermediate loader, decrypting and injecting downstream payloads, often via DLL side-loading against legitimate signed binaries.
- Payload: LightlessCan — a previously undocumented, feature-rich backdoor — is deployed as the primary implant. miniBlindingCan and BLINDINGCAN (S0520) appear as companion/fallback implants.
- Objective: Persistent cyber-espionage access to aerospace engineering data, intellectual property, and defense-adjacent supply chains — consistent with DPRK tasking against defense/aerospace globally.
The infrastructure observed mixes purpose-registered domains (turnscor.com) with compromised legitimate WordPress sites (hurricanepub.com, barsaji.com.mx, keewoom.co.kr, mantis.quick.net.pl) serving as C2 redirectors — a deliberate blending technique that frustrates naive domain-age and reputation filtering.
Threat Actor / Malware Profile
Lazarus Group (APT38 / Diamond Sleet)
DPRK-attributed, active since 2009. Operation Dream Job is their flagship initial-access tradecraft: fake recruiter personas targeting defense, aerospace, crypto, and software engineers with job-themed lures. The aerospace focus here aligns with Lazarus's documented interest in drone, satellite, and missile-adjacent IP.
LightlessCan
- Type: Full-featured backdoor; successor lineage to BlindingCan.
- Behavior: Mimics native Windows command-line utilities (netstat, tasklist, ipconfig-style output) so operator activity resembles legitimate admin actions in process telemetry. Executes commands internally rather than spawning child processes — suppressing Sysmon/EDR process-lineage detection.
- C2: HTTPS to attacker-controlled or compromised web infrastructure; blends with normal outbound web traffic.
- Anti-analysis: Environment checks, execution-guardrail dependencies on loader-delivered parameters (won't fully detonate without the NickelLoader chain), and in-memory-only staging.
NickelLoader
- Role: Intermediate loader responsible for decrypting, unwrapping, and injecting LightlessCan.
- Technique: DLL side-loading — a malicious DLL planted beside a legitimate, signed executable that loads it preferentially.
miniBlindingCan / BLINDINGCAN (S0520)
- Role: Established Lazarus RATs used as secondary implants. Remote access, file exfiltration, command execution, and payload retrieval. Presence of multiple implants indicates resilience-by-redundancy: kill one C2 channel and the operator persists via another.
Persistence & Distribution
- Persistence typically via scheduled tasks, registry Run keys, or service installation dropped during the loader stage.
- Distribution is exclusively spearphishing-driven (LinkedIn DM → off-platform chat → file delivery), meaning email gateway controls will not see the lure.
IOC Analysis
The pulse contains 35 indicators dominated by two types:
| Type | Examples | Operationalization |
|---|---|---|
| Domain | turnscor.com, barsaji.com.mx, hurricanepub.com | Block at DNS/proxy; alert on any resolution. Note compromised-legitimate domains (hurricanepub.com) — block by full URL path, not just domain, to avoid breaking legitimate browsing if business-relevant. |
| Hostname | mantis.quick.net.pl | Treat as compromised infrastructure; sinkhole and hunt historical DNS. |
| URL | /include/include.php, /wp-includes/contacts.php, /library/securimage/index.php, /prod_img/201409/prod.php | These path patterns on unrelated, legitimate sites are classic Lazarus C2 endpoint camouflage. Feed full URLs into proxy/SWG blocklists and retro-hunt proxy logs. |
SOC guidance:
- Ingest the full OTX pulse IOC set into your TI platform (MISP, OpenCTI, or direct OTX API subscription) and push to EDR blocklists, DNS firewalls, and proxy policies.
- Retro-hunt 90 days of DNS and proxy logs for these indicators — Dream Job campaigns have long dwell times before detection.
- AlertLogic: any HTTP(S) connection to PHP endpoints under unusual paths (/wp-includes/*.php with query strings, /include/include.php) from endpoints — not servers — is high-signal.
Detection Engineering
---
title: Lazarus LightlessCan DLL Side-Loading via NickelLoader
id: 8f3a2b1c-laza-2026-0001
status: experimental
description: Detects DLL side-loading patterns associated with NickelLoader staging LightlessCan — unsigned DLL loaded from non-standard directory by a signed legitimate binary
date: 2026/10/18
author: Security Arsenal Threat Intelligence
references:
- https://www.welivesecurity.com/en/eset-research/lazarus-luring-employees-trojanized-coding-challenges-case-spanish-aerospace-company
logsource:
category: image_load
product: windows
detection:
selection_path:
ImageLoaded|contains:
- '\Downloads\'
- '\AppData\Local\Temp\'
- '\AppData\Roaming\'
- '\Users\Public\'
- '\ProgramData\'
selection_unsigned:
Signed: 'false'
filter_system:
ImageLoaded|contains:
- '\Windows\System32\'
- '\Windows\SysWOW64\'
condition: selection_path and selection_unsigned and not filter_system
level: high
tags:
- attack.defense_evasion
- attack.t1574.002
- attack.persistence
---
title: Lazarus LightlessCan C2 Communication — Known Dream Job Infrastructure
id: 8f3a2b1c-laza-2026-0002
status: experimental
description: Detects network connections to known Lazarus Operation Dream Job C2 domains from the OTX pulse on the Spanish aerospace intrusion
date: 2026/10/18
author: Security Arsenal Threat Intelligence
references:
- https://otx.alienvault.com
logsource:
category: dns
product: windows
detection:
selection:
QueryName|contains:
- 'turnscor.com'
- 'hurricanepub.com'
- 'barsaji.com.mx'
- 'keewoom.co.kr'
- 'mantis.quick.net.pl'
condition: selection
level: critical
tags:
- attack.command_and_control
- attack.t1071.001
---
title: Trojanized Coding Challenge Execution — Suspicious Dev Tool Child Processes
id: 8f3a2b1c-laza-2026-0003
status: experimental
description: Detects suspicious child processes spawned by build tools, IDEs, or executables launched from Downloads — consistent with trojanized coding challenge payloads delivered via LinkedIn recruiter lures
date: 2026/10/18
author: Security Arsenal Threat Intelligence
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|contains:
- '\Downloads\'
ParentImage|endswith:
- '.exe'
selection_child:
Image|endswith:
- '\powershell.exe'
- '\cmd.exe'
- '\rundll32.exe'
- '\regsvr32.exe'
- '\mshta.exe'
- '\wscript.exe'
- '\cscript.exe'
- '\msbuild.exe'
condition: selection_parent and selection_child
level: high
tags:
- attack.execution
- attack.t1059
- attack.t1204.002
// Lazarus Operation Dream Job — LightlessCan/NickelLoader hunt
// Targets: C2 comms to pulse IOCs + suspicious DLL side-loading + downloads-origin execution
let dreamjob_iocs = dynamic(["turnscor.com","hurricanepub.com","barsaji.com.mx","keewoom.co.kr","mantis.quick.net.pl"]);
let c2_events = DeviceNetworkEvents
| where TimeGenerated > ago(30d)
| where RemoteUrl has_any (dreamjob_iocs)
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, ActionType;
let sideload_events = DeviceImageLoadEvents
| where TimeGenerated > ago(30d)
| where FolderPath has_any (@"\Downloads\", @"\AppData\Local\Temp\", @"\Users\Public\", @"\AppData\Roaming\")
| join kind=inner (DeviceProcessEvents | project DeviceId, ProcessId, FileName, ProcessCommandLine, TimeGenerated) on DeviceId, $left.InitiatingProcessId == $right.ProcessId
| project TimeGenerated, DeviceName, FileName, FolderPath, SHA256, ProcessCommandLine;
let exec_events = DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where InitiatingProcessFolderPath has @"\Downloads\"
| where FileName in~ ("powershell.exe","cmd.exe","rundll32.exe","regsvr32.exe","mshta.exe","msbuild.exe")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, InitiatingProcessCommandLine;
union c2_events, exec_events
| order by TimeGenerated desc
# Lazarus Dream Job IOC Hunt — LightlessCan / NickelLoader / BLINDINGCAN
# Run elevated on suspected endpoints. Checks persistence, network, and staging artifacts.
$IOCDomains = @("turnscor.com","hurricanepub.com","barsaji.com.mx","keewoom.co.kr","mantis.quick.net.pl")
$StagingPaths = @("$env:USERPROFILE\Downloads","$env:APPDATA","$env:LOCALAPPDATA\Temp","C:\Users\Public","C:\ProgramData")
$Findings = @()
Write-Host "[1/5] Checking DNS cache for Dream Job C2 domains..." -ForegroundColor Cyan
$dns = Get-DnsClientCache | Where-Object { $d = $_.Entry; $IOCDomains | Where-Object { $d -like "*$_*" } }
if ($dns) { $Findings += "DNS CACHE HIT: $($dns.Entry -join ', ')" }
Write-Host "[2/5] Checking active network connections..." -ForegroundColor Cyan
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue | ForEach-Object {
try {
$r = Resolve-DnsName $_.RemoteAddress -ErrorAction SilentlyContinue
if ($r -and ($IOCDomains | Where-Object { $r.NameHost -like "*$_*" })) {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
$Findings += "ACTIVE C2: $($r.NameHost) via $($proc.ProcessName) (PID $($_.OwningProcess))"
}
} catch {}
}
Write-Host "[3/5] Scanning Run keys and services for persistence..." -ForegroundColor Cyan
$runKeys = @("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run","HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run")
foreach ($k in $runKeys) {
Get-ItemProperty $k -ErrorAction SilentlyContinue | Get-Member -MemberType NoteProperty | ForEach-Object {
$val = (Get-ItemProperty $k -Name $_.Name -ErrorAction SilentlyContinue).($_.Name)
if ($val -match "Temp|Downloads|Public|AppData") { $Findings += "PERSISTENCE: $k -> $($_.Name) = $val" }
}
}
Write-Host "[4/5] Checking scheduled tasks for non-standard user-context tasks..." -ForegroundColor Cyan
Get-ScheduledTask | Where-Object { $_.TaskPath -notlike "\Microsoft*" } | ForEach-Object {
$action = $_.Actions.Execute
if ($action -match "Temp|Downloads|Public|AppData") { $Findings += "SCHEDTASK: $($_.TaskName) -> $action" }
}
Write-Host "[5/5] Scanning staging paths for recently created unsigned DLLs/EXEs..." -ForegroundColor Cyan
foreach ($p in $StagingPaths) {
Get-ChildItem $p -Recurse -Include *.dll,*.exe -ErrorAction SilentlyContinue |
Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-45) } | ForEach-Object {
$sig = Get-AuthenticodeSignature $_.FullName
if ($sig.Status -ne 'Valid') { $Findings += "UNSIGNED BINARY: $($_.FullName) created $($_.CreationTime)" }
}
}
Write-Host "`n===== RESULTS =====" -ForegroundColor Yellow
if ($Findings.Count -eq 0) { Write-Host "No Dream Job artifacts found." -ForegroundColor Green }
else { $Findings | ForEach-Object { Write-Host $_ -ForegroundColor Red }; Write-Host "`n$($Findings.Count) findings — isolate host and escalate to IR." }
Response Priorities
Immediate (0–4h):
- Block all pulse IOCs at DNS, proxy/SWG, and EDR network-control layers. Block full URL paths for compromised-legitimate domains.
- Deploy the Sigma rules and execute the KQL hunt across the last 30–90 days of telemetry.
- Alert employees — especially engineering staff — on the LinkedIn recruiter lure: unsolicited Meta/tech recruiter contact followed by coding challenges or project files is now a confirmed Lazarus vector. Institute a policy: external coding assessments must be opened only in sandboxed VMs.
24 Hours:
- Run the PowerShell hunt on endpoints belonging to anyone in engineering, R&D, or program-management roles.
- Review LinkedIn-adjacent risk: while credentials weren't the primary objective here, LightlessCan has full host access — force credential resets (including Kerberos/AAD tokens) for any user whose endpoint shows staging artifacts, and revoke active sessions.
- Identify whether any victim forwarded the trojanized challenge internally — Dream Job payloads spread laterally through collaboration tools.
1 Week:
- Architectural hardening for aerospace/defense posture: application control (WDAC/AppLocker) blocking unsigned DLL loading from user-writable directories; restrict execution from Downloads via attack surface reduction rules.
- Segment engineering workstations from document/IP repositories; require step-up authentication for access to design data.
- Subscribe to the OTX pulse feed programmatically for continuous IOC refresh — Lazarus rotates Dream Job infrastructure aggressively.
- Brief HR and recruiting-adjacent teams so legitimate hiring workflows don't get disrupted by false positives while real lures get reported faster.
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.