pentesting 0.7.13 → 0.7.15

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.
Files changed (3) hide show
  1. package/README.md +31 -17
  2. package/dist/index.js +43 -9
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -222,29 +222,43 @@ agent.abort(); // Complete stop
222
222
 
223
223
  ---
224
224
 
225
- ## 🐳 Docker Environment
225
+ ## 🐳 Docker Toolkit (Auto-Managed)
226
+
227
+ Pentesting automatically manages a Docker container with 50+ pre-installed tools.
228
+
229
+ ### Automatic Setup
230
+
231
+ **No manual Docker setup required!** When you run a command that needs tools like `nmap` or `rustscan`:
232
+
233
+ 1. Pentesting checks if tool exists locally
234
+ 2. If not, it automatically pulls `agnusdei1207/pentesting-tools:latest`
235
+ 3. Starts container `pentesting-tools` with host network
236
+ 4. Executes command via `docker exec`
237
+
238
+ ### Manual Docker Control
226
239
 
227
240
  ```bash
228
- # Pull pre-built toolkit (50+ tools)
229
- docker pull agnusdei1207/pentesting-tools:latest
241
+ # Force all commands through Docker
242
+ export PENTESTING_DOCKER=1
230
243
 
231
- # Run with host network (required for target access)
232
- docker run -d --name pentesting-tools --network host \
233
- -v $(pwd)/workspace:/pentest \
234
- agnusdei1207/pentesting-tools:latest
244
+ # Use custom container name
245
+ export PENTESTING_CONTAINER=my-pentest-container
235
246
 
236
- # Execute tools
237
- docker exec -it pentesting-tools nmap -sCV 10.0.0.1
247
+ # Manual pull (optional - auto-pulled on first use)
248
+ docker pull agnusdei1207/pentesting-tools:latest
238
249
  ```
239
250
 
240
- ### Included Tools
241
- - **Network**: nmap, rustscan, masscan, netcat
242
- - **Web**: ffuf, nikto, sqlmap, httpx
243
- - **Discovery**: subfinder, amass, nuclei
244
- - **Service**: snmpwalk, nbtscan, hydra, smbclient
245
- - **AD/Windows**: impacket, crackmapexec
246
- - **Database**: mysql-client, postgresql-client, redis-tools
247
- - **Utilities**: curl, wget, jq, python3
251
+ ### Included Tools (50+)
252
+
253
+ | Category | Tools |
254
+ |----------|-------|
255
+ | **Network** | nmap, rustscan, masscan, netcat, tcpdump |
256
+ | **Web** | ffuf, nikto, sqlmap, httpx, whatweb |
257
+ | **Discovery** | subfinder, amass, nuclei, dnsrecon |
258
+ | **Bruteforce** | hydra, hashcat, john |
259
+ | **AD/Windows** | impacket, crackmapexec, smbclient |
260
+ | **Database** | mysql-client, postgresql-client, redis-tools |
261
+ | **Utilities** | curl, wget, jq, python3, go |
248
262
 
249
263
  ---
250
264
 
package/dist/index.js CHANGED
@@ -1317,8 +1317,10 @@ import { promisify } from "util";
1317
1317
  import * as fs from "fs/promises";
1318
1318
  import * as path from "path";
1319
1319
  var execAsync = promisify(exec);
1320
+ var DOCKER_IMAGE = "agnusdei1207/pentesting-tools:latest";
1320
1321
  var DOCKER_CONTAINER = process.env.PENTESTING_CONTAINER || "pentesting-tools";
1321
1322
  var FORCE_DOCKER = process.env.PENTESTING_DOCKER === "1";
