zgrab2/module.go
Jeff Cody ec59b49540
Add support for BytesReadLimit parameter in BaseFlags
Some protocols may require more data than others.  To accomodate those,
allow the BytesReadLimit to be changed by means of BaseFlags.

By setting BaseFlags.BytesReadLimit prior to calling .Open(), scanners
can override the default limit to one that is appropriate for the data
collected.
2018-10-22 21:59:01 -04:00

95 lines
3.3 KiB
Go

package zgrab2
import "time"
// Scanner is an interface that represents all functions necessary to run a scan
type Scanner interface {
// Init runs once for this module at library init time
Init(flags ScanFlags) error
// InitPerSender runs once per Goroutine. A single Goroutine will scan some non-deterministic
// subset of the input scan targets
InitPerSender(senderID int) error
// Returns the name passed at init
GetName() string
// Returns the trigger passed at init
GetTrigger() string
// Protocol returns the protocol identifier for the scan.
Protocol() string
// Scan connects to a host. The result should be JSON-serializable
Scan(t ScanTarget) (ScanStatus, interface{}, error)
}
// ScanResponse is the result of a scan on a single host
type ScanResponse struct {
// Status is required for all responses.
Status ScanStatus `json:"status"`
// Protocol is the identifier if the protocol that did the scan. In the case of a complex scan, this may differ from
// the scan name.
Protocol string `json:"protocol"`
Result interface{} `json:"result,omitempty"`
Timestamp string `json:"timestamp,omitempty"`
Error *string `json:"error,omitempty"`
}
// ScanModule is an interface which represents a module that the framework can
// manipulate
type ScanModule interface {
// NewFlags is called by the framework to pass to the argument parser. The parsed flags will be passed
// to the scanner created by NewScanner().
NewFlags() interface{}
// NewScanner is called by the framework for each time an individual scan is specified in the config or on
// the command-line. The framework will then call scanner.Init(name, flags).
NewScanner() Scanner
}
// ScanFlags is an interface which must be implemented by all types sent to
// the flag parser
type ScanFlags interface {
// Help optionally returns any additional help text, e.g. specifying what empty defaults
// are interpreted as.
Help() string
// Validate enforces all command-line flags and positional arguments have valid values.
Validate(args []string) error
}
// BaseFlags contains the options that every flags type must embed
type BaseFlags struct {
Port uint `short:"p" long:"port" description:"Specify port to grab on"`
Name string `short:"n" long:"name" description:"Specify name for output json, only necessary if scanning multiple modules"`
Timeout time.Duration `short:"t" long:"timeout" description:"Set connection timeout (0 = no timeout)" default:"10s"`
Trigger string `short:"g" long:"trigger" description:"Invoke only on targets with specified tag"`
BytesReadLimit int `short:"m" long:"maxbytes" description:"Maximum byte read limit per scan (0 = defaults)"`
}
// UDPFlags contains the common options used for all UDP scans
type UDPFlags struct {
LocalPort uint `long:"local-port" description:"Set an explicit local port for UDP traffic"`
LocalAddress string `long:"local-addr" description:"Set an explicit local address for UDP traffic"`
}
// GetName returns the name of the respective scanner
func (b *BaseFlags) GetName() string {
return b.Name
}
// GetModule returns the registered module that corresponds to the given name
// or nil otherwise
func GetModule(name string) ScanModule {
return modules[name]
}
var modules map[string]ScanModule
func init() {
modules = make(map[string]ScanModule)
}