Back to Intelligence

NadMesh Botnet: Go-Based AI Infrastructure Credential Harvester — OTX Pulse Analysis & Enterprise Detection Pack

SA
Security Arsenal Team
August 16, 2026
8 min read

Threat Summary

A single but high-signal OTX pulse published by AlienVault documents NadMesh, an industrial-grade, Go-based botnet first observed in July 2026 that represents a meaningful escalation in autonomous threat tooling. Unlike traditional botnets that rely on operator-driven campaigns, NadMesh integrates scanning, exploitation, and intelligence harvesting into a single self-contained platform — effectively productizing the entire intrusion lifecycle.

The campaign targets AI service infrastructure and cloud environments across more than 90 cloud provider address ranges. Its exploitation surface is broad and deliberate: Redis, Docker, Kubernetes, MCP (Model Context Protocol) servers, and adjacent cloud services, chained through 20+ distinct exploitation vectors. The botnet conducts autonomous scanning (correlated with Shodan-style internet intelligence), identifies exposed or misconfigured services, exploits them, and then pivots to its true objective: credential harvesting from cloud control planes, container registries, orchestration APIs, and AI pipeline secrets.

The strategic implication is clear: as enterprises rush AI workloads into production — often with permissive service accounts, exposed MCP endpoints, and over-privileged Kubernetes secrets — NadMesh is purpose-built to industrialize the theft of exactly those credentials. Harvested cloud keys, kubeconfigs, and AI service tokens are precisely the commodity that fuels dark web access-broker markets.

Threat Actor / Malware Profile

Family: NadMesh (Go-based botnet) | Attribution: Unknown | TLP: White

Distribution / Initial Access: NadMesh does not rely on phishing. It propagates through autonomous internet-wide scanning of cloud provider netblocks, fingerprinting exposed Redis instances, Docker remote API daemons (port 2375/2376), Kubernetes API servers (6443/10250), etcd, and MCP server endpoints. It weaponizes known vulnerabilities — the pulse includes CVE-2016-0638 (Oracle WebLogic Java deserialization) among its exploitation vectors — alongside misconfiguration abuse such as unauthenticated Redis writes and anonymous Docker API access.

Payload Behavior: Once a service is compromised, NadMesh drops a statically compiled Go binary (SHA256: fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482), harvests environment variables, cloud metadata service credentials (IMDS at 169.254.169.254), Kubernetes service account tokens (/var/run/secrets/kubernetes.io/serviceaccount/), and container secrets, then expands laterally using the stolen material.

C2 Communication: The botnet communicates with infrastructure behind the domain cdnorigin.net, masquerading as legitimate CDN traffic — a common technique to blend beaconing into allowed egress categories.

Persistence: On containerized hosts, NadMesh establishes persistence via cron entries, systemd service units, and Kubernetes DaemonSet/CronJob abuse, allowing reinfection even after individual pod remediation.

Anti-Analysis: The malware is polymorphic (per pulse tags), recompiling or mutating payload artifacts per deployment to defeat static hash detection — which is why behavioral detection on scanning, exploitation, and credential-access patterns is critical in addition to IOC matching.

IOC Analysis

The pulse provides five indicators across three types:

TypeIndicatorOperationalization
CVECVE-2016-0638Map to asset inventory — any exposed WebLogic is a candidate entry vector. Feed into vulnerability prioritization.
Domaincdnorigin.netBlock at DNS sinkhole / secure web gateway / egress firewall. Alert on any resolution in proxy and DNS logs.
MD5ca024acead8f54cfe5b07ac4bdf7fceaHash-block in EDR; low standalone value due to polymorphism.
SHA131c69b3e12936abca770d430066f379ec1d997ecEDR blocklist + retro-hunt in file event telemetry.
SHA256fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482Primary hash for EDR blocking and retro-hunts across process and file-creation events.

