Back to Intelligence

Miasma/Shai-Hulud Descendant 'strutil-core' Ruby Gem + Booking.com Hospitality Phishing Cluster: OTX Pulse Analysis — Credential Theft Detection Pack

SA
Security Arsenal Team
November 9, 2026
11 min read

Two fresh pulses surfaced on AlienVault OTX on 2026-11-09, both converging on a single theme: large-scale credential and payment data theft. One targets the software supply chain via a malicious Ruby gem descended from the Shai-Hulud worm lineage; the other is a polished, multi-language phishing cluster impersonating Booking.com and harvesting payment cards from hotel guests in Japan. Both are TLP:WHITE, actively operational, and immediately actionable.


Threat Summary

These two pulses represent distinct operations but a shared objective set — credential harvesting at scale, monetized through downstream fraud and resale:

Pulse 1 — Hospitality Phishing Cluster (Booking.com Impersonation). Netcraft-tracked infrastructure is serving fake hotel reservation pages that impersonate Booking.com and branded hotel services. The lures are personalized: hotel names, dates, prices, guest names, and contact details are pre-populated, dramatically increasing conversion rates. The kit is multi-language, ships with two visual templates built on a shared codebase, and includes interactive 3D Secure-style card verification flows — meaning victims are walked through live card validation, enabling real-time payment card theft plus credential capture. Targeted sector: hospitality. Targeted geography: Japan. The domain pattern (e.g., reserv-advanced67746202.com, confirmation-advanced-reserv203684.com, gardenstokyjp.com) shows algorithmic / templated registration with hotel- and reservation-themed naming.

