Back to Intelligence

Gorbag Espionage on Ukraine, Rogue Gentlemen Affiliate 'Azazel' & XWorm RAT: OTX Pulse Detection Pack

SA
Security Arsenal Team
November 4, 2026
9 min read

Three concurrent OTX pulses published 2026-11-04 paint a busy threat landscape: a Russia-aligned espionage crew running rapid-hit intelligence collection against Ukraine, a ransomware affiliate gone rogue against its own RaaS operator, and the continued industrialization of the XWorm modular RAT. All three are TLP:WHITE and immediately actionable.

Threat Summary

Pulse 1 — Gorbag (ESET/OTX). Active since February 2025, Gorbag conducts highly targeted cyberespionage against Ukrainian law enforcement, justice entities, front-line local administrations, transportation, and defense. The group favors speed over persistence: spearphishing delivers simple infostealers — BeautyStealer, GIFTEDCROOK, and the Prime ReverseShell — for rapid intelligence harvesting rather than long-term footholds. Delivery leverages CVE-2025-8088 (WinRAR archive traversal) to plant payloads via malicious archives. C2 infrastructure includes M247-hosted VPS nodes (89.44.9.186, AS9009), typical of bulletproof-adjacent hosting rented for short campaign windows.

Pulse 2 — 'The Gentlemen Files' (CloudSEK/OTX). A Russian-speaking affiliate of the Gentlemen RaaS, self-identifying as Azazel, compromised 24+ organizations across six countries (logistics, finance, healthcare, technology, government) while simultaneously betraying the RaaS operator — standing up an independent leak site, LEAKNED, and pocketing 100% of extortion proceeds. Initial access was dominated by exploitation of CI/CD secrets extracted from GitLab instances, including one deep compromise of an AI platform via its MCP integration. The lure domain forgitlab.com suggests credential-phishing against GitLab operators.

Pulse 3 — XWorm (Cyberint/OTX). The DDGroup-associated XWorm RAT continues to spread via phishing attachments, drive-by downloads, and exploit kits, with RDP exploitation as a lateral vector. Its modular design covers remote access, data theft, ransomware delivery, and botnet enrollment. C2 leans heavily on free dynamic-DNS (duckdns.org, webredirect.org subdomains), and 40 IOCs accompany the pulse.

Collective read: commodity-stealer economics (Gorbag, XWorm) and access-via-developer-infrastructure (Azazel) converge on one lesson — credentials and secrets are the kill chain's fuel. Rapid triage, secrets hygiene, and dynamic-DNS egress control are the common denominators.

Threat Actor / Malware Profile

Gorbag (Russia-aligned espionage)

  • Distribution: Spearphishing with malicious WinRAR archives exploiting CVE-2025-8088 (archive path traversal drops payloads to Startup/alternate locations on extraction).
  • Payload behavior: GIFTEDCROOK and BeautyStealer enumerate browser credential stores, cookies, session tokens, and documents of intelligence value; Prime ReverseShell provides on-demand interactive access for tasking.
  • C2 communication: Short-lived VPS nodes (observed: 89.44.9.186 — M247/AS9009, FR; 142.111.194.73). HTTP(S) exfil of zipped staging archives.
  • Persistence: Deliberately minimal — smash-and-grab model; occasional Startup-folder drops via the archive exploit.
  • Anti-analysis: Lightweight packing, short operational windows, infrastructure rotation between campaigns.

Gentlemen RaaS affiliate 'Azazel' / LEAKNED

  • Distribution: Abuse of exposed GitLab instances; harvesting CI/CD pipeline variables, deploy tokens, and cloud keys; phishing via lookalike domain forgitlab.com.
  • Payload behavior: Gentlemen ransomware encryptor plus double-extortion staging; independent leak infrastructure (LEAKNED) for victim shaming.
  • C2/exfil: Cloud storage and attacker-controlled VPS exfil prior to encryption; leak-site publication post-extortion.
  • Persistence: Valid cloud accounts and service tokens stolen from CI/CD — persistence through legitimate credentials rather than implants.
  • Anti-analysis: Living-off-the-cloud; blends with legitimate DevOps tooling, making EDR-only detection insufficient.

