Back to Intelligence

Larva-26005 (North Korea) Xctdoor Backdoor Campaign: CRAT Lineage, DLL Side-Loading & Ngrok C2 — OTX Enterprise Detection Pack

SA
Security Arsenal Team
August 6, 2026
12 min read

A new AlienVault OTX pulse published on 2026-08-06 consolidates analysis from AhnLab ASEC on Larva-26005, a North Korea–linked threat actor distributing the Xctdoor backdoor to targets in Korea since at least 2020. This briefing synthesizes the pulse's 17 indicators — including CVE-2017-8291, three C2 domains, and three file hashes — into an enterprise-ready detection and response package for SOC teams defending defense and technology organizations.


Threat Summary

Larva-26005 represents the continued evolution of a long-running DPRK intrusion set whose tooling connects directly to past CRAT (a.k.a. McRat) attack cases. The pulse links the actor to an extensive malware genealogy: Xctdoor, XcLoader, Hydraq/HidraQ (S0203), Roarur, MdmBot, HomeUnix/Homux, Aurora, 9002 RAT, ThreatNeedle (S0665), and Hansom ransomware — alongside operational use of Ngrok (S9000) for tunneling C2 traffic.

The collective picture is a mature, multi-year espionage-and-disruption operation:

  1. Initial Access — Spear-phishing emails carrying LNK shortcut files masquerading as documents, or trojanized security-software installers.
  2. ExecutionDLL side-loading of malicious payloads alongside legitimate signed binaries, exploiting CVE-2017-8291 (a Ghostscript remote code execution flaw) in some chains.
  3. Payload — Xctdoor backdoors written in C++ and Go, loaded via XcLoader, providing remote command execution, file exfiltration, and staged deployment of secondary implants (historically CRAT and Hansom ransomware).
  4. Objective — Persistent access to defense and technology sector networks in Korea for intelligence collection, credential theft, and — when operationally useful — ransomware deployment for disruption or revenue.

The credential-theft dimension is significant: backdoor access of this depth routinely precedes harvesting of stored credentials, browser data, VPN profiles, and domain tokens, which is why this briefing is classified under darkweb-credentials — credentials stolen in these campaigns have historically surfaced in DPRK-adjacent monetization channels.


Threat Actor / Malware Profile

Larva-26005 (DPRK-nexus)

AttributeDetail
AttributionNorth Korea–linked (Larva cluster)
Active sinceAt least 2020
TargetsDefense & Technology sectors, primarily Korean organizations
DeliverySpear-phishing LNK files, trojanized security software installers
ExploitationCVE-2017-8291 (Ghostscript RCE)
ToolingXctdoor (C++/Go), XcLoader, CRAT/McRat, Hydraq, 9002 RAT, ThreatNeedle, Hansom ransomware

Xctdoor Backdoor — Behavioral Profile

  • Distribution method: LNK shortcut files disguised as documents execute loader logic; fake installers for Korean security products drop the payload. XcLoader stages and decrypts Xctdoor in memory.
  • Payload behavior: Full-featured backdoor — arbitrary command execution, file upload/download, process enumeration, screenshot capture, and module loading. Go variants are cross-platform and resist static signature matching due to large runtime binaries.
  • C2 communication: Hardcoded domains (observed: casinolegit.info, ntsgo.name, ntsgo-corp.com) and compromised/attacker-controlled web infrastructure (www.fabioluciani.com). The actor has also leveraged Ngrok TCP/HTTP tunneling to expose C2 listeners through legitimate ngrok.io infrastructure, blending malicious traffic with a legitimate developer service.
  • Persistence mechanism: DLL side-loading ensures execution whenever the abused legitimate binary launches (often placed alongside startup shortcuts or service registrations). Registry Run keys and scheduled tasks have been observed in adjacent CRAT cases.
  • Anti-analysis techniques: Side-loading behind signed binaries defeats naive application allow-listing; encrypted payload staging via XcLoader; Go compilation inflates binary size and frustrates disassembly; use of CVE-2017-8291 allows exploitation without obvious macro or script artifacts.

The CRAT / Hansom Connection

