Spaces:
Running
Running
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>XXoS - Network Stress Tester</title> | |
<script src="https://cdn.tailwindcss.com"></script> | |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
<style> | |
.glow { | |
text-shadow: 0 0 8px rgba(255, 59, 48, 0.8); | |
} | |
.terminal { | |
background-color: #111111; | |
font-family: 'Courier New', monospace; | |
} | |
.progress-bar { | |
animation: progress 2s ease-in-out infinite; | |
} | |
@keyframes progress { | |
0% { width: 0%; } | |
50% { width: 100%; } | |
100% { width: 0%; } | |
} | |
.modal { | |
transition: opacity 0.3s ease; | |
} | |
body { | |
background-color: #121212; | |
} | |
.whois-modal { | |
max-height: 70vh; | |
overflow-y: auto; | |
} | |
.attack-active { | |
animation: pulse 1.5s infinite; | |
} | |
@keyframes pulse { | |
0% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0.7); } | |
70% { box-shadow: 0 0 0 10px rgba(239, 68, 68, 0); } | |
100% { box-shadow: 0 0 0 0 rgba(239, 68, 68, 0); } | |
} | |
.neon-blue { | |
background-color: #00f2ff; | |
box-shadow: 0 0 10px #00f2ff; | |
} | |
.neon-green { | |
background-color: #00ff9d; | |
box-shadow: 0 0 10px #00ff9d; | |
} | |
.neon-purple { | |
background-color: #b400ff; | |
box-shadow: 0 0 10px #b400ff; | |
} | |
.neon-yellow { | |
background-color: #ffee00; | |
box-shadow: 0 0 10px #ffee00; | |
} | |
</style> | |
</head> | |
<body class="text-gray-200 min-h-screen"> | |
<!-- Settings Modal --> | |
<div id="settingsModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 opacity-0 pointer-events-none modal"> | |
<div class="bg-gray-700 rounded-xl p-6 w-full max-w-md shadow-2xl"> | |
<div class="flex justify-between items-center mb-4"> | |
<h2 class="text-xl font-bold"> | |
<i class="fas fa-cog mr-2 text-blue-500"></i>Settings | |
</h2> | |
<button id="closeSettings" class="text-gray-400 hover:text-white"> | |
<i class="fas fa-times"></i> | |
</button> | |
</div> | |
<div class="space-y-4"> | |
<div> | |
<label class="block text-sm font-medium mb-1">Request Timeout (ms)</label> | |
<input id="timeoutInput" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" value="5000"> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Max Threads</label> | |
<input id="maxThreadsInput" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" value="1000"> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Connection Retries</label> | |
<input id="retriesInput" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" value="3"> | |
</div> | |
<div class="pt-2"> | |
<div class="flex items-center mb-2"> | |
<input id="autoUpdateCheckbox" type="checkbox" class="mr-2" checked> | |
<label for="autoUpdateCheckbox">Auto-update proxy list</label> | |
</div> | |
<div class="flex items-center"> | |
<input id="verboseLogCheckbox" type="checkbox" class="mr-2"> | |
<label for="verboseLogCheckbox">Verbose logging</label> | |
</div> | |
</div> | |
<div class="pt-4"> | |
<button id="saveSettingsBtn" class="w-full bg-blue-600 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-lg transition"> | |
Save Settings | |
</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- WHOIS Modal --> | |
<div id="whoisModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 opacity-0 pointer-events-none modal"> | |
<div class="bg-gray-700 rounded-xl p-6 w-full max-w-2xl shadow-2xl whois-modal"> | |
<div class="flex justify-between items-center mb-4"> | |
<h2 class="text-xl font-bold"> | |
<i class="fas fa-globe mr-2 text-green-500"></i>WHOIS Lookup | |
</h2> | |
<button id="closeWhois" class="text-gray-400 hover:text-white"> | |
<i class="fas fa-times"></i> | |
</button> | |
</div> | |
<div id="whoisContent" class="font-mono text-sm bg-gray-800 p-4 rounded-lg overflow-x-auto"> | |
<div class="text-gray-400">Enter a domain or IP address and click search to view WHOIS data.</div> | |
</div> | |
</div> | |
</div> | |
<!-- Help Modal --> | |
<div id="helpModal" class="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50 opacity-0 pointer-events-none modal"> | |
<div class="bg-gray-700 rounded-xl p-6 w-full max-w-2xl shadow-2xl"> | |
<div class="flex justify-between items-center mb-4"> | |
<h2 class="text-xl font-bold"> | |
<i class="fas fa-question-circle mr-2 text-blue-500"></i>Help & Documentation | |
</h2> | |
<button id="closeHelp" class="text-gray-400 hover:text-white"> | |
<i class="fas fa-times"></i> | |
</button> | |
</div> | |
<div class="space-y-4"> | |
<div> | |
<h3 class="font-semibold text-lg mb-2">Getting Started</h3> | |
<p class="text-sm text-gray-300">1. Enter your target URL or IP address in the Target Configuration section</p> | |
<p class="text-sm text-gray-300">2. Configure the port, method, and threads as needed</p> | |
<p class="text-sm text-gray-300">3. Set the desired attack duration</p> | |
<p class="text-sm text-gray-300">4. Click "LAUNCH ATTACK" to begin</p> | |
</div> | |
<div> | |
<h3 class="font-semibold text-lg mb-2">Attack Methods</h3> | |
<div class="text-sm text-gray-300"> | |
<p><span class="font-semibold">GET:</span> Standard HTTP GET requests</p> | |
<p><span class="font-semibold">POST:</span> HTTP POST requests with random data</p> | |
<p><span class="font-semibold">TCP:</span> TCP connection flood</p> | |
<p><span class="font-semibold">UDP:</span> UDP packet flood</p> | |
<p><span class="font-semibold">SYN:</span> SYN packet flood</p> | |
<p><span class="font-semibold">XXoS:</span> Custom high-performance attack</p> | |
</div> | |
</div> | |
<div> | |
<h3 class="font-semibold text-lg mb-2">Disclaimer</h3> | |
<p class="text-sm text-red-400">This tool is for educational and authorized testing purposes only. Unauthorized use against networks you don't own is illegal.</p> | |
</div> | |
</div> | |
</div> | |
</div> | |
<div class="container mx-auto px-4 py-6 max-w-6xl"> | |
<header class="mb-6 text-center"> | |
<div class="flex flex-col items-center"> | |
<div class="flex items-center"> | |
<i class="fas fa-skull text-red-500 text-3xl mr-3"></i> | |
<h1 class="text-3xl font-bold glow">XXoS</h1> | |
</div> | |
<p class="text-xs text-gray-400 mt-1">BY AB' - NETWORK STRESS TESTER</p> | |
</div> | |
</header> | |
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4 mb-4"> | |
<!-- Target Section --> | |
<div class="bg-gray-700 rounded-xl p-4 shadow-lg col-span-2"> | |
<h2 class="text-lg font-semibold mb-3 flex items-center"> | |
<i class="fas fa-bullseye mr-2 text-red-500"></i> Target Configuration | |
</h2> | |
<div class="space-y-3"> | |
<div> | |
<label class="block text-sm font-medium mb-1">Target URL/IP</label> | |
<div class="flex"> | |
<input id="targetInput" type="text" class="flex-grow bg-gray-600 border border-gray-500 rounded-l-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" placeholder="https://example.com or 192.168.1.1"> | |
<button id="whoisBtn" class="bg-red-600 hover:bg-red-700 px-4 py-2 rounded-r-lg transition"> | |
<i class="fas fa-search"></i> | |
</button> | |
</div> | |
</div> | |
<div class="grid grid-cols-1 md:grid-cols-3 gap-3"> | |
<div> | |
<label class="block text-sm font-medium mb-1">Port</label> | |
<input id="portInput" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" value="80"> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Method</label> | |
<select id="methodSelect" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500"> | |
<option>GET</option> | |
<option>POST</option> | |
<option>TCP</option> | |
<option>UDP</option> | |
<option>SYN</option> | |
<option>XXoS</option> | |
</select> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Threads</label> | |
<input id="threadCount" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" value="1000"> | |
</div> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Duration (seconds)</label> | |
<input id="durationSlider" type="range" min="10" max="600" value="60" class="w-full h-2 bg-gray-600 rounded-lg appearance-none cursor-pointer"> | |
<div class="flex justify-between text-xs text-gray-400"> | |
<span>10s</span> | |
<span>60s</span> | |
<span>600s</span> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Stats Section --> | |
<div class="bg-gray-700 rounded-xl p-4 shadow-lg"> | |
<h2 class="text-lg font-semibold mb-3 flex items-center"> | |
<i class="fas fa-chart-bar mr-2 text-green-500"></i> Attack Statistics | |
</h2> | |
<div class="space-y-3"> | |
<div class="bg-gray-600 rounded-lg p-3"> | |
<div class="flex justify-between mb-1"> | |
<span class="text-sm">Requests Sent</span> | |
<span id="requestCount" class="font-mono">0</span> | |
</div> | |
<div class="w-full bg-gray-500 rounded-full h-2"> | |
<div id="requestBar" class="neon-blue h-2 rounded-full" style="width: 0%"></div> | |
</div> | |
</div> | |
<div class="bg-gray-600 rounded-lg p-3"> | |
<div class="flex justify-between mb-1"> | |
<span class="text-sm">Success Rate</span> | |
<span id="successRate" class="font-mono">0%</span> | |
</div> | |
<div class="w-full bg-gray-500 rounded-full h-2"> | |
<div id="successBar" class="neon-green h-2 rounded-full" style="width: 0%"></div> | |
</div> | |
</div> | |
<div class="bg-gray-600 rounded-lg p-3"> | |
<div class="flex justify-between mb-1"> | |
<span class="text-sm">Attack Duration</span> | |
<span id="attackTime" class="font-mono">00:00:00</span> | |
</div> | |
<div class="w-full bg-gray-500 rounded-full h-2"> | |
<div id="timeBar" class="neon-purple h-2 rounded-full" style="width: 0%"></div> | |
</div> | |
</div> | |
<div class="bg-gray-600 rounded-lg p-3"> | |
<div class="flex justify-between mb-1"> | |
<span class="text-sm">Threads Active</span> | |
<span id="activeThreads" class="font-mono">0/<span id="totalThreads">1000</span></span> | |
</div> | |
<div class="w-full bg-gray-500 rounded-full h-2"> | |
<div id="threadBar" class="neon-yellow h-2 rounded-full" style="width: 0%"></div> | |
</div> | |
</div> | |
<div class="pt-2"> | |
<button id="attackBtn" class="w-full bg-red-600 hover:bg-red-700 text-white font-bold py-2 px-4 rounded-lg transition flex items-center justify-center"> | |
<i class="fas fa-play mr-2"></i> LAUNCH ATTACK | |
</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
<!-- Terminal Output --> | |
<div class="bg-gray-700 rounded-xl p-4 shadow-lg mb-4"> | |
<div class="flex justify-between items-center mb-3"> | |
<h2 class="text-lg font-semibold flex items-center"> | |
<i class="fas fa-terminal mr-2 text-yellow-500"></i> Attack Console | |
</h2> | |
<div class="flex space-x-2"> | |
<button id="clearConsole" class="bg-gray-600 hover:bg-gray-500 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-trash mr-1"></i>Clear | |
</button> | |
<button id="exportLogs" class="bg-gray-600 hover:bg-gray-500 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-download mr-1"></i>Export | |
</button> | |
<button id="settingsBtn" class="bg-gray-600 hover:bg-gray-500 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-cog mr-1"></i>Settings | |
</button> | |
<button id="helpBtn" class="bg-gray-600 hover:bg-gray-500 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-question-circle mr-1"></i>Help | |
</button> | |
</div> | |
</div> | |
<div class="terminal rounded-lg p-3 h-48 overflow-y-auto mb-2"> | |
<div class="text-green-400 font-mono text-sm">> XXoS v1.0 initialized</div> | |
<div class="text-gray-400 font-mono text-sm">> Ready to configure attack parameters</div> | |
<div class="text-gray-400 font-mono text-sm">> No active attack session</div> | |
<div class="text-gray-400 font-mono text-sm">> System resources: 32% CPU, 45% RAM available</div> | |
<div class="text-gray-400 font-mono text-sm">> Proxy connections: 0 active</div> | |
<div id="consoleOutput" class="font-mono text-sm"></div> | |
</div> | |
</div> | |
<!-- Proxy Settings --> | |
<div class="bg-gray-700 rounded-xl p-4 shadow-lg"> | |
<h2 class="text-lg font-semibold mb-3 flex items-center"> | |
<i class="fas fa-server mr-2 text-purple-500"></i> Proxy Configuration | |
</h2> | |
<div class="grid grid-cols-1 md:grid-cols-2 gap-4"> | |
<div> | |
<label class="block text-sm font-medium mb-1">Proxy List</label> | |
<textarea id="proxyList" class="w-full h-28 bg-gray-600 border border-gray-500 rounded-lg px-4 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500 font-mono text-sm" placeholder="Enter one proxy per line (ip:port)"></textarea> | |
<div class="flex space-x-2 mt-2"> | |
<button id="importProxies" class="bg-blue-600 hover:bg-blue-700 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-file-import mr-1"></i>Import | |
</button> | |
<button id="testProxies" class="bg-gray-600 hover:bg-gray-500 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-sync mr-1"></i>Test | |
</button> | |
</div> | |
</div> | |
<div> | |
<label class="block text-sm font-medium mb-1">Proxy Settings</label> | |
<div class="space-y-2"> | |
<div class="flex items-center"> | |
<input type="checkbox" id="useProxy" class="mr-2" checked> | |
<label for="useProxy" class="text-sm">Use Proxy Rotation</label> | |
</div> | |
<div class="flex items-center"> | |
<input type="checkbox" id="autoProxy" class="mr-2"> | |
<label for="autoProxy" class="text-sm">Auto-fetch Proxies</label> | |
</div> | |
<div> | |
<label class="block text-xs font-medium mb-1">Timeout (ms)</label> | |
<input id="proxyTimeout" type="number" class="w-full bg-gray-600 border border-gray-500 rounded-lg px-3 py-1 focus:outline-none focus:ring-2 focus:ring-blue-500 text-sm" value="5000"> | |
</div> | |
<div class="pt-2"> | |
<button id="fetchProxies" class="w-full bg-green-600 hover:bg-green-700 px-3 py-1 rounded-lg transition text-sm"> | |
<i class="fas fa-cloud-download-alt mr-1"></i>Fetch Fresh Proxies | |
</button> | |
</div> | |
</div> | |
</div> | |
</div> | |
</div> | |
<footer class="mt-4 text-center text-gray-500 text-xs"> | |
<p>This tool is for educational and authorized testing purposes only.</p> | |
<p class="mt-1">Unauthorized use against networks you don't own is illegal.</p> | |
</footer> | |
</div> | |
<script> | |
// DOM Elements | |
const settingsBtn = document.getElementById('settingsBtn'); | |
const closeSettings = document.getElementById('closeSettings'); | |
const settingsModal = document.getElementById('settingsModal'); | |
const saveSettingsBtn = document.getElementById('saveSettingsBtn'); | |
const helpBtn = document.getElementById('helpBtn'); | |
const closeHelp = document.getElementById('closeHelp'); | |
const helpModal = document.getElementById('helpModal'); | |
const whoisBtn = document.getElementById('whoisBtn'); | |
const closeWhois = document.getElementById('closeWhois'); | |
const whoisModal = document.getElementById('whoisModal'); | |
const whoisContent = document.getElementById('whoisContent'); | |
const targetInput = document.getElementById('targetInput'); | |
const attackBtn = document.getElementById('attackBtn'); | |
const consoleOutput = document.getElementById('consoleOutput'); | |
const clearConsole = document.getElementById('clearConsole'); | |
const exportLogs = document.getElementById('exportLogs'); | |
const requestCountEl = document.getElementById('requestCount'); | |
const requestBar = document.getElementById('requestBar'); | |
const successRateEl = document.getElementById('successRate'); | |
const successBar = document.getElementById('successBar'); | |
const attackTimeEl = document.getElementById('attackTime'); | |
const timeBar = document.getElementById('timeBar'); | |
const activeThreadsEl = document.getElementById('activeThreads'); | |
const totalThreadsEl = document.getElementById('totalThreads'); | |
const threadBar = document.getElementById('threadBar'); | |
const threadCount = document.getElementById('threadCount'); | |
const durationSlider = document.getElementById('durationSlider'); | |
const portInput = document.getElementById('portInput'); | |
const methodSelect = document.getElementById('methodSelect'); | |
const proxyList = document.getElementById('proxyList'); | |
const useProxy = document.getElementById('useProxy'); | |
const autoProxy = document.getElementById('autoProxy'); | |
const proxyTimeout = document.getElementById('proxyTimeout'); | |
const importProxies = document.getElementById('importProxies'); | |
const testProxies = document.getElementById('testProxies'); | |
const fetchProxies = document.getElementById('fetchProxies'); | |
// State variables | |
let attackActive = false; | |
let requestCount = 0; | |
let successCount = 0; | |
let startTime = 0; | |
let attackInterval; | |
let statsInterval; | |
let attackDuration = parseInt(durationSlider.value); | |
let activeProxies = []; | |
let testedProxies = 0; | |
let workingProxies = 0; | |
let settings = { | |
timeout: 5000, | |
maxThreads: 1000, | |
retries: 3, | |
autoUpdate: true, | |
verboseLog: false | |
}; | |
// Initialize | |
document.addEventListener('DOMContentLoaded', () => { | |
logToConsole('> System initialized', 'text-green-400'); | |
logToConsole('> Ready for attack configuration', 'text-gray-400'); | |
updateSystemStats(); | |
}); | |
// Update system stats periodically | |
function updateSystemStats() { | |
const cpuUsage = Math.floor(Math.random() * 30) + 10; | |
const ramUsage = Math.floor(Math.random() * 40) + 20; | |
const proxyCount = useProxy.checked ? Math.floor(Math.random() * 50) : 0; | |
// Update console with system stats | |
const consoleLines = document.querySelectorAll('.terminal > div'); | |
if (consoleLines.length >= 5) { | |
consoleLines[3].textContent = `> System resources: ${cpuUsage}% CPU, ${100 - ramUsage}% RAM available`; | |
consoleLines[4].textContent = `> Proxy connections: ${proxyCount} active`; | |
} | |
setTimeout(updateSystemStats, 5000); | |
} | |
// Settings Modal | |
settingsBtn.addEventListener('click', () => toggleModal(settingsModal)); | |
closeSettings.addEventListener('click', () => toggleModal(settingsModal, false)); | |
// Help Modal | |
helpBtn.addEventListener('click', () => toggleModal(helpModal)); | |
closeHelp.addEventListener('click', () => toggleModal(helpModal, false)); | |
// WHOIS Modal | |
whoisBtn.addEventListener('click', performWhoisLookup); | |
closeWhois.addEventListener('click', () => toggleModal(whoisModal, false)); | |
// Proxy functionality | |
importProxies.addEventListener('click', importProxyList); | |
testProxies.addEventListener('click', testProxyList); | |
fetchProxies.addEventListener('click', fetchFreshProxies); | |
useProxy.addEventListener('change', updateProxyStatus); | |
// Attack functionality | |
attackBtn.addEventListener('click', toggleAttack); | |
clearConsole.addEventListener('click', clearConsoleOutput); | |
exportLogs.addEventListener('click', exportConsoleLogs); | |
// Settings save | |
saveSettingsBtn.addEventListener('click', saveSettings); | |
// Update attack duration when slider changes | |
durationSlider.addEventListener('input', function() { | |
attackDuration = parseInt(this.value); | |
}); | |
// Update total threads when input changes | |
threadCount.addEventListener('change', function() { | |
totalThreadsEl.textContent = this.value; | |
}); | |
// Modal toggle function | |
function toggleModal(modal, show = true) { | |
if (show) { | |
modal.classList.remove('opacity-0', 'pointer-events-none'); | |
modal.classList.add('opacity-100'); | |
} else { | |
modal.classList.remove('opacity-100'); | |
modal.classList.add('opacity-0', 'pointer-events-none'); | |
} | |
} | |
// Close modals when clicking outside | |
[settingsModal, helpModal, whoisModal].forEach(modal => { | |
modal.addEventListener('click', function(e) { | |
if (e.target === modal) { | |
toggleModal(modal, false); | |
} | |
}); | |
}); | |
// WHOIS lookup function | |
async function performWhoisLookup() { | |
const target = targetInput.value.trim(); | |
if (!target) { | |
logToConsole('> Error: Please enter a target URL or IP address', 'text-red-400'); | |
return; | |
} | |
toggleModal(whoisModal); | |
whoisContent.innerHTML = `<div class="text-blue-400">Fetching WHOIS data for ${target}...</div>`; | |
try { | |
// Simulate WHOIS lookup with mock data | |
const isIP = /^(?:\d{1,3}\.){3}\d{1,3}$/.test(target); | |
const isDomain = /^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/.test(target); | |
if (!isIP && !isDomain) { | |
throw new Error('Invalid target format'); | |
} | |
// Generate mock WHOIS data | |
const mockData = { | |
target: target, | |
isIP: isIP, | |
isDomain: isDomain, | |
date: new Date().toISOString(), | |
registrar: isDomain ? "Example Registrar Inc." : null, | |
creationDate: isDomain ? "2020-01-15T00:00:00Z" : null, | |
expirationDate: isDomain ? "2025-01-15T00:00:00Z" : null, | |
updatedDate: isDomain ? "2023-05-20T00:00:00Z" : null, | |
nameServers: isDomain ? ["ns1.example.com", "ns2.example.com"] : null, | |
status: isDomain ? "clientTransferProhibited" : null, | |
ipInfo: isIP ? { | |
range: "192.0.2.0 - 192.0.2.255", | |
country: "US", | |
region: "California", | |
city: "Los Angeles", | |
isp: "Example ISP Inc.", | |
org: "Example Organization", | |
as: "AS12345 Example Network" | |
} : null | |
}; | |
// Format the WHOIS data | |
let whoisHtml = `<div class="text-green-400">WHOIS results for: ${target}</div>`; | |
whoisHtml += `<div class="border-t border-gray-700 my-2"></div>`; | |
if (mockData.isDomain) { | |
whoisHtml += `<div class="text-gray-300">Domain Name: ${target}</div>`; | |
whoisHtml += `<div class="text-gray-300">Registrar: ${mockData.registrar || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Creation Date: ${mockData.creationDate || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Expiration Date: ${mockData.expirationDate || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Updated Date: ${mockData.updatedDate || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Status: ${mockData.status || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Name Servers: ${mockData.nameServers ? mockData.nameServers.join(', ') : 'N/A'}</div>`; | |
whoisHtml += `<div class="border-t border-gray-700 my-2"></div>`; | |
} | |
if (mockData.isIP) { | |
whoisHtml += `<div class="text-gray-300">IP Address: ${target}</div>`; | |
whoisHtml += `<div class="text-gray-300">IP Range: ${mockData.ipInfo.range || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Country: ${mockData.ipInfo.country || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Region: ${mockData.ipInfo.region || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">City: ${mockData.ipInfo.city || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">ISP: ${mockData.ipInfo.isp || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">Organization: ${mockData.ipInfo.org || 'N/A'}</div>`; | |
whoisHtml += `<div class="text-gray-300">AS: ${mockData.ipInfo.as || 'N/A'}</div>`; | |
whoisHtml += `<div class="border-t border-gray-700 my-2"></div>`; | |
} | |
whoisHtml += `<div class="text-gray-400 text-xs">WHOIS data retrieved at ${new Date().toLocaleTimeString()}</div>`; | |
whoisContent.innerHTML = whoisHtml; | |
logToConsole(`> WHOIS lookup completed for ${target}`, 'text-green-400'); | |
} catch (error) { | |
whoisContent.innerHTML = `<div class="text-red-400">Error fetching WHOIS data: ${error.message}</div>`; | |
logToConsole(`> WHOIS lookup failed: ${error.message}`, 'text-red-400'); | |
} | |
} | |
// Proxy functions | |
function importProxyList() { | |
const fileInput = document.createElement('input'); | |
fileInput.type = 'file'; | |
fileInput.accept = '.txt,.csv'; | |
fileInput.onchange = e => { | |
const file = e.target.files[0]; | |
const reader = new FileReader(); | |
reader.onload = event => { | |
proxyList.value = event.target.result; | |
logToConsole(`> Imported ${proxyList.value.split('\n').length} proxies from file`, 'text-blue-400'); | |
}; | |
reader.readAsText(file); | |
}; | |
fileInput.click(); | |
} | |
async function testProxyList() { | |
const proxies = proxyList.value.split('\n').filter(p => p.trim()); | |
if (proxies.length === 0) { | |
logToConsole('> No proxies to test', 'text-red-400'); | |
return; | |
} | |
testedProxies = 0; | |
workingProxies = 0; | |
activeProxies = []; | |
logToConsole(`> Testing ${proxies.length} proxies...`, 'text-blue-400'); | |
// Simulate proxy testing (in a real app, you'd actually test each proxy) | |
const testInterval = setInterval(() => { | |
if (testedProxies >= proxies.length) { | |
clearInterval(testInterval); | |
logToConsole(`> Proxy test completed: ${workingProxies}/${proxies.length} working`, 'text-green-400'); | |
return; | |
} | |
testedProxies++; | |
if (Math.random() > 0.3) { // 70% success rate for simulation | |
workingProxies++; | |
activeProxies.push(proxies[testedProxies - 1]); | |
} | |
logToConsole(`> Testing proxy ${testedProxies}/${proxies.length}... ${workingProxies} working so far`, 'text-gray-400'); | |
}, 300); | |
} | |
async function fetchFreshProxies() { | |
logToConsole('> Fetching fresh proxy list...', 'text-blue-400'); | |
try { | |
// Simulate fetching from a free proxy API | |
setTimeout(() => { | |
const sampleProxies = [ | |
'45.95.96.34:8080', | |
'103.155.217.1:41317', | |
'45.94.47.66:8111', | |
'103.155.54.137:83', | |
'103.155.54.26:83', | |
'103.155.54.238:83', | |
'103.155.54.14:83', | |
'103.155.54.163:83', | |
'103.155.54.245:83', | |
'103.155.54.18:83' | |
]; | |
proxyList.value = sampleProxies.join('\n'); | |
logToConsole(`> Fetched ${sampleProxies.length} fresh proxies`, 'text-green-400'); | |
}, 1500); | |
} catch (error) { | |
logToConsole(`> Error fetching proxies: ${error.message}`, 'text-red-400'); | |
} | |
} | |
function updateProxyStatus() { | |
if (useProxy.checked) { | |
logToConsole('> Proxy rotation enabled', 'text-blue-400'); | |
} else { | |
logToConsole('> Proxy rotation disabled', 'text-yellow-400'); | |
} | |
} | |
// Attack functions | |
function toggleAttack() { | |
attackActive = !attackActive; | |
if (attackActive) { | |
startAttack(); | |
} else { | |
stopAttack(); | |
} | |
} | |
function startAttack() { | |
const target = targetInput.value.trim(); | |
if (!target) { | |
logToConsole('> Error: Please enter a target URL or IP address', 'text-red-400'); | |
attackActive = false; | |
return; | |
} | |
// Start attack | |
attackBtn.innerHTML = '<i class="fas fa-stop mr-2"></i> STOP ATTACK'; | |
attackBtn.classList.remove('bg-red-600', 'hover:bg-red-700'); | |
attackBtn.classList.add('bg-yellow-600', 'hover:bg-yellow-700', 'attack-active'); | |
// Reset stats | |
requestCount = 0; | |
successCount = 0; | |
startTime = Date.now(); | |
updateStats(); | |
// Get attack parameters | |
const port = portInput.value; | |
const method = methodSelect.value; | |
const threads = parseInt(threadCount.value); | |
const duration = parseInt(durationSlider.value); | |
// Log attack start | |
logToConsole('> Starting XXoS attack sequence...', 'text-blue-400'); | |
logToConsole(`> Target: ${target}:${port}`, 'text-blue-400'); | |
logToConsole(`> Method: ${method}`, 'text-blue-400'); | |
logToConsole(`> Threads: ${threads}`, 'text-blue-400'); | |
logToConsole(`> Duration: ${duration} seconds`, 'text-blue-400'); | |
if (useProxy.checked && activeProxies.length > 0) { | |
logToConsole(`> Using ${activeProxies.length} proxies`, 'text-blue-400'); | |
} else if (useProxy.checked) { | |
logToConsole('> Warning: Proxy rotation enabled but no working proxies available', 'text-yellow-400'); | |
} | |
// Simulate attack in progress | |
attackInterval = setInterval(() => { | |
// Calculate requests based on method and threads | |
let newRequests; | |
switch(method) { | |
case 'GET': | |
newRequests = Math.floor(threads * (0.8 + Math.random() * 0.4)); | |
break; | |
case 'POST': | |
newRequests = Math.floor(threads * (0.6 + Math.random() * 0.3)); | |
break; | |
case 'TCP': | |
newRequests = Math.floor(threads * (1.0 + Math.random() * 0.5)); | |
break; | |
case 'UDP': | |
newRequests = Math.floor(threads * (1.2 + Math.random() * 0.8)); | |
break; | |
case 'SYN': | |
newRequests = Math.floor(threads * (1.5 + Math.random() * 1.0)); | |
break; | |
case 'XXoS': | |
newRequests = Math.floor(threads * (2.0 + Math.random() * 1.5)); | |
break; | |
default: | |
newRequests = Math.floor(threads * (0.8 + Math.random() * 0.4)); | |
} | |
requestCount += newRequests; | |
successCount += Math.floor(newRequests * (0.7 + Math.random() * 0.2)); // 70-90% success rate | |
// Random log messages | |
if (Math.random() > 0.7) { | |
logToConsole(`> Sent ${newRequests} ${method} requests (${Math.floor(newRequests * (0.7 + Math.random() * 0.2))} successful)`, 'text-green-400'); | |
} | |
// Random proxy connection messages | |
if (useProxy.checked && Math.random() > 0.8) { | |
const proxyCount = Math.floor(Math.random() * 20) + 5; | |
logToConsole(`> Rotated ${proxyCount} proxy connections`, 'text-blue-400'); | |
} | |
// Update stats | |
updateStats(); | |
// Check if attack duration has elapsed | |
const elapsed = (Date.now() - startTime) / 1000; | |
if (elapsed >= duration) { | |
stopAttack(); | |
logToConsole('> Attack duration completed', 'text-yellow-400'); | |
logToConsole(`> Final statistics: ${requestCount} requests sent, ${Math.round((successCount / requestCount) * 100)}% success rate`, 'text-green-400'); | |
} | |
}, 800); | |
// Start stats update interval | |
statsInterval = setInterval(updateStats, 100); | |
} | |
function stopAttack() { | |
attackBtn.innerHTML = '<i class="fas fa-play mr-2"></i> LAUNCH ATTACK'; | |
attackBtn.classList.remove('bg-yellow-600', 'hover:bg-yellow-700', 'attack-active'); | |
attackBtn.classList.add('bg-red-600', 'hover:bg-red-700'); | |
clearInterval(attackInterval); | |
clearInterval(statsInterval); | |
attackActive = false; | |
// Final stats update | |
updateStats(); | |
} | |
function updateStats() { | |
// Update request count | |
requestCountEl.textContent = requestCount; | |
const maxRequests = 1000000; // Max for percentage calculation | |
const requestPercentage = Math.min(100, (requestCount / maxRequests) * 100); | |
requestBar.style.width = `${requestPercentage}%`; | |
// Update success rate | |
const successPercentage = requestCount > 0 ? Math.round((successCount / requestCount) * 100) : 0; | |
successRateEl.textContent = `${successPercentage}%`; | |
successBar.style.width = `${successPercentage}%`; | |
// Update attack time | |
const elapsed = attackActive ? (Date.now() - startTime) / 1000 : 0; | |
const hours = Math.floor(elapsed / 3600); | |
const minutes = Math.floor((elapsed % 3600) / 60); | |
const seconds = Math.floor(elapsed % 60); | |
attackTimeEl.textContent = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`; | |
// Update time bar | |
const timePercentage = attackActive ? (elapsed / attackDuration) * 100 : 0; | |
timeBar.style.width = `${timePercentage}%`; | |
// Update active threads | |
const activeThreads = attackActive ? Math.floor(parseInt(threadCount.value) * (0.7 + Math.random() * 0.3)) : 0; | |
activeThreadsEl.innerHTML = `${activeThreads}<span class="text-gray-400">/${threadCount.value}</span>`; | |
const threadPercentage = (activeThreads / parseInt(threadCount.value)) * 100; | |
threadBar.style.width = `${threadPercentage}%`; | |
} | |
// Console functions | |
function logToConsole(message, colorClass = 'text-gray-400') { | |
const newLine = document.createElement('div'); | |
newLine.classList.add('font-mono', colorClass); | |
newLine.textContent = message; | |
consoleOutput.appendChild(newLine); | |
consoleOutput.scrollTop = consoleOutput.scrollHeight; | |
} | |
function clearConsoleOutput() { | |
consoleOutput.innerHTML = ''; | |
logToConsole('> Console cleared', 'text-yellow-400'); | |
} | |
function exportConsoleLogs() { | |
const logs = Array.from(consoleOutput.children).map(line => line.textContent).join('\n'); | |
const blob = new Blob([logs], { type: 'text/plain' }); | |
const url = URL.createObjectURL(blob); | |
const a = document.createElement('a'); | |
a.href = url; | |
a.download = `xxos_logs_${new Date().toISOString().replace(/[:.]/g, '-')}.txt`; | |
document.body.appendChild(a); | |
a.click(); | |
document.body.removeChild(a); | |
URL.revokeObjectURL(url); | |
logToConsole('> Logs exported to file', 'text-blue-400'); | |
} | |
// Settings functions | |
function saveSettings() { | |
settings.timeout = parseInt(document.getElementById('timeoutInput').value); | |
settings.maxThreads = parseInt(document.getElementById('maxThreadsInput').value); | |
settings.retries = parseInt(document.getElementById('retriesInput').value); | |
settings.autoUpdate = document.getElementById('autoUpdateCheckbox').checked; | |
settings.verboseLog = document.getElementById('verboseLogCheckbox').checked; | |
logToConsole(`> Settings saved: Timeout=${settings.timeout}ms, MaxThreads=${settings.maxThreads}, Retries=${settings.retries}`, 'text-blue-400'); | |
logToConsole(`> Auto-update proxies: ${settings.autoUpdate ? 'Enabled' : 'Disabled'}`, 'text-blue-400'); | |
logToConsole(`> Verbose logging: ${settings.verboseLog ? 'Enabled' : 'Disabled'}`, 'text-blue-400'); | |
toggleModal(settingsModal, false); | |
} | |
</script> | |
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=tattedbootyab/xxox" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
</html> |