github.com/crowdsecurity/crowdsec@v1.6.1/pkg/hubtest/nucleirunner.go (about) 1 package hubtest 2 3 import ( 4 "bytes" 5 "errors" 6 "fmt" 7 "os" 8 "os/exec" 9 "time" 10 11 log "github.com/sirupsen/logrus" 12 ) 13 14 type NucleiConfig struct { 15 Path string `yaml:"nuclei_path"` 16 OutputDir string `yaml:"output_dir"` 17 CmdLineOptions []string `yaml:"cmdline_options"` 18 } 19 20 var ErrNucleiTemplateFail = errors.New("nuclei template failed") 21 22 func (nc *NucleiConfig) RunNucleiTemplate(testName string, templatePath string, target string) error { 23 tstamp := time.Now().Unix() 24 25 outputPrefix := fmt.Sprintf("%s/%s-%d", nc.OutputDir, testName, tstamp) 26 // CVE-2023-34362_CVE-2023-34362-1702562399_stderr.txt 27 args := []string{ 28 "-u", target, 29 "-t", templatePath, 30 "-o", outputPrefix + ".json", 31 } 32 args = append(args, nc.CmdLineOptions...) 33 cmd := exec.Command(nc.Path, args...) 34 35 log.Debugf("Running Nuclei command: '%s'", cmd.String()) 36 37 var out bytes.Buffer 38 var outErr bytes.Buffer 39 40 cmd.Stdout = &out 41 cmd.Stderr = &outErr 42 43 err := cmd.Run() 44 45 if err := os.WriteFile(outputPrefix+"_stdout.txt", out.Bytes(), 0644); err != nil { 46 log.Warningf("Error writing stdout: %s", err) 47 } 48 49 if err := os.WriteFile(outputPrefix+"_stderr.txt", outErr.Bytes(), 0644); err != nil { 50 log.Warningf("Error writing stderr: %s", err) 51 } 52 53 if err != nil { 54 log.Warningf("Error running nuclei: %s", err) 55 log.Warningf("Stdout saved to %s", outputPrefix+"_stdout.txt") 56 log.Warningf("Stderr saved to %s", outputPrefix+"_stderr.txt") 57 log.Warningf("Nuclei generated output saved to %s", outputPrefix+".json") 58 return err 59 } else if len(out.String()) == 0 { 60 log.Warningf("Stdout saved to %s", outputPrefix+"_stdout.txt") 61 log.Warningf("Stderr saved to %s", outputPrefix+"_stderr.txt") 62 log.Warningf("Nuclei generated output saved to %s", outputPrefix+".json") 63 //No stdout means no finding, it means our test failed 64 return ErrNucleiTemplateFail 65 } 66 return nil 67 }