wormclaude 1.0.161 → 1.0.162
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands.js +75 -1
- package/dist/theme.js +1 -1
- package/dist/tools.js +5 -7
- package/package.json +1 -1
package/dist/commands.js
CHANGED
|
@@ -57,6 +57,7 @@ export const COMMANDS = [
|
|
|
57
57
|
{ name: '/scan', desc: '[seviye 3+] yetkili hedefte genel tarama (keşif+başlıklar): /scan <alan>' },
|
|
58
58
|
{ name: '/xss', desc: '[seviye 3+] yetkili hedefte XSS taraması (kendi motorumuz): /xss <url>' },
|
|
59
59
|
{ name: '/sqli', desc: '[seviye 3+] yetkili hedefte SQLi taraması (kendi motorumuz): /sqli <url>' },
|
|
60
|
+
{ name: '/fullscan', desc: '[seviye 3+] tam kapsamlı DETERMİNİSTİK tarama: recon+XSS+SQLi tek komutta: /fullscan <hedef>' },
|
|
60
61
|
{ name: '/exploit', desc: 'yetkili testte doğrulanmış PoC üret: /exploit <cve|açıklama>' },
|
|
61
62
|
{ name: '/harden', desc: 'savunma çıktısı üret (YARA/Sigma + yama önerisi): /harden <hedef|tehdit>' },
|
|
62
63
|
{ name: '/export', desc: 'sohbeti dosyaya kaydet' },
|
|
@@ -187,7 +188,7 @@ function formatFinding(x) {
|
|
|
187
188
|
// FALSE-POZİTİF guard: ilk kelime tam komut adı + argüman var + soru DEĞİL ("recon nedir?" tetiklemez).
|
|
188
189
|
// Yalnız hedef-alan komutları; ve hedef URL/domain GİBİ görünmeli ("xss ile tara" → komut DEĞİL,
|
|
189
190
|
// model SecurityScan ile halleder). "?'li URL kabul edilir (parametreli xss/sqli hedefi).
|
|
190
|
-
const _BARE_CMDS = new Set(['recon', 'scan', 'xss', 'sqli']);
|
|
191
|
+
const _BARE_CMDS = new Set(['recon', 'scan', 'xss', 'sqli', 'fullscan']);
|
|
191
192
|
const _TARGET_RE = /(^https?:\/\/)|(\.[a-z]{2,})|(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/i;
|
|
192
193
|
export function detectBareCommand(input) {
|
|
193
194
|
const s = (input || '').trim();
|
|
@@ -269,6 +270,76 @@ async function pentestCmd(tool, arg, ctx) {
|
|
|
269
270
|
}
|
|
270
271
|
ctx.assistant(lines.join('\n'));
|
|
271
272
|
}
|
|
273
|
+
// /fullscan — DETERMİNİSTİK tam tarama. Modelin doğaçlamasına (nmap/sqlmap orkestrasyonu →
|
|
274
|
+
// narration/uydurma/PATH derdi) GÜVENMEZ: recon → XSS → SQLi motorunu KOD sırayla, her hedefte
|
|
275
|
+
// aynı şekilde koşar, gerçek bulguları tek raporda birleştirir. Tekrarlanabilir (red team/öğrenci).
|
|
276
|
+
async function fullScanCmd(arg, ctx) {
|
|
277
|
+
const parts = (arg || '').trim().split(/\s+/).filter(Boolean);
|
|
278
|
+
let scopeAck = false;
|
|
279
|
+
if (parts.length && /^(run|onayla|çalıştır|calistir|--yes|-y|yes|evet)$/i.test(parts[parts.length - 1])) {
|
|
280
|
+
scopeAck = true;
|
|
281
|
+
parts.pop();
|
|
282
|
+
}
|
|
283
|
+
const cleaned = [];
|
|
284
|
+
for (let i = 0; i < parts.length; i++) {
|
|
285
|
+
if (parts[i].startsWith('-')) {
|
|
286
|
+
if (parts[i + 1] && !parts[i + 1].startsWith('-'))
|
|
287
|
+
i++;
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
cleaned.push(parts[i]);
|
|
291
|
+
}
|
|
292
|
+
const target = cleaned.join(' ').trim();
|
|
293
|
+
if (!target) {
|
|
294
|
+
ctx.note(tt('Full scan (deterministic: recon + XSS + SQLi)\nUsage: /fullscan <target>\nExample: /fullscan testphp.vulnweb.com', 'Tam tarama (deterministik: recon + XSS + SQLi)\nKullanım: /fullscan <hedef>\nÖrnek: /fullscan testphp.vulnweb.com'));
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (!scopeAck) {
|
|
298
|
+
pendingPentest = `/fullscan ${target} run`;
|
|
299
|
+
ctx.note(tt(`⚠️ AUTHORIZATION REQUIRED — Full scan (recon + XSS + SQLi)\nTarget: ${target}\n\n` +
|
|
300
|
+
`Sends REAL requests from YOUR IP. Only on systems you own or have written authorization for.\n` +
|
|
301
|
+
`To confirm, type "run" (Enter) · or: /fullscan ${target} run`, `⚠️ YETKİ ONAYI GEREKLİ — Tam tarama (recon + XSS + SQLi)\nHedef: ${target}\n\n` +
|
|
302
|
+
`Hedefe GERÇEK istekler SENİN IP'nden gider. Yalnız sahibi olduğun ya da yazılı izinli sistemlerde.\n` +
|
|
303
|
+
`Onaylamak için "run" yaz (Enter) · ya da: /fullscan ${target} run`));
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
pendingPentest = null;
|
|
307
|
+
ctx.note(tt(`Full scan starting — ${target} (recon → XSS → SQLi, deterministic, repeatable)`, `Tam tarama başlıyor — ${target} (recon → XSS → SQLi, deterministik, tekrarlanabilir)`));
|
|
308
|
+
const steps = [['recon', ptLabel('recon')], ['xss', ptLabel('xss')], ['sqli', ptLabel('sqli')]];
|
|
309
|
+
const all = [];
|
|
310
|
+
for (const [tool, label] of steps) {
|
|
311
|
+
ctx.note(`▶ ${label} …`);
|
|
312
|
+
const out = await runPentest(ctx.config, tool, target, true, (s) => ctx.note(s));
|
|
313
|
+
if (!out.ok) {
|
|
314
|
+
const r = out.reason || out.plan?.reason || 'error';
|
|
315
|
+
// Yetki/kota hatası tüm adımlarda aynı → dur. Diğer hatada o adımı atla, devam et.
|
|
316
|
+
if (r === 'trust_required' || r === 'quota_exceeded' || r === 'no_quota' || r === 'auth') {
|
|
317
|
+
ctx.note(`${tt('Full scan stopped', 'Tam tarama durdu')}: ${ptReason(r)}`);
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
ctx.note(` ${label}: ${ptReason(r)} — ${tt('skipped', 'atlandı')}`);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
const f = (out.report?.findings || []).map((x) => ({ ...x, _step: tool }));
|
|
324
|
+
all.push(...f);
|
|
325
|
+
ctx.note(` ${label}: ${f.length} ${tt('finding(s)', 'bulgu')}`);
|
|
326
|
+
}
|
|
327
|
+
const order = { critical: 0, high: 1, medium: 2, low: 3, info: 4 };
|
|
328
|
+
all.sort((a, b) => (order[a.severity] ?? 9) - (order[b.severity] ?? 9));
|
|
329
|
+
const lines = [`✓ ${tt('Full scan complete', 'Tam tarama tamamlandı')} — ${target}`];
|
|
330
|
+
if (!all.length) {
|
|
331
|
+
lines.push(tt('No findings on the tested surface (recon/XSS/SQLi). Target looks clean or was unreachable.', 'Test edilen yüzeyde bulgu yok (recon/XSS/SQLi). Hedef temiz görünüyor ya da erişilemedi.'));
|
|
332
|
+
}
|
|
333
|
+
else {
|
|
334
|
+
const sev = (s) => all.filter((x) => x.severity === s).length;
|
|
335
|
+
lines.push(`${all.length} ${tt('finding(s)', 'bulgu')} — high:${sev('high')} medium:${sev('medium')} low:${sev('low')} info:${sev('info')}`);
|
|
336
|
+
for (const x of all.slice(0, 60))
|
|
337
|
+
lines.push(' ' + formatFinding(x));
|
|
338
|
+
if (all.length > 60)
|
|
339
|
+
lines.push(` … +${all.length - 60} ${tt('more', 'daha')}`);
|
|
340
|
+
}
|
|
341
|
+
ctx.assistant(lines.join('\n'));
|
|
342
|
+
}
|
|
272
343
|
// /exploit ve /harden — AKTİF tarama DEĞİL, model-üretim görevleri (PoC / YARA-Sigma yazar).
|
|
273
344
|
// Güçlü, yetkili-kapsam çerçevesiyle modele gider (skill gibi). Çıktı kullanıcının dilinde.
|
|
274
345
|
export function buildExploitPrompt(arg) {
|
|
@@ -894,6 +965,9 @@ export async function runSlashCommand(input, ctx) {
|
|
|
894
965
|
case '/sqli':
|
|
895
966
|
await pentestCmd(cmd.slice(1), arg, ctx);
|
|
896
967
|
return true;
|
|
968
|
+
case '/fullscan':
|
|
969
|
+
await fullScanCmd(arg, ctx);
|
|
970
|
+
return true;
|
|
897
971
|
case '/skill': {
|
|
898
972
|
const m = (arg || '').trim().split(/\s+/).filter(Boolean);
|
|
899
973
|
const sub = (m.shift() || '').toLowerCase();
|
package/dist/theme.js
CHANGED
package/dist/tools.js
CHANGED
|
@@ -747,13 +747,11 @@ async function execOne(call, hooks) {
|
|
|
747
747
|
txt += 'Zafiyet bulunamadı (hedef temiz ya da yanıt vermedi).';
|
|
748
748
|
else
|
|
749
749
|
txt += `${rep.found_count} bulgu:\n` + f.slice(0, 50).map((x) => ' ' + JSON.stringify(x)).join('\n');
|
|
750
|
-
// HYBRID: bu gömülü ilk-geçiştir.
|
|
751
|
-
txt +=
|
|
752
|
-
+
|
|
753
|
-
+
|
|
754
|
-
+
|
|
755
|
-
+ ' authorization document. Escalate ONLY if the user accepts AND has confirmed ownership/written'
|
|
756
|
-
+ ' authorization (ask once if unstated).';
|
|
750
|
+
// HYBRID: bu gömülü ilk-geçiştir. Derin tarama = DETERMİNİSTİK /fullscan (model doğaçlamasın).
|
|
751
|
+
txt += `\n\n[hybrid-note] This was WormClaude's fast first-pass scan. For a COMPREHENSIVE scan, tell`
|
|
752
|
+
+ ` the user to run the deterministic command "/fullscan ${target}" — it chains recon + XSS + SQLi`
|
|
753
|
+
+ ` in one reliable, repeatable pass. Do NOT hand-orchestrate nmap/sqlmap yourself; recommend`
|
|
754
|
+
+ ` /fullscan. Pair it with the authorization reminder (only on owned / written-authorized targets).`;
|
|
757
755
|
return { ok: true, output: txt, args };
|
|
758
756
|
}
|
|
759
757
|
catch (e) {
|