Files
attack-defense-platform/panel/static/guide.html
T
root 72382c43d0 fix: guide link IDOR, full team-api IDOR hardening, loading overlay
- guide link now server-side replaced to /team/<idx>/guide (no /team/0 403)
- _check_team_host() applied to ALL team endpoints (login, info, targets,
  status, guide, portal, ssh-ws): host must match team domain; panel/gemastik
  host only with admin session. Cross-domain session reuse -> 403.
- host check BEFORE auth on info/targets (no team-existence oracle)
- loading overlay (spinner + text) on start/stop all-team/set; JS util
  showLoading/hideLoading
2026-09-23 17:02:52 +08:00

108 lines
5.6 KiB
HTML

<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="team-id" content="0">
<title>Panduan SSH — Gemastik A/D</title>
<style>
:root { --bg:#0b0e14; --panel:#151a23; --panel2:#1d2430; --line:#2a3444; --txt:#e6edf3; --dim:#8b98a9; --accent:#38bdf8; --green:#34d399; --red:#f87171; --purple:#a78bfa; }
* { margin:0; padding:0; box-sizing:border-box; }
body { background:var(--bg); color:var(--txt); font-family:'Segoe UI',system-ui,sans-serif; min-height:100vh; }
.wrap { max-width:800px; margin:0 auto; padding:24px 16px 60px; }
header { display:flex; align-items:center; gap:12px; margin-bottom:24px; flex-wrap:wrap; }
.logo { width:42px; height:42px; border-radius:10px; background:linear-gradient(135deg,#38bdf8,#6366f1); display:flex; align-items:center; justify-content:center; font-weight:800; font-size:20px; color:#fff; }
h1 { font-size:22px; }
.sub { color:var(--dim); font-size:13px; }
.card { background:var(--panel); border:1px solid var(--line); border-radius:14px; padding:20px; margin-bottom:16px; }
.card h2 { font-size:15px; margin-bottom:12px; color:var(--accent); }
h3 { color:var(--purple); margin:18px 0 8px; font-size:14px; }
p, li { font-size:13px; color:#c9d4e3; line-height:1.7; }
ol, ul { padding-left:20px; }
.sshbox { background:var(--panel2); border:1px solid var(--line); border-radius:8px; padding:10px 12px; font-family:ui-monospace,monospace; font-size:12px; overflow-x:auto; margin:6px 0; }
code { background:var(--panel2); padding:2px 6px; border-radius:5px; font-size:12px; }
.warn { background:#3a1414; border:1px solid var(--red); border-radius:8px; padding:12px; font-size:13px; color:#fca5a5; margin:10px 0; }
a { color:var(--accent); }
table { width:100%; border-collapse:collapse; font-size:13px; margin:8px 0; }
th, td { text-align:left; padding:8px 6px; border-bottom:1px solid var(--line); }
th { color:var(--dim); font-weight:500; }
</style>
</head>
<body>
<div class="wrap">
<header>
<div class="logo">G</div>
<div style="flex:1">
<h1>📖 Panduan SSH & Attack</h1>
<div class="sub">Gemastik 18 Final — Attack & Defense</div>
</div>
</header>
<div class="card">
<h2>🎯 Konsep Attack & Defense</h2>
<p>Setiap tim punya <b>6 challenge container</b> yang harus dijaga (<b>defense</b>) dan bisa menyerang container tim lain (<b>attack</b>). Setiap container menyimpan <b>flag</b> yang nilainya dicek panitia secara berkala (SLA). Kalau service mati atau flag berubah, tim kamu <b>kehilangan poin SLA</b>.</p>
<p style="margin-top:8px">Kamu menang dengan: (1) menjaga service tetap hidup, (2) <b>mencuri flag</b> dari tim lawan dan submit, (3) mencegah tim lawan mencuri flag kamu.</p>
</div>
<div class="card">
<h2>🔐 Login SSH</h2>
<h3>Cara 1 — Web Terminal di Portal Tim</h3>
<ol>
<li>Buka <b>portal tim kamu</b> (domain dari panitia).</li>
<li>Login dengan <b>password SSH tim</b>.</li>
<li>Tab <b>🖥️ Terminal SSH</b> → pilih challenge → <b>Sambung</b>.</li>
<li>Langsung masuk sebagai <code>ctfuser</code> — tanpa perlu aplikasi SSH.</li>
</ol>
<h3>Cara 2 — SSH Client (opsional)</h3>
<div class="sshbox">ssh ctfuser@43.134.105.109 -p &lt;PORT_SSH&gt;</div>
<p>Contoh: untuk challenge <code>blogpost</code> tim 1, port SSH = <code>31022</code>.</p>
</div>
<div class="card">
<h2>🧭 Command Penting</h2>
<table>
<tr><th>Command</th><th>Fungsi</th></tr>
<tr><td><code>cat /flag.txt</code></td><td>Lihat flag tim kamu sendiri</td></tr>
<tr><td><code>ls /app /srv /opt /home</code></td><td>Cari file source/service</td></tr>
<tr><td><code>ps aux</code></td><td>Lihat proses yang berjalan</td></tr>
<tr><td><code>ss -tlnp</code></td><td>Lihat port yang dibuka service</td></tr>
<tr><td><code>systemctl status</code></td><td>Cek service (kalau ada)</td></tr>
<tr><td><code>cat /etc/passwd</code></td><td>Daftar user lokal</td></tr>
</table>
</div>
<div class="card">
<h2>⚔️ Alur Attack</h2>
<ol>
<li>Buka tab <b>🎯 Target Musuh</b> di portal — lihat daftar domain/port tim lain.</li>
<li>Analisa service lawan dari <b>source code di container kamu sendiri</b> (biasanya sama).</li>
<li>Cari vuln (SSTI, path traversal, RCE, crypto oracle, dsb).</li>
<li>Exploit service lawan → baca <code>/flag.txt</code> mereka.</li>
<li>Submit flag di tab <b>🚩 Submit Flag</b> → <b>poin masuk ke leaderboard</b>.</li>
</ol>
<div class="warn">⚠️ Jangan sampai flag tim kamu bocor! Ganti password SSH rutin (via panitia), dan jangan tinggalkan flag di tempat umum.</div>
</div>
<div class="card">
<h2>🛡️ Alur Defense</h2>
<ol>
<li>Pastikan service <b>selalu hidup</b> — SLA dicek panitia berkala.</li>
<li>Patch vuln yang bisa dipakai lawan (jika tahu).</li>
<li>Jangan ubah <code>/flag.txt</code> — mount <b>read-only</b>, tidak bisa diubah dari dalam container.</li>
<li>Pantau <code>ps aux</code> / log — kalau ada aktivitas mencurigakan, restart via panitia.</li>
</ol>
</div>
<div class="card">
<h2>📞 Butuh Bantuan?</h2>
<p>Hubungi panitia untuk: reset password SSH, restart container, atau lapor service down. Portal ini untuk peserta — panel admin terpisah.</p>
<p style="margin-top:8px"><a href="/team/0" data-portal-link>← Kembali ke portal tim</a></p>
</div>
</div>
<script>
const TEAM_ID = parseInt(document.querySelector('meta[name="team-id"]').content || '0', 10);
document.querySelectorAll('[data-portal-link]').forEach(a => a.href = `/team/${TEAM_ID}`);
</script>
</body>
</html>