mirror of
https://github.com/projectdiscovery/nuclei.git
synced 2025-12-22 21:05:24 +00:00
Added relative path support with automatic templates detection
This commit is contained in:
parent
952058c202
commit
09054b9780
@ -6,7 +6,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
@ -86,8 +85,20 @@ func (r *Runner) Close() {
|
|||||||
// RunEnumeration sets up the input layer for giving input nuclei.
|
// RunEnumeration sets up the input layer for giving input nuclei.
|
||||||
// binary and runs the actual enumeration
|
// binary and runs the actual enumeration
|
||||||
func (r *Runner) RunEnumeration() {
|
func (r *Runner) RunEnumeration() {
|
||||||
// If the template path is a single template and not a glob, use that.
|
var err error
|
||||||
if !strings.Contains(r.options.Templates, "*") && strings.HasSuffix(r.options.Templates, ".yaml") {
|
|
||||||
|
// Check if the template is an absolute path or relative path.
|
||||||
|
// If the path is absolute, use it. Otherwise,
|
||||||
|
if r.isRelative(r.options.Templates) {
|
||||||
|
r.options.Templates, err = r.resolvePath(r.options.Templates)
|
||||||
|
if err != nil {
|
||||||
|
gologger.Errorf("Could not find template file '%s': %s\n", r.options.Templates, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the template path is a single template and not a folder, use that.
|
||||||
|
if strings.HasSuffix(r.options.Templates, ".yaml") {
|
||||||
template, err := templates.ParseTemplate(r.options.Templates)
|
template, err := templates.ParseTemplate(r.options.Templates)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
gologger.Errorf("Could not parse template file '%s': %s\n", r.options.Templates, err)
|
gologger.Errorf("Could not parse template file '%s': %s\n", r.options.Templates, err)
|
||||||
@ -116,48 +127,11 @@ func (r *Runner) RunEnumeration() {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// If the template path is glob
|
|
||||||
if strings.Contains(r.options.Templates, "*") {
|
|
||||||
// Handle the glob, evaluate it and run all the template file checks
|
|
||||||
matches, err := filepath.Glob(r.options.Templates)
|
|
||||||
if err != nil {
|
|
||||||
gologger.Fatalf("Could not evaluate template path '%s': %s\n", r.options.Templates, err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var results bool
|
|
||||||
for _, match := range matches {
|
|
||||||
template, err := templates.ParseTemplate(match)
|
|
||||||
if err != nil {
|
|
||||||
gologger.Errorf("Could not parse template file '%s': %s\n", match, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for _, request := range template.RequestsDNS {
|
|
||||||
dnsResults := r.processTemplateRequest(template, request)
|
|
||||||
if dnsResults {
|
|
||||||
results = dnsResults
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for _, request := range template.RequestsHTTP {
|
|
||||||
httpResults := r.processTemplateRequest(template, request)
|
|
||||||
if httpResults {
|
|
||||||
results = httpResults
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !results {
|
|
||||||
if r.output != nil {
|
|
||||||
outputFile := r.output.Name()
|
|
||||||
r.output.Close()
|
|
||||||
os.Remove(outputFile)
|
|
||||||
}
|
|
||||||
gologger.Infof("No results found for the templates. Happy hacking!")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// If the template passed is a directory
|
// If the template passed is a directory
|
||||||
matches := []string{}
|
matches := []string{}
|
||||||
|
|
||||||
// Recursively walk down the Templates directory and run all the template file checks
|
// Recursively walk down the Templates directory and run all the template file checks
|
||||||
err := godirwalk.Walk(r.options.Templates, &godirwalk.Options{
|
err = godirwalk.Walk(r.options.Templates, &godirwalk.Options{
|
||||||
Callback: func(path string, d *godirwalk.Dirent) error {
|
Callback: func(path string, d *godirwalk.Dirent) error {
|
||||||
if !d.IsDir() && strings.HasSuffix(path, ".yaml") {
|
if !d.IsDir() && strings.HasSuffix(path, ".yaml") {
|
||||||
matches = append(matches, path)
|
matches = append(matches, path)
|
||||||
@ -176,6 +150,7 @@ func (r *Runner) RunEnumeration() {
|
|||||||
if len(matches) == 0 {
|
if len(matches) == 0 {
|
||||||
gologger.Fatalf("Error, no templates found in directory: '%s'\n", r.options.Templates)
|
gologger.Fatalf("Error, no templates found in directory: '%s'\n", r.options.Templates)
|
||||||
}
|
}
|
||||||
|
|
||||||
var results bool
|
var results bool
|
||||||
for _, match := range matches {
|
for _, match := range matches {
|
||||||
template, err := templates.ParseTemplate(match)
|
template, err := templates.ParseTemplate(match)
|
||||||
|
|||||||
@ -273,3 +273,35 @@ func (r *Runner) downloadReleaseAndUnzip(downloadURL string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isRelative checks if a given path is a relative path
|
||||||
|
func (r *Runner) isRelative(path string) bool {
|
||||||
|
if !strings.HasPrefix(path, "/") || !strings.Contains(path, ":\\") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// resolvePath gets the absolute path to the template by either
|
||||||
|
// looking in the current directory or checking the nuclei templates directory.
|
||||||
|
//
|
||||||
|
// Current directory is given preference over the nuclei-templates directory.
|
||||||
|
func (r *Runner) resolvePath(templateName string) (string, error) {
|
||||||
|
curDirectory, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
templatePath := path.Join(curDirectory, templateName)
|
||||||
|
if _, err := os.Stat(templatePath); !os.IsNotExist(err) {
|
||||||
|
gologger.Infof("Found template in current directory: %s\n", templatePath)
|
||||||
|
return templatePath, nil
|
||||||
|
}
|
||||||
|
if r.templatesConfig != nil {
|
||||||
|
templatePath := path.Join(r.templatesConfig.TemplatesDirectory, templateName)
|
||||||
|
if _, err := os.Stat(templatePath); !os.IsNotExist(err) {
|
||||||
|
gologger.Infof("Found template in nuclei-templates directory: %s\n", templatePath)
|
||||||
|
return templatePath, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", fmt.Errorf("no such path found: %s", templateName)
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user