Skip to main content

Low-noise pentest orchestration: recon + scanning + passive checks normalized into one schema, deduplicated, and rendered to a professional PDF.

Project description

Pentest Framework

A modular, automated penetration-testing pipeline that orchestrates open-source tooling, normalizes results into a single schema, deduplicates, optionally enriches findings with an LLM, and produces a professional PDF report.

FOR AUTHORIZED SECURITY TESTING ONLY. Only run this against assets you own or have explicit written permission to test. The pipeline asks for an authorization confirmation before active testing (skippable with --no-confirm for automation).

Pipeline

target ─▶ recon ─▶ scanners ─▶ api_checks ─▶ aggregate ─▶ [enrich] ─▶ PDF report
         (subfinder/    (nuclei/    (headers/CORS/   (dedup +        (Claude,
          amass/httpx)   nikto)      exposed paths)   group)          optional)

Low-noise by design

Most header/recon scanners drown you in false positives. This one suppresses the common ones at the source:

  • Content-type-aware headers — CSP, X-Frame-Options, Referrer-Policy and Permissions-Policy are flagged only on rendered HTML documents, not on JSON APIs where they have no effect.
  • HSTS only over HTTPS — never reported on plaintext http:// targets, where the header is ignored by browsers.
  • SPA-fallback fingerprinting — a single-page-app catch-all that returns the index shell for every path is not reported as an "exposed endpoint".
  • CORS — flags the precise dangerous combination (reflected / null origin with credentials), not a correctly-configured allowlist.
  • One schema — every tool's output is normalized, deduplicated, and severity- escalated into a single finding shape.

Architecture

pentest-framework/            # repo root
├── pentest_framework/        # the package
│   ├── main.py               # full pipeline (CLI: pentest-framework)
│   ├── scan_local.py         # scan a locally-running app by URL
│   ├── recon/ scanner/ api_checks/ parser/ enrichment/ report/
│   ├── models/               # the single Finding schema + Severity
│   └── utils/                # logging, subprocess runner, scope handling
├── examples/                 # standalone usage examples
├── tests/                    # pytest unit tests
└── pyproject.toml  LICENSE  README.md

Install

pip install -e ".[ai]"        # editable install; '[ai]' adds optional Claude enrichment
# or runtime deps only:
pip install -r requirements.txt

Installs a pentest-framework console command (equivalent to python -m pentest_framework.main).

External CLI tools are not Python packages — install them separately and put them on $PATH:

Tool Role Link
subfinder subdomain enumeration (primary) https://github.com/projectdiscovery/subfinder
httpx liveness + tech fingerprinting https://github.com/projectdiscovery/httpx
nuclei vulnerability scanning (primary) https://github.com/projectdiscovery/nuclei
amass subdomain enumeration (fallback) https://github.com/owasp-amass/amass
nikto web-server scan (fallback) https://github.com/sullo/nikto

The pipeline degrades gracefully: missing tools are logged and skipped rather than crashing the run.

Usage

# Full run
python -m pentest_framework.main example.com

# With a scope file and AI enrichment
python -m pentest_framework.main example.com --scope scope.txt --enrich

# Scan a single IP, custom output dir, no interactive prompt
python -m pentest_framework.main 203.0.113.10 -o /output --no-confirm

Output (under --output, default output/):

  • pentest_report.pdf — the report
  • findings.json — normalized, deduplicated findings
  • recon.json — recon results
  • pentest.log — full run log

On success it prints:

Pentest completed. Report saved at output/pentest_report.pdf

Scope file format

# one entry per line; '#' comments allowed
example.com
api.example.com
*.staging.example.com
203.0.113.10

Any discovered host not matching an in-scope entry is dropped before probing.

Run modules independently

Each module is runnable on its own:

python -m pentest_framework.recon.recon example.com
python -m pentest_framework.scanner.scanner --url https://example.com
python -m pentest_framework.api_checks.api_checks https://example.com
python -m pentest_framework.parser.aggregator findings.json
python -m pentest_framework.enrichment.enrich findings.json
python -m pentest_framework.report.report findings.json --target example.com

AI-assisted enrichment

enhance_finding(finding) clarifies the description, adds realistic impact, and suggests remediation. It is strictly editorial — it never invents vulnerabilities and never changes severity/title/target/evidence.

  • With anthropic installed and ANTHROPIC_API_KEY set, it uses Claude (claude-opus-4-8 by default; override with ANTHROPIC_MODEL).
  • Otherwise it falls back to a safe offline heuristic that only fills obviously missing fields.

Scan a local app

recon resolves hostnames, so for an app on a non-standard port, target the URLs directly instead:

python -m pentest_framework.scan_local            # defaults: localhost:8080 + :8000
python -m pentest_framework.scan_local --targets http://localhost:3000/

Finding schema

{
  "title": "",
  "severity": "Critical | High | Medium | Low | Info",
  "description": "",
  "target": "",
  "evidence": "",
  "remediation": ""
}

Tests

pip install -e ".[dev]" && pytest

License

MIT — see LICENSE. For authorized security testing only; please read CONTRIBUTING.md before contributing.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pentest_framework-1.0.0.tar.gz (35.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pentest_framework-1.0.0-py3-none-any.whl (38.8 kB view details)

Uploaded Python 3

File details

Details for the file pentest_framework-1.0.0.tar.gz.

File metadata

  • Download URL: pentest_framework-1.0.0.tar.gz
  • Upload date:
  • Size: 35.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for pentest_framework-1.0.0.tar.gz
Algorithm Hash digest
SHA256 ce377bc188c16bca53bfe45fe4b701443e1afa2a8939370aa5ed21a26587bac0
MD5 6d91adb29f9562f94599dcace987ff2f
BLAKE2b-256 8d14b3dbb242f070dd06e427313e8829791f87f673fb1b4c62c28ba135505def

See more details on using hashes here.

File details

Details for the file pentest_framework-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for pentest_framework-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 53e1f1348a29060cfa3673b2519519c76d4c66197c89ce6c1de7bb38efd7e7a2
MD5 76f862e9384daf52cf7d7718a1972306
BLAKE2b-256 008e807488f75f165fb753e7f54738e67f0807f4689e705b3dad46331c7e3957

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page