Back to Intelligence

Lazarus Operation Dream Job: LightlessCan & NickelLoader Target Aerospace via Trojanized Coding Challenges — OTX Pulse Detection Pack

SA
Security Arsenal Team
October 18, 2026
8 min read

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:

  1. Reconnaissance & Lure: Operators masquerade as Meta recruiters on LinkedIn, cultivating trust with aerospace employees over extended social-engineering conversations.
  2. Delivery: The target receives a 'coding challenge' or 'skills assessment' — a trojanized project that executes a malicious loader when the victim builds/runs it.
  3. Staging: NickelLoader acts as the intermediate loader, decrypting and injecting downstream payloads, often via DLL side-loading against legitimate signed binaries.
  4. Payload: LightlessCan — a previously undocumented, feature-rich backdoor — is deployed as the primary implant. miniBlindingCan and BLINDINGCAN (S0520) appear as companion/fallback implants.
  5. 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:

TypeExamplesOperationalization
Domainturnscor.com, barsaji.com.mx, hurricanepub.comBlock 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.
Hostnamemantis.quick.net.plTreat as compromised infrastructure; sinkhole and hunt historical DNS.
URL/include/include.php, /wp-includes/contacts.php, /library/securimage/index.php, /prod_img/201409/prod.phpThese 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

YAML
---
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
KQL — Microsoft Sentinel / Defender
// 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
PowerShell
# 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.