XWorm (DDGroup)

  • Distribution: Phishing attachments, drive-by downloads, exploit kits; RDP brute-force/exploitation for lateral movement.
  • Payload behavior: Modular plugins — keylogging, credential/cookie theft, clipboard hijacking, ransomware delivery, botnet tasking.
  • C2 communication: Dynamic DNS subdomains (09090clami09090930032.duckdns.org, loganwolverin2042.webredirect.org); TCP-based custom protocol, commonly over non-standard ports.
  • Persistence: Registry Run keys and scheduled tasks; optional process hollowing into legitimate binaries.
  • Anti-analysis: VM/sandbox checks, obfuscated .NET payloads, in-memory plugin loading.

IOC Analysis

TypeExamplesOperationalization
IPv4 (C2)89.44.9.186, 142.111.194.73Block at egress proxy/firewall; retro-hunt netflow/proxy logs 90 days; flag M247/AS9009 VPS traffic from user segments
Domains/hostnamesforgitlab.com, *.duckdns.org, *.webredirect.orgDNS sinkhole/block; alert on dynamic-DNS resolution from endpoints; inspect TLS SNI in proxy logs
File hashes (MD5/SHA1/SHA256)583754e5…f0a4a6, 5f63fe34…7313c5Push to EDR blocklists; retro-hunt with your EDR's hash search; import to MISP for correlation
CVECVE-2025-8088Patch/upgrade WinRAR estate-wide; hunt for archive-extraction writes to Startup and Temp paths

Tooling: EDR hash-block modules (Defender, CrowdStrike, SentinelOne), DNS filtering (Infoblox, Cisco Umbrella), SIEM IOC matching, and MISP/OpenCTI for indicator lifecycle management. Dynamic-DNS detection can be augmented with passive DNS (e.g., SecurityTrails, PassiveTotal) to expand infrastructure.

Detection Engineering

YAML
---
title: WinRAR CVE-2025-8088 Archive Traversal Drop to Startup - Gorbag
id: 8f1e2c3a-11b4-4f6a-9d2e-gorbag000001
status: experimental
description: Detects WinRAR/unrar extraction writing executables or scripts to Startup or Temp paths, consistent with Gorbag's CVE-2025-8088 delivery of GIFTEDCROOK/BeautyStealer.
author: Security Arsenal
logsource:
  category: file_event
  product: windows
  definition: file_event
references:
  - https://www.welivesecurity.com/en/eset-research/gorbag-orcs-border-harvesting-intelligence-ukraine/
date: 2026/11/04
tags:
  - attack.initial_access
  - attack.t1189
  - attack.t1060
detection:
  selection_source:
    Image|endswith:
      - '\winrar.exe'
      - '\unrar.exe'
      - '\7z.exe'
      - '\7zg.exe'
  selection_target_path:
    TargetFilename|contains:
      - '\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\'
      - '\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\'
      - '\AppData\Local\Temp\'
  selection_ext:
    TargetFilename|endswith:
      - '.exe'
      - '.dll'
      - '.bat'
      - '.ps1'
      - '.lnk'
      - '.vbs'
  condition: selection_source and selection_target_path and selection_ext
falsepositives:
  - Legitimate software extraction to Temp by installers
level: high
---
title: XWorm RAT Dynamic DNS C2 Communication
id: 9a2f3d4b-22c5-5a7b-8e3f-xworm000002
status: experimental
description: Detects DNS queries or network connections to dynamic-DNS providers observed hosting XWorm C2 infrastructure.
author: Security Arsenal
logsource:
  category: dns
  product: windows
  definition: dns_query
references:
  - https://cyberint.com/blog/dark-web/xworm-malware-worming-its-way-from-entry-to-exploitation/
date: 2026/11/04
tags:
  - attack.command_and_control
  - attack.t1071
detection:
  selection_ioc:
    query|contains:
      - '09090clami09090930032.duckdns.org'
      - 'loganwolverin2042.webredirect.org'
  selection_dyndns:
    query|endswith:
      - '.duckdns.org'
      - '.webredirect.org'
      - '.hopto.org'
      - '.no-ip.org'
  filter_common:
    Image|endswith:
      - '\svchost.exe'
    query|contains:
      - 'microsoft'
      - 'windows'
  condition: selection_ioc or (selection_dyndns and not filter_common)