1323
+ var dockerStarted = false;
1322
1324
  var DOCKER_TOOLS = [
1323
1325
  // Network scanning
1324
1326
  TOOL_NAME.RUSTSCAN,
@@ -1392,14 +1394,37 @@ var DOCKER_TOOLS = [
1392
1394
  TOOL_NAME.CHECK_SUDO,
1393
1395
  TOOL_NAME.FIND_SUID
1394
1396
  ];
1395
- async function isDockerAvailable() {
1397
+ async function ensureDockerContainer() {
1398
+ if (dockerStarted) return true;
1396
1399
  try {
1397
- await execAsync(`docker inspect ${DOCKER_CONTAINER} --format='{{.State.Running}}'`);
1400
+ const { stdout } = await execAsync(`docker inspect ${DOCKER_CONTAINER} --format='{{.State.Running}}'`);
1401
+ if (stdout.trim() === "true") {
1402
+ dockerStarted = true;
1403
+ return true;
1404
+ }
1405
+ await execAsync(`docker start ${DOCKER_CONTAINER}`);
1406
+ dockerStarted = true;
1407
+ console.log(`[Docker] Started container: ${DOCKER_CONTAINER}`);
1398
1408
  return true;
1399
1409
  } catch {
1400
- return false;
1410
+ try {
1411
+ console.log(`[Docker] Pulling and starting ${DOCKER_IMAGE}...`);
1412
+ await execAsync(`docker run -d --name ${DOCKER_CONTAINER} --network host ${DOCKER_IMAGE}`, {
1413
+ timeout: 12e4
1414
+ // 2 min timeout for pull
1415
+ });
1416
+ dockerStarted = true;
1417
+ console.log(`[Docker] Container ready: ${DOCKER_CONTAINER}`);
1418
+ return true;
1419
+ } catch (err) {
1420
+ console.error(`[Docker] Failed to start container: ${err}`);
1421
+ return false;
1422
+ }
1401
1423
  }
1402
1424
  }
1425
+ async function isDockerAvailable() {
1426
+ return await ensureDockerContainer();
1427
+ }
1403
1428
  async function commandExists(cmd) {
1404
1429
  try {
1405
1430
  await execAsync(`which ${cmd}`);
@@ -4885,11 +4910,20 @@ Use report_finding tool for important discoveries.
4885
4910
  toolInput,
4886
4911
  riskLevel: risk
4887
4912
  });
4888
- const decision = await this.approvalManager.requestApproval(
4889
- toolName,
4890
- toolInput,
4891
- `Executing ${toolName} (${risk} risk)`
4892
- );
4913
+ const decision = await new Promise((resolve) => {
4914
+ const handler = (response2) => {
4915
+ if (response2.requestId === block.id) {
4916
+ this.approvalManager.removeListener("approval_response", handler);
4917
+ if (response2.decision === "approve_always") {
4918
+ this.approvalManager.autoApprovedTools?.add(toolName);
4919
+ resolve("approve");
4920
+ } else {
4921
+ resolve(response2.decision);
4922
+ }
4923
+ }
4924
+ };
4925
+ this.approvalManager.on("approval_response", handler);
4926
+ });
4893
4927
  if (decision === "deny") {
4894
4928
  this.think(THOUGHT_TYPE.STUCK, `Tool denied by user: ${toolName}`);
4895
4929
  this.emit(AGENT_EVENT.TOOL_RESULT, {
@@ -7406,7 +7440,7 @@ ${list}`);
7406
7440
  state.target.discovered.length > 1 && ` (+${state.target.discovered.length - 1})`,
7407
7441
  state.findings.length > 0 && ` \u2502 ${state.findings.length} findings`,
7408
7442
  state.credentials.length > 0 && ` \u2502 ${state.credentials.length} creds`,
7409
- tokenUsage.total > 0 && ` \u2502 ${(tokenUsage.total / 1e3).toFixed(0)}k`
7443
+ tokenUsage.total > 0 && ` \u2502 ${(tokenUsage.total / 1e3).toFixed(0)}k tok`
7410
7444
  ] }),
7411
7445
  /* @__PURE__ */ jsxs2(Text2, { dimColor: true, children: [
7412
7446
  isProcessing && currentStatus && `${currentStatus.slice(0, 40)} \u2502 `,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pentesting",
3
- "version": "0.7.13",
3
+ "version": "0.7.15",
4
4
  "description": "Autonomous Penetration Testing AI Agent",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",