mirror of
https://github.com/chainreactors/spray.git
synced 2025-09-15 19:50:18 +00:00
69 lines
1.5 KiB
Go
69 lines
1.5 KiB
Go
package pkg
|
|
|
|
import (
|
|
"github.com/chainreactors/parsers"
|
|
"strings"
|
|
)
|
|
|
|
type FingerPrintHub struct {
|
|
Name string `json:"name"`
|
|
FaviconHash []string `json:"favicon_hash,omitempty"`
|
|
Keyword []string `json:"keyword,omitempty"`
|
|
Path string `json:"path"`
|
|
Headers map[string]string `json:"headers,omitempty"`
|
|
}
|
|
|
|
func FingerPrintHubDetect(header, body string) parsers.Frameworks {
|
|
frames := make(parsers.Frameworks)
|
|
for _, finger := range FingerPrintHubs {
|
|
status := false
|
|
if fingerPrintHubMatchHeader(finger, header) && fingerPrintHubMatchBody(finger, body) {
|
|
status = true
|
|
}
|
|
|
|
if status {
|
|
frames.Add(&parsers.Framework{
|
|
Name: finger.Name,
|
|
From: parsers.FrameFromDefault,
|
|
Tags: []string{"fingerprinthub"},
|
|
})
|
|
}
|
|
}
|
|
return frames
|
|
}
|
|
|
|
func fingerPrintHubMatchHeader(finger *FingerPrintHub, header string) bool {
|
|
if len(finger.Headers) == 0 {
|
|
return true
|
|
}
|
|
status := true
|
|
for k, v := range finger.Headers {
|
|
if v == "*" && strings.Contains(header, k) {
|
|
status = true
|
|
} else if strings.Contains(header, k) && strings.Contains(header, v) {
|
|
status = true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
return status
|
|
}
|
|
|
|
func fingerPrintHubMatchBody(finger *FingerPrintHub, body string) bool {
|
|
if len(finger.Keyword) == 0 {
|
|
return true
|
|
}
|
|
if body == "" {
|
|
return false
|
|
}
|
|
status := true
|
|
for _, key := range finger.Keyword {
|
|
if strings.Contains(body, key) {
|
|
status = true
|
|
} else {
|
|
return false
|
|
}
|
|
}
|
|
return status
|
|
}
|