Skip to content

Commit

Permalink
Add internal domains flag (#68)
Browse files Browse the repository at this point in the history
* feat: add internal domains flag to scan options

* fix: fix docs
  • Loading branch information
elsapet committed Oct 21, 2022
1 parent 8b76166 commit 19a2ac1
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 16 deletions.
1 change: 1 addition & 0 deletions docs/reference/commands.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ curio scan [FLAGS] [PATH]
- `--debug` enable debug logs
- `--disable-domain-resolution` skip attempt to resolve detected domains during classification (default false)
- `--domain-resolution-timeout` set timeout when attempting to resolve detected domains during classification
- `--internal-domains` define regular expressions for better classification of private or unreachable domains eg. --internal-domains="*.my-company.com,private.sh"

#### Worker Flags

Expand Down
6 changes: 2 additions & 4 deletions pkg/classification/classification.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package classification

import (
"regexp"

"github.com/bearer/curio/pkg/classification/db"
"github.com/bearer/curio/pkg/classification/dependencies"
"github.com/bearer/curio/pkg/classification/interfaces"
Expand All @@ -26,8 +24,8 @@ type Config struct {
func NewClassifier(config *Config) (*Classifier, error) {
interfacesClassifier, err := interfaces.New(
interfaces.Config{
Recipes: db.Default(),
InternalDomainMatchers: []*regexp.Regexp{},
Recipes: db.Default(),
InternalDomains: config.Config.Scan.InternalDomains,
DomainResolver: url.NewDomainResolver(
!config.Config.Scan.DisableDomainResolution,
config.Config.Scan.DomainResolutionTimeout,
Expand Down
27 changes: 20 additions & 7 deletions pkg/classification/interfaces/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,9 @@ type Classifier struct {
}

type Config struct {
Recipes []db.Recipe
InternalDomainMatchers []*regexp.Regexp
DomainResolver *url.DomainResolver
Recipes []db.Recipe
InternalDomains []string
DomainResolver *url.DomainResolver
}

type Recipe struct {
Expand All @@ -58,8 +58,10 @@ type RecipeURLMatch struct {
}

var ErrInvalidRecipes = errors.New("invalid interface recipe")
var ErrInvalidInternalDomainRegexp = errors.New("could not parse internal domains as regexp")

func New(config Config) (*Classifier, error) {
// prepare regular expressions for recipes
var preparedRecipes []Recipe
for _, recipe := range config.Recipes {
preparedRecipe := Recipe{
Expand All @@ -81,19 +83,30 @@ func New(config Config) (*Classifier, error) {
preparedRecipes = append(preparedRecipes, preparedRecipe)
}

// parse internal domains as regular expressions
var internalDomainMatchers []*regexp.Regexp
for _, internalDomain := range config.InternalDomains {
internalDomainMatcher, err := regexp.Compile(internalDomain)
if err != nil {
return nil, ErrInvalidInternalDomainRegexp
}

internalDomainMatchers = append(internalDomainMatchers, internalDomainMatcher)
}

return &Classifier{
Recipes: preparedRecipes,
InternalDomainMatchers: config.InternalDomainMatchers,
InternalDomainMatchers: internalDomainMatchers,
DomainResolver: config.DomainResolver,
}, nil
}

func NewDefault() (*Classifier, error) {
return New(
Config{
Recipes: db.Default(),
InternalDomainMatchers: []*regexp.Regexp{},
DomainResolver: url.NewDomainResolverDefault(),
Recipes: db.Default(),
InternalDomains: []string{},
DomainResolver: url.NewDomainResolverDefault(),
},
)
}
Expand Down
7 changes: 2 additions & 5 deletions pkg/classification/interfaces/interfaces_test.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package interfaces_test

import (
"regexp"
"testing"

"github.com/bearer/curio/pkg/classification/db"
Expand Down Expand Up @@ -195,10 +194,8 @@ func TestInterface(t *testing.T) {

classifier, err := interfaces.New(
interfaces.Config{
Recipes: db.Default(),
InternalDomainMatchers: []*regexp.Regexp{
regexp.MustCompile(`https://my.internal.domain.com`),
},
Recipes: db.Default(),
InternalDomains: []string{"https://my.internal.domain.com"},
},
)
if err != nil {
Expand Down
1 change: 1 addition & 0 deletions pkg/commands/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ func NewConfigCommand() *cobra.Command {
SkipPathFlag: &flag.SkipPathFlag,
DisableDomainResolutionFlag: &flag.DisableDomainResolutionFlag,
DomainResolutionTimeoutFlag: &flag.DomainResolutionTimeoutFlag,
InternalDomainsFlag: &flag.InternalDomainsFlag,
}

configFlags := &flag.Flags{
Expand Down
11 changes: 11 additions & 0 deletions pkg/flag/scan_flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,20 @@ var (
Value: 3 * time.Second,
Usage: "set timeout when attempting to resolve detected domains during classification (default 3 seconds), eg. --domain-resolution-timeout=TODO",
}
InternalDomainsFlag = Flag{
Name: "internal-domains",
ConfigName: "scan.internal-domains",
Value: []string{},
Usage: "define regular expressions for better classification of private or unreachable domains eg. --internal-domains=\"/*.my-company.com/,/private.sh/\"",
}
)

type ScanFlagGroup struct {
SkipPathFlag *Flag
DebugFlag *Flag
DisableDomainResolutionFlag *Flag
DomainResolutionTimeoutFlag *Flag
InternalDomainsFlag *Flag
}

type ScanOptions struct {
Expand All @@ -42,6 +49,7 @@ type ScanOptions struct {
Debug bool `json:"debug"`
DisableDomainResolution bool `json:"disable_domain_resolution"`
DomainResolutionTimeout time.Duration `json:"domain_resolution_timeout"`
InternalDomains []string `json:"internal_domains"`
}

func NewScanFlagGroup() *ScanFlagGroup {
Expand All @@ -50,6 +58,7 @@ func NewScanFlagGroup() *ScanFlagGroup {
DebugFlag: &DebugFlag,
DisableDomainResolutionFlag: &DisableDomainResolutionFlag,
DomainResolutionTimeoutFlag: &DomainResolutionTimeoutFlag,
InternalDomainsFlag: &InternalDomainsFlag,
}
}

Expand All @@ -63,6 +72,7 @@ func (f *ScanFlagGroup) Flags() []*Flag {
f.DebugFlag,
f.DisableDomainResolutionFlag,
f.DomainResolutionTimeoutFlag,
f.InternalDomainsFlag,
}
}

Expand All @@ -77,6 +87,7 @@ func (f *ScanFlagGroup) ToOptions(args []string) (ScanOptions, error) {
Debug: getBool(f.DebugFlag),
DisableDomainResolution: getBool(f.DisableDomainResolutionFlag),
DomainResolutionTimeout: getDuration(f.DomainResolutionTimeoutFlag),
InternalDomains: getStringSlice(f.InternalDomainsFlag),
Target: target,
}, nil
}

0 comments on commit 19a2ac1

Please sign in to comment.