Earlier campaigns paired CRAT (a Delphi-based RAT) with Hansom ransomware — an unusual espionage-plus-extortion combination characteristic of DPRK operators who monetize access when intelligence value is exhausted. Xctdoor is the successor implant: organizations that detect Xctdoor should assume the operator may pivot to ransomware deployment.


IOC Analysis

The pulse contains 17 indicators across four types. Here is how to operationalize each:

CVE Indicator

  • CVE-2017-8291 — Ghostscript -dSAFER sandbox bypass leading to RCE. Operationalize via your vulnerability management platform, not your SIEM blocklist: scan for vulnerable Ghostscript versions (pre-9.21) on endpoints, print servers, document-processing pipelines, and mail gateways that rasterize PostScript/PDF attachments. This CVE indicates the actor weaponizes document-rendering components — patch or isolate them.

Domain & Hostname Indicators

  • casinolegit.info, ntsgo.name, ntsgo-corp.com — C2 domains. Block at DNS resolver, secure web gateway, and firewall. Enable DNS query logging retention and retro-hunt query logs back 90+ days — this campaign has run for years.
  • www.fabioluciani.com — compromised or actor-operated web host used in the C2 chain. Block and hunt for HTTP(S) sessions to it, particularly POST requests with encoded bodies from non-browser processes.

File Hash Indicators (MD5)

  • 0d2e61c8a5e6280e065b61e75b848c68, 12391f66ee33d379108fd649a999e1a0, 01b58f2ff2c14feed46a0768ea46686d — Xctdoor/XcLoader samples. Load into your EDR blocklist and threat-intel platform (MISP, OpenCTI, or native Sentinel/Defender TI connectors). MD5 is collision-weak and easily evaded by recompilation — treat hash blocking as a tripwire, and rely on the behavioral detections below as your primary defense. Note the Go-compiled variants will not match these hashes.

Tooling for Decoding

  • LOKI / THOR scanners for hash and filename sweeps across fleets.
  • Defender for Endpoint / CrowdStrike / SentinelOne custom IOC feeds for hash + domain blocking.
  • Zeek/Suricata for network retro-hunting against DNS and TLS metadata.
  • MISP / OpenCTI to ingest the OTX pulse directly via the AlienVault OTX DirectConnect API for continuous indicator synchronization.

Detection Engineering

The following detections target the specific behaviors in this pulse: LNK-based execution, DLL side-loading, C2 beaconing to the named domains, and Ngrok tunneling abuse.

YAML
---
title: Larva-26005 Xctdoor LNK Execution and DLL Side-Loading
id: 8f3a2b1c-26005-xctdoor-lnk-sideload
description: Detects spear-phishing LNK execution spawning script interpreters or rundll32, consistent with Xctdoor/XcLoader delivery and DLL side-loading tradecraft used by Larva-26005.
status: experimental
author: Security Arsenal Threat Intelligence
date: 2026/08/06
references:
    - https://asec.ahnlab.com/en/94847
logsource:
    category: process_creation
    product: windows
detection:
    selection_lnk_parent:
        ParentImage|endswith: '\explorer.exe'
    selection_lnk_child:
        Image|endswith:
            - '\rundll32.exe'
            - '\regsvr32.exe'
            - '\mshta.exe'
            - '\wscript.exe'
            - '\cscript.exe'
            - '\powershell.exe'
            - '\cmd.exe'
    selection_lnk_cmdline:
        CommandLine|contains:
            - '.lnk'
            - 'temp\'
            - 'appdata\'
            - 'programdata\'
    condition: selection_lnk_parent and selection_lnk_child and selection_lnk_cmdline
falsepositives:
    - Legitimate shortcut-driven application launches (rare for rundll32/mshta parents)
level: high
tags:
    - attack.initial_access
    - attack.t1566.001
    - attack.t1204.002
    - attack.defense_evasion
    - attack.t1574.002
