diff --git a/internal/option.go b/internal/option.go index 77aecee..c5305fa 100644 --- a/internal/option.go +++ b/internal/option.go @@ -269,27 +269,28 @@ func (opt *Option) PrepareRunner() (*Runner, error) { // prepare word dicts := make([][]string, len(opt.Dictionaries)) - for i, f := range opt.Dictionaries { - dicts[i], err = loadFileToSlice(f) - if opt.ResumeFrom != "" { - dictCache[f] = dicts[i] + if len(opt.Dictionaries) == 0 { + dicts = append(dicts, pkg.LoadDefaultDict()) + logs.Log.Warn("not set any dictionary, use default dictionary: https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt") + } else { + for i, f := range opt.Dictionaries { + dicts[i], err = loadFileToSlice(f) + if opt.ResumeFrom != "" { + dictCache[f] = dicts[i] + } + if err != nil { + return nil, err + } + logs.Log.Importantf("Loaded %d word from %s", len(dicts[i]), f) } - if err != nil { - return nil, err - } - logs.Log.Importantf("Loaded %d word from %s", len(dicts[i]), f) } if opt.Word == "" { - if len(opt.Dictionaries) == 0 { - opt.Word = "/" - } else { - opt.Word = "{?" - for i, _ := range dicts { - opt.Word += strconv.Itoa(i) - } - opt.Word += "}" + opt.Word = "{?" + for i, _ := range dicts { + opt.Word += strconv.Itoa(i) } + opt.Word += "}" } if opt.Suffixes != nil { diff --git a/pkg/load.go b/pkg/load.go new file mode 100644 index 0000000..71448d7 --- /dev/null +++ b/pkg/load.go @@ -0,0 +1,92 @@ +package pkg + +import ( + "encoding/json" + "github.com/chainreactors/gogo/v2/pkg/fingers" + "github.com/chainreactors/parsers" + "github.com/chainreactors/utils" + "github.com/chainreactors/utils/iutils" + "github.com/chainreactors/words/mask" + "strings" +) + +func LoadTemplates() error { + var err error + // load fingers + Fingers, err = fingers.LoadFingers(LoadConfig("http")) + if err != nil { + return err + } + + for _, finger := range Fingers { + err := finger.Compile(utils.ParsePorts) + if err != nil { + return err + } + } + + for _, f := range Fingers { + for _, rule := range f.Rules { + if rule.SendDataStr != "" { + ActivePath = append(ActivePath, rule.SendDataStr) + } + if rule.Favicon != nil { + for _, mmh3 := range rule.Favicon.Mmh3 { + Mmh3Fingers[mmh3] = f.Name + } + for _, md5 := range rule.Favicon.Md5 { + Md5Fingers[md5] = f.Name + } + } + } + } + + // load rule + var data map[string]interface{} + err = json.Unmarshal(LoadConfig("spray_rule"), &data) + if err != nil { + return err + } + for k, v := range data { + Rules[k] = v.(string) + } + + // load mask + var keywords map[string]interface{} + err = json.Unmarshal(LoadConfig("spray_common"), &keywords) + if err != nil { + return err + } + + for k, v := range keywords { + t := make([]string, len(v.([]interface{}))) + for i, vv := range v.([]interface{}) { + t[i] = iutils.ToString(vv) + } + mask.SpecialWords[k] = t + } + + var extracts []*parsers.Extractor + err = json.Unmarshal(LoadConfig("extract"), &extracts) + if err != nil { + return err + } + + for _, extract := range extracts { + extract.Compile() + + ExtractRegexps[extract.Name] = []*parsers.Extractor{extract} + for _, tag := range extract.Tags { + if _, ok := ExtractRegexps[tag]; !ok { + ExtractRegexps[tag] = []*parsers.Extractor{extract} + } else { + ExtractRegexps[tag] = append(ExtractRegexps[tag], extract) + } + } + } + return nil +} + +func LoadDefaultDict() []string { + return strings.Split(strings.TrimSpace(string(LoadConfig("spray_default"))), "\n") +} diff --git a/pkg/utils.go b/pkg/utils.go index 3615fd9..9db4201 100644 --- a/pkg/utils.go +++ b/pkg/utils.go @@ -1,12 +1,9 @@ package pkg import ( - "encoding/json" "github.com/chainreactors/gogo/v2/pkg/fingers" "github.com/chainreactors/parsers" - "github.com/chainreactors/utils" "github.com/chainreactors/utils/iutils" - "github.com/chainreactors/words/mask" "math/rand" "net/url" "path" @@ -119,83 +116,6 @@ func RandHost() string { return *(*string)(unsafe.Pointer(&b)) } -func LoadTemplates() error { - var err error - // load fingers - Fingers, err = fingers.LoadFingers(LoadConfig("http")) - if err != nil { - return err - } - - for _, finger := range Fingers { - err := finger.Compile(utils.ParsePorts) - if err != nil { - return err - } - } - - for _, f := range Fingers { - for _, rule := range f.Rules { - if rule.SendDataStr != "" { - ActivePath = append(ActivePath, rule.SendDataStr) - } - if rule.Favicon != nil { - for _, mmh3 := range rule.Favicon.Mmh3 { - Mmh3Fingers[mmh3] = f.Name - } - for _, md5 := range rule.Favicon.Md5 { - Md5Fingers[md5] = f.Name - } - } - } - } - - // load rule - var data map[string]interface{} - err = json.Unmarshal(LoadConfig("rule"), &data) - if err != nil { - return err - } - for k, v := range data { - Rules[k] = v.(string) - } - - // load mask - var keywords map[string]interface{} - err = json.Unmarshal(LoadConfig("mask"), &keywords) - if err != nil { - return err - } - - for k, v := range keywords { - t := make([]string, len(v.([]interface{}))) - for i, vv := range v.([]interface{}) { - t[i] = iutils.ToString(vv) - } - mask.SpecialWords[k] = t - } - - var extracts []*parsers.Extractor - err = json.Unmarshal(LoadConfig("extract"), &extracts) - if err != nil { - return err - } - - for _, extract := range extracts { - extract.Compile() - - ExtractRegexps[extract.Name] = []*parsers.Extractor{extract} - for _, tag := range extract.Tags { - if _, ok := ExtractRegexps[tag]; !ok { - ExtractRegexps[tag] = []*parsers.Extractor{extract} - } else { - ExtractRegexps[tag] = append(ExtractRegexps[tag], extract) - } - } - } - return nil -} - func FingerDetect(content []byte) parsers.Frameworks { frames := make(parsers.Frameworks) for _, finger := range Fingers { diff --git a/spray.go b/spray.go index 36358cb..b93658a 100644 --- a/spray.go +++ b/spray.go @@ -1,4 +1,4 @@ -//go:generate go run templates/templates_gen.go -t templates -o pkg/templates.go -need http,rule,mask,extract +//go:generate go run templates/templates_gen.go -t templates -o pkg/templates.go -need spray package main import "github.com/chainreactors/spray/cmd" diff --git a/templates b/templates index 53643d9..e980f34 160000 --- a/templates +++ b/templates @@ -1 +1 @@ -Subproject commit 53643d9011f3f932cfad07a1f5d1bc87ae88ea77 +Subproject commit e980f346de47e8162a9f466ab6c4218f0bfebd6e