From ae4c85eb0bb0e644763f79d2f5670a54ad842a8c Mon Sep 17 00:00:00 2001 From: edai-dev Date: Sat, 15 Aug 2026 14:13:13 +0700 Subject: [PATCH 1/2] add Node.js host support --- host.js | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 host.js diff --git a/host.js b/host.js new file mode 100644 index 0000000..5e7a940 --- /dev/null +++ b/host.js @@ -0,0 +1,220 @@ +const https = require('https'); +const fs = require('fs'); +const path = require('path'); +const url = require('url'); +const os = require('os'); + +// Configuration +const DEFAULT_PORT = 443; +const HOST = process.env.HOST || '0.0.0.0'; + +// Parse command line arguments for port (e.g. node host.js 8443 or node host.js -p 8443) +function getPort() { + const args = process.argv.slice(2); + for (let i = 0; i < args.length; i++) { + if (args[i] === '--port' || args[i] === '-p') { + const p = parseInt(args[i + 1], 10); + if (!isNaN(p)) return p; + } + const p = parseInt(args[i], 10); + if (!isNaN(p)) return p; + } + return parseInt(process.env.PORT, 10) || DEFAULT_PORT; +} + +const PORT = getPort(); +const CERT_FILE = path.join(__dirname, 'localhost.pem'); + +// MIME types dictionary for WebKit exploit hosting +const MIME_TYPES = { + '.html': 'text/html; charset=utf-8', + '.htm': 'text/html; charset=utf-8', + '.js': 'application/javascript; charset=utf-8', + '.mjs': 'application/javascript; charset=utf-8', + '.css': 'text/css; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.bin': 'application/octet-stream', + '.manifest': 'text/cache-manifest; charset=utf-8', + '.appcache': 'text/cache-manifest; charset=utf-8', + '.jpg': 'image/jpeg', + '.jpeg': 'image/jpeg', + '.png': 'image/png', + '.gif': 'image/gif', + '.svg': 'image/svg+xml', + '.ico': 'image/x-icon', + '.wasm': 'application/wasm', + '.woff': 'font/woff', + '.woff2': 'font/woff2', + '.ttf': 'font/ttf', + '.otf': 'font/otf', + '.txt': 'text/plain; charset=utf-8', + '.xml': 'application/xml; charset=utf-8' +}; + +// Check SSL certificate +if (!fs.existsSync(CERT_FILE)) { + console.error(`[ERROR] SSL certificate file not found: ${CERT_FILE}`); + process.exit(1); +} + +let sslOptions; +try { + const pem = fs.readFileSync(CERT_FILE); + sslOptions = { + key: pem, + cert: pem + }; +} catch (err) { + console.error(`[ERROR] Failed to read certificate: ${err.message}`); + process.exit(1); +} + +// Helper to find existing file path (resolving between public folder and root) +function resolveFilePath(requestUrl) { + const parsedUrl = url.parse(requestUrl); + let pathname = decodeURIComponent(parsedUrl.pathname || '/'); + + // Prevent path traversal attacks + const safePath = path.normalize(pathname).replace(/^(\.\.[\/\\])+/, ''); + + const searchRoots = [ + path.join(__dirname, 'public'), + __dirname + ]; + + if (safePath === '/' || safePath === '\\') { + for (const root of searchRoots) { + const indexPath = path.join(root, 'index.html'); + if (fs.existsSync(indexPath) && fs.statSync(indexPath).isFile()) { + return indexPath; + } + } + } + + for (const root of searchRoots) { + const candidatePath = path.join(root, safePath); + if (fs.existsSync(candidatePath)) { + const stat = fs.statSync(candidatePath); + if (stat.isFile()) { + return candidatePath; + } else if (stat.isDirectory()) { + const candidateIndex = path.join(candidatePath, 'index.html'); + if (fs.existsSync(candidateIndex) && fs.statSync(candidateIndex).isFile()) { + return candidateIndex; + } + } + } + } + + return null; +} + +// Request handler +const server = https.createServer(sslOptions, (req, res) => { + const start = Date.now(); + const filePath = resolveFilePath(req.url); + + // Set CORS headers + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, HEAD, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', '*'); + + if (req.method === 'OPTIONS') { + res.writeHead(204); + res.end(); + return; + } + + if (req.method !== 'GET' && req.method !== 'HEAD') { + res.writeHead(405, { 'Content-Type': 'text/plain' }); + res.end('Method Not Allowed'); + return; + } + + if (!filePath) { + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 Not Found'); + console.log(`[404] ${req.method} ${req.url} - ${Date.now() - start}ms`); + return; + } + + const ext = path.extname(filePath).toLowerCase(); + const contentType = MIME_TYPES[ext] || 'application/octet-stream'; + + fs.stat(filePath, (err, stats) => { + if (err) { + res.writeHead(500, { 'Content-Type': 'text/plain' }); + res.end('500 Internal Server Error'); + console.error(`[500] ${req.method} ${req.url} - Error: ${err.message}`); + return; + } + + res.writeHead(200, { + 'Content-Type': contentType, + 'Content-Length': stats.size, + 'Cache-Control': 'no-cache' + }); + + if (req.method === 'HEAD') { + res.end(); + console.log(`[200] HEAD ${req.url} (${stats.size} bytes) - ${Date.now() - start}ms`); + return; + } + + const stream = fs.createReadStream(filePath); + stream.pipe(res); + stream.on('error', (streamErr) => { + console.error(`[STREAM ERROR] ${req.url} - ${streamErr.message}`); + }); + res.on('finish', () => { + console.log(`[200] GET ${req.url} -> ${path.relative(__dirname, filePath)} (${stats.size} bytes) - ${Date.now() - start}ms`); + }); + }); +}); + +// Display network interfaces +function getLocalIPs() { + const interfaces = os.networkInterfaces(); + const addresses = []; + for (const name of Object.keys(interfaces)) { + for (const net of interfaces[name]) { + if (net.family === 'IPv4' || net.family === 4) { + addresses.push({ name, address: net.address, internal: net.internal }); + } + } + } + return addresses; +} + +// Error handling on server listen +server.on('error', (err) => { + if (err.code === 'EACCES') { + console.error(`\n[ERROR] Permission denied to bind to port ${PORT}.`); + console.error(`Ports below 1024 often require administrator / root privileges.`); + console.error(`Try running as Administrator, or specify another port: node host.js 8443\n`); + } else if (err.code === 'EADDRINUSE') { + console.error(`\n[ERROR] Port ${PORT} is already in use by another application.\n`); + } else { + console.error(`\n[ERROR] Server error: ${err.message}\n`); + } + process.exit(1); +}); + +// Start listening +server.listen(PORT, HOST, () => { + console.log('='.repeat(55)); + console.log(' CSSFontFace Exploit Host Server (Node.js)'); + console.log('='.repeat(55)); + console.log(`HTTPS server listening on port ${PORT}...`); + console.log('\nAvailable URLs for PS4 Web Browser / User\'s Guide:'); + + const ips = getLocalIPs(); + const portSuffix = PORT === 443 ? '' : `:${PORT}`; + + ips.forEach(ip => { + console.log(` - [${ip.name}] https://${ip.address}${portSuffix}/`); + }); + + console.log('='.repeat(55)); + console.log('Press Ctrl+C to stop the server.\n'); +}); From 4427f54714ee779af4ac0e3ca8267081f6217433 Mon Sep 17 00:00:00 2001 From: edai-dev Date: Sat, 15 Aug 2026 14:13:25 +0700 Subject: [PATCH 2/2] add configurable auto-JB delay and modernize the user interface --- .gitignore | 1 + public/includes/script.js | 52 ++- public/includes/style.css | 737 ++++++++++++++++++++++++++++++++++---- public/index.html | 138 +++++-- public/src/misc.js | 26 +- 5 files changed, 842 insertions(+), 112 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c8a3e5 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +public/src/payload.bin \ No newline at end of file diff --git a/public/includes/script.js b/public/includes/script.js index a5a84f9..c75a440 100644 --- a/public/includes/script.js +++ b/public/includes/script.js @@ -1,11 +1,18 @@ -let timerId = null; +let timerId = null; const label = document.getElementById('autoJbLabel'); const checkbox = document.getElementById('autoJbInput'); +const delayInput = document.getElementById('autoJbDelayInput'); const jeilbrekBtn = document.getElementById('jeilbrek'); const UAElement = document.getElementById("UA"); +// Auto Jailbreak Config +const autoJbDefault = true; const storedAutoJb = localStorage.getItem("autoJb"); -let autoJbValue = storedAutoJb !== null ? storedAutoJb === "true" : true; +let autoJbValue = storedAutoJb !== null ? storedAutoJb === "true" : autoJbDefault; + +const storedAutoJbDelay = localStorage.getItem("autoJbDelay"); +let autoJbDelay = storedAutoJbDelay !== null ? parseInt(storedAutoJbDelay, 10) : 5; +if (isNaN(autoJbDelay) || autoJbDelay < 1) autoJbDelay = 5; // choose one of kernel exploits var exploitChain = localStorage.getItem("exploitChain") || "lapse"; @@ -21,13 +28,22 @@ kexForm.addEventListener("change", function (event) { exploitChain = event.target.value; }); +const reloadBtn = document.getElementById('reloadBtn'); + // jailbreak execution -jeilbrekBtn.addEventListener("click", function (e){ +jeilbrekBtn.addEventListener("click", function (e) { jeilbrekBtn.disabled = true; stopInterval(); doJb(); }); +if (reloadBtn) { + reloadBtn.addEventListener("click", function () { + stopInterval(); + window.location.reload(); + }); +} + checkbox.addEventListener('change', function () { localStorage.setItem("autoJb", checkbox.checked); if (checkbox.checked == true && jeilbrekBtn.disabled == false) { @@ -38,7 +54,22 @@ checkbox.addEventListener('change', function () { stopInterval(); }); -function stopInterval(){ +if (delayInput) { + delayInput.value = autoJbDelay; + delayInput.addEventListener("change", function () { + let val = parseInt(delayInput.value, 10); + if (isNaN(val) || val < 1) val = 1; + if (val > 99) val = 99; + delayInput.value = val; + autoJbDelay = val; + localStorage.setItem("autoJbDelay", val); + if (checkbox.checked && jeilbrekBtn.disabled === false) { + jailbreakCountdown(); + } + }); +} + +function stopInterval() { if (timerId !== null) { clearInterval(timerId); timerId = null; @@ -46,17 +77,17 @@ function stopInterval(){ label.textContent = "Auto Jailbreak"; } -function jailbreakCountdown() { +function jailbreakCountdown() { stopInterval(); - let countdown = 5; - label.textContent = `Auto Jailbreaking in: ${countdown}`; + let countdown = autoJbDelay; + label.textContent = `Auto Jailbreaking in: ${countdown}s`; timerId = setInterval(() => { countdown--; - label.textContent = `Auto Jailbreaking in: ${countdown}`; + label.textContent = `Auto Jailbreaking in: ${countdown}s`; if (countdown < 0) { - jeilbrekBtn.disabled = true; + jeilbrekBtn.disabled = true; clearInterval(timerId); timerId = null; label.textContent = 'Executing'; @@ -81,7 +112,7 @@ function displayCacheProgress() { }, 3000); } -document.addEventListener("DOMContentLoaded", function() { +document.addEventListener("DOMContentLoaded", function () { // Cache handling if (window.applicationCache) { window.applicationCache.addEventListener("progress", cacheProgress, false); @@ -98,6 +129,7 @@ document.addEventListener("DOMContentLoaded", function() { // apply autojb localStorage value checkbox.checked = autoJbValue; + if (delayInput) delayInput.value = autoJbDelay; if (autoJbValue) jailbreakCountdown(); }); \ No newline at end of file diff --git a/public/includes/style.css b/public/includes/style.css index 9b337f5..c513570 100644 --- a/public/includes/style.css +++ b/public/includes/style.css @@ -1,104 +1,701 @@ +/* ========================================================================== + CSSFontFace Exploit - Modern & Elegant Theme + ========================================================================== */ + +:root { + --bg-main: #0a0e17; + --bg-gradient: radial-gradient(circle at 50% 0%, #151d30 0%, #0a0e17 80%); + --card-bg: rgba(18, 26, 43, 0.7); + --card-border: rgba(255, 255, 255, 0.08); + --card-hover-border: rgba(59, 130, 246, 0.4); + + --primary: #3b82f6; + --primary-hover: #2563eb; + --primary-glow: rgba(59, 130, 246, 0.35); + + --accent-cyan: #06b6d4; + --accent-green: #10b981; + --accent-amber: #f59e0b; + --accent-red: #ef4444; + + --text-main: #f8fafc; + --text-muted: #94a3b8; + --text-dim: #64748b; + + --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; + --font-mono: "SF Mono", "Consolas", "Monaco", "Courier New", monospace; + + --radius-lg: 16px; + --radius-md: 12px; + --radius-sm: 8px; +} + +* { + box-sizing: border-box; + margin: 0; + padding: 0; +} + body { - background: #111111; - color: #dddddd; - margin: 0; - padding: 20px; - text-align: center; + background: var(--bg-main); + background-image: var(--bg-gradient); + color: var(--text-main); + font-family: var(--font-family); + min-height: 100vh; + padding: 24px 16px; + display: flex; + justify-content: center; + align-items: flex-start; + -webkit-font-smoothing: antialiased; +} + +.app-container { + width: 100%; + max-width: 1100px; + margin: 0 auto; + display: flex; + flex-direction: column; + gap: 24px; +} + +/* ========================================================================== + Header Section (Compact 1-2 Lines) + ========================================================================== */ + +.header { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + padding: 4px 0; + text-align: center; +} + +@media (min-width: 860px) { + .header { + flex-direction: row; + justify-content: space-between; + align-items: center; + text-align: left; + } +} + +.header-main { + display: inline-flex; + align-items: center; + flex-wrap: wrap; + gap: 12px; +} + +.title { + font-size: 24px; + font-weight: 800; + letter-spacing: -0.5px; + background: linear-gradient(135deg, #ffffff 30%, #93c5fd 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + margin: 0; +} + +.badge { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 4px 10px; + background: rgba(59, 130, 246, 0.12); + border: 1px solid rgba(59, 130, 246, 0.25); + border-radius: 9999px; + font-size: 11px; + font-weight: 600; + color: #93c5fd; + letter-spacing: 0.5px; + text-transform: uppercase; +} + +.pulse-dot { + width: 7px; + height: 7px; + background: #3b82f6; + border-radius: 50%; + box-shadow: 0 0 8px #3b82f6; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { transform: scale(0.95); opacity: 0.8; } + 50% { transform: scale(1.3); opacity: 1; box-shadow: 0 0 12px #3b82f6; } + 100% { transform: scale(0.95); opacity: 0.8; } +} + +.ua-card { + display: inline-flex; + align-items: center; + gap: 8px; + background: rgba(15, 23, 42, 0.6); + border: 1px solid var(--card-border); + padding: 6px 12px; + border-radius: var(--radius-md); + max-width: 100%; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25); +} + +.ua-icon { + font-size: 14px; +} + +h3#UA { + font-size: 12px; + color: var(--text-muted); + font-weight: 500; + margin: 0; + word-break: break-all; +} + +/* ========================================================================== + Control Section (Cards) + ========================================================================== */ + +.control-section { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} + +@media (max-width: 768px) { + .control-section { + grid-template-columns: 1fr; + } +} + +.card { + background: var(--card-bg); + border: 1px solid var(--card-border); + border-radius: var(--radius-lg); + padding: 20px; + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + display: flex; + flex-direction: column; + gap: 16px; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.card:hover { + border-color: rgba(255, 255, 255, 0.15); +} + +.card-header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: 8px; + border-bottom: 1px solid rgba(255, 255, 255, 0.05); +} + +.card-title { + font-size: 15px; + font-weight: 700; + color: #e2e8f0; + letter-spacing: 0.2px; +} + +.card-badge { + font-size: 11px; + padding: 3px 8px; + background: rgba(255, 255, 255, 0.06); + border-radius: 6px; + color: var(--text-dim); + text-transform: uppercase; + font-weight: 600; +} + +/* Kernel Options Radio Cards */ +.kernel-options { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; +} + +.radio-card { + position: relative; + display: flex; + align-items: center; + padding: 14px; + background: rgba(10, 15, 26, 0.6); + border: 1px solid var(--card-border); + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s ease; + user-select: none; +} + +.radio-card:hover { + background: rgba(20, 30, 50, 0.7); + border-color: rgba(59, 130, 246, 0.3); +} + +.radio-card input[type="radio"] { + position: absolute; + opacity: 0; + width: 0; + height: 0; +} + +.radio-custom { + width: 18px; + height: 18px; + min-width: 18px; + border: 2px solid var(--text-dim); + border-radius: 50%; + margin-right: 12px; + position: relative; + transition: all 0.2s ease; +} + +.radio-card input[type="radio"]:checked + .radio-custom { + border-color: var(--primary); + background: var(--primary); + box-shadow: 0 0 10px var(--primary-glow); +} + +.radio-card input[type="radio"]:checked + .radio-custom::after { + content: ""; + position: absolute; + top: 4px; + left: 4px; + width: 6px; + height: 6px; + border-radius: 50%; + background: #ffffff; +} + +.radio-info { + display: flex; + flex-direction: column; + gap: 2px; +} + +.radio-title { + font-size: 14px; + font-weight: 700; + color: var(--text-main); +} + +.radio-desc { + font-size: 11px; + color: var(--text-muted); +} + +/* Action Card & Controls */ +.action-body { + display: flex; + flex-direction: column; + gap: 16px; +} + +.btn-group { + display: grid; + grid-template-columns: 1fr auto; + gap: 10px; } -h1 { - color: #ffffff; - font-size: 28px; - margin: 10px 0 5px 0; +.primary-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + width: 100%; + padding: 14px 20px; + background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: var(--radius-md); + color: #ffffff; + font-size: 16px; + font-weight: 700; + letter-spacing: 0.3px; + cursor: pointer; + box-shadow: 0 6px 20px var(--primary-glow); + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); } -h3 { - color: #aaaaaa; - font-size: 14px; - font-weight: normal; - margin: 0 0 15px 0; +.primary-btn:hover:not(:disabled) { + background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%); + box-shadow: 0 8px 25px rgba(59, 130, 246, 0.5); + transform: translateY(-2px); } -hr { - border: 0; - border-top: 1px solid #333333; - margin: 15px auto; - width: 90%; +.primary-btn:active:not(:disabled) { + transform: translateY(0); + box-shadow: 0 3px 10px var(--primary-glow); } -.btn-container { - margin: 20px 0 30px 0; +.primary-btn:disabled { + background: #1e293b; + border-color: rgba(255, 255, 255, 0.05); + color: var(--text-dim); + cursor: not-allowed; + box-shadow: none; + transform: none; } -button { - background: #2563eb; - color: #ffffff; - border: none; - padding: 12px 35px; - font-size: 18px; - font-weight: bold; - cursor: pointer; +.secondary-btn { + display: flex; + align-items: center; + justify-content: center; + gap: 8px; + padding: 14px 20px; + background: rgba(30, 41, 59, 0.7); + border: 1px solid rgba(255, 255, 255, 0.12); + border-radius: var(--radius-md); + color: var(--text-main); + font-size: 15px; + font-weight: 700; + letter-spacing: 0.3px; + cursor: pointer; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2); + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + user-select: none; } -button:disabled, button:hover:disabled { - background: #0b2253; - cursor: default; +.secondary-btn:hover { + background: rgba(51, 65, 85, 0.9); + border-color: rgba(255, 255, 255, 0.25); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.3); + transform: translateY(-2px); } -button:hover { - background: #1d4ed8; +.secondary-btn:active { + transform: translateY(0); } +.btn-icon { + font-size: 18px; +} + +/* Auto Jailbreak Switch & Delay Field */ +.autoJb { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 14px; + background: rgba(10, 15, 26, 0.5); + border: 1px solid var(--card-border); + border-radius: var(--radius-md); + flex-wrap: wrap; +} + +.switch-wrap { + display: flex; + align-items: center; + gap: 12px; + cursor: pointer; + user-select: none; +} + +.switch { + position: relative; + display: inline-block; + width: 44px; + height: 24px; + min-width: 44px; +} + +.switch input { + opacity: 0; + width: 0; + height: 0; + margin: 0 !important; +} + +.slider { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: #334155; + border-radius: 24px; + transition: 0.25s; +} + +.slider::before { + position: absolute; + content: ""; + height: 18px; + width: 18px; + left: 3px; + bottom: 3px; + background-color: #ffffff; + border-radius: 50%; + transition: 0.25s; + box-shadow: 0 2px 4px rgba(0,0,0,0.4); +} + +.switch input:checked + .slider { + background-color: var(--accent-green); + box-shadow: 0 0 10px rgba(16, 185, 129, 0.4); +} + +.switch input:checked + .slider::before { + transform: translateX(20px); +} + +.switch-label { + font-size: 14px; + font-weight: 600; + color: var(--text-muted); + transition: color 0.2s ease; +} + +.switch input:checked ~ .switch-label { + color: var(--text-main); +} + +.delay-wrap { + display: inline-flex; + align-items: center; + gap: 6px; + background: rgba(15, 23, 42, 0.8); + padding: 4px 10px; + border-radius: var(--radius-sm); + border: 1px solid var(--card-border); +} + +.delay-label { + font-size: 12px; + font-weight: 600; + color: var(--text-dim); +} + +.delay-input { + width: 48px; + padding: 3px 6px; + background: rgba(0, 0, 0, 0.5); + border: 1px solid rgba(255, 255, 255, 0.15); + border-radius: 4px; + color: #60a5fa; + font-family: var(--font-mono); + font-size: 13px; + font-weight: 700; + text-align: center; + outline: none; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} + +.delay-input:focus { + border-color: var(--primary); + box-shadow: 0 0 6px var(--primary-glow); +} + +.delay-unit { + font-size: 12px; + color: var(--text-muted); + font-weight: 600; +} + +/* ========================================================================== + Main Output & Media Layout + ========================================================================== */ + .main-layout { - width: 96%; - margin: 0 auto; + display: grid; + grid-template-columns: 280px 1fr; + gap: 20px; + align-items: stretch; +} + +@media (max-width: 860px) { + .main-layout { + grid-template-columns: 1fr; + } } -.media-box { - float: left; - width: 25%; - text-align: center; +/* Mascot Media Box */ +.media-card { + height: 100%; + background: var(--card-bg); + border: 1px solid var(--card-border); + border-radius: var(--radius-lg); + padding: 16px; + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; + gap: 12px; + box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.4); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); } -.media-box img { - width: 90%; - height: auto; - border: 1px solid #222222; +.media-img-wrap { + width: 100%; + display: flex; + justify-content: center; + align-items: center; + border-radius: var(--radius-md); + overflow: hidden; + border: 1px solid rgba(255, 255, 255, 0.08); + background: #000; +} + +.media-img-wrap img { + width: 100%; + height: auto; + max-height: 220px; + object-fit: cover; + display: block; + transition: transform 0.3s ease; +} + +.media-card:hover .media-img-wrap img { + transform: scale(1.03); +} + +.media-footer { + display: flex; + align-items: center; + gap: 8px; + padding: 6px 12px; + background: rgba(10, 15, 26, 0.6); + border-radius: 9999px; + border: 1px solid var(--card-border); +} + +.status-indicator { + width: 8px; + height: 8px; + border-radius: 50%; + background: var(--accent-green); + box-shadow: 0 0 6px var(--accent-green); +} + +.media-text { + font-size: 12px; + font-weight: 600; + color: var(--text-muted); +} + +/* Terminal Console Box */ +.terminal-box { + background: #080c14; + border: 1px solid rgba(255, 255, 255, 0.1); + border-radius: var(--radius-lg); + overflow: hidden; + display: flex; + flex-direction: column; + box-shadow: 0 12px 30px rgba(0, 0, 0, 0.6); +} + +.terminal-header { + background: #0f1523; + padding: 10px 16px; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1px solid rgba(255, 255, 255, 0.07); +} + +.terminal-controls { + display: flex; + align-items: center; + gap: 6px; +} + +.t-dot { + width: 11px; + height: 11px; + border-radius: 50%; + display: inline-block; +} + +.t-dot.red { background: #ef4444; } +.t-dot.yellow { background: #f59e0b; } +.t-dot.green { background: #10b981; } + +.terminal-title { + font-size: 12px; + font-family: var(--font-mono); + color: var(--text-dim); + font-weight: 600; + letter-spacing: 0.5px; +} + +.terminal-tag { + font-size: 10px; + font-family: var(--font-mono); + padding: 2px 6px; + background: rgba(59, 130, 246, 0.15); + color: #60a5fa; + border-radius: 4px; + font-weight: 700; } #console { - float: right; - width: 70%; - background: #000000; - color: #00ff00; - font-size: 14px; - padding: 15px; - text-align: left; - height: 290px; - overflow-y: scroll; - word-wrap: break-word; - border: 1px solid #222222; + background: transparent; + color: #34d399; + font-family: var(--font-mono); + font-size: 13px; + line-height: 1.6; + padding: 16px; + text-align: left; + min-height: 240px; + max-height: 290px; + overflow-y: auto; + word-wrap: break-word; + white-space: pre-wrap; + border: none; +} + +/* Console Log Syntax Coloring */ +.log-error { + color: #ef4444 !important; + font-weight: 600; + text-shadow: 0 0 8px rgba(239, 68, 68, 0.4); + display: block; } -#kernel-options { - margin-bottom: 1rem; +.log-info { + color: #34d399; + display: block; } -input[type="radio"] { - -webkit-appearance: none; - appearance: none; - width: 1rem; - height: 1rem; - border: 2px solid #555; - border-radius: 50%; - background-color: #fff; - cursor: pointer; +.log-debug { + color: #38bdf8; + display: block; } -input[type="radio"]:checked { - background-color: #00ff00; +/* Custom Scrollbar for Terminal */ +#console::-webkit-scrollbar { + width: 8px; +} + +#console::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.2); +} + +#console::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.12); + border-radius: 4px; +} + +#console::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.25); +} + +/* ========================================================================== + Footer + ========================================================================== */ + +.footer { + text-align: center; + padding: 12px 0; + font-size: 12px; + color: var(--text-dim); } -.mt-2{ - margin-top: 2rem; +.footer strong { + color: var(--text-muted); } \ No newline at end of file diff --git a/public/index.html b/public/index.html index d375003..ea173db 100644 --- a/public/index.html +++ b/public/index.html @@ -7,39 +7,127 @@ +
+ +
+
+

