@pentoshi/clai 4.11.11 → 4.11.13
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/README.md +31 -3
- package/dist/agent/compaction/summary-execution.d.ts +1 -0
- package/dist/agent/compaction/summary-execution.js +101 -27
- package/dist/agent/compaction/summary-execution.js.map +1 -1
- package/dist/agent/compaction-executor.js +3 -3
- package/dist/agent/compaction-executor.js.map +1 -1
- package/dist/agent/compaction-summary.d.ts +2 -0
- package/dist/agent/compaction-summary.js +8 -0
- package/dist/agent/compaction-summary.js.map +1 -1
- package/dist/agent/context/compact-with-summary.d.ts +1 -0
- package/dist/agent/context/compact-with-summary.js +60 -30
- package/dist/agent/context/compact-with-summary.js.map +1 -1
- package/dist/agent/events.d.ts +1 -0
- package/dist/agent/evidence/task-classification.js +0 -1
- package/dist/agent/evidence/task-classification.js.map +1 -1
- package/dist/agent/evidence/tool-budgets.js +0 -9
- package/dist/agent/evidence/tool-budgets.js.map +1 -1
- package/dist/agent/loop-guard.js +0 -4
- package/dist/agent/loop-guard.js.map +1 -1
- package/dist/agent/outcomes.js +1 -1
- package/dist/agent/outcomes.js.map +1 -1
- package/dist/agent/parser/arg-formatting.js +0 -8
- package/dist/agent/parser/arg-formatting.js.map +1 -1
- package/dist/agent/parser/bare-recognition.js +0 -4
- package/dist/agent/parser/bare-recognition.js.map +1 -1
- package/dist/agent/progress.js +0 -26
- package/dist/agent/progress.js.map +1 -1
- package/dist/agent/request-accounting.d.ts +1 -0
- package/dist/agent/request-accounting.js +24 -8
- package/dist/agent/request-accounting.js.map +1 -1
- package/dist/agent/request-budget.d.ts +3 -0
- package/dist/agent/request-budget.js +22 -8
- package/dist/agent/request-budget.js.map +1 -1
- package/dist/agent/runner.js +1 -2
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/session-policy.js +0 -5
- package/dist/agent/session-policy.js.map +1 -1
- package/dist/agent/stream-recovery.d.ts +4 -0
- package/dist/agent/stream-recovery.js +14 -15
- package/dist/agent/stream-recovery.js.map +1 -1
- package/dist/agent/task-evidence.js +3 -12
- package/dist/agent/task-evidence.js.map +1 -1
- package/dist/agent/tool-call-parser.js +2 -2
- package/dist/agent/tool-call-parser.js.map +1 -1
- package/dist/agent/turn/automatic-compaction-execution.d.ts +1 -0
- package/dist/agent/turn/automatic-compaction-execution.js +4 -2
- package/dist/agent/turn/automatic-compaction-execution.js.map +1 -1
- package/dist/agent/turn/compaction-admission.d.ts +5 -1
- package/dist/agent/turn/compaction-admission.js +7 -5
- package/dist/agent/turn/compaction-admission.js.map +1 -1
- package/dist/agent/turn/compaction-coordinator.d.ts +2 -1
- package/dist/agent/turn/compaction-coordinator.js +24 -7
- package/dist/agent/turn/compaction-coordinator.js.map +1 -1
- package/dist/agent/turn/compaction-final-fit.d.ts +1 -1
- package/dist/agent/turn/compaction-final-fit.js +5 -4
- package/dist/agent/turn/compaction-final-fit.js.map +1 -1
- package/dist/agent/turn/compaction-summarizer.js +1 -1
- package/dist/agent/turn/compaction-summarizer.js.map +1 -1
- package/dist/agent/turn/event-emitter.js +3 -0
- package/dist/agent/turn/event-emitter.js.map +1 -1
- package/dist/agent/turn/loop/completion-interpretation.js +4 -4
- package/dist/agent/turn/loop/completion-interpretation.js.map +1 -1
- package/dist/agent/turn/loop/deps.d.ts +2 -1
- package/dist/agent/turn/loop/round-request.d.ts +2 -0
- package/dist/agent/turn/loop/round-request.js +17 -3
- package/dist/agent/turn/loop/round-request.js.map +1 -1
- package/dist/agent/turn/loop/run-rounds.js +1 -3
- package/dist/agent/turn/loop/run-rounds.js.map +1 -1
- package/dist/agent/turn/loop/stream-failure.js +4 -1
- package/dist/agent/turn/loop/stream-failure.js.map +1 -1
- package/dist/agent/turn/tool-evidence-signals.js +0 -2
- package/dist/agent/turn/tool-evidence-signals.js.map +1 -1
- package/dist/agent/turn/tool-execution/engagement-checkpoint.js +2 -1
- package/dist/agent/turn/tool-execution/engagement-checkpoint.js.map +1 -1
- package/dist/agent/turn/tool-execution/guards.js +8 -3
- package/dist/agent/turn/tool-execution/guards.js.map +1 -1
- package/dist/agent/turn/tool-routing.d.ts +0 -1
- package/dist/agent/turn/tool-routing.js +0 -2
- package/dist/agent/turn/tool-routing.js.map +1 -1
- package/dist/app/adapters/agent-event-adapter.js +3 -0
- package/dist/app/adapters/agent-event-adapter.js.map +1 -1
- package/dist/app/commands/catalog.js +15 -1
- package/dist/app/commands/catalog.js.map +1 -1
- package/dist/app/controllers/session-compact-helper.js +59 -45
- package/dist/app/controllers/session-compact-helper.js.map +1 -1
- package/dist/app/controllers/session-context-usage.js +16 -5
- package/dist/app/controllers/session-context-usage.js.map +1 -1
- package/dist/app/events/app-event.d.ts +1 -0
- package/dist/app/events/app-event.js.map +1 -1
- package/dist/commands/providers.js +2 -0
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/update/installers.js +17 -2
- package/dist/commands/update/installers.js.map +1 -1
- package/dist/llm/adapters/anthropic-tools.d.ts +1 -0
- package/dist/llm/adapters/anthropic-tools.js +8 -4
- package/dist/llm/adapters/anthropic-tools.js.map +1 -1
- package/dist/llm/anthropic.d.ts +1 -1
- package/dist/llm/anthropic.js +8 -3
- package/dist/llm/anthropic.js.map +1 -1
- package/dist/llm/capability/state.d.ts +1 -1
- package/dist/llm/capability/tool-dialect.js +1 -0
- package/dist/llm/capability/tool-dialect.js.map +1 -1
- package/dist/llm/capability/vision-patterns.js +12 -0
- package/dist/llm/capability/vision-patterns.js.map +1 -1
- package/dist/llm/explabs.d.ts +12 -0
- package/dist/llm/explabs.js +348 -0
- package/dist/llm/explabs.js.map +1 -0
- package/dist/llm/key-rotation.d.ts +4 -0
- package/dist/llm/key-rotation.js +30 -0
- package/dist/llm/key-rotation.js.map +1 -1
- package/dist/llm/model-layers/model-rules.js +6 -0
- package/dist/llm/model-layers/model-rules.js.map +1 -1
- package/dist/llm/provider-identity.js +7 -0
- package/dist/llm/provider-identity.js.map +1 -1
- package/dist/llm/provider-info-text.js +65 -0
- package/dist/llm/provider-info-text.js.map +1 -1
- package/dist/llm/provider-profile-layers.js +40 -2
- package/dist/llm/provider-profile-layers.js.map +1 -1
- package/dist/llm/reasoning-capability.js +19 -1
- package/dist/llm/reasoning-capability.js.map +1 -1
- package/dist/llm/reasoning-controls.d.ts +1 -0
- package/dist/llm/reasoning-controls.js +4 -0
- package/dist/llm/reasoning-controls.js.map +1 -1
- package/dist/llm/reasoning-errors.js +2 -2
- package/dist/llm/reasoning-errors.js.map +1 -1
- package/dist/llm/responses/item-events.js +1 -1
- package/dist/llm/responses/item-events.js.map +1 -1
- package/dist/llm/responses-complete.js +2 -1
- package/dist/llm/responses-complete.js.map +1 -1
- package/dist/llm/responses-config.d.ts +1 -0
- package/dist/llm/responses-config.js.map +1 -1
- package/dist/llm/responses-empty-output.d.ts +2 -0
- package/dist/llm/responses-empty-output.js +22 -0
- package/dist/llm/responses-empty-output.js.map +1 -0
- package/dist/llm/responses-parse.js +8 -2
- package/dist/llm/responses-parse.js.map +1 -1
- package/dist/llm/responses-request.d.ts +1 -0
- package/dist/llm/responses-request.js +19 -6
- package/dist/llm/responses-request.js.map +1 -1
- package/dist/llm/responses-stream-accumulator.js +7 -1
- package/dist/llm/responses-stream-accumulator.js.map +1 -1
- package/dist/llm/routing/attempt-complete.js +3 -1
- package/dist/llm/routing/attempt-complete.js.map +1 -1
- package/dist/llm/routing/attempt-stream.js +3 -1
- package/dist/llm/routing/attempt-stream.js.map +1 -1
- package/dist/llm/routing/error-classification.d.ts +4 -0
- package/dist/llm/routing/error-classification.js +34 -0
- package/dist/llm/routing/error-classification.js.map +1 -1
- package/dist/llm/routing/failure-report.js +4 -2
- package/dist/llm/routing/failure-report.js.map +1 -1
- package/dist/llm/routing/key-rotation.js +13 -2
- package/dist/llm/routing/key-rotation.js.map +1 -1
- package/dist/llm/routing/provider-selection.js +3 -0
- package/dist/llm/routing/provider-selection.js.map +1 -1
- package/dist/llm/token-estimate-calibration.js +20 -3
- package/dist/llm/token-estimate-calibration.js.map +1 -1
- package/dist/llm/token-usage.d.ts +1 -0
- package/dist/llm/token-usage.js +10 -3
- package/dist/llm/token-usage.js.map +1 -1
- package/dist/llm/tokenrouter.d.ts +11 -0
- package/dist/llm/tokenrouter.js +27 -1
- package/dist/llm/tokenrouter.js.map +1 -1
- package/dist/llm/wire/chat-body.js +10 -1
- package/dist/llm/wire/chat-body.js.map +1 -1
- package/dist/llm/wire/responses-failure.js +1 -1
- package/dist/llm/wire/responses-failure.js.map +1 -1
- package/dist/llm/wire/responses-first.js +16 -28
- package/dist/llm/wire/responses-first.js.map +1 -1
- package/dist/mcp/auth/provider.js +0 -1
- package/dist/mcp/auth/provider.js.map +1 -1
- package/dist/mcp/format.js +2 -0
- package/dist/mcp/format.js.map +1 -1
- package/dist/mcp/manager.d.ts +4 -0
- package/dist/mcp/manager.js +37 -19
- package/dist/mcp/manager.js.map +1 -1
- package/dist/mcp/runtime.d.ts +3 -0
- package/dist/mcp/runtime.js +50 -25
- package/dist/mcp/runtime.js.map +1 -1
- package/dist/mcp/schema-compact.d.ts +5 -0
- package/dist/mcp/schema-compact.js +157 -0
- package/dist/mcp/schema-compact.js.map +1 -0
- package/dist/mcp/types.d.ts +1 -1
- package/dist/noninteractive/blocks/tool-blocks.js +10 -5
- package/dist/noninteractive/blocks/tool-blocks.js.map +1 -1
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +4 -6
- package/dist/safety/classifier.js +0 -8
- package/dist/safety/classifier.js.map +1 -1
- package/dist/safety/engagement-policy.js +0 -23
- package/dist/safety/engagement-policy.js.map +1 -1
- package/dist/safety/tool-classification.js +0 -15
- package/dist/safety/tool-classification.js.map +1 -1
- package/dist/session-runtime/binding.d.ts +1 -0
- package/dist/session-runtime/binding.js +7 -0
- package/dist/session-runtime/binding.js.map +1 -1
- package/dist/session-runtime/child-bridge.d.ts +1 -0
- package/dist/session-runtime/child-bridge.js +3 -0
- package/dist/session-runtime/child-bridge.js.map +1 -1
- package/dist/session-runtime/discovery.js +1 -0
- package/dist/session-runtime/discovery.js.map +1 -1
- package/dist/session-runtime/host.d.ts +1 -0
- package/dist/session-runtime/host.js +9 -3
- package/dist/session-runtime/host.js.map +1 -1
- package/dist/session-runtime/reaper.d.ts +1 -0
- package/dist/session-runtime/reaper.js +7 -2
- package/dist/session-runtime/reaper.js.map +1 -1
- package/dist/session-runtime/store.js +1 -0
- package/dist/session-runtime/store.js.map +1 -1
- package/dist/session-runtime/types.d.ts +3 -0
- package/dist/store/config.js +1 -0
- package/dist/store/config.js.map +1 -1
- package/dist/tools/capabilities.js +4 -16
- package/dist/tools/capabilities.js.map +1 -1
- package/dist/tools/definitions/aggregate.js +2 -6
- package/dist/tools/definitions/aggregate.js.map +1 -1
- package/dist/tools/definitions/define.js +0 -8
- package/dist/tools/definitions/define.js.map +1 -1
- package/dist/tools/definitions/files.js +6 -1
- package/dist/tools/definitions/files.js.map +1 -1
- package/dist/tools/definitions/network.d.ts +2 -0
- package/dist/tools/definitions/network.js +17 -0
- package/dist/tools/definitions/network.js.map +1 -0
- package/dist/tools/definitions/orchestration.js +1 -1
- package/dist/tools/definitions/selection.js +1 -4
- package/dist/tools/definitions/selection.js.map +1 -1
- package/dist/tools/fs/search.d.ts +21 -2
- package/dist/tools/fs/search.js +394 -93
- package/dist/tools/fs/search.js.map +1 -1
- package/dist/tools/handlers/files-1.js.map +1 -1
- package/dist/tools/handlers/network-3.js +0 -4
- package/dist/tools/handlers/network-3.js.map +1 -1
- package/dist/tools/handlers/shell-2.js +0 -18
- package/dist/tools/handlers/shell-2.js.map +1 -1
- package/dist/tools/net-ping-sweep.js +1 -1
- package/dist/tools/net-ping-sweep.js.map +1 -1
- package/dist/tools/policies/output-policy.js +0 -3
- package/dist/tools/policies/output-policy.js.map +1 -1
- package/dist/tools/registry.d.ts +0 -9
- package/dist/tools/registry.js +0 -24
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/shell/exec-attempt.js +15 -2
- package/dist/tools/shell/exec-attempt.js.map +1 -1
- package/dist/tui-v2/components/transcript/file-diff-card.d.ts +1 -0
- package/dist/tui-v2/components/transcript/file-diff-card.js +30 -10
- package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.d.ts +1 -0
- package/dist/tui-v2/components/transcript/tool-card.js +4 -2
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/ui-core/bootstrap/composition-root.js +1 -1
- package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
- package/dist/ui-core/commands/mcp-commands.js +41 -11
- package/dist/ui-core/commands/mcp-commands.js.map +1 -1
- package/dist/ui-core/plan/plan-lifecycle.js +1 -1
- package/dist/ui-core/plan/plan-lifecycle.js.map +1 -1
- package/dist/ui-core/rendering/file-diff-view.d.ts +9 -0
- package/dist/ui-core/rendering/file-diff-view.js +20 -1
- package/dist/ui-core/rendering/file-diff-view.js.map +1 -1
- package/dist/ui-core/rendering/syntax/clike.d.ts +1 -0
- package/dist/ui-core/rendering/syntax/clike.js.map +1 -1
- package/dist/ui-core/rendering/syntax/language-highlighters.d.ts +1 -0
- package/dist/ui-core/rendering/syntax/language-highlighters.js +256 -0
- package/dist/ui-core/rendering/syntax/language-highlighters.js.map +1 -1
- package/dist/ui-core/rendering/syntax-highlight.js +2 -2
- package/dist/ui-core/rendering/syntax-highlight.js.map +1 -1
- package/dist/ui-core/state/transcript/apply-app-event.js +3 -1
- package/dist/ui-core/state/transcript/apply-app-event.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +1 -1
- package/dist/tools/definitions/network-1.d.ts +0 -2
- package/dist/tools/definitions/network-1.js +0 -72
- package/dist/tools/definitions/network-1.js.map +0 -1
- package/dist/tools/definitions/network-2.d.ts +0 -2
- package/dist/tools/definitions/network-2.js +0 -22
- package/dist/tools/definitions/network-2.js.map +0 -1
- package/dist/tools/definitions/pentest.d.ts +0 -2
- package/dist/tools/definitions/pentest.js +0 -91
- package/dist/tools/definitions/pentest.js.map +0 -1
- package/dist/tools/dns-native.d.ts +0 -3
- package/dist/tools/dns-native.js +0 -165
- package/dist/tools/dns-native.js.map +0 -1
- package/dist/tools/handlers/network-1.d.ts +0 -2
- package/dist/tools/handlers/network-1.js +0 -52
- package/dist/tools/handlers/network-1.js.map +0 -1
- package/dist/tools/handlers/network-2.d.ts +0 -2
- package/dist/tools/handlers/network-2.js +0 -32
- package/dist/tools/handlers/network-2.js.map +0 -1
- package/dist/tools/handlers/nmap-preparation.d.ts +0 -13
- package/dist/tools/handlers/nmap-preparation.js +0 -66
- package/dist/tools/handlers/nmap-preparation.js.map +0 -1
- package/dist/tools/handlers/pentest.d.ts +0 -2
- package/dist/tools/handlers/pentest.js +0 -208
- package/dist/tools/handlers/pentest.js.map +0 -1
- package/dist/tools/network-context.d.ts +0 -22
- package/dist/tools/network-context.js +0 -130
- package/dist/tools/network-context.js.map +0 -1
- package/dist/tools/nmap-runner.d.ts +0 -10
- package/dist/tools/nmap-runner.js +0 -240
- package/dist/tools/nmap-runner.js.map +0 -1
- package/dist/tools/pentest-workflows.d.ts +0 -8
- package/dist/tools/pentest-workflows.js +0 -175
- package/dist/tools/pentest-workflows.js.map +0 -1
- package/dist/tools/validate.d.ts +0 -26
- package/dist/tools/validate.js +0 -373
- package/dist/tools/validate.js.map +0 -1
- package/dist/tools/whois-native.d.ts +0 -2
- package/dist/tools/whois-native.js +0 -78
- package/dist/tools/whois-native.js.map +0 -1
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { responderJobOptions } from "./responder-job-options.js";
|
|
2
|
-
import { spawnArgv } from "../shell.js";
|
|
3
|
-
import { parseHost, } from "../validate.js";
|
|
4
|
-
import { jobManager } from "../jobs.js";
|
|
5
|
-
import { runNmapScan } from "../nmap-runner.js";
|
|
6
|
-
import { compareAuthorizationContexts, discoverWebSurface, enumerateApi, } from "../pentest-workflows.js";
|
|
7
|
-
import { nativeDnsLookup } from "../dns-native.js";
|
|
8
|
-
import { nativeWhoisLookup } from "../whois-native.js";
|
|
9
|
-
import { optionalNumber, optionalString, requireString, } from "./args.js";
|
|
10
|
-
import { buildPentestReconNmapArgv, prepareDurableNmapJob, } from "./nmap-preparation.js";
|
|
11
|
-
import { estimateScanResources } from "../registry.js";
|
|
12
|
-
export const toolRegistry_PENTEST = {
|
|
13
|
-
async "pentest.recon"(args, options) {
|
|
14
|
-
const host = parseHost(requireString(args, "target"));
|
|
15
|
-
const wantWhois = args.whois !== false;
|
|
16
|
-
const wantDns = args.dns !== false;
|
|
17
|
-
const wantNmap = args.nmap !== false;
|
|
18
|
-
const nmapArgv = buildPentestReconNmapArgv(args, host.value);
|
|
19
|
-
const allSteps = [
|
|
20
|
-
{ key: "whois", command: "whois", argv: [host.value] },
|
|
21
|
-
{
|
|
22
|
-
key: "dns",
|
|
23
|
-
command: "dig",
|
|
24
|
-
argv: [host.value, "ANY", "+noall", "+answer"],
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
key: "nmap",
|
|
28
|
-
command: "nmap",
|
|
29
|
-
argv: nmapArgv,
|
|
30
|
-
},
|
|
31
|
-
];
|
|
32
|
-
const steps = allSteps.filter((step) => {
|
|
33
|
-
if (step.key === "whois")
|
|
34
|
-
return wantWhois;
|
|
35
|
-
if (step.key === "dns")
|
|
36
|
-
return wantDns;
|
|
37
|
-
if (step.key === "nmap")
|
|
38
|
-
return wantNmap;
|
|
39
|
-
return true;
|
|
40
|
-
});
|
|
41
|
-
if (steps.length === 0) {
|
|
42
|
-
return {
|
|
43
|
-
ok: false,
|
|
44
|
-
output: "pentest.recon: no steps requested. Set at least one of whois|dns|nmap to true, or omit them all for a full sweep.",
|
|
45
|
-
exitCode: 1,
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
const { mkdir, writeFile } = await import("node:fs/promises");
|
|
49
|
-
const { join } = await import("node:path");
|
|
50
|
-
const { getArtifactDir } = await import("../../store/paths.js");
|
|
51
|
-
const artifactDir = getArtifactDir();
|
|
52
|
-
let artifactPath;
|
|
53
|
-
try {
|
|
54
|
-
await mkdir(artifactDir, { recursive: true, mode: 0o700 });
|
|
55
|
-
const safeHost = host.value.replace(/[^a-z0-9_.-]+/gi, "-");
|
|
56
|
-
artifactPath = join(artifactDir, `${new Date().toISOString().replace(/[:.]/g, "-")}-recon-${safeHost}.txt`);
|
|
57
|
-
}
|
|
58
|
-
catch {
|
|
59
|
-
artifactPath = undefined;
|
|
60
|
-
}
|
|
61
|
-
const outputs = [];
|
|
62
|
-
const transcript = [];
|
|
63
|
-
let anyOk = false;
|
|
64
|
-
const userAborted = () => Boolean(options?.signal?.aborted);
|
|
65
|
-
const runStep = async (step) => {
|
|
66
|
-
const display = `${step.command} ${step.argv.join(" ")}`;
|
|
67
|
-
options?.onOutput?.(`\n$ ${display}\n`, "stdout");
|
|
68
|
-
const beat = setInterval(() => {
|
|
69
|
-
options?.onOutput?.(`[recon] ${step.key} still running…\n`, "stdout");
|
|
70
|
-
}, 5_000);
|
|
71
|
-
beat.unref?.();
|
|
72
|
-
try {
|
|
73
|
-
if (step.key === "nmap") {
|
|
74
|
-
const estimate = estimateScanResources(step.argv);
|
|
75
|
-
if (args.background === true || args.responder === true) {
|
|
76
|
-
const prepared = await prepareDurableNmapJob(step.argv, options, "Enter your password for the durable nmap raw-socket scan. It is sent only to sudo stdin and is never stored. Esc cancels.");
|
|
77
|
-
const result = prepared.prepared
|
|
78
|
-
? await jobManager.startJob(prepared.spec, {
|
|
79
|
-
name: `recon-${estimate.profile}-${host.value}`,
|
|
80
|
-
profile: estimate.profile,
|
|
81
|
-
estimatedSeconds: estimate.estimatedSeconds,
|
|
82
|
-
...responderJobOptions(options),
|
|
83
|
-
responder: args.responder === true,
|
|
84
|
-
wakeOnCompletion: args.responder === true,
|
|
85
|
-
...(options?.engagementAuthorization
|
|
86
|
-
? { authorization: options.engagementAuthorization }
|
|
87
|
-
: {}),
|
|
88
|
-
})
|
|
89
|
-
: prepared.result;
|
|
90
|
-
return { key: step.key, display, result };
|
|
91
|
-
}
|
|
92
|
-
return {
|
|
93
|
-
key: step.key,
|
|
94
|
-
display,
|
|
95
|
-
result: await runNmapScan(step.argv, options, optionalNumber(args, "timeoutMs")),
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
if (step.key === "dns") {
|
|
99
|
-
return {
|
|
100
|
-
key: step.key,
|
|
101
|
-
display: `native DNS ANY ${host.value}`,
|
|
102
|
-
result: await nativeDnsLookup(host.value, "ANY"),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
if (step.key === "whois") {
|
|
106
|
-
return {
|
|
107
|
-
key: step.key,
|
|
108
|
-
display: `native WHOIS ${host.value}`,
|
|
109
|
-
result: await nativeWhoisLookup(host.value),
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
const timeoutMs = step.key === "whois" ? 20_000 : 30_000;
|
|
113
|
-
return {
|
|
114
|
-
key: step.key,
|
|
115
|
-
display,
|
|
116
|
-
result: await spawnArgv({
|
|
117
|
-
command: step.command,
|
|
118
|
-
argv: step.argv,
|
|
119
|
-
timeoutMs,
|
|
120
|
-
signal: options?.signal,
|
|
121
|
-
onOutput: options?.onOutput,
|
|
122
|
-
}),
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
catch (error) {
|
|
126
|
-
return {
|
|
127
|
-
key: step.key,
|
|
128
|
-
display,
|
|
129
|
-
result: {
|
|
130
|
-
ok: false,
|
|
131
|
-
output: `${step.key} error: ${error instanceof Error ? error.message : String(error)}`,
|
|
132
|
-
exitCode: 1,
|
|
133
|
-
},
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
finally {
|
|
137
|
-
clearInterval(beat);
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
const completed = await Promise.all(steps.map(runStep));
|
|
141
|
-
for (const { display, result } of completed) {
|
|
142
|
-
transcript.push(`$ ${display}`, result.output);
|
|
143
|
-
outputs.push(result.output);
|
|
144
|
-
if (result.ok)
|
|
145
|
-
anyOk = true;
|
|
146
|
-
}
|
|
147
|
-
if (artifactPath) {
|
|
148
|
-
const body = transcript.join("\n\n");
|
|
149
|
-
try {
|
|
150
|
-
await writeFile(artifactPath, body, { encoding: "utf8", mode: 0o600 });
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
artifactPath = undefined;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
const aborted = userAborted();
|
|
157
|
-
const nmapResult = completed.find((entry) => entry.key === "nmap")?.result;
|
|
158
|
-
const requestedScanFailed = wantNmap && Boolean(nmapResult && !nmapResult.ok);
|
|
159
|
-
const backgroundJob = completed.find((entry) => entry.result.backgroundJob)
|
|
160
|
-
?.result.backgroundJob;
|
|
161
|
-
const output = outputs.join("\n\n");
|
|
162
|
-
return {
|
|
163
|
-
ok: !aborted && anyOk && !requestedScanFailed,
|
|
164
|
-
output: aborted
|
|
165
|
-
? `${output}\n\nCommand aborted.`.trim()
|
|
166
|
-
: requestedScanFailed
|
|
167
|
-
? `${output}\n\nThe requested nmap scan failed or was not started; passive recon results above are partial only.`.trim()
|
|
168
|
-
: output,
|
|
169
|
-
exitCode: aborted ? 130 : anyOk && !requestedScanFailed ? 0 : 1,
|
|
170
|
-
...(artifactPath ? { outputPath: artifactPath } : {}),
|
|
171
|
-
...(backgroundJob ? { backgroundJob } : {}),
|
|
172
|
-
};
|
|
173
|
-
},
|
|
174
|
-
async "pentest.webDiscover"(args, options) {
|
|
175
|
-
const paths = Array.isArray(args.paths)
|
|
176
|
-
? args.paths.filter((value) => typeof value === "string")
|
|
177
|
-
: [];
|
|
178
|
-
return discoverWebSurface(requireString(args, "baseUrl"), paths, options);
|
|
179
|
-
},
|
|
180
|
-
async "pentest.apiEnumerate"(args, options) {
|
|
181
|
-
return enumerateApi(requireString(args, "specUrl"), options);
|
|
182
|
-
},
|
|
183
|
-
async "pentest.authCompare"(args, options) {
|
|
184
|
-
const contexts = Array.isArray(args.contexts)
|
|
185
|
-
? args.contexts.filter((value) => {
|
|
186
|
-
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
187
|
-
return false;
|
|
188
|
-
const candidate = value;
|
|
189
|
-
return (typeof candidate.label === "string" &&
|
|
190
|
-
Boolean(candidate.headers) &&
|
|
191
|
-
typeof candidate.headers === "object" &&
|
|
192
|
-
!Array.isArray(candidate.headers));
|
|
193
|
-
})
|
|
194
|
-
: [];
|
|
195
|
-
return compareAuthorizationContexts(requireString(args, "url"), contexts, options);
|
|
196
|
-
},
|
|
197
|
-
async "pentest.scanStatus"(args) {
|
|
198
|
-
const offset = optionalNumber(args, "offset");
|
|
199
|
-
const bytes = optionalNumber(args, "bytes");
|
|
200
|
-
const stream = optionalString(args, "stream");
|
|
201
|
-
return jobManager.tailJob(requireString(args, "id"), {
|
|
202
|
-
...(offset !== undefined ? { offset } : {}),
|
|
203
|
-
...(bytes !== undefined ? { bytes } : {}),
|
|
204
|
-
...(stream !== undefined ? { stream } : {}),
|
|
205
|
-
});
|
|
206
|
-
},
|
|
207
|
-
};
|
|
208
|
-
//# sourceMappingURL=pentest.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pentest.js","sourceRoot":"","sources":["../../../src/tools/handlers/pentest.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import type { ToolResult } from "../types.js";
|
|
2
|
-
export interface NetworkInterfaceInfo {
|
|
3
|
-
name: string;
|
|
4
|
-
address: string;
|
|
5
|
-
family: "IPv4" | "IPv6";
|
|
6
|
-
netmask?: string | undefined;
|
|
7
|
-
cidr?: string | undefined;
|
|
8
|
-
mac?: string | undefined;
|
|
9
|
-
internal: boolean;
|
|
10
|
-
defaultRoute?: boolean | undefined;
|
|
11
|
-
gateway?: string | undefined;
|
|
12
|
-
}
|
|
13
|
-
export interface NetworkContextResult {
|
|
14
|
-
hostname: string;
|
|
15
|
-
platform: NodeJS.Platform;
|
|
16
|
-
interfaces: NetworkInterfaceInfo[];
|
|
17
|
-
candidates: NetworkInterfaceInfo[];
|
|
18
|
-
selected?: NetworkInterfaceInfo | undefined;
|
|
19
|
-
warnings?: string[] | undefined;
|
|
20
|
-
}
|
|
21
|
-
export declare function netmaskToCidr(netmask: string): number | undefined;
|
|
22
|
-
export declare function getNetworkContext(): Promise<ToolResult>;
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { networkInterfaces, hostname, platform } from "node:os";
|
|
2
|
-
import { execSync } from "node:child_process";
|
|
3
|
-
export function netmaskToCidr(netmask) {
|
|
4
|
-
const parts = netmask.split(".");
|
|
5
|
-
if (parts.length !== 4)
|
|
6
|
-
return undefined;
|
|
7
|
-
let bits = 0;
|
|
8
|
-
for (const part of parts) {
|
|
9
|
-
const n = Number(part);
|
|
10
|
-
if (Number.isNaN(n) || n < 0 || n > 255)
|
|
11
|
-
return undefined;
|
|
12
|
-
bits += n.toString(2).split("1").length - 1;
|
|
13
|
-
}
|
|
14
|
-
return bits;
|
|
15
|
-
}
|
|
16
|
-
function isPrivateV4(address) {
|
|
17
|
-
const parts = address.split(".").map(Number);
|
|
18
|
-
const [a, b] = parts;
|
|
19
|
-
if (a === 10)
|
|
20
|
-
return true;
|
|
21
|
-
if (a === 172 && b !== undefined && b >= 16 && b <= 31)
|
|
22
|
-
return true;
|
|
23
|
-
if (a === 192 && b === 168)
|
|
24
|
-
return true;
|
|
25
|
-
if (a === 169 && b === 254)
|
|
26
|
-
return true;
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
function detectGateway() {
|
|
30
|
-
const os = platform();
|
|
31
|
-
try {
|
|
32
|
-
if (os === "darwin") {
|
|
33
|
-
const out = execSync("route -n get default 2>/dev/null", {
|
|
34
|
-
timeout: 5_000,
|
|
35
|
-
encoding: "utf8",
|
|
36
|
-
});
|
|
37
|
-
const match = /gateway:\s+(\S+)/i.exec(out);
|
|
38
|
-
return match?.[1];
|
|
39
|
-
}
|
|
40
|
-
if (os === "linux") {
|
|
41
|
-
const out = execSync("ip route show default 2>/dev/null", {
|
|
42
|
-
timeout: 5_000,
|
|
43
|
-
encoding: "utf8",
|
|
44
|
-
});
|
|
45
|
-
const match = /via\s+(\S+)/i.exec(out);
|
|
46
|
-
return match?.[1];
|
|
47
|
-
}
|
|
48
|
-
if (os === "win32") {
|
|
49
|
-
const out = execSync('powershell -Command "(Get-NetRoute -DestinationPrefix 0.0.0.0/0 | Select-Object -First 1).NextHop"', { timeout: 5_000, encoding: "utf8" });
|
|
50
|
-
const trimmed = out.trim();
|
|
51
|
-
return trimmed || undefined;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
}
|
|
56
|
-
return undefined;
|
|
57
|
-
}
|
|
58
|
-
function sameSubnet(addr, gateway, prefix) {
|
|
59
|
-
const toBits = (ip) => {
|
|
60
|
-
const parts = ip.split(".").map(Number);
|
|
61
|
-
return ((parts[0] << 24) | (parts[1] << 16) | (parts[2] << 8) | parts[3]) >>> 0;
|
|
62
|
-
};
|
|
63
|
-
const mask = prefix === 0 ? 0 : (~0 << (32 - prefix)) >>> 0;
|
|
64
|
-
return (toBits(addr) & mask) === (toBits(gateway) & mask);
|
|
65
|
-
}
|
|
66
|
-
export async function getNetworkContext() {
|
|
67
|
-
const ifaces = networkInterfaces();
|
|
68
|
-
const all = [];
|
|
69
|
-
const warnings = [];
|
|
70
|
-
const gateway = detectGateway();
|
|
71
|
-
for (const [name, addrs] of Object.entries(ifaces)) {
|
|
72
|
-
if (!addrs)
|
|
73
|
-
continue;
|
|
74
|
-
for (const addr of addrs) {
|
|
75
|
-
all.push({
|
|
76
|
-
name,
|
|
77
|
-
address: addr.address,
|
|
78
|
-
family: addr.family,
|
|
79
|
-
netmask: addr.netmask,
|
|
80
|
-
cidr: addr.cidr ?? undefined,
|
|
81
|
-
mac: addr.mac,
|
|
82
|
-
internal: addr.internal,
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const candidates = all.filter((iface) => iface.family === "IPv4" &&
|
|
87
|
-
!iface.internal &&
|
|
88
|
-
isPrivateV4(iface.address));
|
|
89
|
-
let selected;
|
|
90
|
-
if (gateway && candidates.length > 0) {
|
|
91
|
-
for (const candidate of candidates) {
|
|
92
|
-
const prefix = candidate.netmask
|
|
93
|
-
? netmaskToCidr(candidate.netmask)
|
|
94
|
-
: undefined;
|
|
95
|
-
if (prefix !== undefined && sameSubnet(candidate.address, gateway, prefix)) {
|
|
96
|
-
selected = {
|
|
97
|
-
...candidate,
|
|
98
|
-
defaultRoute: true,
|
|
99
|
-
gateway,
|
|
100
|
-
};
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
if (!selected && candidates.length > 0) {
|
|
105
|
-
selected = { ...candidates[0], gateway };
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
else if (candidates.length === 1) {
|
|
109
|
-
selected = candidates[0];
|
|
110
|
-
}
|
|
111
|
-
else if (candidates.length > 1) {
|
|
112
|
-
warnings.push(`Multiple network interfaces found (${candidates.map((c) => `${c.name}:${c.address}`).join(", ")}). Could not determine default route.`);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
warnings.push("No active private IPv4 interfaces detected.");
|
|
116
|
-
}
|
|
117
|
-
const result = {
|
|
118
|
-
hostname: hostname(),
|
|
119
|
-
platform: platform(),
|
|
120
|
-
interfaces: all,
|
|
121
|
-
candidates,
|
|
122
|
-
selected,
|
|
123
|
-
warnings: warnings.length > 0 ? warnings : undefined,
|
|
124
|
-
};
|
|
125
|
-
return {
|
|
126
|
-
ok: candidates.length > 0,
|
|
127
|
-
output: JSON.stringify(result, null, 2),
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
//# sourceMappingURL=network-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"network-context.js","sourceRoot":"","sources":["../../src/tools/network-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { ToolResult } from "../types.js";
|
|
2
|
-
import type { ToolRunOptions } from "./tool-types.js";
|
|
3
|
-
export type NmapScanDepth = "standard" | "deep" | "full";
|
|
4
|
-
export interface NmapTimeoutPolicy {
|
|
5
|
-
readonly depth: NmapScanDepth;
|
|
6
|
-
readonly timeoutMs: number;
|
|
7
|
-
readonly source: "profile" | "environment" | "call";
|
|
8
|
-
}
|
|
9
|
-
export declare function resolveNmapTimeoutPolicy(argv: readonly string[], env?: NodeJS.ProcessEnv): NmapTimeoutPolicy;
|
|
10
|
-
export declare function runNmapScan(argv: string[], options?: ToolRunOptions, timeoutMsOverride?: number): Promise<ToolResult>;
|
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { platform } from "node:os";
|
|
2
|
-
import { commandAvailable } from "../os/pkgmgr.js";
|
|
3
|
-
import { evictSudoSession, formatSudoStdinPassword, looksLikeSudoAuthError, obtainSudoPassword, } from "./sudo-session.js";
|
|
4
|
-
import { getAllowInteractiveStdinInherit, spawnArgv, } from "./shell.js";
|
|
5
|
-
import { isNmapSingleHostTarget, looksLikeNmapNoHostsUp, nmapArgvHasPn, nmapScanNeedsPrivilege, toConnectScanArgv, withNmapSkipDiscovery, } from "./validate.js";
|
|
6
|
-
async function elevationPrefix() {
|
|
7
|
-
if (process.getuid && process.getuid() === 0) {
|
|
8
|
-
return { command: "", argv: [] };
|
|
9
|
-
}
|
|
10
|
-
if (platform() === "win32") {
|
|
11
|
-
if (await commandAvailable("sudo"))
|
|
12
|
-
return { command: "sudo", argv: [] };
|
|
13
|
-
if (await commandAvailable("gsudo"))
|
|
14
|
-
return { command: "gsudo", argv: [] };
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
if (await commandAvailable("sudo")) {
|
|
18
|
-
return { command: "sudo", argv: ["-p", "[clai] sudo password for nmap: "] };
|
|
19
|
-
}
|
|
20
|
-
if (await commandAvailable("doas"))
|
|
21
|
-
return { command: "doas", argv: [] };
|
|
22
|
-
return undefined;
|
|
23
|
-
}
|
|
24
|
-
function looksLikePrivilegeError(output) {
|
|
25
|
-
return /(?:requires root privileges|you (?:requested|need) (?:a scan type|root)|operation not permitted|must (?:be|run as) root|raw sockets?|sudo: (?:a (?:password|terminal) is required|no askpass|3 incorrect)|incorrect password|authentication failure|permission denied|requires (?:administrator|elevation))/i.test(output);
|
|
26
|
-
}
|
|
27
|
-
function canInteractiveSudo() {
|
|
28
|
-
return Boolean(process.stdin.isTTY);
|
|
29
|
-
}
|
|
30
|
-
const NMAP_TIMEOUTS_MS = {
|
|
31
|
-
standard: 5 * 60_000,
|
|
32
|
-
deep: 15 * 60_000,
|
|
33
|
-
full: 45 * 60_000,
|
|
34
|
-
};
|
|
35
|
-
export function resolveNmapTimeoutPolicy(argv, env = process.env) {
|
|
36
|
-
const configured = Number(env.CLAI_NMAP_TIMEOUT_MS);
|
|
37
|
-
if (Number.isSafeInteger(configured) && configured >= 30_000) {
|
|
38
|
-
return { depth: inferNmapScanDepth(argv), timeoutMs: configured, source: "environment" };
|
|
39
|
-
}
|
|
40
|
-
const depth = inferNmapScanDepth(argv);
|
|
41
|
-
return { depth, timeoutMs: NMAP_TIMEOUTS_MS[depth], source: "profile" };
|
|
42
|
-
}
|
|
43
|
-
function inferNmapScanDepth(argv) {
|
|
44
|
-
if (argv.includes("-p-"))
|
|
45
|
-
return "full";
|
|
46
|
-
const portsIndex = argv.findIndex((arg) => arg === "-p");
|
|
47
|
-
const portSpec = portsIndex >= 0 ? argv[portsIndex + 1] ?? "" : "";
|
|
48
|
-
if (/^(?:1-65535|1-65534|0-65535)$/.test(portSpec))
|
|
49
|
-
return "full";
|
|
50
|
-
const explicitPorts = portSpec ? portSpec.split(",").length : 0;
|
|
51
|
-
const topPortsIndex = argv.findIndex((arg) => arg === "--top-ports");
|
|
52
|
-
const topPorts = topPortsIndex >= 0 ? Number(argv[topPortsIndex + 1]) : 0;
|
|
53
|
-
const hasDeepEnumeration = argv.some((arg) => arg === "-sV" || arg === "-sC" || arg === "-A" || arg.startsWith("--script"));
|
|
54
|
-
if (topPorts > 1_000 || explicitPorts > 1_000 || hasDeepEnumeration)
|
|
55
|
-
return "deep";
|
|
56
|
-
return "standard";
|
|
57
|
-
}
|
|
58
|
-
export async function runNmapScan(argv, options, timeoutMsOverride) {
|
|
59
|
-
let scanArgv = isNmapSingleHostTarget(argv) && !nmapArgvHasPn(argv)
|
|
60
|
-
? withNmapSkipDiscovery(argv)
|
|
61
|
-
: [...argv];
|
|
62
|
-
const needsPrivilege = nmapScanNeedsPrivilege(scanArgv);
|
|
63
|
-
const prefix = needsPrivilege ? await elevationPrefix() : undefined;
|
|
64
|
-
const attempts = [];
|
|
65
|
-
if (needsPrivilege && prefix) {
|
|
66
|
-
if (prefix.command === "sudo") {
|
|
67
|
-
const useSecret = Boolean(options?.requestSecret);
|
|
68
|
-
const useTty = !useSecret &&
|
|
69
|
-
canInteractiveSudo() &&
|
|
70
|
-
getAllowInteractiveStdinInherit();
|
|
71
|
-
if (!useSecret && !useTty) {
|
|
72
|
-
options?.onOutput?.("\nCannot prompt for sudo password in this UI without freezing it. Using an unprivileged TCP connect scan (-sT -Pn).\n", "stderr");
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
options?.onOutput?.(useSecret
|
|
76
|
-
? "\nAdministrator access is required for a stealth scan. Complete the secure password prompt below.\n"
|
|
77
|
-
: "\nAdministrator access is required for a stealth scan. Enter your sudo password below; Ctrl+C cancels.\n", "stdout");
|
|
78
|
-
if (useSecret && options?.requestSecret) {
|
|
79
|
-
const auth = await obtainSudoPassword({
|
|
80
|
-
requestSecret: options.requestSecret,
|
|
81
|
-
title: "Administrator access",
|
|
82
|
-
prompt: "Enter your password for sudo (nmap raw-socket scan). It is sent only to sudo, kept in memory for a few minutes so parallel privileged scans don't ask again, and never written to disk. Esc cancels.",
|
|
83
|
-
...(options.signal ? { signal: options.signal } : {}),
|
|
84
|
-
...(options.onOutput ? { onOutput: options.onOutput } : {}),
|
|
85
|
-
});
|
|
86
|
-
if (auth.status === "cancelled") {
|
|
87
|
-
options?.onOutput?.("\nSudo cancelled — falling back to unprivileged TCP connect scan (-sT -Pn).\n", "stderr");
|
|
88
|
-
}
|
|
89
|
-
else if (auth.status === "failed") {
|
|
90
|
-
const detail = auth.detail ? `\n${auth.detail}` : "";
|
|
91
|
-
options?.onOutput?.(`\nSudo authentication failed; using an unprivileged TCP connect scan instead.${detail}\n`, "stderr");
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
attempts.push({
|
|
95
|
-
command: "sudo",
|
|
96
|
-
argv: ["-S", "-p", "", "nmap", ...scanArgv],
|
|
97
|
-
stdinText: formatSudoStdinPassword(auth.password),
|
|
98
|
-
interactiveStdin: false,
|
|
99
|
-
note: "Administrator access confirmed. Starting stealth scan (ESC cancels).",
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
const auth = await spawnArgv({
|
|
105
|
-
command: "sudo",
|
|
106
|
-
argv: [...prefix.argv, "-v"],
|
|
107
|
-
timeoutMs: 120_000,
|
|
108
|
-
signal: options?.signal,
|
|
109
|
-
onOutput: options?.onOutput,
|
|
110
|
-
interactiveStdin: true,
|
|
111
|
-
noArtifact: true,
|
|
112
|
-
});
|
|
113
|
-
if (options?.signal?.aborted)
|
|
114
|
-
return auth;
|
|
115
|
-
if (auth.exitCode === 130) {
|
|
116
|
-
options?.onOutput?.("\nSudo authentication was cancelled; using an unprivileged TCP connect scan instead. Authentication will not be reopened automatically.\n", "stderr");
|
|
117
|
-
}
|
|
118
|
-
else if (auth.ok) {
|
|
119
|
-
attempts.push({
|
|
120
|
-
command: "sudo",
|
|
121
|
-
argv: ["-n", "nmap", ...scanArgv],
|
|
122
|
-
interactiveStdin: false,
|
|
123
|
-
note: "Administrator access confirmed. Starting stealth scan (ESC cancels).",
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
const detail = auth.output?.trim()
|
|
128
|
-
? `\n${auth.output.trim().slice(0, 400)}`
|
|
129
|
-
: "";
|
|
130
|
-
options?.onOutput?.(`\nSudo authentication failed or was not completed; using an unprivileged TCP connect scan instead.${detail}\n`, "stderr");
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
else if (prefix.command) {
|
|
136
|
-
if (getAllowInteractiveStdinInherit()) {
|
|
137
|
-
attempts.push({
|
|
138
|
-
command: prefix.command,
|
|
139
|
-
argv: [...prefix.argv, "nmap", ...scanArgv],
|
|
140
|
-
interactiveStdin: true,
|
|
141
|
-
note: `Running a stealth scan with ${prefix.command} (you may be prompted for your password).`,
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
else {
|
|
145
|
-
options?.onOutput?.(`\n${prefix.command} would need a TTY password prompt (blocked in this UI). Using unprivileged TCP connect scan (-sT -Pn).\n`, "stderr");
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
else {
|
|
149
|
-
attempts.push({ command: "nmap", argv: scanArgv, interactiveStdin: false });
|
|
150
|
-
}
|
|
151
|
-
const connectArgv = withNmapSkipDiscovery(toConnectScanArgv(scanArgv));
|
|
152
|
-
attempts.push({
|
|
153
|
-
command: "nmap",
|
|
154
|
-
argv: connectArgv,
|
|
155
|
-
note: "Privileged scan unavailable — falling back to an unprivileged TCP connect scan (-sT -Pn).",
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
else if (needsPrivilege && !prefix) {
|
|
159
|
-
attempts.push({
|
|
160
|
-
command: "nmap",
|
|
161
|
-
argv: withNmapSkipDiscovery(toConnectScanArgv(scanArgv)),
|
|
162
|
-
note: platform() === "win32"
|
|
163
|
-
? "No elevation helper found (sudo/gsudo). Run from an Administrator terminal with Npcap for a SYN scan; using a TCP connect scan (-sT -Pn) for now."
|
|
164
|
-
: "No sudo/doas available for a raw-socket SYN scan — using an unprivileged TCP connect scan (-sT -Pn) instead.",
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
attempts.push({ command: "nmap", argv: scanArgv });
|
|
169
|
-
}
|
|
170
|
-
const configuredPolicy = resolveNmapTimeoutPolicy(scanArgv);
|
|
171
|
-
const timeoutPolicy = typeof timeoutMsOverride === "number" && Number.isFinite(timeoutMsOverride)
|
|
172
|
-
? {
|
|
173
|
-
...configuredPolicy,
|
|
174
|
-
timeoutMs: Math.max(1_000, Math.min(30 * 60_000, Math.floor(timeoutMsOverride))),
|
|
175
|
-
source: "call",
|
|
176
|
-
}
|
|
177
|
-
: configuredPolicy;
|
|
178
|
-
options?.onOutput?.(`[nmap] ${timeoutPolicy.depth} scan timeout: ${Math.round(timeoutPolicy.timeoutMs / 60_000)}m (${timeoutPolicy.source})\n`, "stdout");
|
|
179
|
-
let last;
|
|
180
|
-
for (let i = 0; i < attempts.length; i += 1) {
|
|
181
|
-
const attempt = attempts[i];
|
|
182
|
-
if (options?.signal?.aborted) {
|
|
183
|
-
return { ok: false, output: "Command aborted.", exitCode: 130 };
|
|
184
|
-
}
|
|
185
|
-
if (attempt.note)
|
|
186
|
-
options?.onOutput?.(`\n${attempt.note}\n`, "stdout");
|
|
187
|
-
let result = await spawnArgv({
|
|
188
|
-
command: attempt.command,
|
|
189
|
-
argv: attempt.argv,
|
|
190
|
-
stdinText: attempt.stdinText,
|
|
191
|
-
timeoutMs: timeoutPolicy.timeoutMs,
|
|
192
|
-
signal: options?.signal,
|
|
193
|
-
onOutput: options?.onOutput,
|
|
194
|
-
...(attempt.interactiveStdin !== undefined
|
|
195
|
-
? { interactiveStdin: attempt.interactiveStdin }
|
|
196
|
-
: {}),
|
|
197
|
-
});
|
|
198
|
-
if (result.ok &&
|
|
199
|
-
looksLikeNmapNoHostsUp(result.output) &&
|
|
200
|
-
!nmapArgvHasPn(attempt.argv) &&
|
|
201
|
-
isNmapSingleHostTarget(attempt.argv)) {
|
|
202
|
-
options?.onOutput?.("\nHost discovery reported no hosts up — retrying once with -Pn (treat host as online).\n", "stdout");
|
|
203
|
-
result = await spawnArgv({
|
|
204
|
-
command: attempt.command,
|
|
205
|
-
argv: withNmapSkipDiscovery(attempt.argv),
|
|
206
|
-
stdinText: attempt.stdinText,
|
|
207
|
-
timeoutMs: timeoutPolicy.timeoutMs,
|
|
208
|
-
signal: options?.signal,
|
|
209
|
-
onOutput: options?.onOutput,
|
|
210
|
-
...(attempt.interactiveStdin !== undefined
|
|
211
|
-
? { interactiveStdin: attempt.interactiveStdin }
|
|
212
|
-
: {}),
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
last = result;
|
|
216
|
-
if (!result.ok &&
|
|
217
|
-
attempt.stdinText !== undefined &&
|
|
218
|
-
looksLikeSudoAuthError(result.output)) {
|
|
219
|
-
evictSudoSession();
|
|
220
|
-
}
|
|
221
|
-
const isLastAttempt = i === attempts.length - 1;
|
|
222
|
-
if (result.ok || isLastAttempt || !looksLikePrivilegeError(result.output)) {
|
|
223
|
-
if (result.ok &&
|
|
224
|
-
looksLikeNmapNoHostsUp(result.output) &&
|
|
225
|
-
isNmapSingleHostTarget(attempt.argv)) {
|
|
226
|
-
return {
|
|
227
|
-
...result,
|
|
228
|
-
output: result.output +
|
|
229
|
-
"\n\nNote: nmap still reported no live host/open ports after -Pn. " +
|
|
230
|
-
"The target may be offline, firewalled, or blocking this host. " +
|
|
231
|
-
"Do not retry the same net.scan args in a loop — try different ports, " +
|
|
232
|
-
"confirm the IP with net.context / net.pingSweep, or use shell.exec for a custom nmap line.",
|
|
233
|
-
};
|
|
234
|
-
}
|
|
235
|
-
return result;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return last ?? { ok: false, output: "nmap produced no result.", exitCode: 1 };
|
|
239
|
-
}
|
|
240
|
-
//# sourceMappingURL=nmap-runner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nmap-runner.js","sourceRoot":"","sources":["../../src/tools/nmap-runner.ts"],"names":[],"mappings":"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"}
|