index.astro (7454B)
1 --- 2 import Base from '../layouts/Base.astro'; 3 import HeroDeck from '../components/HeroDeck.astro'; 4 import Marquee from '../components/Marquee.astro'; 5 import Callout from '../components/Callout.astro'; 6 import facets from '../data/facets.json'; 7 import { SOURCES, SOURCE_META, SOURCE_ROUTE, PLATFORMS, PLATFORM_META } from '../lib/taxonomy'; 8 import { url } from '../lib/url'; 9 import { website, dataset } from '../lib/jsonld'; 10 11 const c = facets.counts; 12 13 const marqueeTitles = [ 14 { n: 'NIX', title: 'GTFOBins', accent: 'foam' }, 15 { n: 'WIN', title: 'LOLBAS', accent: 'iris' }, 16 { n: 'AD', title: 'WADComs', accent: 'gold' }, 17 { n: 'MAC', title: 'LOOBins', accent: 'rose' }, 18 { n: 'DMN', title: 'DÆMON', accent: 'love' }, 19 { n: '01', title: 'SUID · sudo', accent: 'gold' }, 20 { n: '02', title: 'AWL Bypass', accent: 'iris' }, 21 { n: '03', title: 'ADCS · ESC', accent: 'gold' }, 22 { n: '04', title: 'Coercion', accent: 'love' }, 23 ]; 24 const marqueeMeta = [ 25 { tag: 'gtfo', text: `${c.bySource.GTFOBins} techniques`, accent: 'foam' }, 26 { tag: 'lolbas', text: `${c.bySource.LOLBAS} techniques`, accent: 'iris' }, 27 { tag: 'wadcoms', text: `${c.bySource.WADComs} upstream`, accent: 'gold' }, 28 { tag: 'daemon', text: `${c.added} authored here`, accent: 'love' }, 29 { tag: 'mitre', text: 'ATT&CK mapped', accent: 'pine' }, 30 { tag: 'gpl', text: 'GPL-3.0', accent: 'rose' }, 31 ]; 32 33 const platformStats = PLATFORMS.filter((p) => c.byPlatform[p]).map((p) => ({ 34 label: p, 35 accent: PLATFORM_META[p].accent, 36 n: c.byPlatform[p], 37 })); 38 --- 39 <Base 40 title="DÆMONBins — the Off-the-Land Almanac" 41 description="One filterable catalog merging GTFOBins, LOLBAS, WADComs and LOOBins — plus DÆMON additions. Living-off-the-land and offensive techniques by platform, access, environment and evidence state." 42 jsonLd={[website(Astro.site), dataset(Astro.site, c, facets.commits)]} 43 > 44 <HeroDeck /> 45 46 <Marquee titles={marqueeTitles} meta={marqueeMeta} manifest={`${c.techniques} techniques`} /> 47 48 <section class="home-platforms wrap"> 49 <h2 class="eyebrow" style="--acc: var(--foam);"> 50 <span class="eyebrow__n">01</span> 51 <span class="eyebrow__mark">^:</span> 52 <span>By platform</span> 53 <span class="eyebrow__rule" aria-hidden="true"></span> 54 </h2> 55 <div class="home-platforms__grid"> 56 {platformStats.map((p) => ( 57 <div class="home-platstat" data-reveal style={`--acc: var(--${p.accent});`}> 58 <b data-count={p.n}>{p.n.toLocaleString()}</b> 59 <span>{p.label}</span> 60 </div> 61 ))} 62 </div> 63 </section> 64 65 <section class="home-sources wrap"> 66 <h2 class="eyebrow" style="--acc: var(--iris);"> 67 <span class="eyebrow__n">02</span> 68 <span class="eyebrow__mark">^:</span> 69 <span>The collections</span> 70 <span class="eyebrow__rule" aria-hidden="true"></span> 71 </h2> 72 <div class="home-sources__grid"> 73 {SOURCES.map((id, i) => { 74 const s = SOURCE_META[id]; 75 return ( 76 <a class="home-source" data-reveal href={url(SOURCE_ROUTE[id])} style={`--acc: var(--${s.accent});`}> 77 <div class="home-source__top"> 78 <span class="home-source__tag">{String(i + 1).padStart(2, '0')} · {s.tag}</span> 79 <span class="home-source__n">{c.bySource[id] ?? 0}</span> 80 </div> 81 <h3 class="home-source__name">{s.label}</h3> 82 <p class="home-source__blurb">{s.blurb}</p> 83 <span class="home-source__go">Browse {s.label} →</span> 84 </a> 85 ); 86 })} 87 </div> 88 </section> 89 90 <section class="home-scope wrap"> 91 <Callout tone="warning" label="Scope"> 92 Everything here is placeholder-only reference material — lab IPs, <code>test.local</code>, 93 <code>john</code> / <code>password123</code> — in the same spirit as GTFOBins, LOLBAS, WADComs and 94 MITRE ATT&CK. For authorized testing, CTFs, detection engineering and education only. Know your scope. 95 </Callout> 96 <p class="home-scope__cred"> 97 GTFOBins, LOLBAS, WADComs and LOOBins are GPL-3.0 projects; this merged work is GPL-3.0. See <a href={url('credits')}>credits & licenses</a>. 98 </p> 99 </section> 100 </Base> 101 102 <style> 103 /* The section eyebrows are h2s so the page outlines h1 → h2 → h3 for 104 heading navigation; they keep the <p> eyebrow's metrics exactly. */ 105 h2.eyebrow { margin: 1em 0; font-weight: 400; } 106 107 /* ---- By platform -------------------------------------------------------- */ 108 .home-platforms { margin: clamp(2.6rem, 5vw, 4rem) auto 0; } 109 .home-platforms__grid { 110 margin-top: 1rem; 111 display: grid; 112 grid-template-columns: repeat(4, 1fr); 113 gap: 1px; 114 background: var(--rule); 115 border: 1px solid var(--rule); 116 } 117 @media (max-width: 560px) { .home-platforms__grid { grid-template-columns: repeat(2, 1fr); } } 118 .home-platstat { 119 background: var(--bg); 120 padding: 1.4rem 1.2rem; 121 border-top: 2px solid var(--acc); 122 } 123 .home-platstat b { 124 display: block; 125 font-family: var(--font-display); 126 font-weight: 800; 127 font-stretch: 84%; 128 font-size: clamp(1.8rem, 4vw, 2.7rem); 129 letter-spacing: -0.03em; 130 line-height: 1; 131 color: var(--acc); 132 font-variant-numeric: tabular-nums; 133 } 134 .home-platstat span { 135 display: block; 136 margin-top: 0.4rem; 137 font-family: var(--font-mono); 138 font-size: 11px; 139 letter-spacing: 0.14em; 140 text-transform: uppercase; 141 color: var(--fg-faint); 142 } 143 144 /* ---- The collections ---------------------------------------------------- */ 145 .home-sources { margin: clamp(2.6rem, 5vw, 4rem) auto 0; } 146 .home-sources__grid { 147 display: grid; 148 grid-template-columns: repeat(2, 1fr); 149 gap: 1px; 150 background: var(--rule); 151 border: 1px solid var(--rule); 152 margin-top: 1rem; 153 } 154 @media (max-width: 720px) { .home-sources__grid { grid-template-columns: 1fr; } } 155 .home-source { 156 display: flex; 157 flex-direction: column; 158 gap: 0.6rem; 159 padding: 1.5rem 1.5rem 1.4rem; 160 background: var(--bg); 161 text-decoration: none; 162 color: var(--fg); 163 position: relative; 164 } 165 .home-source::before { 166 content: ''; 167 position: absolute; 168 top: 0; left: 0; 169 width: 100%; height: 3px; 170 background: var(--acc); 171 transform: scaleX(0); 172 transform-origin: left; 173 transition: transform 220ms var(--ease); 174 } 175 .home-source:hover::before { transform: scaleX(1); } 176 .home-source__top { display: flex; align-items: center; justify-content: space-between; } 177 .home-source__tag { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--acc); } 178 .home-source__n { font-family: var(--font-mono); font-size: 12px; color: var(--fg-faint); } 179 .home-source__name { font-family: var(--font-display); font-weight: 800; font-stretch: 84%; text-transform: uppercase; letter-spacing: -0.02em; font-size: clamp(24px, 3.5vw, 34px); margin: 0; color: var(--fg); } 180 .home-source__blurb { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--fg-dim); } 181 .home-source__go { margin-top: auto; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--acc); } 182 183 /* ---- Scope -------------------------------------------------------------- */ 184 .home-scope { margin: clamp(2.6rem, 5vw, 4rem) auto 5rem; } 185 .home-scope__cred { margin-top: 1rem; font-size: 13px; color: var(--fg-dim); } 186 .home-scope__cred a { color: var(--accent); } 187 </style>