← All hunts high TLP:CLEAR Part 2 of 2

Aeternum Decentralized C2 and Telegram Exfiltration

An intruder is using public blockchain RPC endpoints to retrieve C2 instructions and the Telegram Bot API to exfiltrate system reconnaissance data, evading traditional domain-based filtering.

Based on research by Unit 42 2026-09-20 9 steps · 3 queries T1041 T1071.001 T1102.001 T1105 T1567.002

Brief

Why Hunt Aeternum

The Unit 42 report, "The Permanent Threat: Analyzing Aeternum’s Blockchain-Based C2 Operations" (https://unit42.paloaltonetworks.com/aeternum-blockchain-c2-analysis/), details a botnet that avoids traditional command and control (C2) infrastructure. Instead of relying on central servers that law enforcement can seize, Aeternum uses smart contracts on the Polygon blockchain. This makes the C2 infrastructure immutable and always available to the malware. Traditional blocking of IP addresses or domain names is often insufficient because the malware communicates with legitimate, public blockchain RPC nodes. This hunt provides a way to identify this activity by focusing on the unique communication lifecycle and the specific artifacts the botnet leaves behind during its exfiltration phase.

Phase 1: DNS Leads

The hunt begins by examining DNS telemetry for lookups related to known decentralized infrastructure and social media APIs. Specifically, it searches for connections to Polygon RPC nodes and the Telegram API. Because developers and administrators might legitimately use these services, this step establishes a lead list based on the rarity of these connections within the environment. The first query identifies every host showing infrequent or new activity to these endpoints, which serves as the entry point for deeper investigation.

Phase 2: Corroboration via HTTP and Modules

Once the hunt identifies a lead list, it pivots to two parallel telemetry sources. The first branch inspects HTTP activity for the unique "SystemInfo Bot" User-Agent used by Aeternum's exfiltration module. It also searches for POST requests to the Telegram API's sendDocument endpoint. The second branch searches for local execution markers, specifically the loading of the DotNetZip.dll module and the creation of files like screenshot.png. By looking for these artifacts only on the lead hosts, the hunt reduces the noise associated with legitimate blockchain development tools.

Phase 3: Triage and Response

The final phase involves an analyst reviewing the correlated timeline. The hunt identifies systems where the DNS lookup for a blockchain node is followed by the loading of the exfiltration module and the transmission of data to Telegram. If the high-confidence "SystemInfo Bot" User-Agent matches the blockchain lead, the hunt facilitates immediate host isolation to prevent further data loss while the incident response team recovers the loader and payloads.

Blind Spots

This hunt has two primary blind spots. First, it lacks visibility into the HTTP request bodies. While an analyst can see traffic to a public RPC node, they cannot confirm the specific Aeternum JSON-RPC method without deep packet inspection. Second, Telegram uses TLS encryption, which hides the exact content of the files being exfiltrated. The hunt relies on the User-Agent and the presence of the DotNetZip.dll module to infer the malicious nature of the transfer.

In this series

Steps

  1. DNS lookups to blockchain and exfil domains

    Query · baseline

    Identify hosts communicating with decentralized RPC nodes or the Telegram API to establish a lead list.

    reads hb_dns_activitysql
    SELECT device_hostname, query_hostname, COUNT(*) AS lookup_count, MIN(time) AS first_seen, MAX(time) AS last_seen FROM hb_dns_activity WHERE (instr(',' || '{{rpc_endpoints}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 OR instr(',' || '{{exfil_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, query_hostname ORDER BY lookup_count DESC

    What a hit looks like. A list of hosts contacting Polygon or Telegram. Common developer activity may appear; prevalence will help filter noise in later steps.

  2. Telegram API exfiltration traffic

    Query · detection candidate

    Find the specific HTTP User-Agent and URI paths used by the Aeternum exfiltration module, restricted to the lead host list.

    reads hb_http_activitysql
    SELECT device_hostname, url_hostname, url_path, user_agent, http_method, time FROM hb_http_activity WHERE (LOWER(user_agent) LIKE 'systeminfo bot%' OR LOWER(url_path) LIKE '%/senddocument%') AND LOWER(url_hostname) = 'api.telegram.org' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. POST requests to /sendDocument with the SystemInfo Bot User-Agent from lead hosts. This is a high-confidence indicator of the exfiltration phase.

  3. Malicious module and reconnaissance artifacts

    Query · enrichment

    Identify the loading of the botnet downloader module and the creation of exfiltration files on lead hosts.

    reads hb_module_activitysql
    SELECT device_hostname, module_name AS artifact, process_name, time, 'module_load' AS type FROM hb_module_activity WHERE LOWER(module_name) = 'dotnetzip.dll' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') UNION ALL SELECT device_hostname, file_name AS artifact, process_name, time, 'file_creation' AS type FROM hb_file_activity WHERE LOWER(file_name) = 'screenshot.png' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')

    What a hit looks like. The loading of dotnetzip.dll or the creation of screenshot.png specifically on hosts identified as having blockchain or Telegram network activity.

  4. Triage Aeternum evidence

    Agent triage

    Correlate the DNS, HTTP, and module findings to confirm a decentralized C2 session and subsequent exfiltration.

  5. Route on verdict

    Decision

    Automate containment if the high-confidence Telegram exfiltration markers are matched with blockchain C2 leads.

  6. Isolate infected host

    Response action

    Prevent further exfiltration and wait for IR to recover the loader and payloads.

  7. Analyst manual review

    Analyst task

    Review indeterminate results where blockchain traffic was seen without specific exfiltration markers.

  8. Close out hunt

    Analyst task

    Record findings and ensure the Telegram User-Agent is promoted to a standing rule.

Coverage

Scenario coverage

StageCoveredHow, or why not
Blockchain-based C2 Communication
T1102.001 · T1071.001
Yes dns-lead-to-decentralized-infra
Payload Download from GitHub
T1105
Yes recon-and-module-artifacts
Data Exfiltration via Telegram API
T1567.002 · T1041
Yes telegram-http-exfiltration, recon-and-module-artifacts
Aeternum Loader Execution
T1204.002
Out of scope Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum’s Blockchain-Based C2 Operations and Communications' series.
Persistence via Startup Folder
T1547.001
Out of scope Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum’s Blockchain-Based C2 Operations and Communications' series.
Auxiliary Binary Execution
T1106
Out of scope Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum’s Blockchain-Based C2 Operations and Communications' series.

Blind spots

  • Needs hb_http_activity with request_body. An analyst can see traffic to a public RPC node but cannot confirm it is malicious without seeing the getDomain() method in the body. It would answer whether the JSON-RPC POST request contains the Aeternum-specific method 0xb68d1809.
  • Needs TLS inspection for api.telegram.org. While the User-Agent is visible, the actual data leaving the estate is hidden by Telegram's encryption. It would answer the exact content of the exfiltrated ZIP or PNG file.

Parameters & data

Parameters

ParameterTypeDefaultWhat it is
exfil_domainslist[domain]api.telegram.org, github.comDomains used for exfiltration and payload acquisition.
lookback_daysnumber14Days of history to examine.
rpc_endpointslist[domain]polygon-mumbai-bor-rpc.publicnode.comBlockchain RPC endpoints used for decentralized C2.
scope_hostslist[host]Hostnames to filter on, typically identified in the initial DNS lead step.

Telemetry

SourceCategoryTelemetry
Endpoint telemetry (hb_ surfaces)endpointendpoint
Web server / proxy logssiemnetwork

Source

Download hunt.md Definition (JSON) An open hunt.md file; it runs anywhere that reads the format.
---
analysis: A standard detection rule might alert on any Telegram connection; this hunt
  specifically correlates the sequence of a rare blockchain RPC lookup followed by
  a unique Telegram User-Agent and the loading of specific botnet modules, reducing
  the false positives associated with legitimate development activity.
blind_spots:
- id: no-http-body-visibility
  question: whether the JSON-RPC POST request contains the Aeternum-specific method
    0xb68d1809
  requires: hb_http_activity with request_body
  risk: An analyst can see traffic to a public RPC node but cannot confirm it is malicious
    without seeing the getDomain() method in the body.
  stage: blockchain-c2-communication
- id: tls-encrypted-exfil
  question: the exact content of the exfiltrated ZIP or PNG file
  requires: TLS inspection for api.telegram.org
  risk: While the User-Agent is visible, the actual data leaving the estate is hidden
    by Telegram's encryption.
  stage: data-exfiltration-via-telegram
coverage:
- stage: blockchain-c2-communication
  status: covered
  steps:
  - dns-lead-to-decentralized-infra
- stage: payload-download-and-loading
  status: covered
  steps:
  - recon-and-module-artifacts
- stage: data-exfiltration-via-telegram
  status: covered
  steps:
  - telegram-http-exfiltration
  - recon-and-module-artifacts
- reason: "Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum\u2019\
    s Blockchain-Based C2 Operations and Communications' series."
  stage: aeternum-initial-execution
  status: out_of_scope
- reason: "Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum\u2019\
    s Blockchain-Based C2 Operations and Communications' series."
  stage: persistence-via-startup-folder
  status: out_of_scope
- reason: "Belongs to another part of the 'The Permanent Threat: Analyzing Aeternum\u2019\
    s Blockchain-Based C2 Operations and Communications' series."
  stage: auxiliary-binary-execution
  status: out_of_scope
guardrails:
  claims: no_unsupported
  evidence: citation_required
  missing_data: not_benign
  telemetry: untrusted
hunt:
  applicability: campaign-specific
  handoff: promote-to-detection
  justification: Blockchain-based C2 infrastructure is immutable and cannot be taken
    down by traditional law enforcement domain seizures. Hunting for the unique communication
    signature of Aeternum is the only durable way to find this threat as it rotates
    its smart contract addresses.
  methodology: model-assisted
  trigger: intel-report
hypothesis: An intruder is using public blockchain RPC endpoints to retrieve C2 instructions
  and the Telegram Bot API to exfiltrate system reconnaissance data, evading traditional
  domain-based filtering.
labels:
- hunt
- attack.t1102.001
- attack.t1071.001
- attack.t1105
- attack.t1567.002
- attack.t1041
name: Aeternum Decentralized C2 and Telegram Exfiltration
parameters:
  exfil_domains:
    default:
    - api.telegram.org
    - github.com
    description: Domains used for exfiltration and payload acquisition.
    from:
      kind: article
      observed: '2026-08-10'
      ref: unit42-aeternum-c2
    type: list[domain]
  lookback_days:
    default: '14'
    description: Days of history to examine.
    type: number
  rpc_endpoints:
    default:
    - polygon-mumbai-bor-rpc.publicnode.com
    description: Blockchain RPC endpoints used for decentralized C2.
    from:
      kind: article
      observed: '2026-08-10'
      ref: unit42-aeternum-c2
    type: list[domain]
  scope_hosts:
    default: []
    description: Hostnames to filter on, typically identified in the initial DNS lead
      step.
    type: list[host]
provenance:
  authors:
  - name: Huntbase hunt generation
    org: huntbase.io
  generated:
    by: huntbase-hunt-generation
    from: https://unit42.paloaltonetworks.com/aeternum-blockchain-c2-analysis/
    gates:
    - dry-run
    - lint
    model: hb_google/gemini-3-flash-preview
rationale: Focus on the general endpoint estate, prioritizing systems with developers
  or administrators who might legitimately use blockchain RPCs, to distinguish them
  from infected workstations.
references:
- name: "Unit 42 \u2014 The Permanent Threat: Analyzing Aeternum\u2019s Blockchain-Based\
    \ C2 Operations"
  url: https://unit42.paloaltonetworks.com/aeternum-blockchain-c2-analysis/
related:
- hunt: aeternum-initial-infection
  reason: This hunt focuses on the C2 and exfiltration lifecycle; the initial execution
    and unpacking are handled in the sibling hunt.
  relation: out-of-scope-alternative
- hunt: aeternum-loader-persistence-execution
  relation: follows
scenario:
  stages:
  - name: Aeternum Loader Execution
    observables:
    - Build.exe
    - UPX-packed binary
    slug: aeternum-initial-execution
    tactic: execution
    techniques:
    - T1204.002
  - name: Persistence via Startup Folder
    observables:
    - AppData\Local
    - Wmi_Framework_APIKEY_wmsnet_*.lnk
    slug: persistence-via-startup-folder
    tactic: persistence
    techniques:
    - T1547.001
  - name: Auxiliary Binary Execution
    observables:
    - wmiframework.exe
    - ZrvEsJQzWQ.exe
    - STAAAAAS.exe
    slug: auxiliary-binary-execution
    tactic: execution
    techniques:
    - T1106
  - name: Blockchain-based C2 Communication
    observables:
    - polygon-mumbai-bor-rpc.publicnode.com
    - '0xb68d1809'
    - getDomain()
    slug: blockchain-c2-communication
    tactic: command-and-control
    techniques:
    - T1102.001
    - T1071.001
  - name: Payload Download from GitHub
    observables:
    - github.com
    - DotNetZip.dll
    - putty.exe
    slug: payload-download-and-loading
    tactic: command-and-control
    techniques:
    - T1105
  - name: Data Exfiltration via Telegram API
    observables:
    - api.telegram.org
    - SystemInfo Bot/2.0
    - screenshot.png
    - /sendDocument
    slug: data-exfiltration-via-telegram
    tactic: exfiltration
    techniques:
    - T1567.002
    - T1041
  summary: Aeternum is a C++ botnet loader that leverages the Polygon blockchain's
    smart contracts for decentralized command-and-control infrastructure. The loader
    establishes persistence via the Windows Startup folder and retrieves instructions
    through Polygon RPC endpoints before downloading secondary payloads from GitHub
    and exfiltrating system data via the Telegram API.
series:
  index: 2
  slug: the-permanent-threat-analyzing-aeternum-s-blockchain-based-c2-operations-and-communications
  title: "The Permanent Threat: Analyzing Aeternum\u2019s Blockchain-Based C2 Operations\
    \ and Communications"
  total: 2
severity: high
targets:
  analyst:
    name: Tier-2 analyst
    role: analyst
  endpoint:
    category: endpoint
    name: Endpoint telemetry (hb_ surfaces)
    telemetry:
    - endpoint
  hunter:
    agent: true
    name: Hunt agent
  web:
    category: siem
    name: Web server / proxy logs
    telemetry:
    - network
tlp: clear
type: investigation
---


# Aeternum Decentralized C2 and Telegram Exfiltration

This hunt targets the network-centric lifecycle of the Aeternum botnet. It first identifies hosts communicating with decentralized blockchain infrastructure (Polygon) and social media APIs (Telegram). It then correlates these connections with specific behavioural markers, such as the SystemInfo Bot User-Agent and the loading of the DotNetZip.dll module. By fanning out across DNS, HTTP, and module telemetry, the hunt identifies the full scope of a blockchain-coordinated intrusion.

## dns-lead-to-decentralized-infra
<!-- DNS lookups to blockchain and exfil domains -->
Identify hosts communicating with decentralized RPC nodes or the Telegram API to establish a lead list.

```sqlite target=endpoint role=baseline params=(lookback_days=lookback_days, rpc_endpoints=rpc_endpoints, exfil_domains=exfil_domains)
~~~yaml
baseline:
  compare: first_seen
  window: '{{lookback_days}}d'
expected: A list of hosts contacting Polygon or Telegram. Common developer activity
  may appear; prevalence will help filter noise in later steps.
prevalence:
  by: device_hostname
  key:
  - query_hostname
  rare_below: 5
reads:
- device_hostname
- query_hostname
- time
silence: not_evidence_of_absence
source: hb_dns_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, query_hostname, COUNT(*) AS lookup_count, MIN(time) AS first_seen, MAX(time) AS last_seen FROM hb_dns_activity WHERE (instr(',' || '{{rpc_endpoints}}' || ',', ',' || LOWER(query_hostname) || ',') > 0 OR instr(',' || '{{exfil_domains}}' || ',', ',' || LOWER(query_hostname) || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') GROUP BY device_hostname, query_hostname ORDER BY lookup_count DESC
```

## corroborate-activity
<!-- Corroborate on network and module surfaces -->
parallel:
- → telegram-http-exfiltration
- → recon-and-module-artifacts
join: → triage-aeternum-evidence

## telegram-http-exfiltration
<!-- Telegram API exfiltration traffic -->
Find the specific HTTP User-Agent and URI paths used by the Aeternum exfiltration module, restricted to the lead host list.

```sqlite target=web role=detection-candidate params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: POST requests to /sendDocument with the SystemInfo Bot User-Agent from lead
  hosts. This is a high-confidence indicator of the exfiltration phase.
reads:
- device_hostname
- http_method
- time
- url_hostname
- url_path
- user_agent
silence: not_evidence_of_absence
source: hb_http_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, url_hostname, url_path, user_agent, http_method, time FROM hb_http_activity WHERE (LOWER(user_agent) LIKE 'systeminfo bot%' OR LOWER(url_path) LIKE '%/senddocument%') AND LOWER(url_hostname) = 'api.telegram.org' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## recon-and-module-artifacts
<!-- Malicious module and reconnaissance artifacts -->
Identify the loading of the botnet downloader module and the creation of exfiltration files on lead hosts.

```sqlite target=endpoint role=enrichment params=(lookback_days=lookback_days, scope_hosts=scope_hosts)
~~~yaml
expected: The loading of dotnetzip.dll or the creation of screenshot.png specifically
  on hosts identified as having blockchain or Telegram network activity.
reads:
- device_hostname
- module_name
- process_name
- time
silence: not_evidence_of_absence
source: hb_module_activity
verified: dry-run
verified_at: '2026-09-20'
~~~
SELECT device_hostname, module_name AS artifact, process_name, time, 'module_load' AS type FROM hb_module_activity WHERE LOWER(module_name) = 'dotnetzip.dll' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days') UNION ALL SELECT device_hostname, file_name AS artifact, process_name, time, 'file_creation' AS type FROM hb_file_activity WHERE LOWER(file_name) = 'screenshot.png' AND ('{{scope_hosts}}' = '' OR instr(',' || '{{scope_hosts}}' || ',', ',' || device_hostname || ',') > 0) AND time >= datetime('now', '-{{lookback_days}} days')
```

## triage-aeternum-evidence
<!-- Triage Aeternum evidence -->
```agent target=hunter
cite: required
context:
- dns-lead-to-decentralized-infra
- telegram-http-exfiltration
- recon-and-module-artifacts
max_iterations: 6
objective: Determine if any host has successfully retrieved commands via Polygon RPC
  and exfiltrated data via Telegram, citing the User-Agent, module loading, and screenshot
  creation.
success_criteria: A per-host verdict of malicious, suspicious, or benign based on
  the presence of the full chain.
tools:
- endpoint
- web
```

## route-on-verdict
<!-- Route on verdict -->
if~: "the triage verdict identifies hosts with confirmed Aeternum exfiltration markers such as the SystemInfo Bot User-Agent or DotNetZip module load" (confidence: high, judge=hunter)
then: → isolate-infected-host
indeterminate: → analyst-manual-review
unavailable: → analyst-manual-review (blind_spot: no-http-body-visibility)
else: → close-out-hunt

## isolate-infected-host
<!-- Isolate infected host -->
```action target=endpoint
~~~yaml
approval: required
~~~
Isolate the host from the network. Capture any running processes communicating with api.telegram.org.
```
→ analyst-manual-review

## analyst-manual-review
<!-- Analyst manual review -->
```manual target=analyst
Examine the process trees for hosts contacting Polygon RPC endpoints. Look for C++ compiled binaries that do not belong to legitimate blockchain development tools.
```
→ close-out-hunt

## close-out-hunt
<!-- Close out hunt -->
```manual target=analyst
Log the number of hosts identified. If Aeternum was confirmed, ensure the HTTP User-Agent and screenshot file name patterns are added to the detection backlog.
```
→ end

Run it

Take this hunt into your environment.

Open it in Huntbase to run every step against your own connections, with Scout weighing the evidence and your analysts in command. Or take the open hunt.md file anywhere that reads the format.

Machine-drafted by huntbase-hunt-generation using hb_google/gemini-3-flash-preview, gated by dry-run, lint, then reviewed by a person.