diff --git a/integration_tests/http/default-matcher-condition.yaml b/integration_tests/http/default-matcher-condition.yaml new file mode 100644 index 00000000..b08acfc6 --- /dev/null +++ b/integration_tests/http/default-matcher-condition.yaml @@ -0,0 +1,22 @@ +id: default-matcher-condition + +info: + name: default-matcher-condition + author: pdteam + severity: info + +requests: + - raw: + - | + GET /?action=curltest&url={{interactsh-url}} HTTP/1.1 + Host: {{Hostname}} + + matchers: + - type: word + part: interactsh_protocol + words: + - "http" + + - type: status + status: + - 200 diff --git a/v2/cmd/integration-test/http.go b/v2/cmd/integration-test/http.go index 0ac66a0f..b6c16c2b 100644 --- a/v2/cmd/integration-test/http.go +++ b/v2/cmd/integration-test/http.go @@ -70,6 +70,7 @@ var httpTestcases = map[string]testutils.TestCase{ "http/get-without-scheme.yaml": &httpGetWithoutScheme{}, "http/cl-body-without-header.yaml": &httpCLBodyWithoutHeader{}, "http/cl-body-with-header.yaml": &httpCLBodyWithHeader{}, + "http/default-matcher-condition.yaml": &httpDefaultMatcherCondition{}, } type httpInteractshRequest struct{} @@ -96,6 +97,49 @@ func (h *httpInteractshRequest) Execute(filePath string) error { return expectResultsCount(results, 1) } +type httpDefaultMatcherCondition struct{} + +// Execute executes a test case and returns an error if occurred +func (d *httpDefaultMatcherCondition) Execute(filePath string) error { + // to simulate matcher-condition `or` + // - template should be run twice and vulnerable server should send response that fits for that specific run + router := httprouter.New() + var routerErr error + // Server endpoint where only interactsh matcher is successful and status code is not 200 + router.GET("/interactsh/", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) { + value := r.URL.Query().Get("url") + if value != "" { + if _, err := retryablehttp.DefaultClient().Get("https://" + value); err != nil { + routerErr = err + } + } + w.WriteHeader(http.StatusNotFound) + }) + // Server endpoint where url is not probed but sends a 200 status code + router.GET("/status/", func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { + w.WriteHeader(http.StatusOK) + }) + ts := httptest.NewServer(router) + defer ts.Close() + + results, err := testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL+"/interactsh", debug) + if err != nil { + return err + } + if routerErr != nil { + return errorutil.NewWithErr(routerErr).Msgf("failed to send http request to interactsh server") + } + if err := expectResultsCount(results, 1); err != nil { + return err + } + + results, err = testutils.RunNucleiTemplateAndGetResults(filePath, ts.URL+"/status", debug) + if err != nil { + return err + } + return expectResultsCount(results, 1) +} + type httpInteractshStopAtFirstMatchRequest struct{} // Execute executes a test case and returns an error if occurred diff --git a/v2/go.mod b/v2/go.mod index 928d737e..ef124d70 100644 --- a/v2/go.mod +++ b/v2/go.mod @@ -26,7 +26,7 @@ require ( github.com/projectdiscovery/clistats v0.0.12 github.com/projectdiscovery/fastdialer v0.0.24 github.com/projectdiscovery/hmap v0.0.10 - github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053 + github.com/projectdiscovery/interactsh v1.1.0 github.com/projectdiscovery/rawhttp v0.1.9 github.com/projectdiscovery/retryabledns v1.0.21 github.com/projectdiscovery/retryablehttp-go v1.0.13 @@ -104,6 +104,7 @@ require ( github.com/hbakhtiyor/strsim v0.0.0-20190107154042-4d2bbb273edf // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/karlseguin/expect v1.0.8 // indirect + github.com/mackerelio/go-osstat v0.2.3 // indirect github.com/pjbgf/sha1cd v0.2.3 // indirect github.com/projectdiscovery/asnmap v1.0.2 // indirect github.com/projectdiscovery/cdncheck v0.0.4-0.20220413175814-b47bc2d578b1 // indirect @@ -134,7 +135,7 @@ require ( github.com/antchfx/xpath v1.2.3 // indirect github.com/aymerick/douceur v0.2.0 // indirect github.com/c4milo/unpackit v0.1.0 // indirect - github.com/caddyserver/certmagic v0.16.3 // indirect + github.com/caddyserver/certmagic v0.17.2 // indirect github.com/cnf/structhash v0.0.0-20201127153200-e1b16c1ebc08 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/dimchansky/utfbom v1.1.1 // indirect @@ -159,7 +160,7 @@ require ( github.com/hdm/jarm-go v0.0.7 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/itchyny/timefmt-go v0.1.5 // indirect - github.com/klauspost/cpuid/v2 v2.1.0 // indirect + github.com/klauspost/cpuid/v2 v2.1.1 // indirect github.com/klauspost/pgzip v1.2.5 // indirect github.com/leodido/go-urn v1.2.1 // indirect github.com/libdns/libdns v0.2.1 // indirect @@ -191,7 +192,7 @@ require ( github.com/zmap/rc2 v0.0.0-20190804163417-abaa70531248 // indirect github.com/zmap/zcrypto v0.0.0-20230205235340-d51ce4775101 // indirect go.etcd.io/bbolt v1.3.7 // indirect - go.uber.org/zap v1.23.0 // indirect + go.uber.org/zap v1.24.0 // indirect goftp.io/server/v2 v2.0.0 // indirect golang.org/x/crypto v0.7.0 golang.org/x/exp v0.0.0-20230224173230-c95f2b4c22f2 diff --git a/v2/go.sum b/v2/go.sum index 2fd6afe7..3b814f56 100644 --- a/v2/go.sum +++ b/v2/go.sum @@ -112,8 +112,8 @@ github.com/bradfitz/iter v0.0.0-20191230175014-e8f45d346db8/go.mod h1:spo1JLcs67 github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/c4milo/unpackit v0.1.0 h1:91pWJ6B3svZ4LOE+p3rnyucRK5fZwBdF/yQ/pcZO31I= github.com/c4milo/unpackit v0.1.0/go.mod h1:pvXCMYlSV8zwGFWMaT+PWYkAB/cvDjN2mv9r7ZRSxEo= -github.com/caddyserver/certmagic v0.16.3 h1:1ZbiU7y5X0MnDjBTXywUbPMs/ScHbgCeeCy/LPh4IZk= -github.com/caddyserver/certmagic v0.16.3/go.mod h1:pSS2aZcdKlrTZrb2DKuRafckx20o5Fz1EdDKEB8KOQM= +github.com/caddyserver/certmagic v0.17.2 h1:o30seC1T/dBqBCNNGNHWwj2i5/I/FMjBbTAhjADP3nE= +github.com/caddyserver/certmagic v0.17.2/go.mod h1:ouWUuC490GOLJzkyN35eXfV8bSbwMwSf4bdhkIxtdQE= github.com/cloudflare/cfssl v1.6.4-0.20221208165709-c5e40da60306 h1:4ifuHhCvT09M+E/lX56KvQsFKSfOd077aYS1sNXa6UY= github.com/cloudflare/cfssl v1.6.4-0.20221208165709-c5e40da60306/go.mod h1:4TQEp/C5L83FVh5G/2edJy2rQ/rqw7r1ze2D2rgrzTs= github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= @@ -287,8 +287,8 @@ github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0 github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.1.0 h1:eyi1Ad2aNJMW95zcSbmGg7Cg6cq3ADwLpMAP96d8rF0= -github.com/klauspost/cpuid/v2 v2.1.0/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= +github.com/klauspost/cpuid/v2 v2.1.1 h1:t0wUqjowdm8ezddV5k0tLWVklVuvLJpoHeb4WBdydm0= +github.com/klauspost/cpuid/v2 v2.1.1/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -316,6 +316,8 @@ github.com/lor00x/goldap v0.0.0-20180618054307-a546dffdd1a3 h1:wIONC+HMNRqmWBjuM 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/mackerelio/go-osstat v0.2.3 h1:jAMXD5erlDE39kdX2CU7YwCGRcxIO33u/p8+Fhe5dJw= +github.com/mackerelio/go-osstat v0.2.3/go.mod h1:DQbPOnsss9JHIXgBStc/dnhhir3gbd3YH+Dbdi7ptMA= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= @@ -404,8 +406,8 @@ github.com/projectdiscovery/hmap v0.0.10 h1:O6ALGW3BK+FmknLXW7ENwQevLs+faRJuoRbD github.com/projectdiscovery/hmap v0.0.10/go.mod h1:xdtyejCgl5LJW7yz7nf/ut32tWuV/l7FjUzItiCtJIg= github.com/projectdiscovery/httpx v1.2.7 h1:rDB+uKpWE/e6nuLDM341ZNzaaMgwcEcc+A9Q5R6RL3s= github.com/projectdiscovery/httpx v1.2.7/go.mod h1:QW8mKw6PzMBb62T5fT9w75hhVBcjoyyVTDJhefZcX50= -github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053 h1:8Dr2q8BWxNgG5EO/YTyNyL83xzmYSDwysx4pMZzZx7I= -github.com/projectdiscovery/interactsh v1.0.6-0.20220827132222-460cc6270053/go.mod h1:7lLz3Rt+Lxt8xhK0EUYkgxoa9RXRL3honxHeAu+ivuk= +github.com/projectdiscovery/interactsh v1.1.0 h1:WXCwvInO2LgOURRr08rr601S5ruzMpoPIVXFRNZpwAE= +github.com/projectdiscovery/interactsh v1.1.0/go.mod h1:49THEmeKNQIU1uV/NxxXEY9u8uNtJ4LMw0A8bxZSKuM= github.com/projectdiscovery/iputil v0.0.2 h1:f6IGnZF4RImJLysPSPG3D84jyTH34q3lihCFeP+eZzI= github.com/projectdiscovery/iputil v0.0.2/go.mod h1:J3Pcz1q51pi4/JL871mQztg0KOzyWDPxnPLOYJm2pVQ= github.com/projectdiscovery/mapcidr v1.1.0 h1:Yeb+CGVsRYvHmZ9YSHb9iy4tzY9YuOm3oTFX/xzGhVU= @@ -591,8 +593,8 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= -go.uber.org/zap v1.23.0 h1:OjGQ5KQDEUawVHxNwQgPpiypGHOxo2mNZsOqTak4fFY= -go.uber.org/zap v1.23.0/go.mod h1:D+nX8jyLsMHMYrln8A0rJjFt/T/9/bGgIhAqxv5URuY= +go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= goftp.io/server/v2 v2.0.0 h1:FF8JKXXKDxAeO1uXEZz7G+IZwCDhl19dpVIlDtp3QAg= goftp.io/server/v2 v2.0.0/go.mod h1:7+H/EIq7tXdfo1Muu5p+l3oQ6rYkDZ8lY7IM5d5kVdQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/v2/pkg/protocols/common/interactsh/interactsh.go b/v2/pkg/protocols/common/interactsh/interactsh.go index d4923276..1a6bc12b 100644 --- a/v2/pkg/protocols/common/interactsh/interactsh.go +++ b/v2/pkg/protocols/common/interactsh/interactsh.go @@ -171,7 +171,7 @@ func (c *Client) firstTimeInitializeClient() error { c.hostname = interactDomain c.dataMutex.Unlock() - interactsh.StartPolling(c.pollDuration, func(interaction *server.Interaction) { + err = interactsh.StartPolling(c.pollDuration, func(interaction *server.Interaction) { item := c.requests.Get(interaction.UniqueID) if item == nil { // If we don't have any request for this ID, add it to temporary @@ -199,6 +199,10 @@ func (c *Client) firstTimeInitializeClient() error { _ = c.processInteractionForRequest(interaction, request) }) + + if err != nil { + return errors.Wrap(err, "could not perform instactsh polling") + } return nil } @@ -258,7 +262,7 @@ func (c *Client) Close() bool { time.Sleep(c.cooldownDuration) } if c.interactsh != nil { - c.interactsh.StopPolling() + _ = c.interactsh.StopPolling() c.interactsh.Close() } diff --git a/v2/pkg/protocols/http/request.go b/v2/pkg/protocols/http/request.go index 18cddd76..d4086a17 100644 --- a/v2/pkg/protocols/http/request.go +++ b/v2/pkg/protocols/http/request.go @@ -393,9 +393,8 @@ func (request *Request) ExecuteWithResults(input *contextargs.Context, dynamicVa MatchFunc: request.Match, ExtractFunc: request.Extract, }) - } else { - callback(event) } + callback(event) }, generator.currentIndex) // If a variable is unresolved, skip all further requests