Misc fixes

This commit is contained in:
Ice3man543 2021-02-07 23:41:33 +05:30
parent 41e9aa21e7
commit 3fe6290eed
6 changed files with 28 additions and 18 deletions

View File

@ -75,7 +75,7 @@ based on templates offering massive extensibility and ease of use.`)
set.BoolVarP(&options.TemplatesVersion, "templates-version", "tv", false, "Shows the installed nuclei-templates version") set.BoolVarP(&options.TemplatesVersion, "templates-version", "tv", false, "Shows the installed nuclei-templates version")
set.StringVarP(&options.BurpCollaboratorBiid, "burp-collaborator-biid", "biid", "", "Burp Collaborator BIID") set.StringVarP(&options.BurpCollaboratorBiid, "burp-collaborator-biid", "biid", "", "Burp Collaborator BIID")
set.StringVarP(&options.ReportingConfig, "reporting-config", "rc", "", "Nuclei Reporting Module configuration file") set.StringVarP(&options.ReportingConfig, "reporting-config", "rc", "", "Nuclei Reporting Module configuration file")
set.StringVarP(&options.ReportingDirectory, "reporting-directory", "rd", "", "Nuclei Reporting Module cache directory for issue deduplication") set.StringVarP(&options.ReportingDB, "report-db", "rdb", "", "Local Nuclei Reporting Database")
_ = set.Parse() _ = set.Parse()
if cfgFile != "" { if cfgFile != "" {

View File

@ -57,7 +57,7 @@ func New(options *types.Options) (*Runner, error) {
runner.catalogue = catalogue.New(runner.options.TemplatesDirectory) runner.catalogue = catalogue.New(runner.options.TemplatesDirectory)
if options.ReportingConfig != "" { if options.ReportingConfig != "" {
if client, err := issues.New(options.ReportingConfig, options.ReportingDirectory); err != nil { if client, err := issues.New(options.ReportingConfig, options.ReportingDB); err != nil {
gologger.Fatal().Msgf("Could not create issue reporting client: %s\n", err) gologger.Fatal().Msgf("Could not create issue reporting client: %s\n", err)
} else { } else {
runner.issuesClient = client runner.issuesClient = client

View File

@ -6,7 +6,8 @@ package dedupe
import ( import (
"crypto/sha1" "crypto/sha1"
"path" "io/ioutil"
"os"
"unsafe" "unsafe"
"github.com/projectdiscovery/nuclei/v2/pkg/output" "github.com/projectdiscovery/nuclei/v2/pkg/output"
@ -17,33 +18,46 @@ import (
// Storage is a duplicate detecting storage for nuclei scan events. // Storage is a duplicate detecting storage for nuclei scan events.
type Storage struct { type Storage struct {
storage *leveldb.DB temporary string
storage *leveldb.DB
} }
const storageFilename = "nuclei-events.db" const storageFilename = "nuclei-events.db"
// New creates a new duplicate detecting storage for nuclei scan events. // New creates a new duplicate detecting storage for nuclei scan events.
func New(folder string) (*Storage, error) { func New(dbPath string) (*Storage, error) {
path := path.Join(folder, storageFilename) storage := &Storage{}
db, err := leveldb.OpenFile(path, nil) var err error
if dbPath == "" {
dbPath, err = ioutil.TempDir("", "nuclei-report-*")
storage.temporary = dbPath
}
if err != nil {
return nil, err
}
storage.storage, err = leveldb.OpenFile(dbPath, nil)
if err != nil { if err != nil {
if !errors.IsCorrupted(err) { if !errors.IsCorrupted(err) {
return nil, err return nil, err
} }
// If the metadata is corrupted, try to recover // If the metadata is corrupted, try to recover
db, err = leveldb.RecoverFile(path, nil) storage.storage, err = leveldb.RecoverFile(dbPath, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
return &Storage{storage: db}, nil return storage, nil
} }
// Close closes the storage for further operations // Close closes the storage for further operations
func (s *Storage) Close() { func (s *Storage) Close() {
s.storage.Close() s.storage.Close()
if s.temporary != "" {
os.RemoveAll(s.temporary)
}
} }
// Index indexes an item in storage and returns true if the item // Index indexes an item in storage and returns true if the item
@ -75,9 +89,6 @@ func (s *Storage) Index(result *output.ResultEvent) (bool, error) {
hasher.Write(unsafeToBytes(k)) hasher.Write(unsafeToBytes(k))
hasher.Write(unsafeToBytes(types.ToString(v))) hasher.Write(unsafeToBytes(types.ToString(v)))
} }
if result.Request != "" {
hasher.Write(unsafeToBytes(result.Request)) // Very dumb, change later.
}
hash := hasher.Sum(nil) hash := hasher.Sum(nil)
exists, err := s.storage.Has(hash, nil) exists, err := s.storage.Has(hash, nil)

View File

@ -48,7 +48,7 @@ func MarkdownDescription(output *output.ResultEvent) string {
} }
builder.WriteString("\n**Request**\n\n```\n") builder.WriteString("\n**Request**\n\n```\n")
builder.WriteString(output.Request) builder.WriteString(output.Request)
builder.WriteString("\n```\n\n**Response**\n\n```\n") builder.WriteString("\n```\n\n<details><summary>**Response**</summary>\n\n```\n")
builder.WriteString(output.Response) builder.WriteString(output.Response)
builder.WriteString("\n```\n\n") builder.WriteString("\n```\n\n")

View File

@ -35,7 +35,7 @@ type Client struct {
} }
// New creates a new nuclei issue tracker reporting client // New creates a new nuclei issue tracker reporting client
func New(config, directory string) (*Client, error) { func New(config, db string) (*Client, error) {
file, err := os.Open(config) file, err := os.Open(config)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "could not open reporting config file") return nil, errors.Wrap(err, "could not open reporting config file")
@ -62,7 +62,7 @@ func New(config, directory string) (*Client, error) {
if tracker == nil { if tracker == nil {
return nil, errors.New("no issue tracker configuration found") return nil, errors.New("no issue tracker configuration found")
} }
storage, err := dedupe.New(directory) storage, err := dedupe.New(db)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -80,9 +80,8 @@ type Options struct {
ExcludedTemplates goflags.StringSlice ExcludedTemplates goflags.StringSlice
// CustomHeaders is the list of custom global headers to send with each request. // CustomHeaders is the list of custom global headers to send with each request.
CustomHeaders goflags.StringSlice CustomHeaders goflags.StringSlice
// ReportingDB is the db for report storage as well as deduplication
ReportingDB string
// ReportingConfig is the config file for nuclei reporting module // ReportingConfig is the config file for nuclei reporting module
ReportingConfig string ReportingConfig string
// ReportingDirectory is the directory to store nuclei issue deduplication data
// for reporting in.
ReportingDirectory string
} }