Pulse 2 — 'strutil-core' Ruby Gem (testmetest / Miasma / Shai-Hulud descendant). A malicious gem, strutil-core v1.0.1, was published to RubyGems on 2026-11-01 by account jamnajiea. On gem install / bundle install, it drops and executes a 5.48 MB credential-stealing worm — a new build of the testmetest worm from the Miasma family, which descends from the Shai-Hulud npm worm toolkit. The payload steals credentials from cloud services and developer environments, poisons AI tooling configurations, and includes wiper capability. It was flagged 70 seconds after release and removed within five hours — but any CI/CD pipeline or developer workstation that installed it in that window is compromised. C2/exfil domains include aiarmor.website and paleasbest.top (https://paleasbest.top/v1/api).

Combined read: both operations feed the credential economy. The phishing cluster harvests consumer payment cards and travel credentials; the gem worm harvests developer/cloud credentials and self-propagates (worm lineage) through the software supply chain, with an emerging twist — poisoning AI tool configurations, suggesting downstream supply-chain compromise of AI-assisted development workflows.


Threat Actor / Malware Profile

testmetest / Miasma (Shai-Hulud descendant) — strutil-core 1.0.1

  • Distribution: Malicious package published to RubyGems (strutil-core, v1.0.1, account jamnajiea). Executes during installation — i.e., malicious install hooks / embedded payload unpacked at gem install or bundle install time. Typosquat-style naming mimicking a legitimate string-utility library.
  • Payload behavior: 5.48 MB worm binary unpacked and executed at install. Steals credentials from cloud service configuration stores (AWS/GCP/Azure credential files), developer environment secrets (.env files, SSH keys, tokens), and package-registry tokens enabling self-propagation (consistent with Shai-Hulud's worm behavior of republishing itself via stolen maintainer tokens).
  • AI poisoning: Modifies AI tool configurations (AI coding assistant configs / MCP server definitions), planting attacker-influenced tooling — an evolution beyond the original Shai-Hulud npm campaign.
  • Wiper capability: Destructive payload stage present in the build; can be triggered to destroy host data if the operation is burned.
  • C2 / exfiltration: HTTPS beaconing to paleasbest.top/v1/api (REST-style exfil endpoint) and aiarmor.website. Likely JSON POST exfil of harvested credential bundles.
  • Persistence: Leverages stolen registry tokens to republish compromised packages (supply-chain persistence rather than host persistence); expect local persistence via shell profile injection (~/.bashrc, ~/.zshrc) or gem post-install hooks consistent with the family.
  • Anti-analysis: Multi-megabyte packed payload (size deters sandbox detonation and AV scanning), short publication window (5 hours) to minimize exposure, polymorphic rebuilds across family lineage.

Booking.com Impersonation Phishing Cluster

  • Distribution: Personalized lure delivery (email/SMS/messaging) containing real reservation details — indicating upstream data sourcing from breached booking/travel datasets or compromised hotel partners.
  • Payload behavior: Two visual templates over a shared codebase; interactive card-verification flow emulating 3D Secure, capturing PAN, CVV, expiry, and billing data with live validation.
  • Infrastructure: Templated, high-churn domain registration (reserv-advancedNNNNNNNN.com, confirmation-advanced-reservNNNNNN.com, hotelchecckrsrv-krwo.world, plus benign-looking decoys like goldeshoms.com, guestnooks-homeset.com). Multi-language kit support.
  • Attribution: Unknown actor for both pulses; the phishing cluster's tradecraft (personalization + interactive verification) is consistent with professional phishing-as-a-service operations selling validated card dumps on dark web carding markets.

IOC Analysis

Indicator types present across the pulses and how to operationalize them:

TypeExamplesOperationalization
Domains (phishing)homesdowttups.com, gardenstokyjp.com, reserv-advanced67746202.com, advanced-reserv882689.com, confirmation-advanced-reserv203684.com, hotelchecckrsrv-krwo.world, goldeshoms.com, guestnooks-homeset.comPush to DNS sinkhole / proxy block lists. Alert on any resolution — resolution itself is a compromise signal (user clicked lure).
Domains/URL (gem C2)aiarmor.website, paleasbest.top, https://paleasbest.top/v1/apiBlock at egress proxy; hunt web proxy and DNS logs for historical hits back to 2026-11-01. Any hit from a build server or developer workstation = incident.
FileHash-SHA256 (gem payload)3b3f6e1b..., 306c1dee..., c5264f3b..., 66c1c6b6..., c7ef186a...Load into EDR blocklists; sweep endpoint and artifact-repository telemetry for execution/download events.

SOC workflow: Pull full pulse IOCs via the OTX DirectConnect API (/api/v1/pulses/subscribed) into your TIP (MISP/OpenCTI), then export to EDR (hash blocks), DNS firewall (RPZ), and proxy (URL categories). Note the phishing domains are high-churn — prioritize pattern-based detection (*reserv-advanced*, *advanced-reserv*) over static IOCs, which will age out within days. Hash IOCs for the gem worm are durable and high-fidelity.


Detection Engineering

YAML
---
title: Malicious Ruby Gem Install Hook Execution - Shai-Hulud/Miasma Lineage
id: 7f3a1c2e-9d4b-4e5a-a1c3-otxstrutil0001
status: experimental
description: Detects gem/bundler package managers spawning shells or script interpreters during install, consistent with the strutil-core malicious gem (testmetest/Miasma worm) executing a payload at install time.
author: Security Arsenal Threat Intel
logsource:
    category: process_creation
    product: windows
    definition: Linux equivalent via auditd/Sysmon for Linux process_creation events
detection:
    selection_parent:
        ParentImage|endswith:
            - '\gem.exe'
            - '\ruby.exe'
            - '\bundle.exe'
            - '/gem'
            - '/bundle'
    selection_child:
        Image|endswith:
            - '\cmd.exe'
            - '\powershell.exe'
            - '\pwsh.exe'
            - '\wscript.exe'
            - '\curl.exe'
            - '\wget.exe'
            - '/bin/sh'
            - '/bin/bash'
            - '/usr/bin/curl'
            - '/usr/bin/wget'
            - '/usr/bin/python3'
    condition: selection_parent and selection_child
fields:
    - CommandLine
    - ParentCommandLine
falsepositives:
    - Legitimate native gem compilation (rare; typically spawns compiler toolchains, not shells)
level: high
tags:
    - attack.initial_access
    - attack.t1195.002
    - attack.t1059
---
title: Network Connection to Miasma/testmetest C2 or Booking.com Phishing Cluster Domains
id: 7f3a1c2e-9d4b-4e5a-a1c3-otxstrutil0002
status: experimental
description: Detects DNS resolution or network connections to OTX-listed infrastructure for the strutil-core gem worm C2 (paleasbest.top, aiarmor.website) and the hospitality phishing cluster domains.
author: Security Arsenal Threat Intel
logsource:
    category: dns
detection:
    selection_exact:
        query:
            - 'paleasbest.top'
            - 'aiarmor.website'
            - 'homesdowttups.com'
            - 'gardenstokyjp.com'
            - 'reserv-advanced67746202.com'
            - 'advanced-reserv882689.com'
            - 'confirmation-advanced-reserv203684.com'
            - 'hotelchecckrsrv-krwo.world'
            - 'goldeshoms.com'
            - 'guestnooks-homeset.com'
    selection_pattern:
        query|contains:
            - 'reserv-advanced'
            - 'advanced-reserv'
            - 'confirmation-advanced-reserv'
    condition: 1 of selection_*
fields:
    - query
    - ClientIP
falsepositives:
    - Unlikely; templated reservation-themed domains have no legitimate enterprise use
level: critical
tags:
    - attack.command_and_control
    - attack.t1071.001
    - attack.exfiltration
    - attack.t1041
---
title: Credential Store Access Following Ruby/Gem Process Execution
id: 7f3a1c2e-9d4b-4e5a-a1c3-otxstrutil0003
status: experimental
description: Detects access to cloud credential files, SSH keys, or environment secret files by Ruby-related processes, matching testmetest/Miasma credential theft behavior.
author: Security Arsenal Threat Intel
logsource:
    category: file_event
    product: windows
detection:
    selection_image:
        Image|endswith:
            - '\ruby.exe'
            - '\gem.exe'
            - '\bundle.exe'
    selection_target:
        TargetFilename|contains:
            - '\.aws\credentials'
            - '\.azure\'
            - '\.config\gcloud\'
            - '\.ssh\'
            - '\.env'
            - '\.npmrc'
            - '\.gem\credentials'
    condition: selection_image and selection_target
fields:
    - TargetFilename
    - CommandLine
falsepositives:
    - Legitimate Ruby cloud SDK usage (rare on endpoints; common on build agents - tune by host role)
level: high
tags:
    - attack.credential_access
    - attack.t1552.001
    - attack.t1552.004
KQL — Microsoft Sentinel / Defender
// Hunt: strutil-core gem install + C2 egress + phishing cluster contact (last 14 days)
let gemC2 = dynamic(["paleasbest.top", "aiarmor.website"]);
let phishDomains = dynamic(["homesdowttups.com","gardenstokyjp.com","reserv-advanced67746202.com","advanced-reserv882689.com","confirmation-advanced-reserv203684.com","hotelchecckrsrv-krwo.world","goldeshoms.com","guestnooks-homeset.com"]);
let GemInstalls = DeviceProcessEvents
| where TimeGenerated > ago(14d)
| where InitiatingProcessFileName in~ ("gem.exe","bundle.exe","ruby.exe","gem","bundle")
   or ProcessCommandLine has_any ("gem install strutil-core","strutil-core")
| project DeviceName, GemInstallTime=TimeGenerated, ProcessCommandLine, InitiatingProcessCommandLine, AccountName;
let C2Hits = DeviceNetworkEvents
| where TimeGenerated > ago(14d)
| where RemoteUrl has_any (gemC2)
   or RemoteUrl has_any (phishDomains)
   or RemoteUrl matches regex @"(?i)(reserv-advanced|advanced-reserv|confirmation-advanced-reserv)\d*\."
| project DeviceName, C2Time=TimeGenerated, RemoteUrl, RemoteIP, InitiatingProcessFileName, InitiatingProcessCommandLine;
C2Hits
| join kind=leftouter GemInstalls on DeviceName
| extend CompromiseType = case(
    isnotempty(GemInstallTime), "SUPPLY-CHAIN: gem install + C2 egress",
    RemoteUrl has_any (phishDomains), "PHISHING: hospitality lure click",
    "C2 egress"),
    Severity = case(isnotempty(GemInstallTime), "CRITICAL", "HIGH")
| project Severity, CompromiseType, DeviceName, AccountName, RemoteUrl, RemoteIP, C2Time, GemInstallTime, InitiatingProcessCommandLine, ProcessCommandLine
| order by Severity asc, C2Time desc
PowerShell
# Security Arsenal - OTX Hunt Script: strutil-core/Miasma gem worm + hospitality phishing artifacts
# Run elevated on endpoints, developer workstations, and build agents. Read-only.

$ErrorActionPreference = 'SilentlyContinue'
$findings = @()

# 1. Malicious gem presence: local gem cache + Gemfile.lock references
$gemPaths = @("$env:USERPROFILE\.gem","$env:ProgramData\gem","C:\Ruby*\lib\ruby\gems","$env:HOME/.gem","/var/lib/gems","/usr/local/lib/ruby/gems")
foreach ($p in $gemPaths) {
    Get-ChildItem -Path $p -Recurse -Filter "*strutil-core*" -ErrorAction SilentlyContinue | ForEach-Object {
        $findings += [pscustomobject]@{Type="MALICIOUS GEM INSTALLED"; Path=$_.FullName; Detail="strutil-core artifact present"}
    }
}
Get-ChildItem -Path "C:\","$env:USERPROFILE" -Recurse -Include "Gemfile.lock","*.gemspec" -Depth 5 -ErrorAction SilentlyContinue | ForEach-Object {
    if ((Get-Content $_.FullName -Raw -ErrorAction SilentlyContinue) -match "strutil-core") {
        $findings += [pscustomobject]@{Type="GEMFILE REFERENCE"; Path=$_.FullName; Detail="strutil-core pinned in dependency file"}
    }
}

# 2. Payload file hashes on disk (EDR-independent sweep of common staging dirs)
$badHashes = @(
  "3b3f6e1bde0b28b015030a81a6d805b5b5306dc3f021e1102123971cfd83acc0",
  "306c1deec402e8b4a6478e7f0fe02194bcd224d37d8fc6ba61ad1951e8abd7a9",
  "c5264f3b9cf2f95c83a70b7dd7430aab8abc262b853dbbcd5386c3a8a9c74769",
  "66c1c6b6b2c47e96fa5fd328338b939e1360511ab5eb2dda6d9112f592259d6b",
  "c7ef186aa59b67d9b198a14f6dc8aaee6dd86510ac7c37d28f65d310cd846411"
)
foreach ($dir in @("$env:TEMP","$env:LOCALAPPDATA\Temp","$env:USERPROFILE\Downloads","C:\Windows\Temp")) {
    Get-ChildItem -Path $dir -Recurse -File -ErrorAction SilentlyContinue | ForEach-Object {
        $h = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
        if ($badHashes -contains $h.ToLower()) {
            $findings += [pscustomobject]@{Type="PAYLOAD HASH MATCH"; Path=$_.FullName; Detail=$h}
        }
    }
}

# 3. Persistence: shell profile / registry run-key injection referencing ruby/gem
$runKeys = @("HKCU:\Software\Microsoft\Windows\CurrentVersion\Run","HKLM:\Software\Microsoft\Windows\CurrentVersion\Run")
foreach ($k in $runKeys) {
    (Get-ItemProperty $k -ErrorAction SilentlyContinue).PSObject.Properties | Where-Object { $_.Value -match "(?i)ruby|gem|strutil" } | ForEach-Object {
        $findings += [pscustomobject]@{Type="RUN KEY PERSISTENCE"; Path="$k\$($_.Name)"; Detail=$_.Value}
    }
}
Get-Content "$env:USERPROFILE\.bashrc","$env:USERPROFILE\.zshrc","$env:USERPROFILE\.bash_profile" -ErrorAction SilentlyContinue | Select-String -Pattern "strutil|paleasbest|aiarmor|gem " | ForEach-Object {
    $findings += [pscustomobject]@{Type="SHELL PROFILE INJECTION"; Path=$_.Path; Detail=$_.Line.Trim()}
}

# 4. Live network connections to C2/phishing infrastructure
$badDomains = "paleasbest.top","aiarmor.website","homesdowttups.com","gardenstokyjp.com","reserv-advanced67746202.com","advanced-reserv882689.com","confirmation-advanced-reserv203684.com","hotelchecckrsrv-krwo.world","goldeshoms.com","guestnooks-homeset.com"
foreach ($d in $badDomains) {
    $r = Resolve-DnsName $d -ErrorAction SilentlyContinue
    if ($r) { $findings += [pscustomobject]@{Type="DNS RESOLVES (sinkhole check)"; Path=$d; Detail=($r.IPAddress -join ",")} }
}
Get-NetTCPConnection -State Established -ErrorAction SilentlyContinue | ForEach-Object {
    try { $name = ([System.Net.Dns]::GetHostEntry($_.RemoteAddress)).HostName } catch { $name = "" }
    foreach ($d in $badDomains) { if ($name -like "*$d*") {
        $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
        $findings += [pscustomobject]@{Type="ACTIVE C2 CONNECTION"; Path=$name; Detail="$($_.RemoteAddress):$($_.RemotePort) via $($proc.ProcessName)"}
    }}
}

# 5. DNS cache evidence of phishing lure clicks
Get-DnsClientCache -ErrorAction SilentlyContinue | Where-Object { $_.Entry -match "(?i)reserv-advanced|advanced-reserv|goldeshoms|guestnooks|homesdowttups|gardenstokyjp|hotelchecckrsrv" } | ForEach-Object {
    $findings += [pscustomobject]@{Type="DNS CACHE: PHISHING CONTACT"; Path=$_.Entry; Detail=$_.Data}
}

if ($findings.Count -gt 0) { $findings | Format-Table -AutoSize; $findings | Export-Csv ".\otx_hunt_$(Get-Date -Format 'yyyyMMdd_HHmm').csv" -NoTypeInformation; Write-Host "[ALERT] $($findings.Count) finding(s) - escalate to IR." -ForegroundColor Red }
else { Write-Host "[CLEAN] No OTX pulse artifacts found on $env:COMPUTERNAME." -ForegroundColor Green }

Response Priorities

Immediate (0-4 hours):

  • Block all listed phishing and C2 domains at DNS (RPZ/sinkhole), web proxy, and email gateway. Add pattern blocks for *reserv-advanced*, *advanced-reserv*, *confirmation-advanced-reserv*.
  • Push the five SHA256 hashes into EDR prevention (not just detection) mode.
  • Query package-install telemetry across developer workstations, build agents, and artifact proxies for strutil-core — any installation between 2026-11-01 and takedown is a declared incident.
  • Run the KQL hunt and PowerShell sweep against build infrastructure first — CI/CD compromise radiates outward.

24 hours:

  • Any host that installed strutil-core: rotate all credentials reachable from that host — cloud IAM keys, SSH keys, registry tokens (RubyGems, npm, GitHub PATs), .env secrets. Assume full theft; the payload exfiltrates to paleasbest.top/v1/api.
  • Revoke and reissue any package-registry tokens used by affected accounts; audit packages published by those accounts for trojanized versions (worm self-propagation).
  • For phishing exposure: identify users who resolved/visited lure domains (proxy/DNS logs), force credential resets, and flag any entered payment cards for issuer notification and fraud monitoring.
  • Audit AI tool configurations (MCP server definitions, assistant configs) on affected developer machines for unauthorized modifications.

1 week:

  • Enforce gem/npm install controls: private registry proxying with allowlisting, disable install-time script execution in CI where feasible (gem install --no-post-install-message hardening, npm ci --ignore-scripts equivalent policy), and sandbox package installation.
  • Deploy egress filtering on build agents — no direct internet access except approved registries.
  • Implement 3D Secure / out-of-band payment verification awareness training for hospitality-facing staff and customer communications; stand up lookalike-domain monitoring (DNSTwist-style permutations of your brand + "reserv"/"confirmation").
  • Add the Sigma rules above to production with host-role tuning (build agents vs. endpoints).

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.