falsepositives:
  - Legitimate self-hosted services using dynamic DNS (rare in enterprise endpoints)
level: high
---
title: Suspicious GitLab Credential Access or CI/CD Secret Harvesting - Gentlemen Affiliate Activity
id: 7b3e4f5c-33d6-6b8c-9f4a-gitlab000003
status: experimental
description: Detects processes accessing GitLab configuration, CI/CD variable files, or credential stores, plus connections to the phishing domain forgitlab.com.
author: Security Arsenal
logsource:
  category: process_creation
  product: windows
  definition: process_creation_cmdline
references:
  - https://www.cloudsek.com/blog/caught-in-4k-the-gentlemen-files
date: 2026/11/04
tags:
  - attack.credential_access
  - attack.t1552
detection:
  selection_paths:
    CommandLine|contains:
      - '.gitlab-credentials'
      - 'gitlab.rb'
      - 'config.toml'
      - 'GITLAB_TOKEN'
      - 'CI_JOB_TOKEN'
      - 'forgitlab.com'
  selection_tools:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\findstr.exe'
      - '\type.exe'
      - '\cat.exe'
  filter_gitlab_runner:
    Image|endswith:
      - '\gitlab-runner.exe'
  condition: selection_paths and selection_tools and not filter_gitlab_runner
falsepositives:
  - DevOps engineers legitimately inspecting runner configs (tune per environment)
level: medium
KQL — Microsoft Sentinel / Defender
// XWorm C2 + Gorbag C2 retro-hunt (Microsoft Sentinel / Defender XDR)
let GorbagC2 = dynamic(["89.44.9.186", "142.111.194.73"]);
let XWormDynDNS = dynamic(["09090clami09090930032.duckdns.org", "loganwolverin2042.webredirect.org"]);
let DynDNSProviders = dynamic(["duckdns.org", "webredirect.org", "hopto.org", "no-ip.org"]);
union isfuzzy=true
(DeviceNetworkEvents
 | where TimeGenerated > ago(30d)
 | where RemoteIP in (GorbagC2) or RemoteUrl has_any (XWormDynDNS)
 | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemoteUrl, RemotePort, ActionType),
(DeviceNetworkEvents
 | where TimeGenerated > ago(30d)
 | where RemoteUrl endswith_any (DynDNSProviders)
 | where InitiatingProcessFileName !in~ ("svchost.exe", "msedge.exe", "chrome.exe", "firefox.exe")
 | project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteIP, RemoteUrl, RemotePort, ActionType),
(DeviceProcessEvents
 | where TimeGenerated > ago(30d)
 | where ProcessCommandLine has_any (".gitlab-credentials", "GITLAB_TOKEN", "CI_JOB_TOKEN", "forgitlab.com")
 | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, AccountName, InitiatingProcessFileName)
| order by TimeGenerated desc
PowerShell
# Security Arsenal - Combined IOC & Persistence Hunt (Gorbag / XWorm / GitLab phishing)
# Run elevated on endpoints; review $report output
$report = @()

# 1. Gorbag C2 + known bad connections
$badIPs = @("89.44.9.186", "142.111.194.73")
Get-NetTCPConnection | Where-Object { $badIPs -contains $_.RemoteAddress } | ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    $report += [pscustomobject]@{Type="BadIP-Connection"; Detail="$($_.RemoteAddress):$($_.RemotePort) via $($proc.ProcessName) ($($proc.Path))"}
}

# 2. XWorm persistence - Run keys with suspicious values
$runKeys = @(
    "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
    "HKLM:\Software\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)
            if ($val -match "AppData|Temp|Roaming|\.ps1|\.vbs|regsvr32|rundll32") {
                $report += [pscustomobject]@{Type="RunKey-Suspicious"; Detail="$key :: $($_.Name) = $val"}
            }
        }
    }
}

