Initial commit

This commit is contained in:
Richard
2026-06-15 18:12:40 +02:00
commit b895cddc5f
10 changed files with 1865 additions and 0 deletions
@@ -0,0 +1,245 @@
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Anmelden bei Ihrem Konto</title>
<!--
============================================================================
SCHULUNGS-DEMO PHISHING-AWARENESS
----------------------------------------------------------------------------
Diese Seite IMITIERT optisch einen Microsoft-Login, ist aber bewusst
HARMLOS gebaut:
* Es werden KEINE Daten gespeichert, gesendet oder weitergeleitet.
* Es gibt KEINE Verbindung zu Microsoft und KEINEN echten Login.
* Alle Eingaben bleiben ausschliesslich lokal im Browser und werden
nach der Demo dem Teilnehmer zu Aufklaerungszwecken angezeigt.
Verwendung nur in Schulungen mit Einwilligung der Teilnehmenden.
============================================================================
-->
<style>
* { box-sizing: border-box; }
html, body { height: 100%; margin: 0; }
body {
font-family: "Segoe UI", "Segoe UI Web", Arial, sans-serif;
color: #1b1b1b;
background: #fff;
display: flex; align-items: center; justify-content: center;
min-height: 100%;
/* Microsoft-typischer heller Verlauf-Hintergrund */
background-image: linear-gradient(rgba(255,255,255,0.0), rgba(255,255,255,0.0));
}
/* Schulungs-Banner */
#demoBanner {
position: fixed; top: 0; left: 0; right: 0;
background: #ffb900; color: #1b1b1b;
font-size: 13px; font-weight: 600; text-align: center;
padding: 6px 12px; z-index: 1000;
border-bottom: 2px solid #d29200;
}
.card {
width: 440px; max-width: 96vw;
background: #fff;
box-shadow: 0 2px 6px rgba(0,0,0,0.2);
padding: 44px 44px 36px;
position: relative;
}
.logo { display: flex; align-items: center; margin-bottom: 16px; }
.logo svg { width: 24px; height: 24px; margin-right: 6px; }
.logo span { font-size: 15px; color: #5e5e5e; font-weight: 600; }
h1 { font-size: 24px; font-weight: 600; margin: 8px 0 4px; }
.sub { font-size: 15px; margin: 0 0 12px; }
.field { width: 100%; border: none; border-bottom: 1px solid #666;
font-size: 15px; padding: 6px 0; outline: none; margin: 6px 0 4px; }
.field:focus { border-bottom: 2px solid #0067b8; }
.row-actions { display: flex; justify-content: flex-end; margin-top: 24px; }
.links { font-size: 13px; margin: 16px 0 0; }
.links a { color: #0067b8; text-decoration: none; }
.links a:hover { text-decoration: underline; }
.btn {
background: #0067b8; color: #fff; border: none;
font-size: 15px; min-width: 108px; height: 32px; cursor: pointer;
}
.btn:hover { background: #005da6; }
.btn.secondary { background: #eaeaea; color: #1b1b1b; margin-right: 8px; }
.btn.secondary:hover { background: #dcdcdc; }
.back { font-size: 13px; color: #1b1b1b; margin-bottom: 12px; display: flex; align-items: center; }
.acct { font-size: 15px; margin: 4px 0 16px; color: #1b1b1b; }
.hint { font-size: 13px; color: #666; margin: 8px 0 0; }
.step { display: none; }
.step.active { display: block; }
.footer {
position: fixed; bottom: 0; right: 0;
font-size: 12px; color: #666; padding: 10px 18px;
}
.footer a { color: #666; text-decoration: none; margin-left: 18px; }
/* Aufklaerungs-Screen */
#reveal { width: 620px; max-width: 96vw; display: none; }
#reveal .card2 {
background: #fff; border: 2px solid #c0392b;
box-shadow: 0 4px 14px rgba(0,0,0,0.18); padding: 32px;
}
#reveal h2 { color: #c0392b; margin-top: 0; font-size: 26px; }
#reveal .captured {
background: #faf2f2; border-left: 4px solid #c0392b;
padding: 14px 16px; font-family: Consolas, "Courier New", monospace;
font-size: 14px; margin: 16px 0; word-break: break-all;
}
#reveal ul { font-size: 15px; line-height: 1.55; }
#reveal .restart { background:#0067b8; color:#fff; border:none; padding:8px 18px;
font-size:14px; cursor:pointer; margin-top:8px; }
</style>
</head>
<body>
<div id="demoBanner">⚠️ SCHULUNGS-DEMO Nachgebauter Login zu Awareness-Zwecken. Es werden KEINE Daten gespeichert oder gesendet. Keine echte Microsoft-Seite.</div>
<!-- ===================== LOGIN-NACHBAU ===================== -->
<div class="card" id="loginCard">
<div class="logo">
<svg viewBox="0 0 23 23" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<rect x="1" y="1" width="10" height="10" fill="#f25022"/>
<rect x="12" y="1" width="10" height="10" fill="#7fba00"/>
<rect x="1" y="12" width="10" height="10" fill="#00a4ef"/>
<rect x="12" y="12" width="10" height="10" fill="#ffb900"/>
</svg>
<span>Microsoft</span>
</div>
<!-- Schritt 1: E-Mail -->
<div class="step active" id="step-email">
<h1>Anmelden</h1>
<input class="field" id="email" type="text" placeholder="E-Mail, Telefon oder Skype" autocomplete="off">
<p class="links">Kein Konto? <a href="#" onclick="return false;">Erstellen Sie jetzt eins!</a></p>
<p class="links"><a href="#" onclick="return false;">Sie können nicht auf Ihr Konto zugreifen?</a></p>
<div class="row-actions">
<button class="btn" id="toPw">Weiter</button>
</div>
</div>
<!-- Schritt 2: Passwort -->
<div class="step" id="step-pw">
<div class="back"> <span id="acctShow" style="margin-left:6px;"></span></div>
<h1>Kennwort eingeben</h1>
<input class="field" id="password" type="password" placeholder="Kennwort" autocomplete="off">
<p class="links"><a href="#" onclick="return false;">Kennwort vergessen</a></p>
<div class="row-actions">
<button class="btn" id="toMfa">Anmelden</button>
</div>
</div>
<!-- Schritt 3: Zweiter Faktor -->
<div class="step" id="step-mfa">
<div class="logo" style="margin-bottom:8px;">
<svg viewBox="0 0 23 23" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<rect x="1" y="1" width="10" height="10" fill="#f25022"/>
<rect x="12" y="1" width="10" height="10" fill="#7fba00"/>
<rect x="1" y="12" width="10" height="10" fill="#00a4ef"/>
<rect x="12" y="12" width="10" height="10" fill="#ffb900"/>
</svg>
</div>
<p class="acct" id="acctShow2"></p>
<h1>Code eingeben</h1>
<p class="sub">Geben Sie den Code aus Ihrer Authenticator-App ein.</p>
<input class="field" id="otp" type="text" inputmode="numeric" placeholder="Code" autocomplete="off" maxlength="8">
<div class="row-actions">
<button class="btn" id="finish">Überprüfen</button>
</div>
</div>
</div>
<!-- ===================== AUFKLAERUNGS-SCREEN ===================== -->
<div id="reveal">
<div class="card2">
<h2>Stopp das war eine Phishing-Simulation</h2>
<p>Hätten Sie das auf einer echten Angreiferseite getan, besäße der Angreifer jetzt:</p>
<div class="captured" id="capturedBox"></div>
<p><strong>Worauf hätten Sie achten können?</strong></p>
<ul>
<li><strong>Die Adresszeile (URL):</strong> Der echte Login läuft nur über <em>login.microsoftonline.com</em> / <em>login.live.com</em> niemals über eine fremde Domain.</li>
<li><strong>Unerwartete Aufforderung:</strong> Eine Mail/SMS, die Sie zur Anmeldung drängt, ist verdächtig besonders bei Zeitdruck.</li>
<li><strong>Auch MFA schützt nicht immer:</strong> Moderne Angriffe leiten Ihren Code in Echtzeit weiter. Deshalb zählt, gar nicht erst Daten einzugeben.</li>
<li><strong>Phishing-resistente Verfahren:</strong> Passkeys / FIDO2-Sicherheitsschlüssel lassen sich nicht über gefälschte Seiten abgreifen.</li>
</ul>
<p>Im Zweifel: Seite schließen, URL selbst eintippen oder Lesezeichen nutzen, und die IT informieren.</p>
<button class="restart" id="restart">Demo zurücksetzen</button>
</div>
</div>
<div class="footer">
<a href="#" onclick="return false;">Nutzungsbedingungen</a>
<a href="#" onclick="return false;">Datenschutz &amp; Cookies</a>
</div>
<script>
/* ----------------------------------------------------------------------------
WICHTIG: Diese Demo sendet bewusst NICHTS. Es gibt keinen fetch/XHR/Submit
nach aussen. Eingaben bleiben in JS-Variablen und werden nur lokal zur
Aufklaerung angezeigt. So ist die Seite als Angriffswerkzeug unbrauchbar.
---------------------------------------------------------------------------- */
(function () {
var data = { email: "", password: "", otp: "" };
function show(stepId) {
document.querySelectorAll('.step').forEach(function (s) { s.classList.remove('active'); });
document.getElementById(stepId).classList.add('active');
}
document.getElementById('toPw').addEventListener('click', function () {
var v = document.getElementById('email').value.trim();
if (!v) { document.getElementById('email').focus(); return; }
data.email = v;
document.getElementById('acctShow').textContent = v;
document.getElementById('acctShow2').textContent = v;
show('step-pw');
document.getElementById('password').focus();
});
document.getElementById('toMfa').addEventListener('click', function () {
var v = document.getElementById('password').value;
if (!v) { document.getElementById('password').focus(); return; }
data.password = v;
show('step-mfa');
document.getElementById('otp').focus();
});
document.getElementById('finish').addEventListener('click', function () {
data.otp = document.getElementById('otp').value.trim();
// Keine Validierung, kein Versand direkt zum Aufklaerungs-Screen.
var masked = data.password.length ? data.password[0] + '•'.repeat(Math.max(0, data.password.length - 1)) : '(leer)';
document.getElementById('capturedBox').innerHTML =
'Benutzername: ' + escapeHtml(data.email) + '<br>' +
'Kennwort: ' + escapeHtml(data.password) + ' (vollständig erfasst)<br>' +
'MFA-Code: ' + escapeHtml(data.otp || '(leer)');
document.getElementById('loginCard').style.display = 'none';
document.querySelector('.footer').style.display = 'none';
document.getElementById('reveal').style.display = 'block';
});
document.getElementById('restart').addEventListener('click', function () {
data = { email: "", password: "", otp: "" };
document.getElementById('email').value = '';
document.getElementById('password').value = '';
document.getElementById('otp').value = '';
document.getElementById('reveal').style.display = 'none';
document.getElementById('loginCard').style.display = 'block';
document.querySelector('.footer').style.display = 'block';
show('step-email');
document.getElementById('email').focus();
});
// Enter-Taste je Schritt
document.getElementById('email').addEventListener('keydown', function (e) { if (e.key === 'Enter') document.getElementById('toPw').click(); });
document.getElementById('password').addEventListener('keydown', function (e) { if (e.key === 'Enter') document.getElementById('toMfa').click(); });
document.getElementById('otp').addEventListener('keydown', function (e) { if (e.key === 'Enter') document.getElementById('finish').click(); });
function escapeHtml(s) {
return String(s).replace(/[&<>"']/g, function (c) {
return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c];
});
}
})();
</script>
</body>
</html>