
pentest-ai v1.4.0
Pentester AI open-source che dimostra ogni scoperta. Gli oracoli automatici rieseguono ogni exploit; i bug verificati includono una capsula di prova che puoi riprodurre tu stesso.
pentest-ai
Non segnala. Dimostra.
Sito web · Installa · Perché la verifica · Benchmark · Limiti · Discord
⚠️ Strumenti offensivi, solo per test autorizzati. Installando accetti l'AUP e i Termini. Vedi Uso responsabile ↓
Due minuti, nessuna API key, nessun target tuo
pip install ptai && ptai demo
ptai demo scansiona un'app vulnerabile inclusa e stampa 4 findings, 3 oracle-VERIFIED.
Ne riproduce uno dal vivo da una proof capsule (replay 3/3), poi esegue le stesse route
in versione corretta e stampa 0 findings.
Due cose da notare. I findings compaiono e scompaiono con la vulnerabilità piuttosto che perché lo strumento è rimasto silenzioso — l'unica cosa cambiata tra le due esecuzioni è la correzione. E uno dei quattro resta un candidato: il bypass del login SQLi è reale, ma nessun oracle ha potuto ri-dimostrarlo su quella route, quindi non ottiene un badge. Quel divario è il prodotto che funziona, non un bug nella demo.
Cosa significa realmente VERIFIED qui
La maggior parte degli scanner ti dice che una cosa potrebbe essere sfruttabile e lascia a te il triage. ptai tratta un finding come un candidato finché un oracle macchina nominato non riesegue l'exploit e lo riproduce N volte su N. Solo allora ottiene VERIFIED.
Tre proprietà rendono questo più di uno slogan:
Nessun LLM produce mai un verdetto. La regola è applicata nel codice, non da una policy: un verdetto che non può nominare l'oracle che se l'è guadagnato viene rifiutato. Un LLM coordina l'esecuzione e ragiona sui risultati. Non decide mai se un bug è reale.
Ogni oracle ha un controllo che deve fallire. Un bypass trusted-header deve restituire contenuto privilegiato con l'header e un rifiuto senza di esso. Un controllo di credenziali leaked deve essere accettato per il segreto reale e rifiutato per un gemello deliberatamente corrotto. Un endpoint che risponde 200 a tutto non guadagna nulla. Questo è ciò che impedisce che "ha restituito 200" venga scambiato per prova.
L'output di scanner di terze parti viene trattenuto. I risultati di nuclei, nikto e zap non diventano findings sulla loro sola autorità. Restano non verificati finché uno degli oracle di ptai non li ri-dimostra in modo indipendente.
Ogni finding VERIFIED viene fornito come una proof capsule portabile — il finding, la
ricetta per ri-dimostrarlo e la ricevuta. Chiunque può eseguire ptai replay contro il
target live e vedere l'oracle ri-confermare, senza fidarsi di ptai. Le capsule sono
deliberatamente non firmate: il replay è il meccanismo di fiducia, non una firma che devi
accettare per fede.
Numeri onesti
| Classi di vulnerabilità con un oracle funzionante | 14 |
| Probe nella libreria | 64 |
| Probe che possono ottenere VERIFIED | 30 |
| Tipi di oracle | 24 |
| Wrapper di strumenti | 203 |
| …che oggi trasformano l'output in findings | 18 |
| Strumenti MCP | 52 |
| Agenti specializzati | 18 |
| Test | 2.729 su Python 3.10 / 3.12 / 3.14 |
Su un honeypot deliberatamente vulnerabile, 23 findings si verificano attraverso quelle 14 classi
con precisione del 100% e zero falsi positivi. Su un OWASP Juice Shop standard, 17
findings verificati nella scansione del 2026-08-23 — riporta HTTP in-scope / verificati /
precisione, non 17/116. Una sessione MCP Path 1 del 2026-08-25 (client MCP che guida
run_probe, target morto prima della verifica dell'orchestratore) ha ottenuto 12 prove verificate
con precisione del 100% contro 64 challenge HTTP in-scope (20 will-not-chase). Le chiavi OSINT,
Web3 e solo-UI di Juice Shop sono fuori dal tabellone di automazione per design.
Leggi quei numeri con attenzione, perché i divari sono il punto. Esistono 64 probe ma solo 30 possono ottenere un verdetto; le altre 34 riportano candidati onesti. 203 wrapper sono registrati ma solo 18 trasformano l'output degli strumenti in findings — gli altri eseguono e restituiscono testo grezzo. Il gate degli oracle compra precisione, non tasso di rilevamento: rimuove i falsi positivi, non trova più bug.
L'harness dell'honeypot (tests/honeypot/) e un gate zero-falsi-positivi su app pulita
(tests/cleanapp/) sono entrambi inclusi in questo
repo e girano in CI, quindi sono riproducibili e non screenshot.
Cosa non fa
Detto chiaramente, perché uno strumento di sicurezza che si sopravvaluta è peggio che inutile.
- È uno scanner di applicazioni web. Tutte le 64 probe e tutti i 24 tipi di oracle targettizzano HTTP. AD, cloud, mobile e wireless hanno agenti e wrapper di strumenti, ma nessuna libreria di probe e nessun oracle dietro di essi.
- Non può fare privilege escalation locale. Serve esecuzione di codice su un host
che già possiedi. ptai testa da remoto e non ha tale canale, quindi l'agente privesc
riporta
unsupportedinvece di uno zero fuorviante. - Non è uno scanner CVE. Non c'è un database versione-a-CVE né una libreria di exploit. Il lavoro sui CVE è limitato alle ricerche su osv.dev su manifest leaked.
- I playbook pianificano, non eseguono.
ptai playbook runrisolve le dipendenze e stampa il piano. Eseguirlo contro un target non è ancora collegato. - Non è autonomo. Gli agenti LLM di pentest completamente autonomi completano il 21–31% dei task end to end; le configurazioni assistite da umani raggiungono il 64%. ptai è costruito per il secondo regime. Premi Ctrl+C due volte per prendere il controllo a metà esecuzione.
La lista completa dei difetti interni, incluso tutto quanto sopra, è tracciata apertamente anziché in silenzio. Se qualcosa qui è sbagliato, apri una issue e verrà corretto.
Installazione
Percorso 1 — Guidalo da Claude Code, Cursor o Codex (nessuna API key)
Il tuo abbonamento AI esistente è l'LLM. ptai fornisce gli strumenti.
pip install ptai
ptai mcp install # rileva automaticamente i tuoi client MCP e scrive le loro config
Riavvia il client e 52 strumenti sono lì. Nessuna chiave Anthropic necessaria su questo percorso — il server MCP non ospita alcun LLM proprio per design.
Percorso 2 — CLI standalone
pip install ptai
export ANTHROPIC_API_KEY=sk-... # oppure OPENAI_API_KEY
ptai start https://target.example.com
# completamente locale, senza cloud:
export PENTEST_AI_LLM_PROVIDER=ollama
# oppure deterministico, senza alcun LLM:
ptai start https://target.example.com --no-llm
La spesa è limitata a $10 per engagement per default (PTAI_PRICE_LIMIT).
Strumenti di sicurezza, REST API e altre opzioni
ptai tools install --tier core # oppure recommended / full
ptai tools install nmap nuclei # oppure per nome
ptai serve # HTTP REST + WebSocket per dashboard
ptai menu # launcher interattivo, senza LLM
All'inizio dell'engagement il planner prevede quali strumenti serviranno all'esecuzione e chiede una volta di installare quelli mancanti. Rifiuta e la risposta persiste.
Benchmark
Riproducibili, in git, con artefatti grezzi. Nessun "tasso di rilevamento del 98,7%" che non puoi verificare.
| Strumento | Findings | Critical+High | Bucket OWASP | Tasso FP |
|---|---|---|---|---|
| ptai | 88 | 46 | 5 | 0% |
| ZAP 2.17.0 | 593 | 0 | 1 | 47% |
| Nuclei 3.8.0 | 1 | 0 | 1 | 0% |
| HexStrike v6.0 | 11 | 0 | 1 | – |
n=1, singolo valutatore, singolo colpo su OWASP Juice Shop. Metodologia e output grezzo in
benchmarks/; write-up completo in docs/benchmarks/juice-shop.md.
La lettura onesta: ptai è forte su target web SPA con copertura di probe curata. HexStrike è più ampio (cloud, binario, CTF) e probabilmente batte ptai su superfici tradizionalmente crawlabili come WordPress. Juice Shop è anche l'app vulnerabile più documentata su internet, quindi sia l'LLM che gli autori delle probe hanno un vantaggio — che è esattamente il motivo per cui il numero dell'honeypot privato è più basso, e perché entrambi vengono pubblicati.
Inseriscilo nella CI
- run: pip install ptai
- run: ptai start ${{ vars.STAGING_URL }} --ci --fail-on verified --sarif pentest.sarif
- uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: pentest.sarif }
--fail-on verified rompe la build solo su un finding che un oracle ha effettivamente dimostrato,
quindi il gate non può essere attivato dal rumore dello scanner. SARIF viene caricato su GitHub Code
Scanning, i findings vengono pubblicati come commento nella PR. Template GitLab e Jenkins in
docs/ci-cd.md.
Come funziona
recon ──▶ auth ──▶ web ──┬──▶ ad
├──▶ cloud ┌──────────────────┐
└──▶ api ──────────▶│ findings DB │
│ scope-guarded │
└────────┬─────────┘
▼
verify (oracles, N/N)
▼
chain ─▶ validate ─▶ detect ─▶ report
md · html · pdf · SARIF · JUnit
18 agenti specializzati eseguono le fasi. Con una API key ognuno usa un LLM per ragionare sui risultati; senza, gira come un loop deterministico di strumenti. L'ordine delle fasi e il rilevamento sono identici in entrambi i casi — le probe trovano i bug, l'LLM solo coordina.
Per chi è
Team AppSec che collegano una scansione autenticata a ogni PR, con un gate che scatta solo su findings dimostrati. Consulenti che vogliono che il report si scriva da solo e una capsule che gli stessi ingegneri del cliente possono riprodurre. Bug bounty hunter che preferirebbero fare triage di 12 findings dimostrati piuttosto che di 600 forse. Utenti di Claude Code / Cursor / Codex che vogliono strumenti reali dietro il loro assistente senza un'altra bolletta API.
Lavora con me
Lo strumento è MIT e gratuito per sempre — questo non cambierà.
Se vuoi un pentest consegnato piuttosto che eseguito da te, o un workspace ospitato con cronologia e accesso del team, entrambi sono su pentestai.xyz. Ogni finding in un engagement consegnato viene fornito con una proof capsule che i tuoi ingegneri possono riprodurre da soli, che è un artefatto sostanzialmente diverso da un PDF pieno di valutazioni di severità.
Domande: [email protected]
Uso responsabile
ptai esegue reali operazioni di rete e host contro i target che specifichi. Sei l'unico responsabile di avere un'autorizzazione scritta esplicita per ogni target. Testare sistemi che non possiedi può violare il Computer Fraud and Abuse Act, il Computer Misuse Act 1990, l'Articolo 32 del GDPR e equivalenti altrove.
La prima esecuzione richiede l'accettazione dell'AUP e la persiste. Imposta
PENTEST_AI_AUP_ACCEPTED=1 in CI. Gli host fuori scope vengono rifiutati al
momento dell'invocazione dello strumento. Tre guardrail sono disattivati per default e vale la pena attivarli:
intensity=safe salta le probe che mutano lo stato, respect_rate_limits rispetta
429/Retry-After, e strict_scope rifiuta le richieste off-host.
Callback out-of-band (OAST) — privacy
Le classi blind (blind SSRF/SQLi/XXE, stored XSS, SSTI, Log4Shell) vengono rilevate tramite
callback che per default passano dal pubblico oast.fun di ProjectDiscovery.
Ogni engagement genera una nuova coppia di chiavi RSA-2048 localmente. I payload di interazione sono cifrati AES-CTR-256 a riposo con la chiave avvolta in RSA-OAEP-SHA256 verso la tua chiave pubblica, quindi solo il tuo processo locale può decifrarli. Ma i metadati sono visibili al server: che un'interazione sia avvenuta, l'IP sorgente del target, il timestamp e il protocollo.
PortSwigger vieta l'uso di collaborator pubblici nelle loro regole di bug bounty, e i grandi programmi richiedono sempre più infrastruttura di callback controllata dal tester. Per engagement a pagamento, self-hosting di Interactsh:
ptai start http://target --oast-server https://oast.example.com --oast-token <T>
ptai start http://target --no-oast # oppure disabilita del tutto
FAQ
Ho bisogno di una API key? Non sul percorso MCP — il tuo abbonamento Claude Code / Cursor / Codex è l'LLM. Solo la CLI standalone ne ha bisogno, e anche lì Ollama gira completamente in locale.
È autonomo? No, e non pretende di esserlo. Le probe rilevano, l'LLM coordina, tu decidi. Ctrl+C due volte prende il controllo a metà esecuzione.
Sicuro contro la produzione? Solo con autorizzazione scritta e i tre guardrail sopra attivati.
Chiama casa? No per default. I findings restano sul tuo disco. Puoi
optare per contatori di utilizzo anonimi con ptai telemetry enable (nessun target,
nessun finding; schema in engine/telemetry.py). Le callback OAST per default vanno
su oast.fun di ProjectDiscovery a meno che tu non passi --oast-server o --no-oast.
In cosa è diverso dal chiedere a Claude di hackerare qualcosa? Una libreria di probe deterministica curata trova i bug e un oracle macchina li dimostra. Un LLM da solo ti dà una supposizione plausibile senza modo di capire se è reale.
Ecosistema
| Repo | Cosa |
|---|---|
| pentest-ai | Questo repo. CLI + server MCP. |
| pentest-ai-agents | File subagent standalone di Claude Code. Opzionale. |
Community: Discord · Discussioni · Issue
Star history
Il vecchio grafico inline (api.star-history.com) è vuoto: GitHub ha limitato la pubblica stargazers API da cui quegli SVG dipendevano. La serie live è su star-history.com. Il README non fa hotlink a un host sostitutivo — il browser di ogni visitatore avrebbe scaricato quell'SVG.
Licenza
MIT. Fai quello che vuoi.
Se ptai ti ha salvato una domenica, metti una star al repo.