nuclei/v2/pkg/matchers/util.go

86 lines
1.8 KiB
Go
Raw Normal View History

2020-04-26 23:32:58 +02:00
package matchers
import (
"fmt"
"net/http"
"net/http/httputil"
"strings"
2020-09-30 01:05:55 +02:00
"time"
2020-04-26 23:32:58 +02:00
"github.com/miekg/dns"
)
2020-10-21 22:30:53 +02:00
const defaultFormat = "%s"
// HttpToMap Converts HTTP to Matcher Map
func HttpToMap(resp *http.Response, body, headers string, duration time.Duration, format string) (m map[string]interface{}) {
2020-04-26 23:32:58 +02:00
m = make(map[string]interface{})
2020-10-21 22:30:53 +02:00
if format == "" {
format = defaultFormat
}
m[fmt.Sprintf(format, "content_length")] = resp.ContentLength
m[fmt.Sprintf(format, "status_code")] = resp.StatusCode
2020-04-26 23:32:58 +02:00
for k, v := range resp.Header {
k = strings.ToLower(strings.TrimSpace(strings.ReplaceAll(k, "-", "_")))
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, k)] = strings.Join(v, " ")
2020-04-26 23:32:58 +02:00
}
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "all_headers")] = headers
m[fmt.Sprintf(format, "body")] = body
2020-04-26 23:32:58 +02:00
if r, err := httputil.DumpResponse(resp, true); err == nil {
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "raw")] = string(r)
2020-04-26 23:32:58 +02:00
}
2020-10-01 18:16:24 +02:00
// Converts duration to seconds (floating point) for DSL syntax
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "duration")] = duration.Seconds()
2020-09-30 01:05:55 +02:00
2020-04-26 23:32:58 +02:00
return m
}
2020-10-21 22:30:53 +02:00
// DnsToMap Converts DNS to Matcher Map
func DnsToMap(msg *dns.Msg, format string) (m map[string]interface{}) {
2020-04-26 23:32:58 +02:00
m = make(map[string]interface{})
2020-10-21 22:30:53 +02:00
if format == "" {
format = defaultFormat
}
m[fmt.Sprintf(format, "rcode")] = msg.Rcode
2020-04-26 23:32:58 +02:00
var qs string
2020-04-26 23:32:58 +02:00
for _, question := range msg.Question {
qs += fmt.Sprintln(question.String())
}
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "question")] = qs
2020-04-26 23:32:58 +02:00
var exs string
for _, extra := range msg.Extra {
exs += fmt.Sprintln(extra.String())
}
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "extra")] = exs
2020-04-26 23:32:58 +02:00
var ans string
for _, answer := range msg.Answer {
ans += fmt.Sprintln(answer.String())
}
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "answer")] = ans
2020-04-26 23:32:58 +02:00
var nss string
for _, ns := range msg.Ns {
nss += fmt.Sprintln(ns.String())
}
2020-10-21 22:30:53 +02:00
m[fmt.Sprintf(format, "ns")] = nss
m[fmt.Sprintf(format, "raw")] = msg.String()
2020-04-26 23:32:58 +02:00
return m
}