Overview
Nuclei est un scanner de vulnérabilités orienté templates. Le dépôt principal le présente comme un outil rapide et personnalisable, basé sur une DSL YAML, pour rechercher des vulnérabilités dans des applications, APIs, réseaux, DNS et configurations cloud (README: https://github.com/projectdiscovery/nuclei).
La documentation officielle précise que Nuclei sert à sonder des applications modernes, de l’infrastructure, des plateformes cloud et des réseaux afin d’aider à identifier et traiter des vulnérabilités exploitables (Docs overview: https://docs.projectdiscovery.io/tools/nuclei/overview). Le point important est donc la séparation entre le moteur, qui exécute les scans, et les templates, qui décrivent les scénarios de détection.
Le projet s’inscrit dans l’écosystème ProjectDiscovery. Le site ProjectDiscovery met aussi en avant une plateforme commerciale autour de la sécurité continue, mais Nuclei reste disponible comme outil open source avec son propre dépôt, sa documentation et son dépôt de templates communautaires (Site ProjectDiscovery: https://projectdiscovery.io/).
Objectif
L’objectif de Nuclei est de rendre les scans de sécurité reproductibles et extensibles. Au lieu d’avoir un scanner fermé avec des règles figées, l’utilisateur peut lancer des templates existants, filtrer par tags ou sévérité, écrire ses propres templates, puis intégrer l’exécution dans des workflows CLI ou CI/CD (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running).
Cette approche est utile pour plusieurs usages techniques:
- tester rapidement un domaine ou une liste de domaines avec les templates par défaut;
- limiter un scan à certaines familles de templates, par exemple
cve,exposures,ssl,dnsouhttp; - conserver des checks internes sous forme de templates versionnés;
- produire des sorties exploitables comme JSON, JSONL, Markdown ou SARIF;
- intégrer des contrôles de régression dans une pipeline CI/CD.
Le README indique aussi que le projet est en développement actif et recommande de lire les changelogs avant une mise à jour. Il signale également que l’exécution de Nuclei comme service peut poser des risques de sécurité et doit être faite avec prudence (README: https://github.com/projectdiscovery/nuclei).
Liens utiles
- Dépôt principal Nuclei
- Documentation Nuclei
- Installation de Nuclei
- Exécution de Nuclei
- Releases Nuclei
- Dépôt nuclei-templates
- Introduction aux templates Nuclei
- Signature des templates
- Nuclei en CI/CD
- nuclei-action pour GitHub Actions
- Site ProjectDiscovery
Installation
La documentation officielle propose plusieurs modes d’installation: Go, Homebrew, Docker, compilation depuis GitHub, binaire depuis les releases et Helm (Install docs: https://docs.projectdiscovery.io/tools/nuclei/install).
Avec Go, la commande documentée est:
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
Avec Homebrew, pour macOS ou Linux:
brew install nuclei
Avec Docker:
docker pull projectdiscovery/nuclei:latest
Depuis le dépôt GitHub, la documentation donne le chemin suivant:
git clone https://github.com/projectdiscovery/nuclei.git; \
cd nuclei/cmd/nuclei; \
go build; \
mv nuclei /usr/local/bin/; \
nuclei -version;Langage du code : PHP (php)
Le README du dépôt indique que l’installation via Go nécessite go >= 1.24.2 (README: https://github.com/projectdiscovery/nuclei). La page d’installation indique plus généralement qu’il faut une version récente de Go pour réussir l’installation (Install docs: https://docs.projectdiscovery.io/tools/nuclei/install).
Notions et concepts
Moteur et templates
Nuclei se comprend comme un moteur d’exécution associé à des templates. Les templates sont des fichiers YAML qui définissent les requêtes, les conditions, les matchers, les extractors et les métadonnées nécessaires à un test donné (Templates docs: https://docs.projectdiscovery.io/templates/introduction).
La documentation des templates présente cette logique comme un langage universel pour décrire des vulnérabilités exploitables. Les templates peuvent couvrir plusieurs protocoles, notamment HTTP, TCP, DNS et d’autres familles prises en charge par Nuclei (Templates docs: https://docs.projectdiscovery.io/templates/introduction).
Bibliothèque communautaire
Le dépôt projectdiscovery/nuclei-templates héberge les templates utilisés par le moteur. Son README le décrit comme une liste communautaire de templates pour identifier des vulnérabilités dans des applications (nuclei-templates README: https://github.com/projectdiscovery/nuclei-templates).
Au moment de la consultation, ce dépôt expose des catégories comme http, cloud, file, network, code, dast, javascript, ssl, dns et workflows, ainsi qu’un tableau de statistiques par tags, auteurs, sévérités et types (nuclei-templates README: https://github.com/projectdiscovery/nuclei-templates).
Filtres
Les scans peuvent être filtrés par tags, sévérité, auteur, ID de template, type de protocole ou condition plus avancée. La documentation montre notamment l’utilisation de -tags, -severity, -author et -tc pour restreindre ce qui sera chargé et exécuté (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running).
Entrées
Nuclei accepte plusieurs formats d’entrée: URLs, hosts, IPs, CIDR, ASN, fichiers OpenAPI, Swagger, exports Burp et autres formats selon la documentation (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running). Les options principales sont -u pour une cible directe et -l pour un fichier de cibles.
Sorties et reporting
Le help documenté mentionne plusieurs formats de sortie: fichier texte, JSONL, export JSON, export Markdown, export SARIF, base de reporting locale et intégrations de reporting (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running). Cela rend Nuclei utilisable aussi bien dans un terminal que dans une chaîne d’outillage plus large.
Signature des templates
La documentation de signature explique que les templates officiels incluent une signature numérique vérifiée par Nuclei avec la clé publique ProjectDiscovery embarquée dans le binaire (Template signing docs: https://docs.projectdiscovery.io/templates/reference/template-signing).
Elle précise aussi que la signature est optionnelle pour tous les protocoles sauf code, et que les templates code non signés sont désactivés et ne peuvent pas être exécutés avec Nuclei (Template signing docs: https://docs.projectdiscovery.io/templates/reference/template-signing).
Depuis la release v3.11.0, les templates personnalisés qui utilisent le protocole javascript: doivent aussi être signés numériquement avant d’être chargés ou exécutés. Les templates JavaScript non signés sont ignorés au chargement et lorsqu’ils sont référencés depuis des workflows (Release v3.11.0: https://github.com/projectdiscovery/nuclei/releases/tag/v3.11.0).
Commandes
Les commandes ci-dessous proviennent du README ou de la documentation officielle. Elles ne supposent pas que Nuclei a été exécuté dans cet environnement.
Afficher l’aide:
nuclei -h
Scanner une cible unique avec les templates par défaut:
nuclei -target example.comLangage du code : CSS (css)
Scanner une URL:
nuclei -u https://example.comLangage du code : JavaScript (javascript)
Scanner une liste de cibles:
nuclei -list urls.txtLangage du code : CSS (css)
Scanner un sous-réseau:
nuclei -target 192.168.1.0/24
Utiliser un template personnalisé:
nuclei -u https://example.com -t /path/to/your-template.yamlLangage du code : JavaScript (javascript)
Filtrer sur le tag cve:
nuclei -u https://example.com -tags cveLangage du code : JavaScript (javascript)
Filtrer sur des templates cve, en sévérité critical ou high, et par auteur:
nuclei -u https://example.com -tags cve -severity critical,high -author geeknikLangage du code : JavaScript (javascript)
Lister les templates correspondant à un filtre sans les exécuter:
nuclei -tags cve -severity critical,high -author geeknik -tl
Exporter en JSON:
nuclei -target example.com -json-export output.jsonLangage du code : CSS (css)
Exporter en Markdown:
MARKDOWN_EXPORT_SORT_MODE=template nuclei -target example.com -markdown-export nuclei_report/Langage du code : JavaScript (javascript)
Signer un template personnalisé:
nuclei -sign -t /path/to/your-template.yaml
Mettre à jour les templates:
nuclei -update-templates
Configurer l’authentification ProjectDiscovery Cloud pour les fonctions qui en dépendent:
nuclei -auth
Demo
Cette démo décrit un premier workflow réaliste. Elle reste volontairement limitée à des commandes documentées afin d’éviter d’inventer des options non vérifiées.
Vue d’ensemble du flux
Le flux consiste à installer Nuclei, préparer une cible ou une liste de cibles, choisir le niveau de filtrage des templates, lancer un scan, puis exploiter les sorties. Pour un premier test, il est préférable de travailler sur un périmètre autorisé: environnement interne, application de test, programme bug bounty où les règles le permettent, ou cible explicitement prévue pour l’entraînement.
Preparation du run
On commence par installer l’outil selon son environnement. Sur macOS, Homebrew est le chemin le plus direct documenté:
brew install nuclei
Ensuite, on vérifie la présence de la commande:
nuclei -version
Pour un scan multi-cibles, on prépare un fichier urls.txt avec une URL ou un host par ligne. La documentation indique que Nuclei peut lire une liste avec -list et que le mode par défaut est une liste simple (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running).
Exemple de contenu attendu pour urls.txt:
https://example.com
https://app.example.comLangage du code : JavaScript (javascript)
Avant de lancer un scan plus large, on peut inspecter les templates qui seraient sélectionnés. Cela évite d’exécuter un jeu de templates trop large ou non adapté au périmètre:
nuclei -tags cve -severity critical,high -tl
Lancement du scan
Pour une cible unique, la commande documentée la plus simple est:
nuclei -u https://example.comLangage du code : JavaScript (javascript)
Pour une liste de cibles:
nuclei -list urls.txtLangage du code : CSS (css)
Si l’objectif est de réduire le scope aux CVE avec une sévérité élevée, on peut combiner tags et sévérité:
nuclei -list urls.txt -tags cve -severity critical,highLangage du code : CSS (css)
Pour un scan avec sortie JSON exploitable par d’autres outils:
nuclei -list urls.txt -tags cve -severity critical,high -json-export output.jsonLangage du code : CSS (css)
La documentation rappelle aussi que certains types de templates ne sont pas exécutés par défaut: les templates code nécessitent -code, les templates headless nécessitent -headless, et les templates DAST/fuzzing nécessitent l’option dédiée (Running docs: https://docs.projectdiscovery.io/tools/nuclei/running). Cette séparation est importante pour garder un run explicite.
Suivi pendant l’execution
Pendant l’exécution, Nuclei affiche les résultats qui matchent les templates chargés. Les options de sortie permettent d’adapter le rendu selon le contexte:
-silentpour limiter l’affichage aux findings;-jsonlpour écrire en JSON Lines;-json-exportpour produire un fichier JSON;-markdown-exportpour produire un rapport Markdown;-sarif-exportpour une intégration avec des outils qui consomment SARIF.
Si un scan produit trop de bruit, le premier réflexe consiste à réduire le périmètre: tags plus précis, sévérités ciblées, exclusion de certains tags, ou listing préalable avec -tl.
Sortie et reutilisation
Après le run, les sorties peuvent être utilisées de plusieurs façons:
- lecture directe dans le terminal pour un test ponctuel;
output.jsonpour post-traitement ou archivage;- rapport Markdown pour une revue humaine;
- SARIF pour GitHub Code Scanning ou une chaîne DevSecOps.
La documentation CI/CD fournit un exemple GitHub Actions minimal avec projectdiscovery/nuclei-action@v3 (CI/CD docs: https://docs.projectdiscovery.io/opensource/nuclei/ci-cd):
name: nuclei-scan
on:
push: {}
pull_request: {}
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Nuclei
uses: projectdiscovery/nuclei-action@v3
with:
args: -u https://example.comLangage du code : HTTP (http)
La même documentation montre aussi un export SARIF vers GitHub Code Scanning. Ce format est utile lorsque l’équipe veut centraliser les findings dans les mécanismes de triage GitHub (CI/CD docs: https://docs.projectdiscovery.io/opensource/nuclei/ci-cd).
Point d’attention sur les templates custom
Pour des templates internes, surtout s’ils utilisent code ou javascript, la signature doit être traitée comme une étape du workflow. La documentation explique que la signature sert à vérifier l’intégrité et l’authenticité d’un template, et que la modification d’un template après signature invalide son digest (Template signing docs: https://docs.projectdiscovery.io/templates/reference/template-signing).
La release v3.11.0 ajoute une contrainte importante: les templates personnalisés utilisant javascript: doivent être signés avant exécution (Release v3.11.0: https://github.com/projectdiscovery/nuclei/releases/tag/v3.11.0). Pour une équipe qui versionne ses propres templates, cela pousse à intégrer la signature et la revue des templates dans le cycle de contribution.
Conclusion
Nuclei propose un modèle simple à comprendre: un moteur CLI, des entrées variées, des templates YAML, des filtres et des sorties exploitables. Le dépôt principal décrit un scanner orienté vulnérabilités et personnalisable, tandis que la documentation détaille l’installation, l’exécution, les formats d’entrée, les filtres et les exports (README: https://github.com/projectdiscovery/nuclei, Docs: https://docs.projectdiscovery.io/tools/nuclei/running).
Le point distinctif est la place des templates. Le dépôt nuclei-templates sert de bibliothèque communautaire, et les templates personnalisés permettent d’adapter l’outil à un périmètre interne ou à des tests de régression spécifiques (nuclei-templates README: https://github.com/projectdiscovery/nuclei-templates).
Pour aller plus loin, il faut lire les changelogs avant mise à jour, comprendre les implications de la signature des templates, et tester l’outil uniquement sur des périmètres autorisés. Cet article n’a pas validé Nuclei par une exécution locale; il synthétise les informations disponibles dans les sources officielles citées.