Article

Nuclei : scanner des vulnérabilités avec des templates YAML

id: cve-scan severity: high protocol: http matchers: – status: 200 Nuclei Scanner de vulnérabilités avec templates YAML ProjectDiscovery · CLI · CI/CD · Security checks

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, dns ou http;
  • 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

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).

Découvrez  Wazuh 003 - Brute-force attack test on SSH

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).

Découvrez  [Sécurité] : scapy - scanner les réseaux wifi (SSID) et leur adresse MAC

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:

  • -silent pour limiter l’affichage aux findings;
  • -jsonl pour écrire en JSON Lines;
  • -json-export pour produire un fichier JSON;
  • -markdown-export pour produire un rapport Markdown;
  • -sarif-export pour 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.json pour 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.

Explorer les formations Xavki

Pour apprendre dans l ordre, repartez depuis la roadmap ou une playlist thematique.