Introduction to Nuclei
Automate Vulnerability Scans with Nuclei
Section titled “Automate Vulnerability Scans with Nuclei”Nuclei can help you ensure the security of complex networks / applications. With vulnerability scans, Nuclei can identify security issues on your network. Once configured, Nuclei can provide detailed information on each vulnerability, including:
- Severity
- Impact
- Description
- Remediation
Once you’ve set up templates, you can automate scans of your systems with every change to your network, and with every discovery of new security issues.
In this Getting Started guide, we describe how you can set up Nuclei to automate vulnerability scans on a relatively simple network. You can then use our Templating Guide to customize Nuclei for your networks.
Nuclei Features
Section titled “Nuclei Features”example “Features.”
Section titled “example “Features.””* **HTTP**, **DNS**, **TCP**, **SSL**, **FILE** protocol support* Fully configurable templates.* Large scale scanning.* Out of band based detection.* Easily write your own templates.Nuclei Installation
Section titled “Nuclei Installation”go install -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei@latestNuclei require latest GO version to install successfully.
”Brew”
Section titled “”Brew””brew install nucleiSupported in **macOS** (or Linux)”Docker"
Section titled “”Docker"”docker pull projectdiscovery/nuclei:latest"Github”
Section titled “"Github””git clone https://github.com/projectdiscovery/nuclei.git; \cd nuclei/v2/cmd/nuclei; \go build; \mv nuclei /usr/local/bin/; \nuclei -version;Nuclei require the latest **GO** version to install successfully.”Binary”
Section titled “”Binary””https://github.com/projectdiscovery/nuclei/releases- Download the latest binary for your OS.- Unzip the ready to run binary.”Helm”
Section titled “”Helm””git clone https://github.com/projectdiscovery/nuclei.gitcd nuclei/helmhelm upgrade --install nuclei . -f values.yamlThis Helm chart creates two primary resources (intended to be configured via `values.yaml`):-
A Kubernetes CronJob to run Nuclei on a defined schedule
-
An Interactsh service for Nuclei to use
Nuclei Templates
Section titled “Nuclei Templates”Public Templates
Section titled “Public Templates”Nuclei has built-in support for automatic template download/update from nuclei templates project which provides community-contributed list of ready-to-use templates that is constantly updated.
Nuclei checks for new community template releases upon each execution and automatically downloads the latest version when available. optionally, this feature can be disabled using the -duc cli flag or the configuration file.
Custom Templates
Section titled “Custom Templates”Users can create custom templates on a personal public / private GitHub / AWS Bucket that they wish to run / update while using nuclei from any environment without manually downloading the GitHub repository everywhere.
To use this feature, users need to set the following environment variables:
For GitHub Project
export GITHUB_TOKEN=gh_XXX export GITHUB_TEMPLATE_REPO=my_nuclei_template
For GitLab Project
export GITLAB_SERVER_URL=https://gitlab.com
The GitLab token must have the read_api and read_repository scope
Section titled “The GitLab token must have the read_api and read_repository scope”export GITLAB_TOKEN=XXXXXXXXXX
Comma separated list of repository IDs (not names)
Section titled “Comma separated list of repository IDs (not names)”export GITLAB_REPOSITORY_IDS=12345,67890
For AWS Bucket
export AWS_ACCESS_KEY=AKIAXXXXXXXX export AWS_SECRET_KEY=XXXXXX export AWS_REGION=us-xxx-1 export AWS_TEMPLATE_BUCKET=aws_bucket_name
For Azure Blob Storage
export AZURE_TENANT_ID=00000000-0000-0000-0000-000000000000 export AZURE_CLIENT_ID=00000000-0000-0000-0000-000000000000 export AZURE_CLIENT_SECRET=00000000-0000-0000-0000-000000000000 export AZURE_SERVICE_URL=https://XXXXXXXXXX.blob.core.windows.net/ export AZURE_CONTAINER_NAME=templates
Environment variables can also be provided to disable download from default and custom template locations:
export DISABLE_NUCLEI_TEMPLATES_PUBLIC_DOWNLOAD=true # Disable download from the default nuclei-templates projectexport DISABLE_NUCLEI_TEMPLATES_GITHUB_DOWNLOAD=true # Disable download from public / private GitHub project(s)export DISABLE_NUCLEI_TEMPLATES_GITLAB_DOWNLOAD=true # Disable download from public / private GitLab project(s)export DISABLE_NUCLEI_TEMPLATES_AWS_DOWNLOAD=true # Disable download from public / private AWS Bucket(s)export DISABLE_NUCLEI_TEMPLATES_AZURE_DOWNLOAD=true # Disable download from public / private Azure Blob StorageOnce the environment variables are set, following command to download the custom templates:
nuclei -update-templatesThis command will clone the repository containing the custom templates to the default nuclei templates directory ($HOME/nuclei-templates/github/).
The directory structure of the custom templates looks as follows:
tree $HOME/nuclei-templates/
nuclei-templates/└── github/$GH_REPO_NAME # Custom templates downloaded from public / private GitHub project└── gitlab/$GL_REPO_NAME # Custom templates downloaded from public / private GitLab project└── s3/$BUCKET_NAME # Custom templates downloaded from public / private AWS Bucket└── azure/$CONTAINER_NAME # Custom templates downloaded from public / private Azure Blob StorageUsers can then use the custom templates with the -t flag as follows:
nuclei -t github/my_custom_template -u https://example.comThe nuclei engine can be updated to latest version by using the -update flag.
Writing your own unique templates will always keep you one step ahead of others.Nuclei Usage
Section titled “Nuclei Usage”nuclei -hThis will display help for the tool. Here are all the switches it supports.
Nuclei is a fast, template based vulnerability scanner focusingon extensive configurability, massive extensibility and ease of use.
Usage: nuclei [flags]
Flags:TARGET: -u, -target string[] target URLs/hosts to scan -l, -list string path to file containing a list of target URLs/hosts to scan (one per line) -resume string resume scan using resume.cfg (clustering will be disabled) -sa, -scan-all-ips scan all the IP's associated with dns record -iv, -ip-version string[] IP version to scan of hostname (4,6) - (default 4)
TEMPLATES: -nt, -new-templates run only new templates added in latest nuclei-templates release -ntv, -new-templates-version string[] run new templates added in specific version -as, -automatic-scan automatic web scan using wappalyzer technology detection to tags mapping -t, -templates string[] list of template or template directory to run (comma-separated, file) -tu, -template-url string[] list of template urls to run (comma-separated, file) -w, -workflows string[] list of workflow or workflow directory to run (comma-separated, file) -wu, -workflow-url string[] list of workflow urls to run (comma-separated, file) -validate validate the passed templates to nuclei -nss, -no-strict-syntax disable strict syntax check on templates -td, -template-display displays the templates content -tl list all available templates
FILTERING: -a, -author string[] templates to run based on authors (comma-separated, file) -tags string[] templates to run based on tags (comma-separated, file) -etags, -exclude-tags string[] templates to exclude based on tags (comma-separated, file) -itags, -include-tags string[] tags to be executed even if they are excluded either by default or configuration -id, -template-id string[] templates to run based on template ids (comma-separated, file) -eid, -exclude-id string[] templates to exclude based on template ids (comma-separated, file) -it, -include-templates string[] templates to be executed even if they are excluded either by default or configuration -et, -exclude-templates string[] template or template directory to exclude (comma-separated, file) -em, -exclude-matchers string[] template matchers to exclude in result -s, -severity value[] templates to run based on severity. Possible values: info, low, medium, high, critical, unknown -es, -exclude-severity value[] templates to exclude based on severity. Possible values: info, low, medium, high, critical, unknown -pt, -type value[] templates to run based on protocol type. Possible values: dns, file, http, headless, tcp, workflow, ssl, websocket, whois -ept, -exclude-type value[] templates to exclude based on protocol type. Possible values: dns, file, http, headless, tcp, workflow, ssl, websocket, whois -tc, -template-condition string[] templates to run based on expression condition
OUTPUT: -o, -output string output file to write found issues/vulnerabilities -sresp, -store-resp store all request/response passed through nuclei to output directory -srd, -store-resp-dir string store all request/response passed through nuclei to custom directory (default "output") -silent display findings only -nc, -no-color disable output content coloring (ANSI escape codes) -j, -jsonl write output in JSONL(ines) format -irr, -include-rr -omit-raw include request/response pairs in the JSON, JSONL, and Markdown outputs (for findings only) [DEPRECATED use -omit-raw] (default true) -or, -omit-raw omit request/response pairs in the JSON, JSONL, and Markdown outputs (for findings only) -nm, -no-meta disable printing result metadata in cli output -ts, -timestamp enables printing timestamp in cli output -rdb, -report-db string nuclei reporting database (always use this to persist report data) -ms, -matcher-status display match failure status -me, -markdown-export string directory to export results in markdown format -se, -sarif-export string file to export results in SARIF format -je, -json-export string file to export results in JSON format -jle, -jsonl-export string file to export results in JSONL(ine) format
CONFIGURATIONS: -config string path to the nuclei configuration file -fr, -follow-redirects enable following redirects for http templates -fhr, -follow-host-redirects follow redirects on the same host -mr, -max-redirects int max number of redirects to follow for http templates (default 10) -dr, -disable-redirects disable redirects for http templates -rc, -report-config string nuclei reporting module configuration file -H, -header string[] custom header/cookie to include in all http request in header:value format (cli, file) -V, -var value custom vars in key=value format -r, -resolvers string file containing resolver list for nuclei -sr, -system-resolvers use system DNS resolving as error fallback -dc, -disable-clustering disable clustering of requests -passive enable passive HTTP response processing mode -fh2, -force-http2 force http2 connection on requests -ev, -env-vars enable environment variables to be used in template -cc, -client-cert string client certificate file (PEM-encoded) used for authenticating against scanned hosts -ck, -client-key string client key file (PEM-encoded) used for authenticating against scanned hosts -ca, -client-ca string client certificate authority file (PEM-encoded) used for authenticating against scanned hosts -sml, -show-match-line show match lines for file templates, works with extractors only -ztls use ztls library with autofallback to standard one for tls13 [Deprecated] autofallback to ztls is enabled by default -sni string tls sni hostname to use (default: input domain name) -lfa, -allow-local-file-access allows file (payload) access anywhere on the system -lna, -restrict-local-network-access blocks connections to the local / private network -i, -interface string network interface to use for network scan -at, -attack-type string type of payload combinations to perform (batteringram,pitchfork,clusterbomb) -sip, -source-ip string source ip address to use for network scan -config-directory string override the default config path ($home/.config) -rsr, -response-size-read int max response size to read in bytes (default 10485760) -rss, -response-size-save int max response size to read in bytes (default 1048576) -reset reset removes all nuclei configuration and data files (including nuclei-templates) -tlsi, -tls-impersonate enable experimental client hello (ja3) tls randomization
INTERACTSH: -iserver, -interactsh-server string interactsh server url for self-hosted instance (default: oast.pro,oast.live,oast.site,oast.online,oast.fun,oast.me) -itoken, -interactsh-token string authentication token for self-hosted interactsh server -interactions-cache-size int number of requests to keep in the interactions cache (default 5000) -interactions-eviction int number of seconds to wait before evicting requests from cache (default 60) -interactions-poll-duration int number of seconds to wait before each interaction poll request (default 5) -interactions-cooldown-period int extra time for interaction polling before exiting (default 5) -ni, -no-interactsh disable interactsh server for OAST testing, exclude OAST based templates
FUZZING: -ft, -fuzzing-type string overrides fuzzing type set in template (replace, prefix, postfix, infix) -fm, -fuzzing-mode string overrides fuzzing mode set in template (multiple, single)
UNCOVER: -uc, -uncover enable uncover engine -uq, -uncover-query string[] uncover search query -ue, -uncover-engine string[] uncover search engine (shodan,censys,fofa,shodan-idb,quake,hunter,zoomeye,netlas,criminalip,publicwww,hunterhow) (default shodan) -uf, -uncover-field string uncover fields to return (ip,port,host) (default "ip:port") -ul, -uncover-limit int uncover results to return (default 100) -ur, -uncover-ratelimit int override ratelimit of engines with unknown ratelimit (default 60 req/min) (default 60)
RATE-LIMIT: -rl, -rate-limit int maximum number of requests to send per second (default 150) -rlm, -rate-limit-minute int maximum number of requests to send per minute -bs, -bulk-size int maximum number of hosts to be analyzed in parallel per template (default 25) -c, -concurrency int maximum number of templates to be executed in parallel (default 25) -hbs, -headless-bulk-size int maximum number of headless hosts to be analyzed in parallel per template (default 10) -headc, -headless-concurrency int maximum number of headless templates to be executed in parallel (default 10)
OPTIMIZATIONS: -timeout int time to wait in seconds before timeout (default 10) -retries int number of times to retry a failed request (default 1) -ldp, -leave-default-ports leave default HTTP/HTTPS ports (eg. host:80,host:443) -mhe, -max-host-error int max errors for a host before skipping from scan (default 30) -te, -track-error string[] adds given error to max-host-error watchlist (standard, file) -nmhe, -no-mhe disable skipping host from scan based on errors -project use a project folder to avoid sending same request multiple times -project-path string set a specific project path -spm, -stop-at-first-match stop processing HTTP requests after the first match (may break template/workflow logic) -stream stream mode - start elaborating without sorting the input -ss, -scan-strategy value strategy to use while scanning(auto/host-spray/template-spray) (default auto) -irt, -input-read-timeout duration timeout on input read (default 3m0s) -nh, -no-httpx disable httpx probing for non-url input -no-stdin disable stdin processing
HEADLESS: -headless enable templates that require headless browser support (root user on Linux will disable sandbox) -page-timeout int seconds to wait for each page in headless mode (default 20) -sb, -show-browser show the browser on the screen when running templates with headless mode -ho, -headless-options string[] start headless chrome with additional options -sc, -system-chrome use local installed Chrome browser instead of nuclei installed -lha, -list-headless-action list available headless actions
DEBUG: -debug show all requests and responses -dreq, -debug-req show all sent requests -dresp, -debug-resp show all received responses -p, -proxy string[] list of http/socks5 proxy to use (comma separated or file input) -pi, -proxy-internal proxy all internal requests -ldf, -list-dsl-function list all supported DSL function signatures -tlog, -trace-log string file to write sent requests trace log -elog, -error-log string file to write sent requests error log -version show nuclei version -hm, -hang-monitor enable nuclei hang monitoring -v, -verbose show verbose output -profile-mem string optional nuclei memory profile dump file -vv display templates loaded for scan -svd, -show-var-dump show variables dump for debugging -ep, -enable-pprof enable pprof debugging server -tv, -templates-version shows the version of the installed nuclei-templates -hc, -health-check run diagnostic check up
UPDATE: -up, -update update nuclei engine to the latest released version -ut, -update-templates update nuclei-templates to latest released version -ud, -update-template-dir string custom directory to install / update nuclei-templates -duc, -disable-update-check disable automatic nuclei/templates update check
STATISTICS: -stats display statistics about the running scan -sj, -stats-json display statistics in JSONL(ines) format -si, -stats-interval int number of seconds to wait between showing a statistics update (default 5) -m, -metrics expose nuclei metrics on a port -mp, -metrics-port int port to expose nuclei metrics on (default 9092)Running Nuclei
Section titled “Running Nuclei”Nuclei templates can be primarily executed in two ways,
- Templates (
-t/templates)
As default, all the templates (except nuclei-ignore list) gets executed from default template installation path.
nuclei -u https://example.comCustom template directory or multiple template directory can be executed as follows,
nuclei -u https://example.com -t cves/ -t exposures/Custom template Github repos are downloaded under github directory. Custom repo templates can be passed as follows
nuclei -u https://example.com -t github/private-repoSimilarly, Templates can be executed against list of URLs.
nuclei -list http_urls.txt- Workflows (
-w/workflows)
nuclei -u https://example.com -w workflows/Similarly, Workflows can be executed against list of URLs.
nuclei -list http_urls.txt -w workflows/wordpress-workflow.yamlNuclei Filters
Section titled “Nuclei Filters”Nuclei engine supports three basic filters to customize template execution.
-
Tags (
-tags)Filter based on tags field available in the template.
-
Severity (
-severity)Filter based on severity field available in the template.
-
Author (
-author)Filter based on author field available in the template.
As default, Filters are applied on installed path of templates and can be customized with manual template path input.
For example, below command will run all the templates installed at ~/nuclei-templates/ directory and has cve tags in it.
nuclei -u https://example.com -tags cveAnd this example will run all the templates available under ~/nuclei-templates/exposures/ directory and has config tag in it.
nuclei -u https://example.com -tags config -t exposures/Multiple filters works together with AND condition, below example runs all template with cve tags AND has critical OR high severity AND geeknik as author of template.
nuclei -u https://example.com -tags cve -severity critical,high -author geeknikMultiple filters can also be combined using the template condition flag (-tc) that allows complex expressions like the following ones:
nuclei -tc "contains(id,'xss') || contains(tags,'xss')"nuclei -tc "contains(tags,'cve') && contains(tags,'ssrf')"nuclei -tc "contains(name, 'Local File Inclusion')"The supported fields are:
idstringnamestringdescriptionstringtagsslice of stringsauthorsslice of stringsseveritystringprotocolstringhttp_methodslice of stringsbodystring (containing all request bodies if any)matcher_typeslice of stringextractor_typeslice of stringdescriptionstring
Also, every key-value pair from the template metadata section is accessible. All fields can be combined with logical operators (|| and &&) and used with DSL helper functions.
Similarly, all filters are supported in workflows as well.
nuclei -w workflows/wordpress-workflow.yaml -severity critical,high -list http_urls.txtinfo “Workflows”
Section titled “info “Workflows””In Workflows, Nuclei filters are applied on templates or sub-templates running via workflows, not on the workflows itself.Rate Limits
Section titled “Rate Limits”Nuclei have multiple rate limit controls for multiple factors, including a number of templates to execute in parallel, a number of hosts to be scanned in parallel for each template, and the global number of request / per second you wanted to make/limit using nuclei, here is an example of each flag with description.
| Flag | Description |
|---|---|
| rate-limit | Control the total number of request to send per seconds |
| bulk-size | Control the number of hosts to process in parallel for each template |
| c | Control the number of templates to process in parallel |
Feel free to play with these flags to tune your nuclei scan speed and accuracy.
`rate-limit` flag takes precedence over the other two flags, the number of requests/seconds can't go beyond the value defined for `rate-limit` flag regardless the value of `c` and `bulk-size` flag.Traffic Tagging
Section titled “Traffic Tagging”Many BugBounty platform/programs requires you to identify the HTTP traffic you make, this can be achieved by setting custom header using config file at $HOME/.config/nuclei/config.yaml or CLI flag -H / header
info “Setting custom header using config file”
Section titled “info “Setting custom header using config file””# Headers to include with each request.header: - 'X-BugBounty-Hacker: h1/geekboy' - 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) / nuclei'info “Setting custom header using CLI flag”
Section titled “info “Setting custom header using CLI flag””nuclei -header 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) / nuclei' -list urls.txt -tags cvesTemplate Exclusion
Section titled “Template Exclusion”Nuclei supports a variety of methods for excluding / blocking templates from execution. By default, nuclei excludes the tags/templates listed below from execution to avoid unexpected fuzz based scans and some that are not supposed to run for mass scan, and these can be easily overwritten with nuclei configuration file / flags.
- Default Template ignore list.
danger ""
Section titled “danger ""”**nuclei-ignore** file is not supposed to be updated / edited / removed by user, to overwrite default ignore list, utilize [nuclei configuration](https://nuclei.projectdiscovery.io/nuclei/get-started/#nuclei-config) file.Nuclei engine supports two ways to manually exclude templates from scan,
-
Exclude Templates (
-exclude-templates/exclude)exclude-templates flag is used to exclude single or multiple templates and directory, multiple
-exclude-templatesflag can be used to provide multiple values. -
Exclude Tags (
-exclude-tags/etags)exclude-tags flag is used to exclude templates based in defined tags, single or multiple can be used to exclude templates.
info “Example of excluding single template”
Section titled “info “Example of excluding single template””nuclei -list urls.txt -t cves/ -exclude-templates cves/2020/CVE-2020-XXXX.yamlinfo “Example of multiple template exclusion”
Section titled “info “Example of multiple template exclusion””nuclei -list urls.txt -exclude-templates exposed-panels/ -exclude-templates technologies/info “Example of excluding templates with single tag”
Section titled “info “Example of excluding templates with single tag””nuclei -l urls.txt -t cves/ -etags xssinfo “Example of excluding templates with multiple tags”
Section titled “info “Example of excluding templates with multiple tags””nuclei -l urls.txt -t cves/ -etags sqli,rceTo easily overwrite nuclei-ignore, Nuclei engine supports include-tags / include-templates flag.
info “Example of running blocked templates”
Section titled “info “Example of running blocked templates””nuclei -l urls.txt -include-tags iot,misc,fuzzHeadless Mode
Section titled “Headless Mode”-headless-options
Section titled “-headless-options”Additional chrome options can be specified using -headless-options, for example -
nuclei -u https://tesla.com -headless -headless-options --no-sandbox,proxy-server=http://127.0.0.1:8080Uncover Integration
Section titled “Uncover Integration”Nuclei supports integration with uncover to execute templates against hosts returned by uncover for the given query.
Here are uncover options to use -
nuclei -h uncover
UNCOVER: -uc, -uncover enable uncover engine -uq, -uncover-query string[] uncover search query -ue, -uncover-engine string[] uncover search engine (shodan,shodan-idb,fofa,censys,quake,hunter,zoomeye,netlas,criminalip) (default shodan) -uf, -uncover-field string uncover fields to return (ip,port,host) (default "ip:port") -ul, -uncover-limit int uncover results to return (default 100) -ucd, -uncover-delay int delay between uncover query requests in seconds (0 to disable) (default 1)You have to set the API key of the engine you are using as an environment variable in your shell.
export SHODAN_API_KEY=xxxexport CENSYS_API_ID=xxxexport CENSYS_API_SECRET=xxxexport FOFA_EMAIL=xxxexport FOFA_KEY=xxxexport QUAKE_TOKEN=xxxexport HUNTER_API_KEY=xxxexport ZOOMEYE_API_KEY=xxxRequired API keys can be obtained by signing up on the following platforms Shodan, Censys, Fofa, Quake, Hunter and ZoomEye .
Example of template execution using a search query.
export SHODAN_API_KEY=xxxnuclei -id 'CVE-2021-26855' -uq 'vuln:CVE-2021-26855' -ue shodanIt can also read queries from templates metadata and execute template against hosts returned by uncover for that query.
Example of template execution using template-defined search queries.
Template snippet of CVE-2021-26855
metadata: shodan-query: 'vuln:CVE-2021-26855'nuclei -t cves/2021/CVE-2021-26855.yaml -uncovernuclei -tags cve -uncoverWe can update the nuclei configuration file to include these tags for all scans.
Mass Scanning using Nuclei
Section titled “Mass Scanning using Nuclei”Nuclei fully utilises resources to optimise scanning speed. However, when scanning thousands, if not millions, of targets, scanning using default parameter values is bound to cause some performance issues ex: low RPS, Slow Scans, Process Killed, High RAM consumption, etc. this is due to limited resources and network I/O. Hence following parameters need to be tuned based on system configuration and targets.
| Flag | Short | Description |
|---|---|---|
| scan-strategy | -ss | Scan Strategy to Use (auto/host-spray/template-spray) |
| bulk-size | -bs | Max Number of targets to scan in parallel |
| concurrency | -c | Max Number of templates to use in parallel while scanning |
| stream | - | stream mode - start elaborating without sorting the input |
info “Note”
Section titled “info “Note””These are common parameters that need to be tuned . apart from these -rate-limit,-retries,-timeout,-max-host-error also need to be tuned based on targets that are being scanned
Which Scan Strategy to Use?
Section titled “Which Scan Strategy to Use?”scan-strategy option can have three possible values
host-spray: All templates are iterated over each target.template-spray: Each template is iterated over all targets.auto(Default) : Placeholder oftemplate-sprayfor now.
User should select Scan Strategy based on number of targets and Each strategy has its own pros & cons.
- When targets < 1000 .
template-sprayshould be used . this strategy is slightly faster thanhost-spraybut uses more RAM and doesnot optimally reuse connections. - When targets > 1000 .
host-sprayshould be used . this strategy uses less RAM thantemplate-sprayand reuses HTTP connections along with some minor improvements and these are crucial when mass scanning.
Concurrency & Bulk-Size
Section titled “Concurrency & Bulk-Size”Whatever the scan-strategy is -concurrency and -bulk-size are crucial for tuning any type of scan. While tuning these parameters following points should be noted.
If scan-strategy is template-spray
-concurrency<bulk-size(Ex:-concurrency 10 -bulk-size 200)
If scan-strategy is host-spray
-concurrency>bulk-size(Ex:-concurrency 200 -bulk-size 10)
-concurrency x -bulk-size <= 2500 (depending on system config)
Stream
Section titled “Stream”This option should only be enabled if targets > 10k . This skips any type of sorting or preprocessing on target list.
Nuclei Config
Section titled “Nuclei Config”abstract ""
Section titled “abstract ""”Since release of [v.2.3.2](https://blog.projectdiscovery.io/nuclei-v2-3-0-release/) nuclei uses [goflags](https://github.com/projectdiscovery/goflags) for clean CLI experience and long/short formatted flags.
[goflags](https://github.com/projectdiscovery/goflags) comes with auto-generated config file support that coverts all available CLI flags into config file, basically you can define all CLI flags into config file to avoid repetitive CLI flags that loads as default for every scan of nuclei.
Default path of nuclei config file is `$HOME/.config/nuclei/config.yaml`, uncomment and configure the flags you wish to run as default.Here is an example config file:
# Headers to include with all HTTP requestheader: - 'X-BugBounty-Hacker: h1/geekboy'
# Directory based template executiontemplates: - cves/ - vulnerabilities/ - misconfiguration/
# Tags based template executiontags: exposures,cve
# Template Filterstags: exposures,cveauthor: geeknik,pikpikcu,dhiyaneshdkseverity: critical,high,medium
# Template Allowlistinclude-tags: dos,fuzz # Tag based inclusion (allows overwriting nuclei-ignore list)include-templates: # Template based inclusion (allows overwriting nuclei-ignore list) - vulnerabilities/xxx - misconfiguration/xxxx
# Template Denylistexclude-tags: info # Tag based exclusionexclude-templates: # Template based exclusion - vulnerabilities/xxx - misconfiguration/xxxx
# Rate Limit configurationrate-limit: 500bulk-size: 50concurrency: 50Once configured, config file be used as default, additionally custom config file can be also provided using -config flag.
info “Running nuclei with custom config file”
Section titled “info “Running nuclei with custom config file””```nuclei -config project.yaml -list urls.txt```Nuclei Reporting
Section titled “Nuclei Reporting”Nuclei comes with reporting module support with the release of v2.3.0 supporting GitHub, GitLab, and Jira integration, this allows nuclei engine to create automatic tickets on the supported platform based on found results.
| Platform | GitHub | GitLab | Jira | Markdown | SARIF | Elasticsearch | Splunk HEC |
|---|---|---|---|---|---|---|---|
| Support |
-rc, -report-config flag can be used to provide a config file to read configuration details of the platform to integrate. Here is an example config file for all supported platforms.
For example, to create tickets on GitHub, create a config file with the following content and replace the appropriate values:
# GitHub contains configuration options for GitHub issue tracker
github: username: "$user" owner: "$user" token: "$token" project-name: "testing-project" issue-label: "Nuclei"To store results in Elasticsearch, create a config file with the following content and replace the appropriate values:
# elasticsearch contains configuration options for elasticsearch exporterelasticsearch: # IP for elasticsearch instance ip: 127.0.0.1 # Port is the port of elasticsearch instance port: 9200 # IndexName is the name of the elasticsearch index index-name: nucleiTo forward results to Splunk HEC, create a config file with the following content and replace the appropriate values:
# splunkhec contains configuration options for splunkhec exportersplunkhec: # Hostname for splunkhec instance host: "$hec_host" # Port is the port of splunkhec instance port: 8088 # IndexName is the name of the splunkhec index index-name: nuclei # SSL enables ssl for splunkhec connection ssl: true # SSLVerification disables SSL verification for splunkhec ssl-verification: true # HEC Token for the splunkhec instance token: "$hec_token"To forward results to Jira, create a config file with the following content and replace the appropriate values:
The Jira reporting options allows for custom fields, as well as using variables from the Nuclei templates in those custom fields.
The supported variables currently are: $CVSSMetrics, $CVEID, $CWEID, $Host, $Severity, $CVSSScore, $Name
In addition, Jira is strict when it comes to custom field entry. If the field is a dropdown, Jira accepts only the case sensitive specific string and the API call is slightly different. To support this, there are three types of customfields.
name is the dropdown value
id is the ID value of the dropdown
freeform is if the customfield the entry of any value
To avoid duplication, the JQL query run can be slightly modified by the config file.
The CLOSED_STATUS can be changed in the Jira template file using the status-not variable.
summary ~ TEMPLATE_NAME AND summary ~ HOSTNAME AND status != CLOSED_STATUS
jira: # cloud is the boolean which tells if Jira instance is running in the cloud or on-prem version is used cloud: true # update-existing is the boolean which tells if the existing, opened issue should be updated or new one should be created update-existing: false # URL is the jira application url url: https://localhost/jira # account-id is the account-id of the Jira user or username in case of on-prem Jira account-id: test-account-id # email is the email of the user for Jira instance # token is the token for Jira instance or password in case of on-prem Jira token: test-token #project-name is the name of the project. project-name: test-project-name #issue-type is the name of the created issue type (case sensitive) issue-type: Bug # SeverityAsLabel (optional) sends the severity as the label of the created issue # User custom fields for Jira Cloud instead severity-as-label: true # Whatever your final status is that you want to use as a closed ticket - Closed, Done, Remediated, etc # When checking for duplicates, the JQL query will filter out status's that match this. # If it finds a match _and_ the ticket does have this status, a new one will be created. status-not: Closed # Customfield supports name, id and freeform. name and id are to be used when the custom field is a dropdown. # freeform can be used if the custom field is just a text entry # Variables can be used to pull various pieces of data from the finding itself. # Supported variables: $CVSSMetrics, $CVEID, $CWEID, $Host, $Severity, $CVSSScore, $Name custom_fields: customfield_00001: name: "Nuclei" customfield_00002: freeform: $CVSSMetrics customfield_00003: freeform: $CVSSScoreRunning nuclei with reporting module:
nuclei -l urls.txt -t cves/ -rc issue-tracker.yamlSimilarly, other platforms can be configured. Reporting module also supports basic filtering and duplicate checks to avoid duplicate ticket creation.
allow-list: severity: high,criticalThis will ensure to only creating tickets for issues identified with high and critical severity; similarly, deny-list can be used to exclude issues with a specific severity.
If you are running periodic scans on the same assets, you might want to consider -rdb, -report-db flag that creates a local copy of the valid findings in the given directory utilized by reporting module to compare and create tickets for unique issues only.
nuclei -l urls.txt -t cves/ -rc issue-tracker.yaml -rdb prodMarkdown Export
Nuclei supports markdown export of valid findings with -me, -markdown-export flag, this flag takes directory as input to store markdown formatted reports.
Including request/response in the markdown report is optional, and included when -irr, -include-rr flag is used along with -me.
nuclei -l urls.txt -t cves/ -irr -markdown-export reportsOptionally, the markdown exports can be sorted by template, host, or severity by setting the enviroment variable: MARKDOWN_EXPORT_SORT_MODE to template, host, or severity.
Example:
export MARKDOWN_EXPORT_SORT_MODE=severitySARIF Export
Nuclei supports SARIF export of valid findings with -se, -sarif-export flag. This flag takes a file as input to store SARIF formatted report.
nuclei -l urls.txt -t cves/ -sarif-export report.sarifIt is also possible to visualize Nuclei results using sarif file.
-
By Uploading SARIF File to SARIF Viewer
-
By Uploading SARIF File to Github Actions
more info here.
info “Note”
Section titled “info “Note””These are not official viewers of Nuclei and Nuclei has no liability towards any of these options to visualize Nuclei results. These are just some publicly available options to visualize SARIF File.
Scan Metrics
Section titled “Scan Metrics”Nuclei expose running scan metrics on a local port 9092 when -metrics flag is used and can be accessed at localhost:9092/metrics, default port to expose scan information is configurable using -metrics-port flag.
Here is an example to query metrics while running nuclei as following nuclei -t cves/ -l urls.txt -metrics
curl -s localhost:9092/metrics | jq .{ "duration": "0:00:03", "errors": "2", "hosts": "1", "matched": "0", "percent": "99", "requests": "350", "rps": "132", "startedAt": "2021-03-27T18:02:18.886745+05:30", "templates": "256", "total": "352"}Passive Scan
Section titled “Passive Scan”Nuclei engine supports passive mode scanning for HTTP based template utilizing file support, with this support we can run HTTP based templates against locally stored HTTP response data collected from any other tool.
nuclei -passive -target http_datainfo ""
Section titled “info ""”Passive mode support is limited for templates having `{{BasedURL}}` or `{{BasedURL/}}` as base path.About This Project
Section titled “About This Project”Nuclei Templates Explorer is an open-source documentation site that makes it easy to browse, search, and explore thousands of security vulnerability templates from the official ProjectDiscovery Nuclei Templates repository.
Designed for both developers and security researchers, the site allows filtering by tags, severity, author, template type, and more. It features a modern user interface with light/dark theme support and a fast client-side search experience.
This project is a part of the RequestBin.net ecosystem, dedicated to simplifying and supporting web security testing workflows.