# 3. Scheduled tasks executing from user-writable paths
Get-ScheduledTask | ForEach-Object {
    $actions = $_.Actions | Where-Object { $_.Execute -match "AppData|Temp|Public" }
    if ($actions) {
        $report += [pscustomobject]@{Type="ScheduledTask-Suspicious"; Detail="$($_.TaskName) -> $($actions.Execute) $($actions.Arguments)"}
    }
}

# 4. Startup folder payloads (CVE-2025-8088 drop location)
$startupPaths = @(
    "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup",
    "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Startup"
)
foreach ($p in $startupPaths) {
    if (Test-Path $p) {
        Get-ChildItem $p -File | Where-Object { $_.Extension -in ".exe",".dll",".bat",".ps1",".lnk",".vbs" } | ForEach-Object {
            $report += [pscustomobject]@{Type="StartupPayload"; Detail="$($_.FullName) | Created: $($_.CreationTime)"}
        }
    }
}

# 5. GitLab credential exposure on disk (Azazel/Gentlemen vector)
$gitlabArtifacts = @("$env:USERPROFILE\.gitlab-credentials", "C:\gitlab-runner\config.toml")
foreach ($g in $gitlabArtifacts) {
    if (Test-Path $g) {
        $report += [pscustomobject]@{Type="GitLab-Secret-OnDisk"; Detail="$g present - verify access logs and rotate tokens"}
    }
}

# 6. Known malicious file hashes (sample from pulses)
$badHashes = @("583754e5e682ea83d58fbf76ea5c82ea0f2ab5db06e9e52343c4d52f35f0a4a6",
               "5f63fe34d77b1eff07a9eef9d7ca1df2537aa90cb1d3fc2e215086d2397313c5",
               "ce02802067934e0eb072f69bf6427bf6")
foreach ($dir in @("$env:TEMP", "$env:APPDATA", "$env:LOCALAPPDATA")) {
    Get-ChildItem $dir -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
        $h = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
        $hm = (Get-FileHash $_.FullName -Algorithm MD5 -ErrorAction SilentlyContinue).Hash
        if ($badHashes -contains $h.ToLower() -or $badHashes -contains $hm.ToLower()) {
            $report += [pscustomobject]@{Type="MaliciousHash"; Detail="$($_.FullName) matched pulse IOC"}
        }
    }
}

$report | Format-Table -AutoSize
$report | Export-Csv "$env:TEMP\otx_hunt_$(Get-Date -Format yyyyMMdd_HHmm).csv" -NoTypeInformation

Response Priorities

Immediate (0–4h):

  • Block 89.44.9.186, 142.111.194.73, forgitlab.com, and the listed duckdns.org/webredirect.org hostnames at proxy, firewall, and DNS layers.
  • Push all 50+ file hashes from the pulses into EDR blocklists and execute retro-hunts.
  • Deploy the Sigma and KQL detections above; alert on any dynamic-DNS egress from non-browser processes.
  • Audit Startup folders and Run keys on endpoints in high-risk segments (executive, finance, OT-adjacent).

24 hours:

  • Credential-stealer exposure (Gorbag/XWorm): any host matching an infostealer IOC → force enterprise-wide password reset for that user, revoke session tokens/cookies (browser session theft defeats MFA), and re-issue certificates.
  • CI/CD secrets (Azazel/Gentlemen): rotate all GitLab personal access tokens, deploy tokens, CI job tokens, and any cloud keys stored in pipeline variables. Review GitLab audit logs for anomalous token use and unexpected runner registrations. Verify no user visited forgitlab.com and reset those credentials regardless.
  • Validate MFA coverage on all remote access (RDP gateways, VPNs) given XWorm's RDP exploitation vector.

1 week:

  • Patch or upgrade WinRAR estate-wide to remediate CVE-2025-8088; consider application-control rules preventing archive extractors from writing to Startup/Temp.
  • Architecturally segment CI/CD: move secrets to a dedicated vault (no long-lived tokens in pipeline variables), enforce short TTLs, and alert on secret reads outside runner contexts.
  • Implement egress policy denying dynamic-DNS TLDs for server and workstation VLANs by default, with exception workflow.
  • Restrict RDP exposure (VPN-gated, NLA, account lockout) and enable RDP brute-force analytics.
  • Conduct tabletop exercise on double-extortion response, including leak-site monitoring for your organization's name.

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.