---
title: Larva-26005 Xctdoor C2 Communication and Ngrok Tunneling
id: 8f3a2b1c-26005-xctdoor-c2-ngrok
description: Detects DNS or network connections to known Larva-26005 Xctdoor C2 domains or Ngrok tunnel endpoints spawned by non-browser processes, matching ThreatNeedle/Ngrok tunneling tradecraft.
status: experimental
author: Security Arsenal Threat Intelligence
date: 2026/08/06
references:
    - https://asec.ahnlab.com/en/94847
logsource:
    category: dns
    product: windows
detection:
    selection_c2:
        query|contains:
            - 'casinolegit.info'
            - 'ntsgo.name'
            - 'ntsgo-corp.com'
            - 'fabioluciani.com'
    selection_ngrok:
        query|contains:
            - 'ngrok.io'
            - 'ngrok.com'
            - 'ngrok-free.app'
    condition: selection_c2 or selection_ngrok
falsepositives:
    - Developers legitimately using Ngrok (restrict by process context in your SIEM join)
level: critical
tags:
    - attack.command_and_control
    - attack.t1071.001
    - attack.t1572
---
title: Larva-26005 Ghostscript Exploitation CVE-2017-8291 Spawning Suspicious Child Processes
id: 8f3a2b1c-26005-ghostscript-cve-2017-8291
description: Detects Ghostscript (gswin32c/gswin64c) spawning shells or script interpreters, indicative of CVE-2017-8291 exploitation in document-processing chains used by Larva-26005.
status: experimental
author: Security Arsenal Threat Intelligence
date: 2026/08/06
references:
    - https://asec.ahnlab.com/en/94847
logsource:
    category: process_creation
    product: windows
detection:
    selection_parent:
        ParentImage|endswith:
            - '\gswin32c.exe'
            - '\gswin64c.exe'
            - '\gs.exe'
    selection_child:
        Image|endswith:
            - '\cmd.exe'
            - '\powershell.exe'
            - '\pwsh.exe'
            - '\wscript.exe'
            - '\rundll32.exe'
            - '\mshta.exe'
    condition: selection_parent and selection_child
falsepositives:
    - None expected; Ghostscript should never spawn shells in normal operation
level: critical
tags:
    - attack.execution
    - attack.t1203
    - cve.2017-8291
KQL — Microsoft Sentinel / Defender
// Larva-26005 Xctdoor Hunt — C2 beacons, LNK/side-load execution, Ngrok abuse
// Microsoft Sentinel / Defender for Endpoint
let c2_domains = dynamic(["casinolegit.info", "ntsgo.name", "ntsgo-corp.com", "fabioluciani.com"]);
let ngrok_suffixes = dynamic(["ngrok.io", "ngrok.com", "ngrok-free.app"]);
let known_hashes = dynamic([
    "0d2e61c8a5e6280e065b61e75b848c68",
    "12391f66ee33d379108fd649a999e1a0",
    "01b58f2ff2c14feed46a0768ea46686d"]);
let suspicious_children = dynamic(["rundll32.exe", "regsvr32.exe", "mshta.exe",
    "wscript.exe", "cscript.exe", "powershell.exe", "cmd.exe"]);
union isfuzzy=true
    // 1) Network beacons to Xctdoor C2 or Ngrok tunnels from non-browser processes
    (DeviceNetworkEvents
    | where TimeGenerated > ago(30d)
    | where RemoteUrl has_any (c2_domains)
       or (RemoteUrl has_any (ngrok_suffixes)
           and InitiatingProcessFileName !in~ ("chrome.exe","msedge.exe","firefox.exe","ngrok.exe"))
    | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine,
              RemoteUrl, RemoteIP, ActionType, HuntSignal="C2_Beacon"),
    // 2) LNK-driven execution chain: explorer spawning script interpreters referencing .lnk
    (DeviceProcessEvents
    | where TimeGenerated > ago(30d)
    | where InitiatingProcessFileName =~ "explorer.exe"
    | where FileName in~ (suspicious_children)
    | where ProcessCommandLine has_any (".lnk", "\\temp\\", "\\appdata\\", "\\programdata\\")
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine,
              InitiatingProcessFileName, HuntSignal="LNK_Execution"),
    // 3) Hash match on known Xctdoor / XcLoader samples
    (DeviceProcessEvents
    | where TimeGenerated > ago(30d)
    | where MD5 in~ (known_hashes)
    | project TimeGenerated, DeviceName, FileName, FolderPath, MD5, HuntSignal="Hash_Match"),
    // 4) Ghostscript CVE-2017-8291 exploitation: gs spawning shells
    (DeviceProcessEvents
    | where TimeGenerated > ago(30d)
    | where InitiatingProcessFileName has_any ("gswin32c", "gswin64c", "gs.exe")
    | where FileName in~ (suspicious_children)
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine,
              InitiatingProcessFileName, HuntSignal="Ghostscript_Exploit")
