- 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
108 lines
5.6 KiB
HTML
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 <PORT_SSH></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> |