SOC guidance: Because NadMesh is polymorphic, hashes have a short shelf life — treat them as retro-hunt seeds, not durable blocks. The durable detections are behavioral: outbound scanning from servers, access to cloud metadata endpoints from unusual processes, reads of Kubernetes service account tokens, and egress to cdnorigin.net. Tooling that operationalizes this pulse: EDR hash/IoA engines, Zeek/Suricata for C2 egress, Falco for container runtime detection, and Sigma/KQL correlation in your SIEM.

Detection Engineering

YAML
---
title: NadMesh Botnet - Kubernetes Service Account Token Access by Non-System Process
description: Detects reads of Kubernetes service account token material by processes outside expected system daemons, consistent with NadMesh credential harvesting behavior (OTX pulse 2026-08-16).
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
    category: file_access
    product: linux
detection:
    selection_path:
        TargetFilename|contains: '/var/run/secrets/kubernetes.io/serviceaccount/'
    filter_legit:
        Image|startswith:
            - '/usr/bin/kubelet'
            - '/usr/local/bin/kube-proxy'
    condition: selection_path and not filter_legit
falsepositives:
    - Legitimate in-pod applications reading their own projected tokens
level: high
tags:
    - attack.credential_access
    - attack.t1552
    - nadmesh
---
title: NadMesh Botnet - Cloud Instance Metadata Service Access via Curl or Wget
description: Detects command-line HTTP clients querying the cloud metadata service, a technique NadMesh uses to harvest IAM/instance credentials after exploitation.
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
    category: process_creation
    product: linux
detection:
    selection_img:
        Image|endswith:
            - '/curl'
            - '/wget'
    selection_cli:
        CommandLine|contains: '169.254.169.254'
    condition: all of selection_*
falsepositives:
    - Cloud-init and provisioning scripts during instance bootstrap
    - SRE diagnostics
level: medium
tags:
    - attack.credential_access
    - attack.t1552.005
    - nadmesh
---
title: NadMesh Botnet - Outbound Connection to Known C2 Domain
description: Detects network connections to the NadMesh C2 domain cdnorigin.net, which masquerades as CDN traffic.
status: experimental
date: 2026/08/16
author: Security Arsenal Threat Intelligence
logsource:
    category: dns
    product: any
detection:
    selection:
        query|contains: 'cdnorigin.net'
    condition: selection
falsepositives:
    - None expected; domain is associated with botnet C2
level: critical
tags:
    - attack.command_and_control
    - attack.t1071
    - nadmesh
KQL — Microsoft Sentinel / Defender
// NadMesh Botnet Hunt — C2 egress, hash execution, and metadata-service credential access
// Microsoft Sentinel / Defender XDR — OTX Pulse 2026-08-16
let NadMeshHashes = dynamic([
    "ca024acead8f54cfe5b07ac4bdf7fcea",
    "31c69b3e12936abca770d430066f379ec1d997ec",
    "fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482"
]);
union isfuzzy=true
(
    DeviceNetworkEvents
    | where TimeGenerated > ago(7d)
    | where RemoteUrl has "cdnorigin.net"
    | project TimeGenerated, DeviceName, InitiatingProcessFileName, RemoteUrl, RemoteIP, ActionType, SignalSource = "C2_Egress"
),
(
    DeviceProcessEvents
    | where TimeGenerated > ago(7d)
    | where MD5 in~ (NadMeshHashes) or SHA1 in~ (NadMeshHashes) or SHA256 in~ (NadMeshHashes)
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, SHA256, InitiatingProcessAccountName, SignalSource = "Hash_Match"
),
(
    DeviceProcessEvents
    | where TimeGenerated > ago(7d)
    | where ProcessCommandLine has "169.254.169.254"
      and FileName in~ ("curl", "wget", "curl.exe", "wget.exe")
    | project TimeGenerated, DeviceName, FileName, ProcessCommandLine, InitiatingProcessAccountName, SignalSource = "IMDS_Access"
)
| sort by TimeGenerated desc
PowerShell
# NadMesh Botnet IOC & Persistence Hunt — Security Arsenal
# Run elevated on suspect Linux-adjacent Windows hosts via WSL/SSH or adapt for fleet EDR sweep

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