| sort by TimeGenerated desc
PowerShell
# Larva-26005 / Xctdoor IOC Hunt Script
# Checks hosts for C2 connections, persistence artifacts, and known malware hashes
# Run elevated; suitable for remote sweep via Invoke-Command

$C2Domains   = @("casinolegit.info","ntsgo.name","ntsgo-corp.com","www.fabioluciani.com")
$KnownHashes = @("0d2e61c8a5e6280e065b61e75b848c68",
                 "12391f66ee33d379108fd649a999e1a0",
                 "01b58f2ff2c14feed46a0768ea46686d")
$SuspectDirs = @("$env:TEMP","$env:APPDATA","$env:LOCALAPPDATA","$env:ProgramData")
$findings = @()

Write-Host "[*] Larva-26005 Xctdoor Hunt - $(Get-Date -Format o)`n" -ForegroundColor Cyan

# --- 1) Active network connections resolving to C2 / ngrok ---
Write-Host "[1] Checking DNS cache and active connections for C2 artifacts..." -ForegroundColor Yellow
$dnsCache = Get-DnsClientCache -ErrorAction SilentlyContinue
foreach ($d in $C2Domains) {
    $hit = $dnsCache | Where-Object { $_.Entry -like "*$d*" }
    if ($hit) { $findings += "DNS cache hit for C2 domain: $d" }
}
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue | ForEach-Object {
    try {
        $rdns = (Resolve-DnsName $_.RemoteAddress -ErrorAction Stop).NameHost
        if ($C2Domains | Where-Object { $rdns -like "*$_*" } -or $rdns -like "*ngrok*") {
            $proc = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
            $findings += "Suspicious connection: $($_.RemoteAddress) ($rdns) PID $($_.OwningProcess) [$proc]"
        }
    } catch {}
}

# --- 2) Persistence: Run keys with side-loading-style paths ---
Write-Host "[2] Auditing Run keys and scheduled tasks..." -ForegroundColor Yellow
$runKeys = @("HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
             "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",
             "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run")
foreach ($key in $runKeys) {
    if (Test-Path $key) {
        Get-ItemProperty $key | Get-Member -MemberType NoteProperty | ForEach-Object {
            $val = (Get-ItemProperty $key -Name $_.Name -ErrorAction SilentlyContinue).($_.Name)
            if ($val -match "(?i)(temp|appdata|programdata|rundll32|regsvr32|\.dll)") {
                $findings += "Suspicious Run key: $key\$($_.Name) = $val"
            }
        }
    }
}
Get-ScheduledTask | Where-Object {
    $_.Actions.Execute -match "(?i)(rundll32|regsvr32|mshta|powershell)" -and
    $_.Actions.Arguments -match "(?i)(temp|appdata|programdata|\.dll|http)"
} | ForEach-Object { $findings += "Suspicious scheduled task: $($_.TaskName) -> $($_.Actions.Execute) $($_.Actions.Arguments)" }

# --- 3) Hash sweep in suspect directories ---
Write-Host "[3] Hashing binaries in TEMP/APPDATA/PROGRAMDATA (this may take a while)..." -ForegroundColor Yellow
foreach ($dir in $SuspectDirs) {
    if (Test-Path $dir) {
        Get-ChildItem $dir -Recurse -Include *.exe,*.dll -ErrorAction SilentlyContinue | ForEach-Object {
            $md5 = (Get-FileHash $_.FullName -Algorithm MD5 -ErrorAction SilentlyContinue).Hash
            if ($KnownHashes -contains $md5.ToLower()) {
                $findings += "MALWARE HASH MATCH: $($_.FullName) [$md5]"
            }
        }
    }
}

