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.
- package/README.md +31 -17
- package/dist/index.js +43 -9
- 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
|
|
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
|
-
#
|
|
229
|
-
|
|
241
|
+
# Force all commands through Docker
|
|
242
|
+
export PENTESTING_DOCKER=1
|
|
230
243
|
|
|
231
|
-
#
|
|
232
|
-
|
|
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
|
-
#
|
|
237
|
-
docker
|
|
247
|
+
# Manual pull (optional - auto-pulled on first use)
|
|
248
|
+
docker pull agnusdei1207/pentesting-tools:latest
|
|
238
249
|
```
|
|
239
250
|
|
|
240
|
-
### Included Tools
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
4889
|
-
|
|
4890
|
-
|
|
4891
|
-
|
|
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 `,
|