
Framework d'agents IA pour les tests de sécurité en boîte noire avec orchestration autonome multi-agents, outils de pentesting intégrés, et intégration MCP pour les workflows de bug bounty, red team et tests de pénétration.
https://github.com/user-attachments/assets/a67db2b5-672a-43df-b709-149c8eaee975
# Clone
git clone https://github.com/GH05TCREW/pentestagent.git
cd pentestagent
# Setup (creates venv, installs deps)
.\scripts\setup.ps1 # Windows
./scripts/setup.sh # Linux/macOS
# Or manual
python -m venv venv
.\venv\Scripts\Activate.ps1 # Windows
source venv/bin/activate # Linux/macOS
pip install -e ".[all]"
playwright install chromium # Required for browser tool
Créez .env à la racine du projet :
ANTHROPIC_API_KEY=sk-ant-...
PENTESTAGENT_MODEL=claude-sonnet-4-20250514
Ou pour OpenAI :
OPENAI_API_KEY=sk-...
PENTESTAGENT_MODEL=gpt-5
Tout modèle supporté par LiteLLM fonctionne.
Pointer PentestAgent vers n'importe quel endpoint compatible OpenAI via OPENAI_API_BASE :
OPENAI_API_KEY=your-relay-token
OPENAI_API_BASE=https://relay.example/v1
PENTESTAGENT_MODEL=openai/<model-name-on-your-relay>
Pour les endpoints compatibles Anthropic, utilisez ANTHROPIC_API_BASE à la place.
Voir .env.example pour les notes complètes sur les fournisseurs et les options d'embedding.
pentestagent # Launch TUI
pentestagent -t 192.168.1.1 # Launch with target
pentestagent tui --docker # Run tools in Docker container
Exécutez les outils dans un conteneur Docker pour l'isolation et les outils de pentest préinstallés.
# Base image with nmap, netcat, curl
docker run -it --rm \
-e ANTHROPIC_API_KEY=your-key \
-e PENTESTAGENT_MODEL=claude-sonnet-4-20250514 \
ghcr.io/gh05tcrew/pentestagent:latest
# Kali image with metasploit, sqlmap, hydra, etc.
docker run -it --rm \
-e ANTHROPIC_API_KEY=your-key \
ghcr.io/gh05tcrew/pentestagent:kali
# Build
docker compose build
# Run
docker compose run --rm pentestagent
# Or with Kali
docker compose --profile kali build
docker compose --profile kali run --rm pentestagent-kali
Le conteneur exécute PentestAgent avec un accès aux outils de pentest Linux. L'agent peut utiliser nmap, msfconsole, sqlmap, etc. directement via l'outil terminal.
Nécessite que Docker soit installé et en cours d'exécution.
PentestAgent propose trois modes, accessibles via des commandes dans le TUI :
/assist <task> One single-shot instruction.
/agent <task> Run autonomous agent on task
/crew <task> Run multi-agent crew on task
/interact <task> Chat with the agent in guided mode
/target <host> Set target
/tools List available tools
/notes Show saved notes
/report Generate report from session
/memory Show token/memory usage
/prompt Show system prompt
/conversations Browse and restore saved conversations
/mcp <list/add> Visualizes or adds a new MCP server.
/spawn [target] [--scope CIDR] [--model M] [--no-rag] [--no-mcp]
Manually spawn a child MCP agent from the TUI.
/despawn <server_name>
Terminate and remove a previously spawned child agent.
/clear Clear chat and history
/quit Exit (also /exit, /q)
/help Show help (also /h, /?)
Appuyez sur Esc pour arrêter un agent en cours d'exécution. Ctrl+Q pour quitter.
PentestAgent inclut des playbooks d'attaque préconstruits pour les tests de sécurité en boîte noire. Les playbooks définissent une approche structurée pour des évaluations de sécurité spécifiques.
Exécuter un playbook :
pentestagent run -t example.com --playbook thp3_web

