package network import ( "encoding/hex" "fmt" "net/http" "net/http/httptest" "net/url" "testing" "github.com/stretchr/testify/require" "github.com/projectdiscovery/nuclei/v3/pkg/model" "github.com/projectdiscovery/nuclei/v3/pkg/model/types/severity" "github.com/projectdiscovery/nuclei/v3/pkg/operators" "github.com/projectdiscovery/nuclei/v3/pkg/operators/extractors" "github.com/projectdiscovery/nuclei/v3/pkg/operators/matchers" "github.com/projectdiscovery/nuclei/v3/pkg/output" "github.com/projectdiscovery/nuclei/v3/pkg/protocols/common/contextargs" "github.com/projectdiscovery/nuclei/v3/pkg/testutils" ) func TestNetworkExecuteWithResults(t *testing.T) { options := testutils.DefaultOptions testutils.Init(options) templateID := "testing-network" request := &Request{ ID: templateID, Address: []string{"{{Hostname}}:"}, ReadSize: 2048, Inputs: []*Input{}, Operators: operators.Operators{ Matchers: []*matchers.Matcher{{ Name: "test", Part: "data", Type: matchers.MatcherTypeHolder{MatcherType: matchers.WordsMatcher}, Words: []string{"200 OK"}, }}, Extractors: []*extractors.Extractor{{ Part: "data", Type: extractors.ExtractorTypeHolder{ExtractorType: extractors.RegexExtractor}, Regex: []string{"

.*

"}, }}, }, } ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { _, _ = w.Write([]byte(exampleBody)) })) defer ts.Close() parsed, err := url.Parse(ts.URL) require.Nil(t, err, "could not parse url") request.Address[0] = "{{Hostname}}" request.Inputs = append(request.Inputs, &Input{Data: fmt.Sprintf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", parsed.Host)}) executerOpts := testutils.NewMockExecuterOptions(options, &testutils.TemplateInfo{ ID: templateID, Info: model.Info{SeverityHolder: severity.Holder{Severity: severity.Low}, Name: "test"}, }) err = request.Compile(executerOpts) require.Nil(t, err, "could not compile network request") var finalEvent *output.InternalWrappedEvent t.Run("domain-valid", func(t *testing.T) { metadata := make(output.InternalEvent) previous := make(output.InternalEvent) ctxArgs := contextargs.NewWithInput(parsed.Host) err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) { finalEvent = event }) require.Nil(t, err, "could not execute network request") }) require.NotNil(t, finalEvent, "could not get event output from request") require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results") require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results") require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results") require.Equal(t, "

Example Domain

", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results") finalEvent = nil t.Run("invalid-port-override", func(t *testing.T) { metadata := make(output.InternalEvent) previous := make(output.InternalEvent) ctxArgs := contextargs.NewWithInput("127.0.0.1:11211") err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) { finalEvent = event }) require.Nil(t, err, "could not execute network request") }) require.Nil(t, finalEvent.Results, "could not get event output from request") request.Inputs[0].Type = NetworkInputTypeHolder{NetworkInputType: hexType} request.Inputs[0].Data = hex.EncodeToString([]byte(fmt.Sprintf("GET / HTTP/1.1\r\nHost: %s\r\n\r\n", parsed.Host))) t.Run("hex-to-string", func(t *testing.T) { metadata := make(output.InternalEvent) previous := make(output.InternalEvent) ctxArgs := contextargs.NewWithInput(parsed.Host) err := request.ExecuteWithResults(ctxArgs, metadata, previous, func(event *output.InternalWrappedEvent) { finalEvent = event }) require.Nil(t, err, "could not execute network request") }) require.NotNil(t, finalEvent, "could not get event output from request") require.Equal(t, 1, len(finalEvent.Results), "could not get correct number of results") require.Equal(t, "test", finalEvent.Results[0].MatcherName, "could not get correct matcher name of results") require.Equal(t, 1, len(finalEvent.Results[0].ExtractedResults), "could not get correct number of extracted results") require.Equal(t, "

Example Domain

", finalEvent.Results[0].ExtractedResults[0], "could not get correct extracted results") } var exampleBody = ` Example Domain

Example Domain

This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission.

More information...

`