From 393ac8898b541b1de4805d46ba03052a37a2f16b Mon Sep 17 00:00:00 2001 From: M09Ic Date: Fri, 28 Oct 2022 01:48:33 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E8=B0=83result,=20=E5=87=86=E5=A4=87?= =?UTF-8?q?=E5=B0=86=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81=E6=8A=BD=E7=A6=BB?= =?UTF-8?q?=E5=88=B0=E5=85=AC=E5=85=B1=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- v2/internal/core/output.go | 12 +++---- v2/pkg/result.go | 64 ++++++++++++++++++++++++++++---------- v2/pkg/result_data.go | 18 +++++------ v2/pkg/utils.go | 34 -------------------- 4 files changed, 63 insertions(+), 65 deletions(-) diff --git a/v2/internal/core/output.go b/v2/internal/core/output.go index 6ecffa12..2fff147c 100644 --- a/v2/internal/core/output.go +++ b/v2/internal/core/output.go @@ -15,17 +15,17 @@ func output(result *Result, outType string) string { switch outType { case "color", "c": - out = ColorOutput(result) + out = result.ColorOutput() case "json", "j": - out = JsonOutput(result) + out = result.JsonOutput() case "jsonlines", "jl": - out = JsonOutput(result) + "\n" + out = result.JsonOutput() + "\n" case "full": - out = FullOutput(result) + out = result.FullOutput() case "csv": - out = CsvOutput(result) + out = result.CsvOutput() default: - out = ValuesOutput(result, outType) + out = result.ValuesOutput(outType) } return out } diff --git a/v2/pkg/result.go b/v2/pkg/result.go index d3cf47b3..b580b52e 100644 --- a/v2/pkg/result.go +++ b/v2/pkg/result.go @@ -1,9 +1,11 @@ package pkg import ( + "encoding/json" "fmt" "github.com/chainreactors/gogo/v2/pkg/fingers" "github.com/chainreactors/gogo/v2/pkg/utils" + "github.com/chainreactors/logs" "github.com/chainreactors/parsers" "net" "net/http" @@ -81,15 +83,14 @@ func (result *Result) AddVulns(vulns []*fingers.Vuln) { } func (result *Result) AddFramework(f *fingers.Framework) { + f.FromStr = fingers.FrameFromMap[f.From] result.Frameworks = append(result.Frameworks, f) - //result.FrameworksMap[f.ToString()] = true } -func (result *Result) AddFrameworks(f []*fingers.Framework) { - result.Frameworks = append(result.Frameworks, f...) - //for _, framework := range f { - //result.FrameworksMap[framework.ToString()] = true - //} +func (result *Result) AddFrameworks(fs []*fingers.Framework) { + for _, f := range fs { + result.AddFramework(f) + } } func (result *Result) AddExtract(extract *fingers.Extracted) { @@ -116,13 +117,6 @@ func (result *Result) GetExtractStat() string { } } -func (result *Result) NoFramework() bool { - if len(result.Frameworks) == 0 { - return true - } - return false -} - func (result *Result) GuessFramework() { for _, v := range PortMap.Get(result.Port) { if TagMap.Get(v) == nil && !utils.SliceContains([]string{"top1", "top2", "top3", "other", "windows"}, v) { @@ -226,6 +220,13 @@ func (result *Result) GetTarget() string { return fmt.Sprintf("%s:%s", result.Ip, result.Port) } +func (result *Result) NoFramework() bool { + if len(result.Frameworks) == 0 { + return true + } + return false +} + func (result *Result) GetFirstFramework() string { if !result.NoFramework() { return result.Frameworks[0].Name @@ -233,6 +234,37 @@ func (result *Result) GetFirstFramework() string { return "" } +func (result *Result) ColorOutput() string { + s := fmt.Sprintf("[+] %s\t%s\t%s\t%s\t%s [%s] %s %s\n", result.GetURL(), result.Midware, result.Language, logs.Blue(result.Frameworks.ToString()), result.Host, logs.Yellow(result.Status), logs.Blue(result.Title), logs.Red(result.Vulns.ToString())) + return s +} + +func (result *Result) FullOutput() string { + s := fmt.Sprintf("[+] %s\t%s\t%s\t%s\t%s [%s] %s %s %s\n", result.GetURL(), result.Midware, result.Language, result.Frameworks.ToString(), result.Host, result.Status, result.Title, result.Vulns.ToString(), result.Extracts.ToString()) + return s +} + +func (result *Result) JsonOutput() string { + jsons, _ := json.Marshal(result) + return string(jsons) +} + +func (result *Result) CsvOutput() string { + return fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n", result.Ip, result.Port, result.GetURL(), result.Status, slashComma(result.Title), result.Host, result.Language, slashComma(result.Midware), slashComma(result.Frameworks.ToString()), slashComma(result.Vulns.ToString()), slashComma(result.Extracts.ToString())) +} + +func (result *Result) ValuesOutput(outType string) string { + outs := strings.Split(outType, ",") + for i, out := range outs { + outs[i] = result.Get(out) + } + return strings.Join(outs, "\t") + "\n" +} + +func slashComma(s string) string { + return strings.Replace(s, ",", "\\,", -1) +} + func (result *Result) AddNTLMInfo(m map[string]string, t string) { result.Title = m["MsvAvNbDomainName"] + "/" + m["MsvAvNbComputerName"] result.Host = strings.Trim(m["MsvAvDnsDomainName"], "\x00") + "/" + m["MsvAvDnsComputerName"] @@ -272,9 +304,9 @@ func (rs Results) Filter(k, v, op string) Results { return filtedres } -func (results Results) GetValues(key string) []string { - values := make([]string, len(results)) - for i, result := range results { +func (rs Results) GetValues(key string) []string { + values := make([]string, len(rs)) + for i, result := range rs { //if focus && !result.Frameworks.IsFocus() { // // 如果需要focus, 则跳过非focus标记的framework // continue diff --git a/v2/pkg/result_data.go b/v2/pkg/result_data.go index b501e10e..607c3446 100644 --- a/v2/pkg/result_data.go +++ b/v2/pkg/result_data.go @@ -84,7 +84,7 @@ type ResultsData struct { Data Results `json:"data"` } -func (rd ResultsData) groupByIP() map[string]IPMapResult { +func (rd *ResultsData) groupByIP() map[string]IPMapResult { pfs := make(map[string]IPMapResult) //ipfs := make(map[string]ipformat) for _, result := range rd.Data { @@ -96,7 +96,7 @@ func (rd ResultsData) groupByIP() map[string]IPMapResult { return pfs } -func (rd ResultsData) groupBySortedIP() (map[string]IPMapResult, []string) { +func (rd *ResultsData) groupBySortedIP() (map[string]IPMapResult, []string) { pfs := rd.groupByIP() ips := make([]string, len(pfs)) var i = 0 @@ -131,7 +131,7 @@ func (rd *ResultsData) Filter(name string) { rd.Data = results } -func (rd ResultsData) ToConfig() string { +func (rd *ResultsData) ToConfig() string { // 输出配置信息 var configstr string configstr = fmt.Sprintf("Scan Target: %s, Ports: %s, Mod: %s \n", rd.Config.GetTargetName(), rd.Config.Ports, rd.Config.Mod) @@ -142,7 +142,7 @@ func (rd ResultsData) ToConfig() string { return configstr } -func (rd ResultsData) ToValues(outType string) string { +func (rd *ResultsData) ToValues(outType string) string { outs := strings.Split(outType, ",") outvalues := make([][]string, len(outs)) ss := make([]string, len(rd.Data)) @@ -160,7 +160,7 @@ func (rd ResultsData) ToValues(outType string) string { return strings.Join(ss, "\n") } -func (rd ResultsData) ToFormat(isColor bool) string { +func (rd *ResultsData) ToFormat(isColor bool) string { var s string pfs, ips := rd.groupBySortedIP() @@ -211,7 +211,7 @@ func (rd ResultsData) ToFormat(isColor bool) string { return s } -func (rd ResultsData) ToCobaltStrike() string { +func (rd *ResultsData) ToCobaltStrike() string { var s string pfs := rd.groupByIP() for ip, imap := range pfs { @@ -231,7 +231,7 @@ func (rd ResultsData) ToCobaltStrike() string { return s } -func (rd ResultsData) ToZombie() string { +func (rd *ResultsData) ToZombie() string { var zms []zombiemeta for _, r := range rd.Data { if service, ok := zombiemap[strings.ToLower(r.GetFirstFramework())]; ok { @@ -250,11 +250,11 @@ func (rd ResultsData) ToZombie() string { return string(s) } -func (rd ResultsData) ToCsv() string { +func (rd *ResultsData) ToCsv() string { var s strings.Builder s.WriteString("ip,port,url,status,title,host,language,midware,frame,vuln,extract\n") for _, r := range rd.Data { - s.WriteString(CsvOutput(r)) + s.WriteString(r.CsvOutput()) } return s.String() } diff --git a/v2/pkg/utils.go b/v2/pkg/utils.go index 565f2b33..bdc70291 100644 --- a/v2/pkg/utils.go +++ b/v2/pkg/utils.go @@ -1,16 +1,13 @@ package pkg import ( - "encoding/json" "fmt" . "github.com/chainreactors/files" "github.com/chainreactors/gogo/v2/pkg/utils" "github.com/chainreactors/ipcs" - "github.com/chainreactors/logs" "github.com/chainreactors/parsers" "regexp" "sort" - "strings" ) var ( @@ -57,34 +54,3 @@ func sortIP(ips []string) []string { }) return ips } - -func ValuesOutput(result *Result, outType string) string { - outs := strings.Split(outType, ",") - for i, out := range outs { - outs[i] = result.Get(out) - } - return strings.Join(outs, "\t") + "\n" -} - -func ColorOutput(result *Result) string { - s := fmt.Sprintf("[+] %s\t%s\t%s\t%s\t%s [%s] %s %s\n", result.GetURL(), result.Midware, result.Language, logs.Blue(result.Frameworks.ToString()), result.Host, logs.Yellow(result.Status), logs.Blue(result.Title), logs.Red(result.Vulns.ToString())) - return s -} - -func FullOutput(result *Result) string { - s := fmt.Sprintf("[+] %s\t%s\t%s\t%s\t%s [%s] %s %s %s\n", result.GetURL(), result.Midware, result.Language, result.Frameworks.ToString(), result.Host, result.Status, result.Title, result.Vulns.ToString(), result.Extracts.ToString()) - return s -} - -func JsonOutput(result *Result) string { - jsons, _ := json.Marshal(result) - return string(jsons) -} - -func CsvOutput(result *Result) string { - return fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n", result.Ip, result.Port, result.GetURL(), result.Status, slashComma(result.Title), result.Host, result.Language, slashComma(result.Midware), slashComma(result.Frameworks.ToString()), slashComma(result.Vulns.ToString()), slashComma(result.Extracts.ToString())) -} - -func slashComma(s string) string { - return strings.Replace(s, ",", "\\,", -1) -}