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  }