-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.go
More file actions
109 lines (97 loc) · 2.98 KB
/
main.go
File metadata and controls
109 lines (97 loc) · 2.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package main
import (
"encoding/json"
"flag"
"fmt"
"log"
"os"
"time"
"github.com/ismailtsdln/mvctrace/internal/detector"
"github.com/ismailtsdln/mvctrace/internal/httpclient"
)
const (
green = "\033[32m"
red = "\033[31m"
yellow = "\033[33m"
blue = "\033[34m"
reset = "\033[0m"
bold = "\033[1m"
)
func getConfidenceColor(conf int) string {
if conf >= 70 {
return green
} else if conf >= 40 {
return yellow
}
return red
}
func main() {
var (
jsonOutput = flag.Bool("json", false, "Output in JSON format")
timeout = flag.Duration("timeout", 10*time.Second, "Request timeout")
proxy = flag.String("proxy", "", "HTTP proxy URL")
silent = flag.Bool("silent", false, "Minimal output")
)
flag.Parse()
if flag.NArg() != 1 {
fmt.Println("Usage: mvctrace [flags] <url>")
fmt.Println("Flags:")
flag.PrintDefaults()
os.Exit(1)
}
targetURL := flag.Arg(0)
client := httpclient.NewClient(*timeout, *proxy)
result := detector.Detect(client, targetURL)
if *jsonOutput {
jsonData, err := json.MarshalIndent(result, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(jsonData))
return
}
if *silent {
if result.IsMVC {
fmt.Printf("%sMVC detected%s (%s%s%s confidence)\n", green, reset, getConfidenceColor(result.Confidence), result.ConfidenceLevel(), reset)
} else {
fmt.Printf("%sNot MVC%s\n", red, reset)
}
return
}
// Human-readable output
fmt.Printf("%sTarget:%s %s\n", blue+bold, reset, result.Target)
if result.IsMVC {
fmt.Printf("%sFramework:%s ASP.NET MVC\n", green+bold, reset)
if result.Version != "" {
fmt.Printf("%sMVC Version:%s %s (%s%s%s Confidence)\n", green+bold, reset, result.Version, getConfidenceColor(result.Confidence), result.ConfidenceLevel(), reset)
if result.VersionSource != "" {
fmt.Printf("%sVersion Source:%s %s\n", green, reset, result.VersionSource)
}
} else {
fmt.Printf("%sMVC Detected%s (%s%s%s Confidence)\n", green+bold, reset, getConfidenceColor(result.Confidence), result.ConfidenceLevel(), reset)
}
} else {
fmt.Printf("%sFramework:%s Not ASP.NET MVC\n", red+bold, reset)
fmt.Printf("%sConfidence:%s %s%s%s\n", red+bold, reset, getConfidenceColor(result.Confidence), result.ConfidenceLevel(), reset)
}
if len(result.Evidence) > 0 {
fmt.Printf("%sEvidence:%s\n", yellow+bold, reset)
for _, ev := range result.Evidence {
fmt.Printf(" %s•%s %s\n", yellow, reset, ev.Description)
fmt.Printf(" %sSource:%s %s\n", yellow, reset, ev.Source)
if ev.Value != "" {
fmt.Printf(" %sValue:%s %s\n", yellow, reset, ev.Value)
}
if ev.HTTPDetails != nil {
fmt.Printf(" %sHTTP Request:%s %s %s\n", blue, reset, ev.HTTPDetails.Method, ev.HTTPDetails.URL)
fmt.Printf(" %sHTTP Response:%s Status %d\n", blue, reset, ev.HTTPDetails.StatusCode)
if len(ev.HTTPDetails.Headers) > 0 {
fmt.Printf(" %sHeaders:%s\n", blue, reset)
for k, v := range ev.HTTPDetails.Headers {
fmt.Printf(" %s: %s\n", k, v)
}
}
}
}
}
}