# --- 4) Orphaned DLLs next to legitimate binaries (side-load staging) ---
Write-Host "[4] Checking for recently modified DLLs outside System32 (side-load staging)..." -ForegroundColor Yellow
Get-ChildItem $SuspectDirs -Recurse -Include *.dll -ErrorAction SilentlyContinue |
    Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-60) -and
                   -not (Get-AuthenticodeSignature $_.FullName -ErrorAction SilentlyContinue).Status -eq "Valid" } |
    ForEach-Object { $findings += "Unsigned recent DLL (possible side-load payload): $($_.FullName)" }

# --- Report ---
Write-Host "`n=== HUNT RESULTS ===" -ForegroundColor Cyan
if ($findings.Count -eq 0) {
    Write-Host "[+] No Larva-26005 / Xctdoor artifacts detected on $env:COMPUTERNAME" -ForegroundColor Green
} else {
    $findings | ForEach-Object { Write-Host "[!] $_" -ForegroundColor Red }
    $findings | Out-File "$env:TEMP\xctdoor_hunt_$(Get-Date -Format yyyyMMdd_HHmmss).log"
    Write-Host "`nFindings logged to $env:TEMP. ISOLATE THIS HOST and escalate to IR." -ForegroundColor Red
}

Response Priorities

Immediate (0–4 hours)

  • Block casinolegit.info, ntsgo.name, ntsgo-corp.com, and www.fabioluciani.com at DNS resolvers, secure web gateways, and egress firewalls.
  • Push the three MD5 hashes into EDR blocklists; deploy the Sigma rules above to your SIEM.
  • Retro-hunt DNS and proxy logs back at least 90 days — this campaign's operational tempo is measured in years.
  • Audit for Ngrok usage: if ngrok is not an approved tool, block ngrok.io/ngrok.com/ngrok-free.app at the proxy and alert on any ngrok.exe execution.
  • Isolate any host with a confirmed hash match or C2 beacon.

24 Hours

  • Treat this as a credential-theft event for any confirmed-compromised host: force password resets for all accounts that authenticated from or to the affected machine, including service accounts and cached domain credentials (run klist purge, revoke Kerberos tickets, reset krbtgt twice if domain controllers were touched).
  • Revoke active sessions and refresh tokens (OAuth, VPN, SSO) tied to affected users; enforce MFA re-enrollment verification.
  • Hunt for staged secondary payloads (CRAT, Hansom ransomware artifacts): check for shadow-copy deletion (vssadmin delete shadows), mass file renames, and RDP/SMB lateral movement from compromised hosts.
  • Scan for Ghostscript versions vulnerable to CVE-2017-8291 across endpoints, mail gateways, and document-processing servers; patch or sandbox rendering pipelines.

1 Week

  • Block or heavily restrict LNK files in email attachments at the gateway; enable Attack Surface Reduction rules for Office/script-interpreter child processes and LNK-based execution.
  • Implement application control with publisher + path rules (WDAC/AppLocker) to defeat DLL side-loading; alert on DLLs loaded from user-writable directories.
  • Deploy DLL-search-order hardening and enable SafeDllSearchMode; audit for unsigned DLLs adjacent to signed executables.
  • Conduct a spear-phishing simulation themed around security-software installers — the actor's exact lure — for Korean-language and defense-adjacent business units.
  • Subscribe to the OTX pulse via DirectConnect API into MISP/OpenCTI so future Larva-26005 indicators auto-populate your detection stack.

Analyst Note: Larva-26005's lineage — Aurora to Hydraq to 9002 RAT to ThreatNeedle to Xctdoor — traces one of the longest continuously operating DPRK intrusion toolchains on record. Defense and technology organizations with Korean business exposure should treat this pulse as an active-compromise indicator set, not a historical curiosity. The pairing of espionage implants with Hansom ransomware means containment speed directly determines whether you face an intelligence breach or an encryption event.

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.