PentestAgent inclut des outils intégrés et supporte MCP (Model Context Protocol) pour l'extensibilité.
Outils intégrés : terminal, browser, notes, web_search (nécessite TAVILY_API_KEY), spawn_mcp_agent
spawn_mcp_agent)spawn_mcp_agent est un outil intégré qui permet à un agent en cours d'exécution de générer une copie enfant de lui-même en tant que serveur MCP subordonné connecté via stdio. Le processus enfant est totalement isolé — son propre runtime, client LLM, historique de conversation et magasin de notes — et son ensemble complet d'outils est injecté dans les outils disponibles de l'agent parent après la génération.
Cela permet des workflows hiérarchiques multi-agents sans aucune orchestration externe : l'agent s'organise lui-même en déléguant des sous-tâches ciblées à des enfants qu'il génère à la demande.
Après le retour de spawn_mcp_agent, les outils de l'enfant (run_task, run_task_async, await_tasks, etc.) sont disponibles lors du prochain appel d'outil. Le nom du serveur de l'enfant est attribué automatiquement (par exemple child_agent_1) et renvoyé dans le résultat.
Exemple — orchestrateur déléguant une reconnaissance parallèle à deux enfants :
# Turn 1: spawn two isolated child agents
spawn_mcp_agent target="10.0.1.0/24" scope=["10.0.1.0/24"]
spawn_mcp_agent target="10.0.2.0/24" scope=["10.0.2.0/24"]
# Turn 2: children's tools are now available — delegate work asynchronously
child_agent_1__run_task_async task="Full port scan and service enumeration"
child_agent_2__run_task_async task="Full port scan and service enumeration"
# Turn 3: wait and collect
child_agent_1__await_tasks task_ids=["<id1>"] timeout_seconds=600
child_agent_2__await_tasks task_ids=["<id2>"] timeout_seconds=600
child_agent_1__get_task_result task_id="<id1>"
child_agent_2__get_task_result task_id="<id2>"
/spawn et /despawn)Au-delà de l'outil automatique spawn_mcp_agent, le TUI expose deux commandes qui vous permettent de générer et de terminer des agents enfants manuellement, indépendamment d'une boucle d'agent en cours d'exécution.
/spawn/spawn [target] [--scope CIDR ...] [--model MODEL] [--no-rag] [--no-mcp]
Génère un nouvel agent MCP enfant via stdio et l'attache à la session en cours. L'enfant apparaît comme un panneau de terminal pliable dans la barre latérale du TUI et ses outils deviennent disponibles pour l'agent parent lors du prochain appel d'outil.
Exemples :
/spawn 10.0.1.1
/spawn 10.0.1.1 --scope 10.0.1.0/24 --model claude-sonnet-4-20250514
/spawn --target 10.0.1.1 --scope 10.0.1.0/24 --no-rag
/despawn/despawn <server_name>
Termine l'agent enfant identifié par server_name (par exemple child_agent_1), supprime son panneau de terminal du TUI et déconnecte ses outils de la session parente. Utilisez /mcp list pour voir les noms de tous les agents enfants actuellement actifs.
Exemple :
/despawn child_agent_1
Lorsqu'un serveur MCP expose plus de 128 outils, PentestAgent remplace automatiquement le catalogue complet par un seul outil mcp_<server>_rag_optimizer. Ce méta-outil utilise la similarité d'embedding (via LiteLLM, par défaut text-embedding-3-small) pour récupérer les outils les plus pertinents pour la tâche en cours et les injecter dans le prochain tour de l'agent — maintenant la fenêtre de contexte gérable sans perdre l'accès à l'ensemble complet des outils.
L'optimiseur est transparent pour l'agent : il appelle l'outil RAG avec des requêtes ciblées en langage naturel décrivant ce dont il a besoin, et les outils correspondants deviennent disponibles au prochain tour pour être appelés directement.
Conseils d'utilisation pour l'agent :
| Argument | Type | Défaut | Description |
|---|---|---|---|
Les embeddings sont calculés une fois au démarrage et mis en cache, donc les requêtes répétées sont rapides. L'optimiseur est construit par serveur, donc chaque serveur MCP avec un grand catalogue obtient son propre index indépendant.
Astuce : Transmettez une requête par capacité distincte plutôt que de tout combiner en une seule requête.
["list open ports on a host", "get process memory usage"]donne de meilleurs résultats que["list ports and memory and CPU"].
PentestAgent supporte MCP dans deux directions : consommer des serveurs MCP externes comme sources d'outils, et s'exposer en tant que serveur MCP afin que des clients externes (Claude Desktop, Cursor, etc.) puissent piloter PentestAgent par programmation.
Configurez mcp_servers.json pour connecter PentestAgent à n'importe quel serveur MCP externe. Exemple de configuration :
{
"mcpServers": {
"nmap": {
"command": "npx",
"args": ["-y", "gc-nmap-mcp"],
"env": {
"NMAP_PATH": "/usr/bin/nmap"
}
}
}
}
PentestAgent peut s'exécuter en tant que serveur MCP, permettant à tout client compatible MCP de soumettre des tâches, d'inspecter les résultats et de contrôler l'agent à distance. Deux transports sont supportés :
STDIO — pour les clients locaux (par ex. Claude Desktop, Cursor) :
pentestagent mcp_server --type stdio
pentestagent mcp_server --type stdio --target 192.168.1.1 --scope 192.168.1.0/24
pentestagent mcp_server --type stdio --model claude-sonnet-4-20250514 --docker
SSE (HTTP) — pour les clients distants ou réseau :
pentestagent mcp_server --type sse
pentestagent mcp_server --type sse --host 0.0.0.0 --port 8080
pentestagent mcp_server --type sse --target 10.0.0.1 --scope 10.0.0.0/24 --docker
Le transport SSE expose un seul endpoint /mcp supportant POST (requêtes), GET (flux SSE persistant pour les push initiés par le serveur) et DELETE (démantèlement de session). Les sessions sont suivies via l'en-tête Mcp-Session-Id.
Tous les drapeaux mcp_server :
claude_desktop_config.json){
"mcpServers": {
"pentestagent": {
"command": "pentestagent",
"args": ["mcp_server", "--type", "stdio"]
}
}
}
Lorsqu'il agit en tant que serveur MCP, PentestAgent expose les outils suivants :
Statut et configuration du serveur
| Outil | Description |
|---|---|
get_server_status | Statut en direct du serveur : état de préparation, nombre de tâches par état, cible/périmètre principal, taille du magasin de mémoire |
get_config | Configuration de l'agent principal : cible, périmètre, itérations max, liste d'outils |
update_config | Mettre à jour la cible, le périmètre ou les itérations max pour toutes les tâches suivantes |
Exécution des tâches
| Outil | Description |
|---|---|
run_task | Soumettre une tâche et bloquer jusqu'à ce qu'elle soit terminée. Renvoie le résultat complet, les outils utilisés et un instantané des notes |
run_task_async |
Inspection des tâches
| Outil | Description |
|---|
Contrôle des tâches
| Outil | Description |
|---|---|
cancel_task | Annuler une tâche en cours ou en attente par ID |
Gestion des outils
| Outil | Description |
|---|---|
list_tools | Lister tous les outils disponibles pour l'agent |
enable_tool | Activer un outil nommé sur l'agent principal |
disable_tool | Désactiver un outil nommé sur l'agent principal |
Historique des conversations
| Outil | Description |
|---|---|
get_conversation_history | Renvoyer l'historique des messages pour une tâche ou l'agent principal. Supporte un paramètre limit |
reset_conversation | Effacer l'historique des conversations pour une tâche ou l'agent principal |
Mémoire
| Outil | Description |
|---|---|
store_memory | Persister une paire clé-valeur dans le magasin de mémoire en cours de traitement |
retrieve_memory | Récupérer par clé exacte, rechercher par sous-chaîne ou lister toutes les clés |
clear_memory | Supprimer une clé spécifique ou effacer toute la mémoire avec |
Observabilité
| Outil | Description |
|---|---|
get_logs | Renvoyer les journaux d'exécution récents, éventuellement filtrés par niveau (info / warning / error) |
get_metrics | Métriques d'exécution : nombre de tâches, taux de succès, nombre total d'appels d'outils, tailles de la mémoire et des journaux |
Pour les tâches de reconnaissance de longue durée, utilisez le modèle asynchrone :
# 1. Submit tasks without blocking
run_task_async task="Enumerate subdomains of example.com" target="example.com"
run_task_async task="Run nmap SYN scan on example.com" target="example.com"
# 2. Block until both finish (up to 5 minutes)
await_tasks task_ids=["<id1>", "<id2>"] timeout_seconds=300
# 3. Retrieve full results
get_task_result task_id="<id1>"
get_task_result task_id="<id2>"
pentestagent tools list # List all tools
pentestagent tools info <name> # Show tool details
pentestagent mcp list # List MCP servers
pentestagent mcp add <name> <command> [args...] # Add MCP server
pentestagent mcp test <name> # Test MCP connection
Chaque message utilisateur dans le TUI expose deux boutons d'action en ligne : rewind et fork.
Cliquez sur rewind sur n'importe quel message utilisateur pour tronquer la conversation juste avant ce message — à la fois dans l'UI et dans l'historique en mémoire de l'agent. Utilisez-le pour réessayer une requête depuis le début sans sauvegarder le chemin écarté.
Cliquez sur >> fork sur n'importe quel message utilisateur pour bifurquer la conversation à partir de ce point :
Cela vous permet d'essayer une approche alternative à partir de n'importe quel point tout en gardant le fil original accessible via /conversations.
PentestAgent persiste automatiquement chaque conversation afin que vous puissiez consulter, comparer et restaurer les sessions passées.
La sauvegarde automatique se déclenche après chaque tâche /assist, /agent, /crew et /interact, et avant /clear. Jusqu'à 20 conversations sont conservées ; les plus anciennes sont supprimées automatiquement.
Emplacement de stockage : workspaces/<active>/memory/conversations/ lorsqu'un espace de travail est actif, ou conversations/ à la racine du projet sinon. Chaque conversation est un fichier JSON.
Parcourir et restaurer avec /conversations :
La commande /conversations ouvre une modale à deux panneaux dans le TUI :
Sélectionnez une conversation et appuyez sur Restaurer pour la recharger dans la session actuelle, ou Fermer pour fermer la modale.
pentestagent/knowledge/sources/ pour une injection automatique de contexte.loot/notes.json avec des catégories (credential, vulnerability, finding, artifact). Les notes persistent entre les sessions et sont injectées dans le contexte de l'agent.pentestagent/
agents/ # Agent implementations
config/ # Settings and constants
interface/ # TUI and CLI
knowledge/ # RAG system and shadow graph
llm/ # LiteLLM wrapper
mcp/ # MCP client and server configs
playbooks/ # Attack playbooks
runtime/ # Execution environment
tools/ # Built-in tools
pip install -e ".[dev]"
pytest # Run tests
pytest --cov=pentestagent # With coverage
black pentestagent # Format
ruff check pentestagent # Lint
Utilisez uniquement contre des systèmes pour lesquels vous avez une autorisation explicite de test. L'accès non autorisé est illégal.
MIT
| Mode | Commande | Description |
|---|
| Assist | /assist <tâche> | Une instruction unique, avec exécution d'outils |
| Agent | /agent <tâche> | Exécution autonome d'une seule tâche |
| Crew | /crew <tâche> | Mode multi-agent. L'orchestrateur génère des travailleurs spécialisés |
| Interact | /interact <tâche> | Mode interactif. Discutez avec l'agent, il vous aidera et vous guidera pendant la procédure de pentest |
| Argument | Type | Défaut | Description |
|---|
target | string | — | Cible de pentest à transmettre à l'enfant |
scope | string[] | — | Cibles/CIDR dans le périmètre pour l'enfant |
model | string | var. env. | Identifiant du modèle, remplace PENTESTAGENT_MODEL sur l'enfant |
no_rag | boolean | false | Ignorer l'initialisation du moteur RAG sur l'enfant |
no_mcp | boolean | true | Ignorer les connexions aux serveurs MCP externes sur l'enfant (recommandé) |
| Argument | Description |
|---|
target | Cible de pentest à transmettre à l'enfant (positionnelle ou --target) |
--scope CIDR | Un ou plusieurs CIDR dans le périmètre (répétable) |
--model MODEL | Remplacer le modèle pour l'agent enfant |
--no-rag | Ignorer l'initialisation du moteur RAG sur l'enfant |
--no-mcp | Ignorer les connexions aux serveurs MCP externes sur l'enfant |
queries| string[] |
| (obligatoire) |
| Une requête ciblée par capacité nécessaire. Plus spécifique = plus grande précision |
top_k | integer | 20 | Outils à récupérer par requête (max 128). Les résultats sont fusionnés et dédupliqués |
| Drapeau | Défaut | Description |
|---|
--type | (obligatoire) | Transport : stdio ou sse |
--host | 0.0.0.0 | Hôte de liaison SSE |
--port | 8080 | Port de liaison SSE |
--target | aucun | Cible de pentest principale (IP / nom d'hôte) |
--scope | [] | Cibles/CIDR dans le périmètre (séparés par des espaces) |
--model | var. env. | Identifiant du modèle, remplace PENTESTAGENT_MODEL |
--docker | false | Utiliser DockerRuntime au lieu de LocalRuntime |
--no-rag | false | Ignorer l'initialisation du moteur RAG |
--no-mcp | false | Ignorer les connexions aux serveurs MCP externes |
Soumettre une tâche et renvoyer immédiatement un task_id. Interroger avec get_task_status |
list_tasks | Lister toutes les tâches avec statut, cible et résumé. Filtrable par statut |
get_task_status | Interroger le statut actuel et l'aperçu du résultat d'une tâche |
get_task_result | Résultat complet de la tâche : sortie finale, étapes de réflexion, tous les appels d'outils et résultats, instantané des notes |
await_tasks | Bloquer jusqu'à ce qu'un ensemble d'ID de tâches asynchrones soient toutes terminées (interrogation toutes les 500 ms, délai configurable) |
scope='all'