122 lines
2.7 KiB
HTML
122 lines
2.7 KiB
HTML
<!doctype html>
|
||
<html>
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<title>Presents Vault Seed Leak — Challenge</title>
|
||
<style>
|
||
body {
|
||
margin: 0;
|
||
background: #d9f3e1; /* pale Xmas green */
|
||
color: #000000;
|
||
font-family: Verdana, Arial, sans-serif;
|
||
}
|
||
.page {
|
||
max-width: 800px;
|
||
margin: 20px auto;
|
||
padding: 12px 16px 18px;
|
||
background: #ffffff;
|
||
border: 3px solid #c00000; /* Xmas red */
|
||
}
|
||
.subtitle {
|
||
font-size: 11px;
|
||
text-transform: uppercase;
|
||
letter-spacing: 1px;
|
||
color: #006600;
|
||
margin-bottom: 4px;
|
||
}
|
||
h1 {
|
||
font-size: 20px;
|
||
margin: 6px 0 10px;
|
||
color: #900000;
|
||
}
|
||
h2, h3 {
|
||
font-size: 15px;
|
||
margin: 10px 0 6px;
|
||
color: #006600;
|
||
}
|
||
p {
|
||
font-size: 13px;
|
||
line-height: 1.4;
|
||
margin: 6px 0;
|
||
}
|
||
.tokens {
|
||
margin: 6px 0 8px;
|
||
padding: 8px;
|
||
background: #fff8f8;
|
||
border: 1px solid #cc9999;
|
||
}
|
||
.token {
|
||
font-family: "Courier New", monospace;
|
||
font-size: 12px;
|
||
margin: 2px 0;
|
||
display: inline-block;
|
||
}
|
||
.hint {
|
||
font-size: 12px;
|
||
color: #333366;
|
||
margin-top: 4px;
|
||
}
|
||
.muted {
|
||
font-size: 12px;
|
||
color: #555555;
|
||
}
|
||
code {
|
||
font-family: "Courier New", monospace;
|
||
font-size: 12px;
|
||
background: #eef6ee;
|
||
padding: 1px 3px;
|
||
border: 1px solid #c0d9c0;
|
||
}
|
||
a {
|
||
color: #a00000;
|
||
text-decoration: none;
|
||
}
|
||
a:hover {
|
||
text-decoration: underline;
|
||
}
|
||
hr {
|
||
border: 0;
|
||
border-top: 1px solid #cc9999;
|
||
margin: 12px 0 10px;
|
||
}
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="page">
|
||
<div class="subtitle">North Pole Presents Vault</div>
|
||
<h1>Presents Vault Seed Leak</h1>
|
||
|
||
<p>
|
||
The token service used for maintenance tasks was seeded with the system time (seconds).
|
||
Three one-time tokens were intercepted in sequence. A rough time window is known.
|
||
</p>
|
||
|
||
<h2>Observed tokens</h2>
|
||
<p class="hint">{{ note }}</p>
|
||
<div class="tokens">
|
||
{% for t in observed %}
|
||
<div class="token">{{ t }}</div><br/>
|
||
{% endfor %}
|
||
</div>
|
||
|
||
<h3>Time window (epoch seconds)</h3>
|
||
<div class="tokens">
|
||
<span class="token">{{ window_start }}</span> –
|
||
<span class="token">{{ window_end }}</span>
|
||
</div>
|
||
|
||
<p class="hint">
|
||
Find the exact seed (an epoch second in this window) that reproduces the tokens in order,
|
||
then compute the next token and request <code>/flag?token=THE_TOKEN</code>.
|
||
</p>
|
||
|
||
<hr>
|
||
|
||
<h3>Machine-readable data</h3>
|
||
<p class="muted">
|
||
<a href="/api/observed"><code>/api/observed</code></a>
|
||
</p>
|
||
</div>
|
||
</body>
|
||
</html>
|