Primary Case Exhibit: Exposed: QuickDAV Malware Distribution Repository and Remcos RAT Infrastructure
Exposed QuickDAV Malware Distribution Repository and Remcos RAT Infrastructure
Target acquired:hxxp://151[.]241[.]154[]:/ Acquisition date: 2026-08-13 UTC Analysis type: Passive acquisition review + offline static malware analysis Analyst context: DFIR / incident-response investigation Execution policy: No acquired malware was executed. No intrusive interaction with the remote host is required for the findings in this report.
The Alert from my own CTI Project
1. Executive Summary
The exposed service at 151[.]241[.]154[]:8888 is assessed as a malware distribution repository supporting multiple campaigns rather than a standalone Remcos command-and-control listener. The HTTP service identifies itself as Express with SciActive QuickDAV 3.4.0, and directory indexing exposed the repository structure and 39 acquired payload files.
The corpus contains a repeatable PowerShell loader framework with two principal delivery branches:
Registry-resident / Scheduled Task branch downloads a text carrier, slices a fixed hex region, stores carrier data and loader state under HKCU:\Software\<campaign key>, persists through fake software-update Scheduled Tasks, and repeatedly executes XOR-decoded native code from executable memory via conhost.exe --headless + 32-bit PowerShell.
Disk-backed Themes branch writes a carrier beneath %APPDATA%\Microsoft\Windows\Themes, marks it hidden, records its path/URLs under HKCU, extracts and XOR-decrypts a large position-independent payload, and executes it using HeapCreate/HeapAlloc or VirtualAlloc. Selected variants add Microsoft Defender exclusions for the Themes path and powershell.exe.
Offline extraction identified seven distinct Remcos configurations across Remcos 7.2.5 Pro and 7.2.4 Pro, including seven configured controller endpoints. The decrypted settings also expose botnet identifiers, Remcos mutexes, license identifiers, and TLS certificate/private-key material. Reuse of identical Remcos license IDs and identical TLS key material provides strong infrastructure/build clustering.
A second payload family is present in four identical 2,145,730-byte carrier files. Its extracted 797,023-byte position-independent blob is not a PE file and is assessed as probable Donut-derived shellcode based on its execution architecture and encrypted embedded instance. The inner payload was not falsely attributed to Remcos because it remains encrypted/unresolved in this static pass.
The acquisition contains significant duplication: 39 files collapse to 25 unique SHA-256 values. One carrier hash occurs eight times and the alternate-shellcode carrier hash occurs four times, showing deliberate file/path churn over a comparatively small set of underlying payloads.
High-confidence conclusions
151[.]241[.]154[]:8888 is a delivery/content node exposing malware and loader infrastructure.
The loader framework uses redundant hosts in 151[.]241[.]154[]/24, particularly 151[.]241[.]154[]:8888 as a recurring fallback.
Twelve distinct Scheduled Task loader configurations were recovered.
Four alternate disk-backed loaders target a shared large carrier format and the Rhysm1utym XOR key.
Seven distinct Remcos C2 configurations were recovered directly from decoded PE resources.
The Remcos samples expose four strong configuration clusters based on license/TLS key reuse.
The infection chain is strongly huntable through registry paths, task names, mutexes, XOR keys, process ancestry, extraction offsets, and controller endpoints.
Server-provided Last Modified timestamps are treated as server metadata, not trusted forensic creation times.
The QuickDAV UI does not declare the timezone used for displayed modification timestamps.
Static findings demonstrate configured malware behavior and capabilities; they do not prove every capability was exercised against a specific victim.
Controller configuration recovered from malware is authoritative for sample intent but does not establish that every controller was reachable at every point in time.
The alternate PIC branch remains partially unresolved; attribution to Donut is an architectural assessment rather than a proven builder fingerprint.
Directory 3/ was empty at acquisition time. Directories 1/ and 2/ contained the active loader/carrier corpus.
3.3 Observed repository time span
Based on the QuickDAV listing metadata, acquired file modification timestamps span approximately:
2026-05-25 03:24:38 through2026-07-28 20:57:34
The timezone is unspecified. The latest listed artifact is open.bat, modified shortly after the corresponding aiemgqgiewigsq279.jpj loader on July 28, supporting an upload/deployment sequence rather than a single static archival dump.
0x40 corresponds to executable/read/write memory protection. Some alternate variants instead use VirtualAlloc(...,0x3000,0x04), copy the payload, change protection to executable/read (0x20), invoke, then VirtualFree.
The following mapping is directly recoverable from the readable loader scripts:
7.2 Stage timing / retry behavior
Most persistent secondary stages wait approximately 130 seconds before their main loop, then use 60-second retry/recurrence sleeps with a short 2-second garbage-collection/reallocation pause. aiemgqgiewigsq279.jpj and ueyamga45hymsdis.hsb use shorter 30-second loop timings in the recovered secondary stage. The repeated task trigger every minute plus the secondary loop means an infected user context can repeatedly attempt recovery and execution.
8. Alternate Disk-Backed Themes Branch
Four loader scripts use a distinct but related strategy:
The decoded blob is not a PE according to static file identification. It is position-independent native data executed directly as a function pointer. The architecture is strongly consistent with a Donut-style loader: executable position-independent shellcode with an encrypted embedded instance/module and in-memory execution. Assessment: probable Donut-derived loader, moderate confidence in exact builder attribution.
The inner embedded module remains unresolved in this static pass, so it is intentionally not labeled Remcos.
9. Carrier Encoding and Payload Recovery
9.1 Remcos carrier format
The dominant carrier files are text-like containers with a large embedded hex substring. The loader performs:
raw carrier text → fixed Substring(offset,length) → each two characters converted to one byte → repeated ASCII XORkey → native PE32 payload
For the common 1,157,120-character encoded region:
RemcosAgentinitialized ( 7.2.5 Pro 7.2.4 Pro Remcos restarted by watchdog! Offline Keylogger Started Online Keylogger Started RecoverCookies Uploading file to Controller: Downloading file: GetDirectListeningPort cmd.exe powershell.exe
These strings, together with successfully decrypted SETTINGS resources and the Remcos-specific configuration field layout, provide high-confidence family identification.
10. Remcos SETTINGS Configuration Analysis
The Remcos family identification was not based only on printable strings. The decoded PE files contain a named resource, RT_RCDATA/SETTINGS, which stores the controller configuration in an encrypted binary structure. Recovering this resource and reproducing the malware's configuration-decryption path exposed the configured C2 endpoints, botnet identifiers, mutexes, license identifiers, and embedded TLS key material.
This stage is important because it separates family identification from configuration recovery: strings can identify Remcos, but the SETTINGS resource explains how that specific build was configured and provides much stronger infrastructure pivots.
10.1 Configuration-recovery chain
For the Remcos payloads recovered from the exposed repository, the complete static path is:
encoded carrier | | campaign-specific substring carve | hex decode | repeating XOR v Remcos PE (MZ/PE32) | | PE Resource Directory v RT_RCDATA (type10) | +-- named resource: SETTINGS | +-- byte 0 = RC4 key length (N) +-- bytes 1..N = RC4 key material +-- remaining = RC4 ciphertext | | RC4 KSA + PRGA v decrypted Remcos configuration | | split on 7c 1e 1e 1f 7c v 58 configuration fields
No brute force was required. Both cryptographic layers are self-describing from the loader/resource structure: the outer PowerShell exposes its XOR key and the Remcos SETTINGS blob stores its own RC4 key immediately before the ciphertext.
10.2 Locating the SETTINGS resource
The decoded native payloads contain a PE resource with the following hierarchy:
PE Resource Directory └── RT_RCDATA / type 10 └── SETTINGS └── language 0 └── IMAGE_RESOURCE_DATA_ENTRY
The resource must be extracted from the decoded Remcos PE, not from the original HTTP carrier. Searching the outer .mtj, .hww, .fru, .nky, or similar carrier directly will not expose the plaintext controller configuration.
Two representative resources were validated byte-for-byte:
This provides immediate validation that the correct key and resource boundaries were used. A failed decode instead produces high-entropy/non-structured output and will not produce the expected controller field, delimiter sequence, UTF-16LE strings, or ASN.1 objects near the tail of the configuration.
10.4 Remcos 7.2.5 variation
The same framing was independently validated against the 7.2.5 Pro sample:
PE SHA-256: c5e0acb54c7d95a5b3cb04d5e0963884a684a7cb36d1e6f01bc88985c595dec0
This confirms that the 7.2.4 and 7.2.5 configurations use the same overall resource framing and field layout while allowing variable-length RC4 keys.
10.5 RC4 decryption logic
The transformation is standard RC4: a key-scheduling algorithm (KSA) initializes/permutates a 256-byte state array, followed by the pseudo-random generation algorithm (PRGA), whose keystream is XORed with the configuration ciphertext.
Field 0 in the observed samples contains an additional trailing 0x1e, so the normalized controller field is obtained with:
controller_field = fields[0].rstrip(b"\x1e")
The configuration is mixed-encoding, not purely ASCII. It contains:
ASCII strings such as the controller, botnet name, mutex, directories, and license ID;
UTF-16LE strings such as remcos.exe, logs.dat, Remcos, and remcos;
single-byte numeric/boolean fields;
binary ASN.1 DER objects in fields 54–56.
High-value fields recovered consistently from this corpus are:
Field 0 :controller:port:TLS-flag Field 1 :botnetidentifier Field 10 :executablename(UTF-16LE:remcos.exe) Field 14 :Remcosmutex Field 17 :logfilename(UTF-16LE:logs.dat) Field 26 :Screenshots Field 38 :MicRecords Field 48 :UTF-16LE"Remcos" Field 49 :UTF-16LE"remcos" Field 52 :licenseidentifier Field 54 :DERX.509certificate Field 55 :DERSEC1ECprivatekeymatchingfield54 Field 56 :secondDERX.509certificate
The trailing :1 in controller field 0 is interpreted as the TLS-enable flag, not a password. For example:
The following compact extractor can be used once pefile is installed. It does not execute the malware; it only reads the PE resource table, decrypts the resource, and writes the resulting artifacts.
#!/usr/bin/env python3 from pathlib import Path import hashlib import pefile
for i in range(256): j = (j + S[i] + key[i % len(key)]) & 0xff S[i], S[j] = S[j], S[i]
out = bytearray() i = j = 0
for byte in data: i = (i + 1) & 0xff j = (j + S[i]) & 0xff S[i], S[j] = S[j], S[i] k = S[(S[i] + S[j]) & 0xff] out.append(byte ^ k)
return bytes(out)
def extract_settings(path: str) -> bytes: pe = pefile.PE(path)
for resource_type in pe.DIRECTORY_ENTRY_RESOURCE.entries: if resource_type.struct.Id != 10: # RT_RCDATA continue
for resource_name in resource_type.directory.entries: if resource_name.name is None: continue
if str(resource_name.name).upper() != "SETTINGS": continue
for resource_lang in resource_name.directory.entries: rva = resource_lang.data.struct.OffsetToData size = resource_lang.data.struct.Size return pe.get_data(rva, size)
raise RuntimeError("RT_RCDATA/SETTINGS resource not found")
def decode_text(field: bytes) -> str: field = field.rstrip(b"\x1e")
if not field: return ""
# Detect common UTF-16LE fields. if len(field) % 2 == 0 and len(field) >= 4: odd = field[1::2] if odd and odd.count(0) / len(odd) >= 0.60: while field.endswith(b"\x00\x00"): field = field[:-2] return field.decode("utf-16le", "replace")
for i in (0, 1, 10, 14, 17, 26, 38, 48, 49, 52): print(f"[{i:02d}] {decode_text(fields[i])}")
# Preserve the binary cryptographic fields independently. for i in (54, 55, 56): Path(f"field_{i}.der").write_bytes(fields[i]) print( f"[{i:02d}] len={len(fields[i])} " f"sha256={hashlib.sha256(fields[i]).hexdigest()}" )
Example execution against the recovered 7.2.4 PE produces:
A companion standard-library-only extractor, which performs the PE resource traversal itself and therefore does not require pefile, was also produced during this investigation as extract_remcos_settings.py.
10.8 TLS/ASN.1 resource fields
Fields 54–56 are not strings and should not be decoded as text. They are DER-encoded ASN.1 structures.
For the 7.2.4 sample:
Field 54 length:260bytes SHA-256:d7ecb82932ee66211e66e6cbd50e68d02b51962e0274ae16d6fe9f5d3bfd4b6f Type:DERX.509certificate
Field 55 length: 121 bytes SHA-256: 0dbe0818a6196d365899106f46359e3ed4737c695cfad89cb513a203332702d9 Type: DER SEC1 EC private key Curve: prime256v1 / NIST P-256 Public key: matches field 54
Field 56 length: 260 bytes SHA-256: 2798275f59618de8d70fe5023993d000baa7f2dc9b7359096405c877bf68b566 Type: second DER X.509 certificate
The certificates observed in this configuration use ECDSA-with-SHA256 and P-256 public keys. The 7.2.4 certificates carry an unusual broad validity interval from 1970 to 2090 with empty issuer/subject distinguished names, making them configuration artifacts rather than normal public-PKI server certificates.
They can be inspected without executing the sample:
openssl x509 -inform DER -in field_54.der -text -noout openssl ec -inform DER -in field_55.der -text -noout openssl x509 -inform DER -in field_56.der -text -noout
or generically:
openssl asn1parse -inform DER -in field_55.der
The field hashes are particularly valuable because identical certificate/private-key bytes provide a much stronger campaign/build pivot than similar-looking domains.
10.9 Recovered controllers
10.10 Unique decoded Remcos payloads
10.11 Configuration/TLS clustering
Identical license IDs combined with identical embedded TLS key material are strong build/infrastructure pivots. This is stronger than hostname similarity alone.
Cluster interpretation
The group containing www.serveredgeupdt.com, www.tools94upd.com, and upmicrotoolserv.com shares the same Remcos license identifier and the same three TLS material hashes.
The group containing edge93update.com and www.upd782378tol.com shares a second license/TLS material set.
348787241.com has unique license/TLS material within this corpus.
151[.]241[.]154[]:2941 has unique license/TLS material within this corpus and is the only recovered controller expressed directly as an IP address.
These clusters support common-builder/common-controller relationships but do not, by themselves, identify a specific human operator.
11. Delivery Infrastructure Recovered From Malware
11.1 Delivery nodes
The PowerShell code directly references the following HTTP delivery endpoints:
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
151[.]241[.]154[]:8888
The repeated use of 151[.]241[.]154[]:8888 as a fallback across unrelated campaign names is notable. The exposed .105 host is therefore only one node in a wider distribution pattern.
under different random-looking names/paths shows that filename churn is mainly a delivery/campaign artifact rather than evidence of eight distinct malware payloads.
The stored command launches C:\Windows\System32\conhost.exe --headless and re-enters the same registry-resident PowerShell stage. This establishes dual persistence (Scheduled Task + Run key) for those campaigns.