Files
honeypot.es/static/index.html
Malin 1aa164263f feat: initial T-Pot attack map with Spanish UI and Docker support
- Full Spanish interface (all UI text, popups, charts, tables)
- Dark and light mode support
- Disclaimer banner: no data logged, public European service
- Footer: Servicio ofrecido por Cloud Host (cloudhost.es)
- Docker: single container (Redis + DataServer + AttackMapServer)
- Remote T-Pot support via ELASTICSEARCH_URL env var (direct or SSH tunnel)
- Based on telekom-security/t-pot-attack-map (Apache 2.0)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-25 21:23:28 +01:00

680 lines
34 KiB
HTML

<!DOCTYPE html>
<html lang="es" data-theme="dark">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; font-src 'self'; img-src 'self' https://*.cartocdn.com https://*.openstreetmap.org data:; object-src 'none'; connect-src 'self' wss: ws:">
<title>Mapa de Ataques - Visualización de Ciberseguridad en Tiempo Real</title>
<meta name="description" content="Visualización en tiempo real de ataques al honeypot T-Pot y amenazas de ciberseguridad">
<!-- Check integrity: openssl dgst -sha384 -binary your.file.name | openssl base64 -A-->
<!--Setup D3-->
<script src="static/d3.v7.min.js" defer integrity="sha384-CjloA8y00+1SDAUkjs099PVfnY2KmDC2BZnws9kh8D/lX1s46w6EPhpXdqMfjK6i"></script>
<!--Setup JQuery-->
<script src="static/jquery-3.7.1.min.js" defer integrity="sha384-1H217gwSVyLSIfaLxHbE7dRb3v4mYCKbpQvzx0cegeju1MVsGrX5xXxAvs/HgeFs"></script>
<!--Setup Luxon-->
<script src="static/luxon.min.js" defer integrity="sha384-CU0J6nu6GO5gWB5IqOOhPQsG0LKyjpotF5Gw502R+0zbkzKHjDWc6FKSZsNTJfLX"></script>
<!--Setup Chart.js for enhanced visualizations-->
<script src="static/chart.umd.js" defer integrity="sha384-FcQlsUOd0TJjROrBxhJdUhXTUgNJQxTMcxZe6nHbaEfFL1zjQ+bq/uRoBQxb0KMo"></script>
<!--Setup Bootstrap-->
<link href="static/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH"/>
<script src="static/bootstrap.min.js" defer integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"></script>
<!--Setup Leaflet-->
<link rel="stylesheet" href="static/leaflet.css" integrity="sha384-sHL9NAb7lN7rfvG5lfHpm643Xkcjzp4jFvuavGOndn6pjVqS6ny56CAt3nsEVT4H"/>
<script src="static/leaflet.js" defer integrity="sha384-cxOPjt7s7Iz04uaHJceBmS+qpjv2JkIHNVcuOrM+YHwZOmJGBXI00mdUXEq65HTH"></script>
<!--Setup Leaflet Fullscreen Plugin (https://github.com/Leaflet/Leaflet.fullscreen) -->
<link href="static/leaflet.fullscreen.css" integrity="sha384-C7Iw1+OrHpvFnDYJhJHiS1pJp56ctL3Y74XojtVviNiHwMX1h8KlJEo41yI6UA8i" rel="stylesheet"/>
<script src="static/leaflet.fullscreen.js" defer integrity="sha384-TqFtkYBnYsrP2JCfIv/oLQxS9L6xpaIV9xnaI2UGMK25cJsTtQXZIU6WGQ7daT0Z"></script>
<!-- Local Fonts (Inter & JetBrains Mono) -->
<link href="static/fonts/fonts.css" rel="stylesheet" integrity="sha384-hfuGJk4QqYM6FMHlIjLQUEioQvJ1nPENVylKK8+JSZTBQ/KG7GwoJe29Mpw+2p11">
<!-- Local Icons (Font Awesome) -->
<link rel="stylesheet" href="static/fontawesome/css/all.min.css" integrity="sha384-t1nt8BQoYMLFN5p42tRAtuAAFQaCQODekUVeKKZrEnEyp4H2R0RHFz0KWpmj7i8g">
<link href="static/index.css?v=6" rel="stylesheet" integrity="sha384-axsUVEL9GPXH1d8THaTelM/LEPfqz4DQswvGr5mjWiL97mOoRFAsB8KLrDB13qAI"/>
<style>
#disclaimer-banner {
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 9999;
background: rgba(15, 20, 30, 0.97);
border-top: 1px solid rgba(99, 102, 241, 0.4);
padding: 10px 20px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
font-size: 0.78rem;
color: rgba(200, 210, 230, 0.85);
backdrop-filter: blur(8px);
}
[data-theme="light"] #disclaimer-banner {
background: rgba(240, 242, 250, 0.97);
border-top: 1px solid rgba(99, 102, 241, 0.3);
color: rgba(40, 50, 80, 0.9);
}
#disclaimer-banner .disclaimer-text strong {
color: #a5b4fc;
}
[data-theme="light"] #disclaimer-banner .disclaimer-text strong {
color: #4f46e5;
}
#disclaimer-close-btn {
background: rgba(99,102,241,0.15);
border: 1px solid rgba(99,102,241,0.4);
color: #a5b4fc;
border-radius: 6px;
padding: 4px 12px;
cursor: pointer;
font-size: 0.75rem;
white-space: nowrap;
flex-shrink: 0;
}
[data-theme="light"] #disclaimer-close-btn {
color: #4f46e5;
}
#site-footer {
position: fixed;
bottom: 6px;
right: 16px;
z-index: 9997;
font-size: 0.72rem;
color: rgba(150, 160, 180, 0.65);
pointer-events: auto;
display: none;
}
[data-theme="light"] #site-footer {
color: rgba(80, 90, 120, 0.65);
}
#site-footer a {
color: rgba(165,180,252,0.8);
text-decoration: none;
}
[data-theme="light"] #site-footer a {
color: rgba(79, 70, 229, 0.8);
}
#site-footer-inline {
font-size: 0.72rem;
color: rgba(150, 160, 180, 0.65);
}
#site-footer-inline a {
color: rgba(165,180,252,0.8);
text-decoration: none;
}
</style>
</head>
<body>
<!-- Pantalla de carga -->
<div id="loading-screen" class="loading-screen">
<div class="loading-content">
<div class="spinner"></div>
<h2>Iniciando Mapa de Ataques</h2>
<p>Cargando datos de ciberseguridad en tiempo real...</p>
</div>
</div>
<!-- Barra de navegación superior -->
<nav class="top-navbar">
<div class="navbar-content flex-between">
<div class="navbar-brand flex-center">
<i class="fas fa-shield-halved"></i>
<span>Mapa de Ataques</span>
</div>
<!-- Estadísticas T-Pot en cabecera -->
<div class="navbar-stats">
<div class="stats-group">
<div class="stats-header-title">
<i class="fas fa-satellite-dish fa-lg"></i>
<span id="honeypotStatsHeader">Ataques</span>
</div>
<div class="stats-inline">
<div class="stat-inline-item flex-center">
<span class="stat-inline-label">1m</span>
<span class="stat-inline-value" id="last_1m">-</span>
</div>
<div class="stat-separator">|</div>
<div class="stat-inline-item flex-center">
<span class="stat-inline-label">1h</span>
<span class="stat-inline-value" id="last_1h">-</span>
</div>
<div class="stat-separator">|</div>
<div class="stat-inline-item flex-center">
<span class="stat-inline-label">24h</span>
<span class="stat-inline-value" id="last_24h">-</span>
</div>
</div>
</div>
</div>
<div class="navbar-controls">
<div class="connection-status" id="connection-status">
<div class="status-indicator" id="status-indicator"></div>
<span id="status-text">Conectando...</span>
</div>
<div class="cache-status" id="cache-status" title="Estado de la caché de datos">
<div class="status-indicator" id="cache-indicator"></div>
<span id="cache-text">Caché</span>
</div>
<button class="btn-base control-btn flex-center-both hover-lift" id="theme-toggle" title="Cambiar tema">
<i class="fas fa-moon"></i>
</button>
<button class="btn-base control-btn flex-center-both hover-lift" id="fullscreen-toggle" title="Pantalla completa">
<i class="fas fa-expand"></i>
</button>
<button class="btn-base control-btn flex-center-both hover-lift" id="settings-toggle" title="Configuración">
<i class="fas fa-gear"></i>
</button>
</div>
</div>
</nav>
<!-- Contenedor principal -->
<div class="main-container">
<!-- Contenedor del mapa -->
<div class="map-container">
<div id="map"></div>
</div>
<!-- Panel lateral (plegable) -->
<div class="side-panel" id="side-panel">
<div class="panel-toggle" id="panel-toggle">
<i class="fas fa-chevron-left"></i>
</div>
<div class="panel-content">
<!-- Leyenda de servicios -->
<div class="panel-section">
<div class="section-header flex-center">
<i class="fas fa-palette"></i>
<h3>Tipos de Servicio</h3>
</div>
<div class="service-legend">
<div class="service-item">
<div class="service-color protocol-adb"></div>
<span>ADB</span>
</div>
<div class="service-item">
<div class="service-color protocol-chargen"></div>
<span>CHARGEN</span>
</div>
<div class="service-item">
<div class="service-color protocol-dhcp"></div>
<span>DHCP</span>
</div>
<div class="service-item">
<div class="service-color protocol-dicom"></div>
<span>DICOM</span>
</div>
<div class="service-item">
<div class="service-color protocol-dns"></div>
<span>DNS</span>
</div>
<div class="service-item">
<div class="service-color protocol-elasticsearch"></div>
<span>ELASTICSEARCH</span>
</div>
<div class="service-item">
<div class="service-color protocol-email"></div>
<span>EMAIL</span>
</div>
<div class="service-item">
<div class="service-color protocol-ftp"></div>
<span>FTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-ftp-data"></div>
<span>FTP-DATA</span>
</div>
<div class="service-item">
<div class="service-color protocol-hl7"></div>
<span>HL7</span>
</div>
<div class="service-item">
<div class="service-color protocol-http"></div>
<span>HTTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-https"></div>
<span>HTTPS</span>
</div>
<div class="service-item">
<div class="service-color protocol-iec104"></div>
<span>IEC104</span>
</div>
<div class="service-item">
<div class="service-color protocol-imap"></div>
<span>IMAP</span>
</div>
<div class="service-item">
<div class="service-color protocol-imaps"></div>
<span>IMAPS</span>
</div>
<div class="service-item">
<div class="service-color protocol-industrial"></div>
<span>INDUSTRIAL</span>
</div>
<div class="service-item">
<div class="service-color protocol-ipp"></div>
<span>IPP</span>
</div>
<div class="service-item">
<div class="service-color protocol-ipmi"></div>
<span>IPMI</span>
</div>
<div class="service-item">
<div class="service-color protocol-ipsec"></div>
<span>IPSEC</span>
</div>
<div class="service-item">
<div class="service-color protocol-irc"></div>
<span>IRC</span>
</div>
<div class="service-item">
<div class="service-color protocol-jetdirect"></div>
<span>JETDIRECT</span>
</div>
<div class="service-item">
<div class="service-color protocol-ldap"></div>
<span>LDAP</span>
</div>
<div class="service-item">
<div class="service-color protocol-memcached"></div>
<span>MEMCACHED</span>
</div>
<div class="service-item">
<div class="service-color protocol-mongodb"></div>
<span>MONGODB</span>
</div>
<div class="service-item">
<div class="service-color protocol-mqtt"></div>
<span>MQTT</span>
</div>
<div class="service-item">
<div class="service-color protocol-mysql"></div>
<span>MYSQL</span>
</div>
<div class="service-item">
<div class="service-color protocol-nfs"></div>
<span>NFS</span>
</div>
<div class="service-item">
<div class="service-color protocol-ntp"></div>
<span>NTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-oracle"></div>
<span>ORACLE</span>
</div>
<div class="service-item">
<div class="service-color protocol-pop3"></div>
<span>POP3</span>
</div>
<div class="service-item">
<div class="service-color protocol-pop3s"></div>
<span>POP3S</span>
</div>
<div class="service-item">
<div class="service-color protocol-postgresql"></div>
<span>POSTGRESQL</span>
</div>
<div class="service-item">
<div class="service-color protocol-pptp"></div>
<span>PPTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-rdp"></div>
<span>RDP</span>
</div>
<div class="service-item">
<div class="service-color protocol-redis"></div>
<span>REDIS</span>
</div>
<div class="service-item">
<div class="service-color protocol-rpc"></div>
<span>RPC</span>
</div>
<div class="service-item">
<div class="service-color protocol-scada"></div>
<span>SCADA</span>
</div>
<div class="service-item">
<div class="service-color protocol-sip"></div>
<span>SIP</span>
</div>
<div class="service-item">
<div class="service-color protocol-smb"></div>
<span>SMB</span>
</div>
<div class="service-item">
<div class="service-color protocol-smtp"></div>
<span>SMTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-smtps"></div>
<span>SMTPS</span>
</div>
<div class="service-item">
<div class="service-color protocol-snmp"></div>
<span>SNMP</span>
</div>
<div class="service-item">
<div class="service-color protocol-socks"></div>
<span>SOCKS</span>
</div>
<div class="service-item">
<div class="service-color protocol-sql"></div>
<span>SQL</span>
</div>
<div class="service-item">
<div class="service-color protocol-ssdp"></div>
<span>SSDP</span>
</div>
<div class="service-item">
<div class="service-color protocol-ssh"></div>
<span>SSH</span>
</div>
<div class="service-item">
<div class="service-color protocol-telnet"></div>
<span>TELNET</span>
</div>
<div class="service-item">
<div class="service-color protocol-tftp"></div>
<span>TFTP</span>
</div>
<div class="service-item">
<div class="service-color protocol-vnc"></div>
<span>VNC</span>
</div>
<div class="service-item">
<div class="service-color protocol-wins"></div>
<span>WINS</span>
</div>
<div class="service-item">
<div class="service-color protocol-other"></div>
<span>OTRO</span>
</div>
</div>
</div>
</div>
</div>
<!-- Panel inferior (Dashboard) -->
<div class="bottom-panel" id="bottom-panel">
<div class="panel-tabs">
<button class="tab-btn active" data-tab="live-feed">
<i class="fas fa-list-ol"></i>
Ataques en Vivo
</button>
<button class="tab-btn" data-tab="top-ips">
<i class="fas fa-bullseye"></i>
IPs más Activas
</button>
<button class="tab-btn" data-tab="countries">
<i class="fas fa-globe"></i>
Países Atacantes
</button>
<button class="tab-btn" data-tab="overview">
<i class="fas fa-chart-bar"></i>
Panel de Control
</button>
<div class="panel-resize" id="panel-resize">
<i class="fas fa-bars"></i>
</div>
</div>
<div class="tab-content">
<!-- Panel de Control -->
<div class="tab-pane" id="overview-tab">
<div class="dashboard-grid">
<div class="dashboard-card">
<div class="card-header flex-between">
<h4 class="flex-center"><i class="fas fa-bullseye"></i> Distribución de Ataques</h4>
</div>
<div class="card-content">
<canvas id="attack-distribution-chart"></canvas>
</div>
</div>
<div class="dashboard-card">
<div class="card-header flex-between">
<h4 class="flex-center"><i class="fas fa-clock"></i> Línea Temporal de Actividad</h4>
<div class="time-range-selector">
<select id="timeline-interval" class="timeline-dropdown">
<option value="1m">Último 1 Minuto</option>
<option value="1h">Última 1 Hora</option>
<option value="24h" selected>Últimas 24 Horas</option>
</select>
</div>
</div>
<div class="card-content">
<canvas id="timeline-chart"></canvas>
</div>
</div>
<div class="dashboard-card">
<div class="card-header">
<h4><i class="fas fa-network-wired"></i> Desglose por Protocolo</h4>
</div>
<div class="card-content">
<canvas id="protocol-chart"></canvas>
</div>
</div>
<div class="dashboard-card">
<div class="card-header">
<h4><i class="fas fa-server"></i> Rendimiento del Honeypot</h4>
</div>
<div class="card-content">
<canvas id="honeypot-chart"></canvas>
</div>
</div>
<div class="dashboard-card">
<div class="card-header">
<h4><i class="fas fa-temperature-half"></i> Mapa de Calor de Amenazas</h4>
</div>
<div class="card-content">
<div id="threat-heatmap"></div>
</div>
</div>
</div>
</div>
<!-- Pestaña IPs más Activas -->
<div class="tab-pane" id="top-ips-tab">
<div class="table-wrapper">
<table class="data-table" id="ip-table">
<thead>
<tr>
<th>Posición</th>
<th>Ataques</th>
<th>IP Origen</th>
<th>Reputación</th>
<th>Bandera</th>
<th>País</th>
<th>Último Protocolo</th>
<th>Última Vez Visto</th>
</tr>
</thead>
<tbody id='ip-tracking'>
<!-- Contenido dinámico -->
</tbody>
</table>
</div>
</div>
<!-- Pestaña Países Atacantes -->
<div class="tab-pane" id="countries-tab">
<div class="table-wrapper">
<table class="data-table" id="country-table">
<thead>
<tr>
<th>Posición</th>
<th>Ataques</th>
<th>Bandera</th>
<th>País</th>
<th>Protocolo Principal</th>
<th>IPs Únicas</th>
<th>Última IP Vista</th>
<th>Última Vez</th>
</tr>
</thead>
<tbody id='country-tracking'>
<!-- Contenido dinámico -->
</tbody>
</table>
</div>
</div>
<!-- Pestaña Ataques en Vivo -->
<div class="tab-pane" id="live-feed-tab">
<div class="table-wrapper">
<table class="data-table" id="live-attacks-table">
<thead>
<tr>
<th>Hora</th>
<th>IP Origen</th>
<th>Reputación</th>
<th>Bandera</th>
<th>País</th>
<th>Honeypot</th>
<th>Protocolo</th>
<th>Puerto</th>
<th>Hostname T-Pot</th>
</tr>
</thead>
<tbody id='attack-tracking'>
<!-- Contenido dinámico -->
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Modal de Configuración -->
<div class="modal" id="settings-modal">
<div class="modal-content">
<div class="modal-header flex-between">
<h3 class="flex-center"><i class="fas fa-cog"></i> Configuración</h3>
<button class="modal-close flex-center-both" id="settings-close">
<i class="fas fa-times"></i>
</button>
</div>
<div class="modal-body">
<div class="settings-section">
<h4 class="flex-center"><i class="fas fa-volume-up"></i> Alertas de Audio</h4>
<div class="setting-item">
<label class="setting-label">
<input type="checkbox" id="sound-alerts">
<div class="setting-content">
<span class="setting-title">Activar alertas de sonido</span>
<span class="setting-description">Habilitar notificaciones de audio para nuevos ataques</span>
</div>
</label>
</div>
<div class="setting-item" id="sound-options">
<div class="setting-content">
<span class="setting-title">Sonido de alerta</span>
<select id="alert-sound" class="setting-select">
<option value="beep">Pitido Digital</option>
<option value="notification">Campanilla de Notificación</option>
<option value="alert">Alerta de Seguridad</option>
<option value="retro_videogame">Videojuego Retro</option>
</select>
</div>
</div>
</div>
<div class="settings-section">
<h4 class="flex-center"><i class="fas fa-database"></i> Gestión de Datos</h4>
<div class="setting-item">
<div class="setting-content">
<span class="setting-title">Almacenamiento en Caché</span>
<span class="setting-description">Borrar los datos de ataques en caché y reiniciar los marcadores del mapa</span>
<button class="btn-base btn-warning hover-lift mt-2" id="clear-cache">
<i class="fas fa-trash-alt"></i> Limpiar Caché
</button>
</div>
</div>
</div>
</div>
<div class="modal-footer flex-between">
<button class="btn-base btn-secondary hover-lift" id="reset-settings">
<i class="fas fa-undo"></i> Restablecer valores
</button>
<button class="btn-base btn-primary hover-lift" id="save-settings">
<i class="fas fa-save"></i> Guardar cambios
</button>
</div>
</div>
</div>
<!-- Banner de aviso legal y privacidad -->
<div id="disclaimer-banner">
<div class="disclaimer-text" style="display:flex; align-items:center; gap:10px; flex:1; flex-wrap:wrap;">
<i class="fas fa-shield-halved" style="color:#6366f1; font-size:1.1rem; flex-shrink:0;"></i>
<span>
<strong>Servicio público europeo.</strong>
Este mapa muestra ataques detectados por señuelos de ciberseguridad (honeypots).
<strong>No se registran ni almacenan datos personales de ningún tipo.</strong>
Todos los datos son agregados y anónimos. Hecho en Europa &#127466;&#127482; con fines de investigación y divulgación.
&mdash; Servicio ofrecido por <a href="https://cloudhost.es" target="_blank" rel="noopener noreferrer" style="color:#a5b4fc; text-decoration:none;">Cloud Host</a>
</span>
</div>
<button id="disclaimer-close-btn">Entendido</button>
</div>
<!-- Pie de página permanente -->
<div id="site-footer">
Servicio ofrecido por <a href="https://cloudhost.es" target="_blank" rel="noopener noreferrer">Cloud Host</a>
</div>
<script src="static/cache-bridge.js" defer integrity="sha384-mMltIbf7JoxVuM6ZaB7TYkrLmY2njkbSTL9VvYqNKtmct/C2X1/JvKr8FeYHU0I+"></script>
<script src="static/map.js" defer integrity="sha384-2qT3tHtMdXU7HVX5lsXUrVs/of8RMbZKLzlajAkUSFHOQtHBOR/e8klblY+r89DE"></script>
<script src="static/dashboard.js" defer integrity="sha384-G3w6UiVOgfx+CP0Otu961qJu1kfOfCLHDO4rtaWMPxem4VHwdL1SPSA0jDDWqRKF"></script>
<script>
window.addEventListener('load', function() {
var banner = document.getElementById('disclaimer-banner');
var footer = document.getElementById('site-footer');
var closeBtn = document.getElementById('disclaimer-close-btn');
// Adjust bottom panel margin for banner
function adjustLayout() {
var bottomPanel = document.getElementById('bottom-panel');
if (bottomPanel) {
if (banner && banner.style.display !== 'none') {
bottomPanel.style.marginBottom = banner.offsetHeight + 'px';
} else {
bottomPanel.style.marginBottom = '0';
}
}
}
adjustLayout();
window.addEventListener('resize', adjustLayout);
closeBtn.addEventListener('click', function() {
banner.style.display = 'none';
footer.style.display = 'block';
adjustLayout();
});
});
</script>
</body>
</html>