CSSFontFace UAF Exploit

+
+ + WebKit • PS4 6.00 – 11.02 +
+
+
+ 🎮 +

Running on:

+
+
-

CSSFontFace UAF Exploit

-

Running on:

- -
- -
-
- - - - -
- -
- - -
-
+ +
+ +
+
+ Kernel Exploit Chain + Target Select +
+
+ + + +
+
+ + +
+
+ Execution Controls + Actions +
+ +
+
+ + +
-
-
- A cat staring at you -
+
+ -
Ready. Awaiting execution...
-  
+
+ + + s +
+
+
+
+
+ +
+ +
+
+
+ Exploit Mascot +
+ +
+
+ +
+
+
+ + + +
+ System Log • Live Exploit Terminal + TTY +
+
Ready. Awaiting execution...
+
+
+
+ + +
+

Research & Exploit by ufm42Nathan Fargo (@ntfargo) • Dr.Yenyen

+
- diff --git a/public/src/misc.js b/public/src/misc.js index 6c9fe8c..1e50813 100644 --- a/public/src/misc.js +++ b/public/src/misc.js @@ -3,26 +3,38 @@ const logger = { seq: 0, verbose: true, // enable for debug logs info(msg) { - this.log(`[+] ${msg}`); + this.log(`[+] ${msg}`, "info"); }, error(msg) { - this.log(`[-] ${msg}`); + this.log(`[-] ${msg}`, "error"); }, debug(msg) { if (this.verbose) { - this.log(`[*] ${msg}`); + this.log(`[*] ${msg}`, "debug"); } }, - log(msg) { + log(msg, type = "") { if (is_worker()) { - self.postMessage({ type: "log", value: `[${self.name}]${msg}` }); + self.postMessage({ type: "log", value: `[${self.name}]${msg}`, logType: type }); } else { if (this.console === undefined) { this.console = document.getElementById("console"); } - this.console.append(`${msg}\n`); - this.console.scrollTop = this.console.scrollHeight; + if (this.console) { + const span = document.createElement("span"); + const str = String(msg); + if (type === "error" || str.startsWith("[-]") || str.includes("[-]")) { + span.className = "log-error"; + } else if (type === "info" || str.startsWith("[+]")) { + span.className = "log-info"; + } else if (type === "debug" || str.startsWith("[*]")) { + span.className = "log-debug"; + } + span.textContent = `${str}\n`; + this.console.appendChild(span); + this.console.scrollTop = this.console.scrollHeight; + } const data = JSON.stringify({ seq: this.seq++,