# 1. Hash-based file hunt (NadMesh payload artifacts)
$hashes = @(
    'ca024acead8f54cfe5b07ac4bdf7fcea',
    '31c69b3e12936abca770d430066f379ec1d997ec',
    'fc4109f5dd1d30b65dd60e57dc639ac1d313bfa5241e36e61fbc4aabc1cda482'
)
Get-ChildItem -Path 'C:\','D:\' -Recurse -File -Force | ForEach-Object {
    $h = Get-FileHash $_.FullName -Algorithm SHA256
    if ($hashes -contains $h.Hash.ToLower()) {
        $report += "[HASH MATCH] $($_.FullName) SHA256=$($h.Hash)"
    }
}

# 2. Network connections / DNS cache check for C2 domain
$dns = Get-DnsClientCache | Where-Object { $_.Entry -like '*cdnorigin.net*' }
if ($dns) { $report += "[C2 DNS] cdnorigin.net resolved on this host: $($dns | Out-String)" }

$conns = Get-NetTCPConnection | Where-Object { $_.State -eq 'Established' } | ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess
    if ($proc.ProcessName -notin @('chrome','msedge','firefox','svchost','System')) {
        $report += "[NET] PID $($_.OwningProcess) $($proc.ProcessName) -> $($_.RemoteAddress):$($_.RemotePort)"
    }
}

# 3. Persistence artifacts — scheduled tasks & services with suspicious Go-binary traits
Get-ScheduledTask | Where-Object {
    $_.Actions.Execute -match 'tmp|appdata|programdata' -and $_.TaskPath -notlike '\Microsoft*'
} | ForEach-Object { $report += "[TASK] $($_.TaskName) -> $($_.Actions.Execute)" }

Get-CimInstance Win32_Service | Where-Object {
    $_.PathName -match 'tmp|appdata|programdata' -and $_.State -eq 'Running'
} | ForEach-Object { $report += "[SERVICE] $($_.Name) -> $($_.PathName)" }

# 4. Kubernetes / cloud credential artifacts on disk
$kPaths = @("$env:USERPROFILE\.kube\config", "$env:USERPROFILE\.docker\config.json", "$env:USERPROFILE\.aws\credentials")
foreach ($p in $kPaths) {
    if (Test-Path $p) { $report += "[CRED AT RISK] $p exists — rotate if host shows other hits" }
}

$report | Out-File "NadMesh_Hunt_$(Get-Date -Format 'yyyyMMdd_HHmmss').txt"
$report | Format-List

Response Priorities

Immediate (0–4 hours):

  • Block cdnorigin.net at DNS resolver, secure web gateway, and egress firewall; alert on any historical resolution.
  • Push the three file hashes to EDR blocklists; run retro-hunts for execution in the last 30 days.
  • Audit external exposure: identify any internet-facing Redis, Docker API (2375/2376), Kubernetes API (6443), etcd, or MCP endpoints and take them offline or behind authentication immediately.

Within 24 hours:

  • Treat any host that touched the C2 domain or ran a matching hash as fully credential-compromised: rotate cloud IAM keys, kubeconfigs, container registry tokens, AI service API keys, and any secrets stored in environment variables on that host.
  • Review cloud audit logs (CloudTrail / Azure Activity Log / GCP Audit) for use of those credentials from unexpected source IPs.
  • Invalidate active sessions and enforce re-authentication for identities tied to affected workloads.

Within 1 week:

  • Harden architecture: enforce authenticated-only access on Redis/Docker/Kubernetes control planes, disable IMDSv1 (require IMDSv2), and apply network policies restricting pod egress.
  • Deploy runtime detection (Falco/eBPF) in Kubernetes clusters to catch token reads and anomalous outbound scanning.
  • Patch or isolate any WebLogic instances vulnerable to CVE-2016-0638, and implement egress filtering that denies cloud netblock-to-netblock scanning.

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.