From 4cb5e2e8f6c3100aacbd6ed31e49aa30d4b8a534 Mon Sep 17 00:00:00 2001 From: edoardottt Date: Sat, 3 Sep 2022 13:34:49 +0200 Subject: [PATCH] lint --- crawler/colly.go | 50 ++++++++++++++++----------------- crawler/requests.go | 30 ++++++++++---------- crawler/useragents.go | 14 +++++----- input/check.go | 12 ++++---- input/flags.go | 10 +++---- input/input.go | 10 +++---- main.go | 58 +++++++++++++++++++-------------------- output/beautify.go | 2 +- output/color.go | 24 ++++++++-------- output/examples.go | 2 +- output/help.go | 2 +- output/html.go | 10 +++---- output/output.go | 50 ++++++++++++++++----------------- output/txt.go | 4 +-- scanner/endpoints.go | 8 +++--- scanner/errors.go | 8 +++--- scanner/extensions.go | 16 +++++------ scanner/info.go | 8 +++--- scanner/secrets.go | 10 +++---- utils/files.go | 34 +++++++++++------------ utils/slice.go | 18 ++++++------ utils/urls.go | 64 +++++++++++++++++++++---------------------- 22 files changed, 221 insertions(+), 223 deletions(-) diff --git a/crawler/colly.go b/crawler/colly.go index 58f665c..cab8ce9 100644 --- a/crawler/colly.go +++ b/crawler/colly.go @@ -43,9 +43,9 @@ import ( "github.com/gocolly/colly/extensions" ) -//Crawler it's the actual crawler engine. -//It controls all the behaviours of a scan -//(event handlers, secrets, errors, extensions and endpoints scanning). +// Crawler it's the actual crawler engine. +// It controls all the behaviours of a scan +// (event handlers, secrets, errors, extensions and endpoints scanning). func Crawler(target string, txt string, html string, delayTime int, concurrency int, ignore string, ignoreTxt string, cache bool, timeout int, intensive bool, rua bool, proxy string, insecure bool, secrets bool, secretsFile []string, plain bool, endpoints bool, @@ -80,19 +80,19 @@ func Crawler(target string, txt string, html string, delayTime int, concurrency os.Exit(1) } - //clean target input + // clean target input target = utils.RemoveProtocol(target) ignoreSlice := []string{} ignoreBool := false - //if ignore -> produce the slice + // if ignore -> produce the slice if ignore != "" { ignoreBool = true ignoreSlice = utils.CheckInputArray(ignore) } - //if ignoreTxt -> produce the slice + // if ignoreTxt -> produce the slice if ignoreTxt != "" { ignoreBool = true ignoreSlice = utils.ReadFile(ignoreTxt) @@ -105,7 +105,7 @@ func Crawler(target string, txt string, html string, delayTime int, concurrency FinalErrors := []scanner.ErrorMatched{} FinalInfos := []scanner.InfoMatched{} - //crawler creation + // crawler creation c := CreateColly(delayTime, concurrency, cache, timeout, intensive, rua, proxy, insecure, userAgent, target) // On every a element which has href attribute call callback @@ -276,7 +276,7 @@ func Crawler(target string, txt string, html string, delayTime int, concurrency } }) - //Add headers (if needed) on each request + // Add headers (if needed) on each request if (len(headers)) > 0 { c.OnRequest(func(r *colly.Request) { for header, value := range headers { @@ -290,7 +290,7 @@ func Crawler(target string, txt string, html string, delayTime int, concurrency lengthOk := len(string(r.Body)) > 10 - //if endpoints or secrets or filetype: scan + // if endpoints or secrets or filetype: scan if endpoints || secrets || (1 <= fileType && fileType <= 7) || errors || info { // HERE SCAN FOR SECRETS if secrets && lengthOk { @@ -367,8 +367,8 @@ func Crawler(target string, txt string, html string, delayTime int, concurrency return FinalResults, FinalSecrets, FinalEndpoints, FinalExtensions, FinalErrors, FinalInfos } -//CreateColly takes as input all the settings needed to instantiate -//a new Colly Collector object and it returns this object. +// CreateColly takes as input all the settings needed to instantiate +// a new Colly Collector object and it returns this object. func CreateColly(delayTime int, concurrency int, cache bool, timeout int, intensive bool, rua bool, proxy string, insecure bool, userAgent string, target string) *colly.Collector { c := colly.NewCollector( @@ -428,13 +428,13 @@ func CreateColly(delayTime int, concurrency int, cache bool, timeout int, return c } -//huntSecrets hunts for secrets +// huntSecrets hunts for secrets. func huntSecrets(secretsFile []string, target string, body string) []scanner.SecretMatched { secrets := SecretsMatch(target, body, secretsFile) return secrets } -//SecretsMatch checks if a body matches some secrets +// SecretsMatch checks if a body matches some secrets. func SecretsMatch(url string, body string, secretsFile []string) []scanner.SecretMatched { var secrets []scanner.SecretMatched @@ -475,13 +475,13 @@ func SecretsMatch(url string, body string, secretsFile []string) []scanner.Secre return secrets } -//huntEndpoints hunts for juicy endpoints +// huntEndpoints hunts for juicy endpoints. func huntEndpoints(endpointsFile []string, target string) []scanner.EndpointMatched { endpoints := EndpointsMatch(target, endpointsFile) return endpoints } -//EndpointsMatch check if an endpoint matches a juicy parameter +// EndpointsMatch check if an endpoint matches a juicy parameter. func EndpointsMatch(target string, endpointsFile []string) []scanner.EndpointMatched { endpoints := []scanner.EndpointMatched{} matched := []scanner.Parameter{} @@ -510,7 +510,7 @@ func EndpointsMatch(target string, endpointsFile []string) []scanner.EndpointMat return endpoints } -//huntExtensions hunts for extensions +// huntExtensions hunts for extensions. func huntExtensions(target string, severity int) scanner.FileTypeMatched { extension := scanner.FileTypeMatched{} copyTarget := target @@ -532,13 +532,13 @@ func huntExtensions(target string, severity int) scanner.FileTypeMatched { return extension } -//huntErrors hunts for errors +// huntErrors hunts for errors. func huntErrors(target string, body string) []scanner.ErrorMatched { errorsSlice := ErrorsMatch(target, body) return errorsSlice } -//ErrorsMatch checks the patterns for errors +// ErrorsMatch checks the patterns for errors. func ErrorsMatch(url string, body string) []scanner.ErrorMatched { errors := []scanner.ErrorMatched{} @@ -556,13 +556,13 @@ func ErrorsMatch(url string, body string) []scanner.ErrorMatched { return errors } -//huntInfos hunts for infos +// huntInfos hunts for infos. func huntInfos(target string, body string) []scanner.InfoMatched { infosSlice := InfoMatch(target, body) return infosSlice } -//InfoMatch checks the patterns for infos +// InfoMatch checks the patterns for infos. func InfoMatch(url string, body string) []scanner.InfoMatched { infos := []scanner.InfoMatched{} @@ -580,7 +580,7 @@ func InfoMatch(url string, body string) []scanner.InfoMatched { return infos } -//RetrieveBody retrieves the body (in the response) of a url +// RetrieveBody retrieves the body (in the response) of a url. func RetrieveBody(target string) string { sb, err := GetRequest(target) if err == nil && sb != "" { @@ -590,7 +590,7 @@ func RetrieveBody(target string) string { return "" } -//IgnoreMatch checks if the URL should be ignored or not. +// IgnoreMatch checks if the URL should be ignored or not. func IgnoreMatch(url string, ignoreSlice []string) bool { for _, ignore := range ignoreSlice { if strings.Contains(url, ignore) { @@ -601,9 +601,9 @@ func IgnoreMatch(url string, ignoreSlice []string) bool { return false } -//intensiveOk checks if a given url can be crawled -//in intensive mode (if the 2nd level domain matches with -//the inputted target). +// intensiveOk checks if a given url can be crawled +// in intensive mode (if the 2nd level domain matches with +// the inputted target). func intensiveOk(target string, urlInput string) bool { root, err := utils.GetRootHost(urlInput) if err != nil { diff --git a/crawler/requests.go b/crawler/requests.go index 7566195..57b3f7f 100644 --- a/crawler/requests.go +++ b/crawler/requests.go @@ -33,8 +33,8 @@ import ( "net/http" ) -//GetRequest performs a GET request and return -//a string (the body of the response). +// GetRequest performs a GET request and return +// a string (the body of the response). func GetRequest(target string) (string, error) { resp, err := http.Get(target) if err != nil { @@ -42,33 +42,33 @@ func GetRequest(target string) (string, error) { } defer resp.Body.Close() - //We Read the response body on the line below. + // We Read the response body on the line below. body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err } - //Convert the body to type string + // Convert the body to type string sb := string(body) return sb, nil } -//PostRequest performs a POST request and return -//a string (the body of the response) -//the map in the input should contains the data fields and values -//in this way for example: -//{ email: test@example.com, password: stupid_pwd }. +// PostRequest performs a POST request and return +// a string (the body of the response) +// the map in the input should contains the data fields and values +// in this way for example: +// { email: test@example.com, password: stupid_pwd }. func PostRequest(target string, data map[string]string) (string, error) { postBody, _ := json.Marshal(data) responseBody := bytes.NewBuffer(postBody) - //Leverage Go's HTTP Post function to make request + // Leverage Go's HTTP Post function to make request resp, err := http.Post(target, "application/json", responseBody) - //Handle Error + // Handle Error if err != nil { return "", err } defer resp.Body.Close() - //Read the response body + // Read the response body body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err @@ -79,15 +79,15 @@ func PostRequest(target string, data map[string]string) (string, error) { return sb, nil } -//HeadRequest performs a HEAD request and return -//a string (the headers of the response). +// HeadRequest performs a HEAD request and return +// a string (the headers of the response). func HeadRequest(target string) (string, error) { resp, err := http.Head(target) if err != nil { return "", err } defer resp.Body.Close() - //Read the response body + // Read the response body body, err := ioutil.ReadAll(resp.Body) if err != nil { return "", err diff --git a/crawler/useragents.go b/crawler/useragents.go index f002399..049dc96 100644 --- a/crawler/useragents.go +++ b/crawler/useragents.go @@ -35,7 +35,7 @@ import ( "time" ) -//Firefox versions +// Firefox versions. var ffVersions = []float32{ 58.0, 57.0, @@ -46,7 +46,7 @@ var ffVersions = []float32{ 35.0, } -//Chrome versions +// Chrome versions. var chromeVersions = []string{ "65.0.3325.146", "64.0.3282.0", @@ -55,7 +55,7 @@ var chromeVersions = []string{ "37.0.2062.124", } -//Operating system +// Operating system. var osStrings = []string{ "Macintosh; Intel Mac OS X 10_10", "Windows NT 10.0", @@ -65,7 +65,7 @@ var osStrings = []string{ "X11; Linux x86_64", } -//genFirefoxUA generates a random Firefox User Agent +// genFirefoxUA generates a random Firefox User Agent. func genFirefoxUA() string { rand.Seed(time.Now().UnixNano()) version := ffVersions[rand.Intn(len(ffVersions))] @@ -74,7 +74,7 @@ func genFirefoxUA() string { return fmt.Sprintf("Mozilla/5.0 (%s; rv:%.1f) Gecko/20100101 Firefox/%.1f", os, version, version) } -//genChromeUA generates a random Chrome User Agent +// genChromeUA generates a random Chrome User Agent. func genChromeUA() string { rand.Seed(time.Now().UnixNano()) version := chromeVersions[rand.Intn(len(chromeVersions))] @@ -83,8 +83,8 @@ func genChromeUA() string { return fmt.Sprintf("Mozilla/5.0 (%s) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/%s Safari/537.36", os, version) } -//GenerateRandomUserAgent generates a random user agent -//(can be Chrome or Firefox). +// GenerateRandomUserAgent generates a random user agent +// (can be Chrome or Firefox). func GenerateRandomUserAgent() string { rand.Seed(time.Now().UnixNano()) diff --git a/input/check.go b/input/check.go index 2897763..650619e 100644 --- a/input/check.go +++ b/input/check.go @@ -34,16 +34,16 @@ import ( "github.com/edoardottt/cariddi/utils" ) -//CheckDataPost should take as input a string and checks -//if it's correctly formatted to be represented as post data -//TODO - for now cariddi sends only GET requests. +// CheckDataPost should take as input a string and checks +// if it's correctly formatted to be represented as post data +// TODO - for now cariddi sends only GET requests. func CheckDataPost(input string) (map[string]string, error) { // ===== TODO ======= return map[string]string{}, nil } -//CheckOutputFile checks if the string provided as input -//is formatted in a correct way. +// CheckOutputFile checks if the string provided as input +// is formatted in a correct way. func CheckOutputFile(input string) bool { invalid := []string{"\\", "/", "'", "\""} for _, elem := range invalid { @@ -55,7 +55,7 @@ func CheckOutputFile(input string) bool { return true } -//CheckFlags checks the flags taken as input. +// CheckFlags checks the flags taken as input. func CheckFlags(flags Input) { if flags.TXT != "" { if !CheckOutputFile(flags.TXT) { diff --git a/input/flags.go b/input/flags.go index f9a8677..801d3c1 100644 --- a/input/flags.go +++ b/input/flags.go @@ -30,8 +30,8 @@ import ( "flag" ) -//Input struct. -//It contains all the possible options. +// Input struct. +// It contains all the possible options. type Input struct { Version bool Delay int @@ -62,9 +62,9 @@ type Input struct { UserAgent string } -//ScanFlag defines all the options taken -//as input and scan them, then it returns -//an Input struct. +// ScanFlag defines all the options taken +// as input and scan them, then it returns +// an Input struct. func ScanFlag() Input { versionPtr := flag.Bool("version", false, "Print the version.") delayPtr := flag.Int("d", 0, "Delay between a page crawled and another.") diff --git a/input/input.go b/input/input.go index 11a6e1f..b58b2e0 100644 --- a/input/input.go +++ b/input/input.go @@ -35,8 +35,8 @@ import ( "github.com/edoardottt/cariddi/utils" ) -//ScanTargets return the array of elements -//taken as input on stdin. +// ScanTargets return the array of elements +// taken as input on stdin. func ScanTargets() []string { var result []string @@ -52,9 +52,9 @@ func ScanTargets() []string { return utils.RemoveDuplicateValues(result) } -//GetHeaders returns the headers provided as input -//using the headers flag. -//E.g. -headers \"Cookie: auth=yes;;Client: type=2\". +// GetHeaders returns the headers provided as input +// using the headers flag. +// E.g. -headers \"Cookie: auth=yes;;Client: type=2\". func GetHeaders(input string) map[string]string { result := make(map[string]string) diff --git a/main.go b/main.go index df7fece..b77443f 100644 --- a/main.go +++ b/main.go @@ -36,50 +36,49 @@ import ( "github.com/edoardottt/cariddi/utils" ) -//main function > +// main function. func main() { - // Scan flags. flags := input.ScanFlag() - //Print version and exit. + // Print version and exit. if flags.Version { output.Beautify() os.Exit(0) } - //Print help and exit. + // Print help and exit. if flags.Help { output.PrintHelp() os.Exit(0) } - //Print examples and exit. + // Print examples and exit. if flags.Examples { output.PrintExamples() os.Exit(0) } - //If it's possible print the cariddi banner. + // If it's possible print the cariddi banner. if !flags.Plain { output.Beautify() } - //Read the targets from standard input. + // Read the targets from standard input. targets := input.ScanTargets() - //Check if there are errors in the flags definition. + // Check if there are errors in the flags definition. input.CheckFlags(flags) - //If it is needed, read custom endpoints definition - //from the specified file. + // If it is needed, read custom endpoints definition + // from the specified file. var endpointsFileSlice []string if flags.EndpointsFile != "" { endpointsFileSlice = utils.ReadFile(flags.EndpointsFile) } - //If it is needed, read custom secrets definition - //from the specified file. + // If it is needed, read custom secrets definition + // from the specified file. var secretsFileSlice []string if flags.SecretsFile != "" { secretsFileSlice = utils.ReadFile(flags.SecretsFile) @@ -92,20 +91,20 @@ func main() { finalErrors := []scanner.ErrorMatched{} finalInfos := []scanner.InfoMatched{} - //Create output files if needed (txt / html). + // Create output files if needed (txt / html). var ResultTxt = "" if flags.TXT != "" { ResultTxt = utils.CreateOutputFile(flags.TXT, "results", "txt") } - var ResultHtml = "" + var ResultHTML = "" if flags.HTML != "" { - ResultHtml = utils.CreateOutputFile(flags.HTML, "", "html") - output.BannerHTML(ResultHtml) - output.HeaderHTML("Results", ResultHtml) + ResultHTML = utils.CreateOutputFile(flags.HTML, "", "html") + output.BannerHTML(ResultHTML) + output.HeaderHTML("Results", ResultHTML) } - //Read headers if needed + // Read headers if needed var headers map[string]string if flags.HeadersFile != "" || flags.Headers != "" { @@ -119,13 +118,12 @@ func main() { headers = input.GetHeaders(headersInput) } - //For each target generate a crawler and collect all the results. + // For each target generate a crawler and collect all the results. for _, inp := range targets { - - results, secrets, endpoints, extensions, errors, infos := crawler.Crawler(inp, ResultTxt, ResultHtml, flags.Delay, + results, secrets, endpoints, extensions, errors, infos := crawler.Crawler(inp, ResultTxt, ResultHTML, flags.Delay, flags.Concurrency, flags.Ignore, flags.IgnoreTXT, flags.Cache, flags.Timeout, flags.Intensive, - flags.Rua, flags.Proxy, flags.Insecure, flags.Secrets, secretsFileSlice, flags.Plain, flags.Endpoints, endpointsFileSlice, - flags.Extensions, headers, flags.Errors, flags.Info, flags.Debug, flags.UserAgent) + flags.Rua, flags.Proxy, flags.Insecure, flags.Secrets, secretsFileSlice, flags.Plain, flags.Endpoints, + endpointsFileSlice, flags.Extensions, headers, flags.Errors, flags.Info, flags.Debug, flags.UserAgent) finalResults = append(finalResults, results...) finalSecret = append(finalSecret, secrets...) @@ -135,7 +133,7 @@ func main() { finalInfos = append(finalInfos, infos...) } - //Remove duplicates from all the results. + // Remove duplicates from all the results. finalResults = utils.RemoveDuplicateValues(finalResults) finalSecret = scanner.RemoveDuplicateSecrets(finalSecret) finalEndpoints = scanner.RemovDuplicateEndpoints(finalEndpoints) @@ -151,18 +149,18 @@ func main() { // IF HTML OUTPUT > if flags.HTML != "" { - output.HtmlOutput(flags, ResultHtml, finalResults, finalSecret, + output.HTMLOutput(flags, ResultHTML, finalResults, finalSecret, finalEndpoints, finalExtensions, finalErrors, finalInfos) } - //If needed print secrets. + // If needed print secrets. if !flags.Plain && len(finalSecret) != 0 { for _, elem := range finalSecret { output.EncapsulateCustomGreen(elem.Secret.Name, elem.Match+" in "+elem.URL) } } - //If needed print endpoints. + // If needed print endpoints. if !flags.Plain && len(finalEndpoints) != 0 { for _, elem := range finalEndpoints { for _, parameter := range elem.Parameters { @@ -179,21 +177,21 @@ func main() { } } - //If needed print extensions. + // If needed print extensions. if !flags.Plain && len(finalExtensions) != 0 { for _, elem := range finalExtensions { output.EncapsulateCustomGreen(elem.Filetype.Extension, elem.URL+" matched!") } } - //If needed print errors. + // If needed print errors. if !flags.Plain && len(finalErrors) != 0 { for _, elem := range finalErrors { output.EncapsulateCustomGreen(elem.Error.ErrorName, elem.Match+" in "+elem.URL) } } - //If needed print infos. + // If needed print infos. if !flags.Plain && len(finalInfos) != 0 { for _, elem := range finalInfos { output.EncapsulateCustomGreen(elem.Info.Name, elem.Match+" in "+elem.URL) diff --git a/output/beautify.go b/output/beautify.go index 136148d..7e3b9c7 100644 --- a/output/beautify.go +++ b/output/beautify.go @@ -32,7 +32,7 @@ import ( "github.com/fatih/color" ) -//Beautify prints the banner + version +// Beautify prints the banner + version. func Beautify() { banner1 := " _ _ _ _ \n" banner2 := " ___ __ _ _ __(_) __| | __| (_)\n" diff --git a/output/color.go b/output/color.go index 3b158ed..e859440 100644 --- a/output/color.go +++ b/output/color.go @@ -32,8 +32,8 @@ import ( "github.com/fatih/color" ) -//EncapsulateGreen takes as input a string and -//print a green prefix. +// EncapsulateGreen takes as input a string and +// print a green prefix. func EncapsulateGreen(inp string) { // Create a custom print function for convenience green := color.New(color.FgGreen).PrintfFunc() @@ -41,8 +41,8 @@ func EncapsulateGreen(inp string) { fmt.Println(inp) } -//EncapsulateRed takes as input a string and -//print a red prefix. +// EncapsulateRed takes as input a string and +// print a red prefix. func EncapsulateRed(inp string) { // Create a custom print function for convenience red := color.New(color.FgRed).PrintfFunc() @@ -50,8 +50,8 @@ func EncapsulateRed(inp string) { fmt.Println(inp) } -//EncapsulateYellow takes as input a string and -//print a yellow prefix. +// EncapsulateYellow takes as input a string and +// print a yellow prefix. func EncapsulateYellow(inp string) { // Create a custom print function for convenience yellow := color.New(color.FgYellow).PrintfFunc() @@ -59,8 +59,8 @@ func EncapsulateYellow(inp string) { fmt.Println(inp) } -//EncapsulateCustomGreen takes as input a string and -//print it with the green color. +// EncapsulateCustomGreen takes as input a string and +// print it with the green color. func EncapsulateCustomGreen(alert string, inp string) { // Create a custom print function for convenience green := color.New(color.FgGreen).PrintfFunc() @@ -68,8 +68,8 @@ func EncapsulateCustomGreen(alert string, inp string) { fmt.Println(inp) } -//EncapsulateCustomRed takes as input a string and -//print it with the red color. +// EncapsulateCustomRed takes as input a string and +// print it with the red color. func EncapsulateCustomRed(alert string, inp string) { // Create a custom print function for convenience red := color.New(color.FgRed).PrintfFunc() @@ -77,8 +77,8 @@ func EncapsulateCustomRed(alert string, inp string) { fmt.Println(inp) } -//EncapsulateCustomYellow takes as input a string and -//print it with the yellow color. +// EncapsulateCustomYellow takes as input a string and +// print it with the yellow color. func EncapsulateCustomYellow(alert string, inp string) { // Create a custom print function for convenience yellow := color.New(color.FgYellow).PrintfFunc() diff --git a/output/examples.go b/output/examples.go index 1ed716b..fcbf6ca 100644 --- a/output/examples.go +++ b/output/examples.go @@ -28,7 +28,7 @@ package output import "fmt" -//PrintExamples prints some examples +// PrintExamples prints some examples. func PrintExamples() { Beautify() fmt.Println(` diff --git a/output/help.go b/output/help.go index 56f422e..d0e3ff4 100644 --- a/output/help.go +++ b/output/help.go @@ -28,7 +28,7 @@ package output import "fmt" -//PrintHelp prints the help. +// PrintHelp prints the help. func PrintHelp() { Beautify() fmt.Println(`Usage of cariddi: diff --git a/output/html.go b/output/html.go index 7556b58..66cdbbc 100644 --- a/output/html.go +++ b/output/html.go @@ -31,7 +31,7 @@ import ( "os" ) -//BannerHTML appends the initial banner to html file +// BannerHTML appends the initial banner to html file. func BannerHTML(filename string) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { @@ -50,7 +50,7 @@ func BannerHTML(filename string) { file.Close() } -//AppendOutputToHTML appends the output to html file +// AppendOutputToHTML appends the output to html file. func AppendOutputToHTML(output string, status string, filename string, isLink bool) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { @@ -84,7 +84,7 @@ func AppendOutputToHTML(output string, status string, filename string, isLink bo file.Close() } -//HeaderHTML appends the html header +// HeaderHTML appends the html header. func HeaderHTML(header string, filename string) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { @@ -99,7 +99,7 @@ func HeaderHTML(header string, filename string) { file.Close() } -//FooterHTML appends the footer +// FooterHTML appends the footer. func FooterHTML(filename string) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { @@ -114,7 +114,7 @@ func FooterHTML(filename string) { file.Close() } -//BannerFooterHTML appends the final footer +// BannerFooterHTML appends the final footer. func BannerFooterHTML(filename string) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { diff --git a/output/output.go b/output/output.go index cbb5d48..aa503d2 100644 --- a/output/output.go +++ b/output/output.go @@ -36,15 +36,15 @@ import ( "github.com/edoardottt/cariddi/utils" ) -//PrintSimpleOutput prints line by line +// PrintSimpleOutput prints line by line. func PrintSimpleOutput(out []string) { for _, elem := range out { fmt.Println(elem) } } -//TxtOutput it's the wrapper around all the txt things. -//Actually it manages everything related to TXT output. +// TxtOutput it's the wrapper around all the txt things. +// Actually it manages everything related to TXT output. func TxtOutput(flags input.Input, finalResults []string, finalSecret []scanner.SecretMatched, finalEndpoints []scanner.EndpointMatched, finalExtensions []scanner.FileTypeMatched, finalErrors []scanner.ErrorMatched, finalInfos []scanner.InfoMatched) { @@ -115,9 +115,9 @@ func TxtOutput(flags input.Input, finalResults []string, finalSecret []scanner.S } } -//HtmlOutput it's the wrapper around all the html things. -//Actually it manages everything related to HTML output. -func HtmlOutput(flags input.Input, ResultFilename string, finalResults []string, finalSecret []scanner.SecretMatched, +// HtmlOutput it's the wrapper around all the html things. +// Actually it manages everything related to HTML output. +func HTMLOutput(flags input.Input, resultFilename string, finalResults []string, finalSecret []scanner.SecretMatched, finalEndpoints []scanner.EndpointMatched, finalExtensions []scanner.FileTypeMatched, finalErrors []scanner.ErrorMatched, finalInfos []scanner.InfoMatched) { exists, err := utils.ElementExists("output-cariddi") @@ -131,28 +131,28 @@ func HtmlOutput(flags input.Input, ResultFilename string, finalResults []string, utils.CreateOutputFolder() } - HeaderHTML("Results found", ResultFilename) + HeaderHTML("Results found", resultFilename) for _, elem := range finalResults { - AppendOutputToHTML(elem, "", ResultFilename, true) + AppendOutputToHTML(elem, "", resultFilename, true) } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) // if secrets flag enabled save also secrets if flags.Secrets { - HeaderHTML("Secrets found", ResultFilename) + HeaderHTML("Secrets found", resultFilename) for _, elem := range finalSecret { - AppendOutputToHTML(elem.Secret.Name+" - "+elem.Match+" in "+elem.URL, "", ResultFilename, false) + AppendOutputToHTML(elem.Secret.Name+" - "+elem.Match+" in "+elem.URL, "", resultFilename, false) } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) } // if endpoints flag enabled save also endpoints if flags.Endpoints { - HeaderHTML("Endpoints found", ResultFilename) + HeaderHTML("Endpoints found", resultFilename) for _, elem := range finalEndpoints { for _, parameter := range elem.Parameters { @@ -164,48 +164,48 @@ func HtmlOutput(flags input.Input, ResultFilename string, finalResults []string, } } - AppendOutputToHTML(finalString+" in "+elem.URL, "", ResultFilename, false) + AppendOutputToHTML(finalString+" in "+elem.URL, "", resultFilename, false) } } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) } // if extensions flag enabled save also extensions if 1 <= flags.Extensions && flags.Extensions <= 7 { - HeaderHTML("Extensions found", ResultFilename) + HeaderHTML("Extensions found", resultFilename) for _, elem := range finalExtensions { - AppendOutputToHTML(elem.Filetype.Extension+" in "+elem.URL, "", ResultFilename, false) + AppendOutputToHTML(elem.Filetype.Extension+" in "+elem.URL, "", resultFilename, false) } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) } // if errors flag enabled save also errors if flags.Errors { - HeaderHTML("Errors found", ResultFilename) + HeaderHTML("Errors found", resultFilename) for _, elem := range finalErrors { - AppendOutputToHTML(elem.Error.ErrorName+" - "+elem.Match+" in "+elem.URL, "", ResultFilename, false) + AppendOutputToHTML(elem.Error.ErrorName+" - "+elem.Match+" in "+elem.URL, "", resultFilename, false) } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) } // if info flag enabled save also infos if flags.Info { - HeaderHTML("Useful informations found", ResultFilename) + HeaderHTML("Useful informations found", resultFilename) for _, elem := range finalInfos { // Escape HTML comment to be shown on the result page AppendOutputToHTML(elem.Info.Name+" - "+ strings.Replace(strings.Replace(elem.Match, "<", "<", 10), ">", ">", 10)+ - " in "+elem.URL, "", ResultFilename, false) + " in "+elem.URL, "", resultFilename, false) } - FooterHTML(ResultFilename) + FooterHTML(resultFilename) } - BannerFooterHTML(ResultFilename) + BannerFooterHTML(resultFilename) } diff --git a/output/txt.go b/output/txt.go index 360b22d..cf1594c 100644 --- a/output/txt.go +++ b/output/txt.go @@ -31,8 +31,8 @@ import ( "os" ) -//AppendOutputToTxt opens the output file and append -//the string taken as input. +// AppendOutputToTxt opens the output file and append +// the string taken as input. func AppendOutputToTxt(output string, filename string) { file, err := os.OpenFile(filename, os.O_APPEND|os.O_WRONLY, 0644) if err != nil { diff --git a/scanner/endpoints.go b/scanner/endpoints.go index 230649b..463c7c6 100644 --- a/scanner/endpoints.go +++ b/scanner/endpoints.go @@ -26,7 +26,7 @@ along with this program. If not, see http://www.gnu.org/licenses/. package scanner -//Parameter struct. +// Parameter struct. // Parameter = the name of the parameter. // Attacks = Possible attacks. type Parameter struct { @@ -34,7 +34,7 @@ type Parameter struct { Attacks []string } -//EndpointMatched struct. +// EndpointMatched struct. // Parameters = a list of parameters in a particular endpoint. // Url = url (aka endpoint). type EndpointMatched struct { @@ -42,7 +42,7 @@ type EndpointMatched struct { URL string } -//GetJuicyParameters returns juicy parameters and their possible attacks. +// GetJuicyParameters returns juicy parameters and their possible attacks. func GetJuicyParameters() []Parameter { var juicyParameters = []Parameter{ {"apikey", []string{"Info"}}, @@ -186,7 +186,7 @@ func GetJuicyParameters() []Parameter { return juicyParameters } -//RemovDuplicateEndpoints removes duplicate endpoints found. +// RemovDuplicateEndpoints removes duplicate endpoints found. func RemovDuplicateEndpoints(input []EndpointMatched) []EndpointMatched { keys := make(map[string]bool) list := []EndpointMatched{} diff --git a/scanner/errors.go b/scanner/errors.go index 2958229..9d3870e 100644 --- a/scanner/errors.go +++ b/scanner/errors.go @@ -23,7 +23,7 @@ along with this program. If not, see http://www.gnu.org/licenses/. package scanner -//Error struct. +// Error struct. // ErrorName = the name that identifies the error. // Regex = The regular expression to be matched. type Error struct { @@ -31,7 +31,7 @@ type Error struct { Regex []string } -//ErrorMatched struct. +// ErrorMatched struct. // Error = Error struct. // Url = url in which the error is found. // Match = the string matching the regex. @@ -41,7 +41,7 @@ type ErrorMatched struct { Match string } -//GetErrorRegexes returns all the error structs. +// GetErrorRegexes returns all the error structs. func GetErrorRegexes() []Error { var regexes = []Error{ { @@ -150,7 +150,7 @@ func GetErrorRegexes() []Error { return regexes } -//RemoveDuplicateErrors removes duplicates from Errors found. +// RemoveDuplicateErrors removes duplicates from Errors found. func RemoveDuplicateErrors(input []ErrorMatched) []ErrorMatched { keys := make(map[string]bool) list := []ErrorMatched{} diff --git a/scanner/extensions.go b/scanner/extensions.go index 36c9039..65fb830 100644 --- a/scanner/extensions.go +++ b/scanner/extensions.go @@ -26,7 +26,7 @@ along with this program. If not, see http://www.gnu.org/licenses/. package scanner -//FileType struct. +// FileType struct. // Extension = the file extension (doc, txt ..etc..). // Severity = the 'importance' of the file found. Higher is better. type FileType struct { @@ -34,7 +34,7 @@ type FileType struct { Severity int } -//FileTypeMatched struct. +// FileTypeMatched struct. // Filetype = Filetype struct. // Url = url of the file found. type FileTypeMatched struct { @@ -42,12 +42,12 @@ type FileTypeMatched struct { URL string } -//GetExtensions returns all the extension structs. +// GetExtensions returns all the extension structs. func GetExtensions() []FileType { - //extensions contains a list of known extensions - //and the TYPICAL (also say `in general`) associated severity. - //Why in general? Because a python file can be anything, it can - //contain secret data or not. + // extensions contains a list of known extensions + // and the TYPICAL (also say `in general`) associated severity. + // Why in general? Because a python file can be anything, it can + // contain secret data or not. var extensions = []FileType{ {"key", 1}, {"env", 1}, @@ -111,7 +111,7 @@ func GetExtensions() []FileType { return extensions } -//RemoveDuplicateExtensions removes duplicates from Extensions found. +// RemoveDuplicateExtensions removes duplicates from Extensions found. func RemoveDuplicateExtensions(input []FileTypeMatched) []FileTypeMatched { keys := make(map[string]bool) list := []FileTypeMatched{} diff --git a/scanner/info.go b/scanner/info.go index 2d79b69..f45e9d5 100644 --- a/scanner/info.go +++ b/scanner/info.go @@ -23,7 +23,7 @@ along with this program. If not, see http://www.gnu.org/licenses/. package scanner -//Info struct. +// Info struct. // Name = the name that identifies the information. // Regex = The regular expression to be matched. type Info struct { @@ -31,7 +31,7 @@ type Info struct { Regex []string } -//InfoMatched struct. +// InfoMatched struct. // Info = Info struct. // Url = url in which the information is found. // Match = the string matching the regex. @@ -41,7 +41,7 @@ type InfoMatched struct { Match string } -//GetInfoRegexes returns all the info structs. +// GetInfoRegexes returns all the info structs. func GetInfoRegexes() []Info { var regexes = []Info{ { @@ -83,7 +83,7 @@ func GetInfoRegexes() []Info { return regexes } -//RemoveDuplicateInfos removes duplicates from Infos found. +// RemoveDuplicateInfos removes duplicates from Infos found. func RemoveDuplicateInfos(input []InfoMatched) []InfoMatched { keys := make(map[string]bool) list := []InfoMatched{} diff --git a/scanner/secrets.go b/scanner/secrets.go index f6098d7..b307e67 100644 --- a/scanner/secrets.go +++ b/scanner/secrets.go @@ -26,7 +26,7 @@ along with this program. If not, see http://www.gnu.org/licenses/. package scanner -//Secret struct. +// Secret struct. // Name = the name that identifies the secret. // Description. // Regex = The regular expression matching the secret. @@ -40,7 +40,7 @@ type Secret struct { Poc string } -//SecretMatched struct. +// SecretMatched struct. // Secret = The secret matched (struct). // Url = url in which is present the secret. // Match = the string matching the regex. @@ -50,8 +50,8 @@ type SecretMatched struct { Match string } -//GetSecretRegexes returns a slice of all -//the secret structs. +// GetSecretRegexes returns a slice of all +// the secret structs. func GetSecretRegexes() []Secret { var regexes = []Secret{ { @@ -342,7 +342,7 @@ func GetSecretRegexes() []Secret { return regexes } -//RemoveDuplicateSecrets removes duplicates from secrets found. +// RemoveDuplicateSecrets removes duplicates from secrets found. func RemoveDuplicateSecrets(input []SecretMatched) []SecretMatched { keys := make(map[string]bool) list := []SecretMatched{} diff --git a/utils/files.go b/utils/files.go index 76dbca2..d81cfdd 100644 --- a/utils/files.go +++ b/utils/files.go @@ -36,10 +36,10 @@ import ( "strings" ) -//CreateOutputFolder creates the output folder -//If it fails exits with an error message. +// CreateOutputFolder creates the output folder +// If it fails exits with an error message. func CreateOutputFolder() { - //Create a folder/directory at a full qualified path + // Create a folder/directory at a full qualified path err := os.Mkdir("output-cariddi", 0755) if err != nil { fmt.Println("Can't create output folder.") @@ -47,12 +47,12 @@ func CreateOutputFolder() { } } -//CreateOutputFile takes a target (of the attack), a subcommand -//(PORT-DNS-DIR-SUBDOMAIN-REPORT) and a format (json-html-txt). -//It creates the output folder if needed, then checks if the output file -//already exists, if yes asks the user if scilla has to overwrite it; -//if no scilla creates it. -//Whenever an instruction fails, it exits with an error message. +// CreateOutputFile takes a target (of the attack), a subcommand +// (PORT-DNS-DIR-SUBDOMAIN-REPORT) and a format (json-html-txt). +// It creates the output folder if needed, then checks if the output file +// already exists, if yes asks the user if scilla has to overwrite it; +// if no scilla creates it. +// Whenever an instruction fails, it exits with an error message. func CreateOutputFile(target string, subcommand string, format string) string { target = ReplaceBadCharacterOutput(target) @@ -96,15 +96,15 @@ func CreateOutputFile(target string, subcommand string, format string) string { return filename } -//ReplaceBadCharacterOutput replaces forward-slashes -//with dashes (to avoid problems with output folder). +// ReplaceBadCharacterOutput replaces forward-slashes +// with dashes (to avoid problems with output folder). func ReplaceBadCharacterOutput(input string) string { result := strings.ReplaceAll(input, "/", "-") return result } -//ReadFile reads a file line per line -//and returns a slice of strings. +// ReadFile reads a file line per line +// and returns a slice of strings. func ReadFile(inputFile string) []string { file, err := os.Open(inputFile) if err != nil { @@ -123,7 +123,7 @@ func ReadFile(inputFile string) []string { return text } -//ElementExists returns whether the given file or directory exists. +// ElementExists returns whether the given file or directory exists. func ElementExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil { @@ -137,8 +137,8 @@ func ElementExists(path string) (bool, error) { return false, err } -//ReadHTTPRequestFromFile reads from a file an HTTP -//request and returns a *http.Request object. +// ReadHTTPRequestFromFile reads from a file an HTTP +// request and returns a *http.Request object. func ReadHTTPRequestFromFile(inputFile string) (*http.Request, error) { f, err := os.Open(inputFile) if err != nil { @@ -158,7 +158,7 @@ func ReadHTTPRequestFromFile(inputFile string) (*http.Request, error) { return req, nil } -//ReadEntireFile returns the content of the inputted file. +// ReadEntireFile returns the content of the inputted file. func ReadEntireFile(inputFile string) []byte { file, err := os.Open(inputFile) if err != nil { diff --git a/utils/slice.go b/utils/slice.go index b42f621..412b924 100644 --- a/utils/slice.go +++ b/utils/slice.go @@ -31,8 +31,8 @@ import ( "strings" ) -//RemoveDuplicateValues removes duplicates from a slice -//of strings. +// RemoveDuplicateValues removes duplicates from a slice +// of strings. func RemoveDuplicateValues(strSlice []string) []string { keys := make(map[string]bool) list := []string{} @@ -47,8 +47,8 @@ func RemoveDuplicateValues(strSlice []string) []string { return list } -//CheckInputArray checks the basic rules to -//be valid and then returns the array as input. +// CheckInputArray checks the basic rules to +// be valid and then returns the array as input. // - Delete duplicates. // - Avoid empty strings. func CheckInputArray(input string) []string { @@ -66,16 +66,16 @@ func CheckInputArray(input string) []string { return result } -//CheckCookies checks if the string provided to the -//-cookie option is valid. -//format: "name1:value1;name2:value2" -//It returns a slice of Cookies. +// CheckCookies checks if the string provided to the +// -cookie option is valid. +// format: "name1:value1;name2:value2" +// It returns a slice of Cookies. func CheckCookies(input string) []*http.Cookie { var result []*http.Cookie if input == "" { return result } - //Split and get different pairs of (name,value) + // Split and get different pairs of (name,value) pairs := strings.Split(input, ";") if len(pairs) == 0 { return result diff --git a/utils/urls.go b/utils/urls.go index e9cf8a2..e05ed89 100644 --- a/utils/urls.go +++ b/utils/urls.go @@ -32,10 +32,10 @@ import ( "strings" ) -//GetHost takes as input a string and -//tries to parse it as url, if it's a -//well formatted url this function returns -//the host (the domain if you prefer). +// GetHost takes as input a string and +// tries to parse it as url, if it's a +// well formatted url this function returns +// the host (the domain if you prefer). func GetHost(input string) string { u, err := url.Parse(input) if err != nil { @@ -45,10 +45,10 @@ func GetHost(input string) string { return u.Host } -//GetProtocol takes as input a string and -//tries to parse it as url, if it's a -//well formatted url this function returns -//the protocol (the scheme if you prefer). +// GetProtocol takes as input a string and +// tries to parse it as url, if it's a +// well formatted url this function returns +// the protocol (the scheme if you prefer). func GetProtocol(input string) string { u, err := url.Parse(input) if err != nil { @@ -58,19 +58,19 @@ func GetProtocol(input string) string { return u.Scheme } -//GetRootHost takes as input a string and -//tries to parse it as url, if it's a -//well formatted url this function returns -//the second level domain. +// GetRootHost takes as input a string and +// tries to parse it as url, if it's a +// well formatted url this function returns +// the second level domain. func GetRootHost(input string) (string, error) { u, err := url.Parse(input) if err != nil { return "", err } - //divide host and port, then split by dot + // divide host and port, then split by dot parts := strings.Split(strings.Split(u.Host, ":")[0], ".") - //return the last two parts + // return the last two parts if len(parts) > 1 { return parts[len(parts)-2] + "." + parts[len(parts)-1], nil } @@ -78,17 +78,17 @@ func GetRootHost(input string) (string, error) { return "", errors.New("domain formatted in a bad way") } -//HasProtocol takes as input a string and -//checks if it has a protocol ( like in a -//URI/URL). +// HasProtocol takes as input a string and +// checks if it has a protocol ( like in a +// URI/URL). func HasProtocol(input string) bool { res := strings.Index(input, "://") return res >= 0 } -//RemoveProtocol removes the protocol from -//the input string (something://...). -//If it's not present it returns the input. +// RemoveProtocol removes the protocol from +// the input string (something://...). +// If it's not present it returns the input. func RemoveProtocol(input string) string { res := strings.Index(input, "://") if res >= 0 { @@ -98,8 +98,8 @@ func RemoveProtocol(input string) string { return input } -//RemovePort removes port from the input string. -//If it's not present it returns the input. +// RemovePort removes port from the input string. +// If it's not present it returns the input. func RemovePort(input string) string { res := strings.Index(input, ":") if res >= 0 { @@ -109,11 +109,11 @@ func RemovePort(input string) string { return input } -//RetrieveParameters takes as input a string and -//if it's correctly url-formatted returns a slice -//of strings that are the parameters of the URL. +// RetrieveParameters takes as input a string and +// if it's correctly url-formatted returns a slice +// of strings that are the parameters of the URL. func RetrieveParameters(input string) []string { - var result []string + result := []string{} u, err := url.Parse(input) if err != nil { @@ -128,8 +128,8 @@ func RetrieveParameters(input string) []string { return result } -//AbsoluteURL takes as input a protocol, a domain and a path -//and returns the absolute URL with protocol + domain + path. +// AbsoluteURL takes as input a protocol, a domain and a path +// and returns the absolute URL with protocol + domain + path. func AbsoluteURL(protocol string, target string, path string) string { // if the path variable starts with a scheme, it means that the // path is itself an absolute path. @@ -144,7 +144,7 @@ func AbsoluteURL(protocol string, target string, path string) string { return protocol + "://" + target + "/" + path } -//SameDomain checks if two urls have the same domain. +// SameDomain checks if two urls have the same domain. func SameDomain(url1 string, url2 string) bool { u1, err := url.Parse(url1) if err != nil { @@ -163,8 +163,8 @@ func SameDomain(url1 string, url2 string) bool { return u1.Host == u2.Host } -//GetPath returns the path of the input string -//(if correctly URL-formatted). +// GetPath returns the path of the input string +// (if correctly URL-formatted). func GetPath(input string) (string, error) { u, err := url.Parse(input) if err != nil { @@ -174,7 +174,7 @@ func GetPath(input string) (string, error) { return u.Path, nil } -//IsEmailURL checks if the input string is a mail URL. +// IsEmailURL checks if the input string is a mail URL. func IsEmailURL(input string) (bool, string) { if input[:7] == "mailto:" { return true, input[7:]